20201027のLinuxに関する記事は7件です。

MAC Linux 環境構築 エラーメモ

目的

Linux導入時にでたエラー

環境

・Mac OS catalina ver10.15.7
・VirtualBox ver6.0.14
・Vagrant

使用したアプリケーション

・iTerm2

https://www.iterm2.com/

・VirtualBox ver6.0.14
https://www.vagrantup.com/

エラー箇所

vagrant box add ubuntu/bionic64 --box-version 20200130.1.0

installを行うとセキュリティーとプライバシーから機能拡張からブロックされました
と表示されるので”セキュリティー”環境設定から開き

スクリーンショット 2020-10-27 20.58.42.png

閉じちゃった時は?マークからシステム環境設定へ

許可をしておかないとinstallに失敗しこんなエラーがでた

There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", "06d68c13-7910-4f8f-a263-e9424395d7cf", "--type", "headless"]

Stderr: VBoxManage: error: The virtual machine 'username_default_1549175601821_34118' has terminated unexpectedly during startup with exit code 1 (0x1)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component MachineWrap, inter

許可しておく事で解決しました。

この記事は以下の情報を参考にして執筆しました。

引用
Vagrant upでエラーが出て躓いた時の解決方法

まとめ

・調べて先人様の知恵を参考にさせていただきました
・エラー文をよく読んで考える

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MongoDBのログローテート設定

MongoDBのログローテーションをしたくて調べて設定してみました。(バージョンは3.4)

やりたいこと

ログは1日1回ローテーションしたい。
ローテーション後のログファイルは mongod.log_yyyymmdd という名前をつけたい。
自動圧縮したい。
溜め続けるのではなく一定期間が経過したら自動削除したい。

やったこと

logrotateで以下のように設定

# vi /etc/logrotate.d/mongod

/usr/local/var/log/mongodb/mongod.log
{
    missingok
    daily
    dateext
    rotate 30
    create
    compress
    delaycompress
    postrotate
      /bin/kill -SIGUSR1 `cat /var/run/mongodb/mongod.pid 2> /dev/null` 2> /dev/null || true
      find /data/mongodb/logs -type f -size 0 -regextype posix-awk -regex "^\/usr\/local\/var\/log\/mongodb\/mongod\.log\.[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}-[0-9]{2}-[0-9]{2}$" -execdir rm {} \; >/dev/null 2>&1
    endscript
}

メモ

kill -SIGUSR1 でMongoDBのログローテートを行うと、MongoDBが mongod.log.yyyy-mm-ddTxx-xx-xx という名前の空ログファイルを作ってしまうので find を使用して消している。

create ではなくnocreate にすると、MongoDBがログファイルを見失って
ローテーションのタイミングでMongoDBが異常終了する。

参考先

Automating MongoDB Log Rotation

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プロキシ環境下の Docker

Docker おじさんです。

今回は
「顧客の本番環境がプロキシを通さないとインターネットに出れないことが判明した!!!」
という状況で焦らないためのメモ。

Docker のインストール

Debian / Ubuntu 前提で。

プロキシ環境下なので以下は普通に通らないと思うが、~/.bashrc とかで環境変数 http_proxy などを設定しても sudo すると環境変数は引き継がれないのでそのままでは通らない。

$ sudo apt-get install docker.io

sudo-E オプションを付ければ環境変数を引き継げば通るが毎回 -E をつけるのが面倒なので、別の方法として apt の設定ファイルを書いてしまったほうが楽。

/etc/apt/apt.conf.d/00-proxy
Acquire::http::Proxy "http://{HOST}:{port}";
Acquire::https::Proxy "http://{HOST}:{port}";

RHEL / CentOS の人は yum 用の設定方法があると思うので適当にググってやっていって欲しい。

Docker Engine

docker pull などでイメージを落としてくる場合は Docker Engine にプロキシ設定をする必要がある。

単純に環境変数 HTTP_PROXY HTTPS_PROXY を設定すればいいのだが、最近は Systemd で動いていることがほとんどだと思うので Systemd の設定ファイルで環境変数を指定するのが手っ取り早い。

/lib/systemd/system/docker.service
[Service]
Environment=HTTP_PROXY=http://{HOST}:{port}
Environment=HTTPS_PROXY=http://{HOST}:{port}

Docker イメージのビルド時

Docker イメージのビルド時に限らないが、 apt-get install などでインターネットに出たい場合は、そのツールひとつひとつにプロキシ設定をする必要がある。

apt-get や pip などは環境変数を設定するだけでプロキシを通ってくれるので、とりあえず環境変数を設定しておき、個別に対応が必要なツールについては個別に対応していく、となる。ビルド時に環境変数を設定するには Dockerfile に環境変数を指定してもいいが、ARG を使うのがよさそう。

例えば Docker Compose の設定ファイルで args を指定する場合は、サービスの build オプションを以下のように指定する。

docker-compose.yml
  build:
    context: .
    args:
      - http_proxy=http://{HOST}:{port}
      - https_proxy=http://{HOST}:{port}
      - HTTP_PROXY=http://{HOST}:{port}
      - HTTPS_PROXY=http://{HOST}:{port}

ツールによって対応している環境変数名が大文字だったり小文字だったりするので、両方指定しておいたほうが良い。
(例えば apt-get は大文字の HTTP_PROXY を指定しても認識してくれない)

Docker コンテナ起動時

コンテナ起動時はビルド時と同様にツールひとつひとつにプロキシ設定をする必要があるため、個別対応以外で出来ることといえば環境変数を設定するだけとなる。

コンテナ起動時に毎回環境変数を指定するのは手間なので、 ~/.docker/config.json を書いておくとコンテナ内に HTTP_PROXY などを自動で設定してくれる機能を使うと楽。

~/.docker/config.json
{
  "proxies": {
    "default": {
      "httpProxy": "http://{HOST}:{port}",
      "httpsProxy": "http://{HOST}:{port}"
    }
  }
}

Configure Docker to use a proxy server | Docker Documentation

その他

Docker 以外の設定で環境変数では対応できないやつ (git とか curl とか boto3 とか) そのへんはググって個別によしなに設定する。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

クラウド の監視も オンプレ の監視も Azure Monitor で決まり!GUIで楽々!

ディスクがパンクして大騒ぎしている日々・・・

ことの発端はディスクがパンクしシステム不具合が発生してから対処するといった情シスながらのアリアリ運用(私の管轄していたサーバーではありませんよ)を目にしたため監視はどうなっているのか尋ねると JP1 のライセンスが足りないとかなんだかで(言い訳にも聞こえましたが)監視が疎かになっていた様子。そんな中、何か安価なツールはないものだろうかと調べていると海外では比較的導入されていそうな SolarWinds やオープンソースの Zabbix, Hinemos などが他にも候補としてありそうだったが、なんかヘビーな感じ。必要なものを金もサーバーも構築せずほとんどかけずに直ぐに開始したい!必要なものは今の時代1時間で対応できずはずだよね・・・と行き着いた先が Azure Monitor 。調べてみるとオンプレも簡単に連携できることがわかり導入をスタート。機能的には Monitor という機能とログ置き場の Log Analytics Workspaces というログ置き場の二つのサービスが関わることになる。
image.png
image.png

Azure Monitor のコストは?

Cost.png

https://azure.microsoft.com/ja-jp/pricing/details/monitor/
に記載があるものの複雑に見えてよくわからん。ということで、整理すると大きくは
●ログ保管の費用(Data Ingestion)・・・これは保管するメトリックの種類や取得頻度が増えれば増えるほど費用が加算される。オンプレのWindowsサーバーでディスクの%free spaceとfree megabytesといったディスク容量の監視を2個、1分おきに監視を開始した設定では1台あたり月10円程度になりそう。CPUやメモリなど次々監視したいものを増やすこともできるが増やせば増やすほどログが増え課金が増える。このあたりは監視頻度の増減や監視項目の増減を適度に調整、監視し莫大なコストにならぬよう注意をする必要があろう。不安なうちはスモールスタートがよさそうだ。
●アラート設定自体の費用・・・1つのアラート設定につき月11円。一つのサーバーの一つのドライブで1つのアラートという感じなので二つのドライブを見る場合は2つのアラート設定になる。
●アラート送信の費用(メール、SMS、電話音声)・・・メールやAzureアプリの連携が一番安い(1か月1,000件は無料とのこと)。SMSや電話音声は上記料金表にもあるが1回あたり数十円かかりそうなので注意。

オンプレとどう連携させるのか?

ネット接続がNGのサーバーもあると思うが今回はその対応は必要が無いので省略している(Log Analytics Gateway
は使用しない)。Log Analytics Workspaces の Overview または Agents management で WindowsとLinuxとAzureを連携させるプログラムがダウンロードできそれをインストールしないといけない。
image.png
image.png

インストール中にWorkspace IDと連携キーを聞かれるのでそれはダウンロード画面に表示されている情報をコピペしてセットアップを続行することとなる。また、当該画面においてすでに連携されているWindowsやLinuxがあれば台数が表示される。(本画面では2台が接続済)
image.png
"Advanced settings" で吸い上げるオンプレWindows/Linuxログの内容が設定できる。一つのLog Analytics Workspaceで設定できる吸い上げ条件は一つのようなので、条件を変えたい場合は別のLog Analytics Workspaceを作成しなければいけない様子。画像の例ではすべてのディスクの% Free Space, Free Megabytesを1分毎に吸い上げる設定の例となる。これを2台に同時適用しているイメージだ。
ここの設定さえすれば自動でログの吸い上げが始まる。
オンプレサーバーがAzureと接続できているかはコントロールパネルのMicrosoft Monitoring AgentのAzure Log Analytics(OMS)タブで確認できる。グリーンのチェックマークが入っていてsuccessfullyと表示されていれば連携は既にされている。プロキシの設定 タブでプロキシーの設定が必要であれば入力可能にもなっている。
image.pngimage.png

アラートの設定

アラートの設定は Monitor から行う。Manage actions であらかじめ通知先(メールアドレス、例としてTeamsのチャネルにも投稿可能)を登録しておくと使いまわしができるのでお勧め。New alert ruleで新たな通知設定ができる。この画面ではアラートの発報テストをしたので2件発生しており2件クローズしている状況。New, Acknowledged, Closed は人間がステータスコントロールするように作られているが通知はActivated, Deactivatedというステータスをシステムが管理しておりAzureの良いところはアラートの発報 Activated と件名に入るだけではなく、障害解決の Deactivated という件名が入った監視(および解決通知)もちゃんとしてくれているところにある。
image.png
メールの通知例:
image.png
次の設定では空きディスク容量が3072MB(3GB)を切った場合にアラート通知する設定例。
image.png
Conditionの例。
image.png

リソースがAzureにある場合はもっとしやすい。また、Webサイトの死活監視もできる。(Webサイトの死活だけであれば(ログ保管は別)その設定自体は無料のようである)。世界各国にあるAzureデータセンターからWebサイトへアクセスし応答が200かまたは別かなど設定しアラートも設定できる。応答時間もわかるので非常にわかりやすい。

image.png

image.png

Azure SQL Databaseの残容量、Azure Data FactoryのETL実行結果に異常がある場合のアラートも可能だ。アラート設定例。
image.png

設定するリソースグループ名には気を付けて

Azure Monitor関係はリソースグループの移動ができないものが多い。従い、移動が発生するようなことがあると大変大変手間なことになる。日本語などアルファベットや数値以外の文字が入っていると後続のリソース作成等で誤作動を行うこともあるのでリソースグループ名には十分気を付けそう。
詳細はこちら
https://qiita.com/mnoda/items/d60d72b78adc894aaf29

公式ドキュメント

https://docs.microsoft.com/ja-jp/azure/azure-monitor/overview
は機能全体が俯瞰されています。
全体像(上記公式サイトより):
image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初心者向け Linux操作 基本コマンドまとめ

はじめに

 今年からエンジニアになり、コマンドラインでの操作やネットワークの基本的な概念を身に付けたいと思いLinuxの学習をはじめました。その備忘録として記事を書いていきます。間違っているところなどがあればご指摘いただければと思います。

基本的なコマンド

1.ファイル操作コマンド

1-1.ファイルやディレクトリの一覧を表示する(ls)

【できること】

・ファイルやディレクトリの一覧を表示するコマンド
・lsの後ろにオプションやファイル名、ディレクトリ名を指定できる。
・ワイルドカード(*)を使用して結果を絞り込んで一覧表示することができる。

使い方

ls [オプション] [ファイル名]

の書式で入力できる。

$ ls
ダウンロード  デスクトップ 画像 音楽
テンプレート  ドキュメント 公開

このように現在いるディレクトリ内にあるファイルやディレクトリの一覧を表示することができる。

lsの後ろにディレクトリ、ファイルを指定すると、そのディレクトリ内にあるファイルやディレクトリの一覧を表示することができる。

$ ls /usr/
bin etc games include lib libexec local sbin share src tmp

ファイルの並び順を変えて表示するなどコマンドの動作を変える場合はオプションを使う。

-a
.ではじまる隠しファイルも含めて、全てのファイルを表示する
-l
長(Long)形式で表示する
-t
最終更新時間によって、並び替えて表示する
-r
逆順に並び替えて表示する

ファイルを絞り込んで表示する

 $ls hosts*
hosts  hosts.allow  hosts.deny

この場合は、頭文字にhostsがつくファイルを全て表示する。

文字数がわかる場合の絞り込み

$ cd /etc
$ ls hosts.????
hosts.deny

?の数で文字を絞り込む。上記の場合は4文字

?の後に文字列をつけても絞り込みできる。

 cd /etc
$ ls hosts.????w
hosts.allow

1-2.ファイルのコピー(cp)

【できること】

・ファイルの複製を作成
・コピーを作成したファイル名を指定することもできる
・-rオプションを使用するとディレクトリもコピーすることができる

使い方

cp [オプション] [コピー元] [コピー先] 

使用例

cp a b

上記の例では、コピー先であるbの状態によって動きが変わってくる。
・bが存在するファイル名ではない場合、aをコピーとしてbのファイルが作成される。
・bがディレクトリ名だった場合、bの下にaのコピーが作成される。
・bというファイル名が存在してる場合、aのコピーでbが上書きされる。

オプション

-i
 ファイルの上書きコピーをする時に"overwrite ファイル名? (y/n [n])"のような確認のための
問い合わせをしてくる。謝って上書きコピーをしないように使用される。

-r
 ディレクトリをコピーする。cpコマンドは基本的にファイルをコピーするコマンドだが、これを付けると
ディレクトリの中にある全てのファイル・ディレクトリをコピーできる。

-p
 元の情報を保持したままコピーする。ファイルには、所有者、管理者権限、更新日時など、ファイルに関する
様々な情報がある。通常のコピーではその情報が新しい内容になりコピーされる。古い情報を保持したい
場合はこのオプションを付ける。

1-3.ファイルの移動(mv)

 できること

・ファイルを移動することができる。
・移動する時にファイル名の変更もできる。

使い方

mv 移動元ファイル 移動先ファイル

使用例

mv a b

mvコマンドでもファイル・ディレクトリの状態によって動きが変わってくる。
・aがファイル名でbが存在するディレクトリだった場合、bのディレクトリの下にaのファイルが移動する。
・aがディレクトリで、bも存在するディレクトリの場合、bのディレクトリの下にaのディレクトリが移動する。
・aがファイル名で、bが存在しない場合、aのファイル名がbに変更される。
・aがディレクトリ名で、bが存在しない場合、aのディレクトリ名がbに変更される。

 オプション

-i
 ファイルの上書きコピーをする時に"overwrite ファイル名? (y/n [n])"のような確認のための
問い合わせをしてくる。謝って上書きコピーをしないように使用される。

-f
 強制的に処理を実行する。一部では、処理を確認する問い合わせがあるが、それを無視して強制的に処理を実行させる。

1-4.ファイルの削除(rm)

できること

・ファイルを削除することができる。

使い方

rm ファイル名

オプション

-i
 ファイルの削除をする時に、本当に削除していいのか、確認のための問い合わせをする。。誤ってファイルを削除をしないように使用される。

-f
 強制的に処理を実行する。一部では、処理を確認する問い合わせがあるが、それを無視して強制的に処理を実行させる。
-r
 ディレクトリをコピーする。cpコマンドは基本的にファイルをコピーするコマンドだが、これを付けるとディレクトリの中にある全てのファイル・ディレクトリをコピーできる。

 LinuxのようなUNIX系OSでは、一度削除したファイルは復活できないので使用する時は要注意。また、rmはファイルを削除するコマンドなのでディレクトリは削除できないので、ディレクトリの削除には後述するrmdirコマンドを使用する。

2.ディレクトリの操作

前提知識

特別なディレクトリ

Linuxでは、特別なディレクトリや、それを記号で表すものがある。以下がそれの代表的なもの。

カレントディレクトリ(.)

 現在いるディレクトリのこと。ファイル・ディレクトリ操作では、ドット(.)を使って表される。

親ディレクトリ(..)

 現在いるディレクトリの一階層上のこと。カレントディレクトリが/user/hostであれば、親ディレクトリは/userになる。

ホームディレクトリ

 ユーザーの作業開始位置となるディレクトリ。ログイン直後のユーザーは必ずホームディレクトリにいる。ファイルやディレクトリ操作ではチルダ(~)を使って表される。

ルートディレクトリ

 ディレクトリの最上位階層を表す。ファイル・ディレクトリ操作ではルート(/)を使って表される。

絶対パス指定と相対パス指定

 現在のカレントディレクトリが/user/localで/user/bin/xxxを指定するやり方は2通りある。

1./user/bin/xxx
 最上位のルートディレクトリからディレクトリ・ファイルを指定する方法が絶対パス指定。絶対パス指定は、どこのディレクトリにいても指定することができるが、記述が長くなることもある。

  1. ../bin/xxx  現在いるディレクトリの位置から見てパスを指定する方法が相対パス指定。相対パス指定は、現在のディレクトリが変わると指定できないが、現在の位置から近いディレクトリ指定の場合、記述が少なくて済む。

2-1.現在のディレクトリを表示(pwd)

 できること

・階層構造になっているディレクトリの、現在どこの位置にいるのかを表示することができる。

使い方

$ pwd
/home/hosts

/はディレクトリの区切りを表す記号。

2-2.ディレクトリの変更(cd)

 できること

・現在いるディレクトリを変更することができる。

使い方

cd [ディレクトリ名]

ディレクトリの指定方法は絶対パス、相対パスどちらでも可能。何も指定しない場合は、ホームディレクトリに移動する。

2-2.ディレクトリの作成(mkdir)

 

できること

 ・ディレクトリを作成することができる。

使い方

mkdir ディレクトリ名

dir1の下にdir2、その下にdir3を作成したい場合、

mkdir dir1
mkdir dir1/dir2
mkdir dir1/dir2/dir3

オプション

-p
指定されたディレクトリの上位ディレクトリも作成する。

-pオプションを使うと

mkdir -p dir1/dir2/dir3 

のように書くことができる。

2-3.ディレクトリの削除(rmdir)

できること

・ディレクトリを削除することができる。

使い方

rmdir ディレクトリ名

オプション

-p
指定した階層までのディレクトリを一括で削除する。

rmdirは、オプションを使用しない場合、最下層のディレクトリのみを削除する。ディレクトリの中身が入っていると削除はできない。ディレクトリの中にファイル・ディレクトリが入っている場合の削除は、rm -rコマンドを用いて行う。

3.ファイルの内容を表示

3-1.ファイルの内容を表示(cat)

できること

・ファイルの中身を確認することができる。

使い方

cat ファイル名
ファイルの内容を表示

オプション

-n
行番号を付加して表示する。

3-2.ページャを使った表示(more、less)

できること

・catで表示したページの行数が多すぎると表示されずに流れてしまう。(通常25行程度)多くの行があっても確認できるように画面制御を行い、途中でスクロールを止めることをページング機能という。それをこのコマンドで実現できる。

使い方

moreコマンドの場合
項目 内容
スペース 次のページへ進む
b 前の一画面へ戻る
f 次の一画面へ進む
/単語 単語の検索。nキーで検索結果をジャンプ
q ページャコマンドを終了(quit)する
lessコマンドの場合
項目 内容
スペース 次のページへ進む
b 前の一画面へ戻る
f 次の一画面へ進む
前の行へ進む
次の行へ進む
/単語 単語の検索。nキーで検索結果をジャンプ
q ページャコマンドを終了(quit)する

4.ファイルの検索

4-1.ファイル検索(find)

できること

・ファイルがどこのディレクトリにあるのか検索することができる。

使い方

find パス -name ファイル名

5.コマンドのパス

 今まで使用してきたコマンドはプログラムで、プログラムもファイルの一種。/binや/sbinと言ったプログラム用のディレクトリに配置されている。

5-1.コマンドのパスを表示(which)

 基本的にコマンドを実行する時、プログラムがどこのディレクトリに配置されているかを意識することはない。これは、PATHという環境変数にプログラムが配置されているディレクトリが設定されているから。whichコマンドをしようすると、PATH環境変数に含まれるディレクトリ配下に配置されているコマンドのパスを表示できる。

使い方

which コマンド名

コマンドが存在するディレクトリがPATH環境変数に含まれていないと、whichコマンドの結果はエラーになる。

6.ヘルプの使い方

 実行コマンドに対して--helpオプションなどをつけて実行することで、コマンドの実行に使えるオプションを調べることができる。

使い方

コマンド --help

7.マニュアルの使い方

man コマンド名

オプション

-k 単語
'単語'が含まれるエントリー一覧を出力する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

sys/cdefs.hがないときの対処

症状

Ubuntu18.04でC言語のコンパイル時に以下のエラーが出たときの対処方法をメモしておきます。

sys/cdefs.h: そのようなファイルやディレクトリはありません

対処

普通はlibc6-dev-i386をインストールすれば治るようです。

sudo apt install libc6-dev-i386

私の場合、libc6-dev-i386は既にインストールされていました。
libc6-devを再インストールすることで解決しました。

sudo apt install --reinstall libc6-dev

原因

/usr/include/sys/cdefs.h/usr/include/x86_64-linux-gnu/sys/cdefs.hへのシンボリックリンクになっています。
その/usr/include/x86_64-linux-gnu/sys/が存在しなかったことが原因でした。

おそらく、sysを除外したバックアップから復元したときにやってしまったようです。うっかりすぎますね。

参考文献

致命的なエラー:sys / cdefs.h:そのようなファイルまたはディレクトリはありません|

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux Command 纏め

ssh [option] hostname [cmd]

ssh : Secure Shell Protocol 、network protocolの中の一つで、
computer to computer のように ネットのようなpublic networkを通じてお互いに通信をする時
セキュリティー的に安全のため使うprotocol。
1.データ転送
2.遠隔制御

SSH Client -> SSH Protocol <= SSH Server

option コマンド内容
-i 秘密鍵ファイル(identity ファイル指定)
-l ログインユーザ名を指定
-p ポート番号を指定
-x X11の転送を有効化
-1 SSHのprotocol version1を使用
-2 SSHのprotocol version2を使用
-4 IPv4を使用

◆ls : folder/fileの一覧を表示
◆cd : folderの場所を移動
◆pwd : 現在のfolder位置を表示
◆cp : folder/file copy
◆mv : move
◆rm : remove
◆mkdir : make directory? folderを作成

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む