2018 年度 OSS リテラシー 3 : 第 10 回 サーバセットアップ (センサーとの連動)
はじめに
今回はラズパイの設定を修正して, サーバ sky.epi.it.matsue-ct.jp に送っていたのを 仮想サーバに送るように設定し直す.
以下ではラズパイと仮想マシンの両方に対してコマンドを打ち込むが, 以下のように区別をする.
ラズパイ => プロンプト ($, #) の前に "sensor" を付す 仮想マシン => プロンプト ($, #) の前に "vm" を付す
ラズパイでの設定
SD カードを再び書き込み可能にする
現在, ラズパイは overlayfs を用いて SD カードへの書き込みを抑制している (第7回資料). このままファイル編集を行ってしまうと, 再起動したときに設定が元に戻ってしまう. そのために, SD カードに再び書き込み可能な状態に戻す.
SD カードに書き込みする場合には, ルートのファイルシステムを rw (read write) でマウントし直して, 設定ファイル (/boot/config.txt) を元に戻す. 但し, 絶対パスが /mnt/boot-ro/config.txt になることに注意せよ.
sensor$ sudo mount -o remount,rw /mnt/boot-ro sensor$ sudo vi /mnt/boot-ro/config.txt # initramfs initrd.gz (末尾の命令をコメントアウトする) sensor$ sudo reboot
環境情報取得用のスクリプトの編集
GitHub からダウンロードして利用している環境情報取得用のスクリプトを編集し, 送り先のサーバと PHP スクリプトのパスを仮想マシンに変更する. 自分の固定 IP を設定すること.
sensor$ vi iotex-sensor/bin/monitoring ...(略)... # サーバ名 #server = "sky.epi.it.matsue-ct.jp" #php = "http://#{server}/~sugiyama/test/monitoring.php" server = "10.176.0.XXX" php = "http://#{server}/~hogehoge/php/monitoring.php" ...(略)...
zabbix の設定変更
zabbix-agent の設定を変更し, データの送り先のサーバを仮想マシンに変更する. 自分の固定 IP を設定すること.
sensor$ sudo vi /etc/zabbix/zabbix_agentd.conf ...(略)... #Server=sky.epi.it.matsue-ct.jp Server=10.176.0.XXX ...(略)... #ServerActive=sky.epi.it.matsue-ct.jp ServerActive=10.176.0.XXX ...(略)...
crontab の確認
crontab が以下のようになっているか確認しておく. なっていなかったら修正する.
$ crontab -e # m h dom mon dow command MAILTO="" PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin @reboot ./iotex-sensor/bin/monitoring
再び overlayfs を有効にする.
再び SD カードに書き込みできない状態に戻すには, 設定ファイル (/boot/config.txt) の末尾の命令を有効にして再起動する.
sensor$ sudo vi /boot/config.txt initramfs initrd.gz (コメントアウトを外す) sensor$ sudo reboot
再起動後の確認
overlayfs が有効になっていることを確認するために, df コマンドを実行する. 以下のようにファイルシステムとして "overlay" が存在すれば良い.
sensor$ df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 udev 464112 0 464112 0% /dev tmpfs 94960 2840 92120 3% /run /dev/mmcblk0p2 14777128 5057392 8949384 37% /mnt/root-ro tmpfs 474788 27520 447268 6% /mnt/root-rw tmpfs 474788 0 474788 0% /mnt/boot-rw /dev/mmcblk0p1 42708 33582 9126 79% /mnt/boot-ro /mnt/boot-ro 42708 33582 9126 79% /mnt/boot-ro2 overlay 474788 27520 447268 6% / <--ココ overlay 474788 0 474788 0% /boot <--ココ tmpfs 474788 0 474788 0% /dev/shm tmpfs 5120 4 5116 1% /run/lock tmpfs 474788 0 474788 0% /sys/fs/cgroup tmpfs 94956 0 94956 0% /run/user/109 tmpfs 94956 0 94956 0% /run/user/1001
また, 環境情報データ送信用のスクリプトが動いているか確認する. 第7回資料 で crontab の設定がきちんと行われていれば, 再起動時に ./iotex-sensor/bin/monitoring が自動的に実行されているはずである. ラズパイ上で動いているプロセスを確認するには ps コマンドを利用する.
sensor$ ps aux| grep monitoring sugiyama 515 0.0 0.0 1900 376 ? Ss 19:54 0:00 /bin/sh -c ./iotex-sensor/bin/monitoring sugiyama 517 0.1 0.9 28028 8784 ? Sl 19:54 0:00 ruby ./iotex-sensor/bin/monitoring sugiyama 1467 0.0 0.0 3852 548 pts/0 S+ 20:02 0:00 grep --color=auto monitoring
仮想サーバでの設定
環境情報データの受け取りの確認
まず Web サーバのログを確認し, ラズパイからのアクセスがあることを確認する. tail -f コマンドを使うことで, ファイルに新たなログが追加されるたびに標準出力が更新される. 数分間見ていれば 1 分間隔でログが増えていくことがわかる. tail -f コマンドを終了させるときは Ctrl-C (コントールキーを押しながら c キーを押す) とする.
vm$ sudo -s vm# tail -f /var/log/apache2/access.log ...(略)... 10.52.2.36 - - [18/Dec/2018:20:15:01 +0900] "GET /~hogehoge/php/monitoring.php?hostname=j52&time=2018/12/18T20:15:00&experiment_id=mon&essid=&temp=22.353333333333335&humi=35.318565163500004&dp=6.267685202446666 HTTP/1.1" 200 579 "-" "curl/7.52.1" 10.52.2.36 - - [18/Dec/2018:20:16:00 +0900] "GET /~hogehoge/php/monitoring.php?hostname=j52&time=2018/12/18T20:16:00&experiment_id=mon&essid=&temp=22.17&humi=35.73597459725&dp=6.276913743041666 HTTP/1.1" 200 579 "-" "curl/7.52.1" 10.52.2.36 - - [18/Dec/2018:20:17:00 +0900] "GET /~hogehoge/php/monitoring.php?hostname=j52&time=2018/12/18T20:17:00&experiment_id=mon&essid=&temp=22.2&humi=35.727903358750005&dp=6.300135280706667 HTTP/1.1" 200 579 "-" "curl/7.52.1" 10.52.2.36 - - [18/Dec/2018:20:18:00 +0900] "GET /~hogehoge/php/monitoring.php?hostname=j52&time=2018/12/18T20:18:00&experiment_id=mon&essid=&temp=22.25166666666667&humi=35.738378330833335&dp=6.350015274005 HTTP/1.1" 200 579 "-" "curl/7.52.1"
仮想サーバ上で MySQL に接続して, ラズパイから送られてきたデータがデータベースに登録されているか確認する.
vm$ mysql -u hogehoge -p Enter password: (適宜入力) ...(略)... MariaDB [(none)]> use iotex Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [iotex]> select * from iotex2018 where time > '2018-12-18'; +----------+---------------------+-------+-------+-------+-------+-------+-------+------+------+------+---------+---------+------+---------+------+---------+---------+ | hostname | time | temp | temp2 | temp3 | humi | humi2 | humi3 | dp | dp2 | dp3 | bmptemp | dietemp | lux | objtemp | pres | winddir | windvel | +----------+---------------------+-------+-------+-------+-------+-------+-------+------+------+------+---------+---------+------+---------+------+---------+---------+ | j52 | 2018-12-18 19:57:00 | 21.74 | NULL | NULL | 36.16 | NULL | NULL | 6.07 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | | j52 | 2018-12-18 19:58:00 | 21.96 | NULL | NULL | 35.86 | NULL | NULL | 6.14 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | | j52 | 2018-12-18 19:59:00 | 21.87 | NULL | NULL | 35.68 | NULL | NULL | 5.99 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | | j52 | 2018-12-18 20:00:00 | 21.85 | NULL | NULL | 35.75 | NULL | NULL | 6 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | +----------+---------------------+-------+-------+-------+-------+-------+-------+------+------+------+---------+---------+------+---------+------+---------+---------+
しばらく時間を空けてから再び同じ SQL を実行すると, データ数が増えていること, データ間隔が 1 分おきであることが確認できる.
MariaDB [iotex]> select * from iotex2018 where time > '2018-12-18'; +----------+---------------------+-------+-------+-------+-------+-------+-------+------+------+------+---------+---------+------+---------+------+---------+---------+ | hostname | time | temp | temp2 | temp3 | humi | humi2 | humi3 | dp | dp2 | dp3 | bmptemp | dietemp | lux | objtemp | pres | winddir | windvel | +----------+---------------------+-------+-------+-------+-------+-------+-------+------+------+------+---------+---------+------+---------+------+---------+---------+ | j52 | 2018-12-18 19:57:00 | 21.74 | NULL | NULL | 36.16 | NULL | NULL | 6.07 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | | j52 | 2018-12-18 19:58:00 | 21.96 | NULL | NULL | 35.86 | NULL | NULL | 6.14 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | | j52 | 2018-12-18 19:59:00 | 21.87 | NULL | NULL | 35.68 | NULL | NULL | 5.99 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | | j52 | 2018-12-18 20:00:00 | 21.85 | NULL | NULL | 35.75 | NULL | NULL | 6 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | | j52 | 2018-12-18 20:01:00 | 22.16 | NULL | NULL | 35.32 | NULL | NULL | 6.09 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | | j52 | 2018-12-18 20:02:00 | 22 | NULL | NULL | 35.69 | NULL | NULL | 6.11 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | | j52 | 2018-12-18 20:03:00 | 21.96 | NULL | NULL | 35.9 | NULL | NULL | 6.16 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | +----------+---------------------+-------+-------+-------+-------+-------+-------+------+------+------+---------+---------+------+---------+------+---------+---------+
環境情報の可視化
grafana を用いてラズパイから送られてきた環境情報を可視化する. ブラウザで 10.176.0.XXX:3000 (仮想マシンの 3000 番ポート)にアクセスし, ダッシュボードを作成する. 作成したダッシュボードにおいて, 刻々と表示されるデータが増えることを確認すること.
また, SQL を作成するときの注意としては, SELECT で time でなく UNIX_TIMESTAMP(time) とすること. UNIX_TIMESTAMP 関数を使わないとうまく可視化できない.
なお, バージョンによっては edit したときに, "Query Builder" が起動することがある. そのままだと使いにくいので, "Edit SQL" をクリックすると良い.
-->>
ラズパイのホスト名の設定 [方法 1]
ラズパイは DHCP で接続しているために, IP アドレスが変わることがある. zabbix で監視する際, ホストを IP アドレスで識別すると継続した監視が困難となる. そこで, /etc/hosts にラズパイの名前引きの設定をしておく.
ラズパイの IP アドレスは, Web サーバ (apache2) のログ, もしくは データベース (mysql) の iotex2018_host テーブルに保管されている.
ここでは Web サーバのログからラズパイの IP アドレスを調べて, それを /etc/hosts に登録するためのスクリプトを作成する. 例えば, 以下のように monitoring.php へのアクセスログを抽出すると, ラズパイの IP アドレスが判定できる.
vm$ sudo -s vm# grep monitoring.php /var/log/apache2/access.log | tail -n 1 10.52.2.36 - - [18/Dec/2018:21:33:00 +0900] "GET /~hogehoge/php/monitoring.php?hostname=j52&time=2018/12/18T21:33:00&experiment_id=mon&essid=&temp=21.448333333333334&humi=34.31812194616666&dp=5.055583016071667 HTTP/1.1" 200 579 "-" "curl/7.52.1"
さらに sed コマンドを使うと, 先頭に書かれた IP アドレスだけを抽出できる. sed コマンドでは正規表現を使って IP を抽出している (正規表現の書き方は復習しておくこと).
vm# grep monitoring.php /var/log/apache2/access.log | tail -n 1 | sed -r 's/^.*\s*(10\.[0-9]+\.[0-9]+\.[0-9]+)\s-\s-.*$/\1/' 10.52.2.36
以下のようなシェルスクリプトを作成すると, /etc/hosts にラズパイの IP を追加することができる. jxxx の部分は学生番号以外にしておくこと (仮想マシンと同じホスト名にすると上手くいかない).
vm# vi /root/mkhosts.sh #!/bin/bash ip=`grep monitoring.php /var/log/apache2/access.log | tail -n 1 | sed -r 's/^.*\s*(10\.[0-9]+\.[0-9]+\.[0-9]+)\s-\s-.*$/\1/'` HOST="/etc/hosts" ORIG="/etc/hosts.bk" # オリジナルの保管 if [ -e $ORIG ];then cp $ORIG $HOST else cp $HOST $ORIG fi # IP を追加 echo "$ip jxxxx.epi.it.matsue-ct.jp jxxxx" >> $HOST
作成した後, 登録したホスト名で ping が打てることを確認せよ. DNS サーバに登録していなくても, /etc/hosts に登録することで, ローカルに名前引きができることが確かめられる.
vm# ping jxxxx PING jxxxx.epi.it.matsue-ct.jp (10.52.2.36) 56(84) bytes of data. 64 bytes from jxxxx.epi.it.matsue-ct.jp (10.52.2.36): icmp_seq=1 ttl=62 time=0.458 ms 64 bytes from jxxxx.epi.it.matsue-ct.jp (10.52.2.36): icmp_seq=2 ttl=62 time=0.532 ms 64 bytes from jxxxx.epi.it.matsue-ct.jp (10.52.2.36): icmp_seq=3 ttl=62 time=0.618 ms
crontab にこのシェルスクリプトを登録して 10 分おきに実行するようにしておくと良い.
vm# crontab -e PATH=/usr/bin:/bin:/usr/local/bin:/usr/sbin:/sbin */10 * * * * sh /root/mkhosts.sh
/etc/hosts ファイルのタイムスタンプを閲覧し (ls -l), 10 分おきに更新されていることを確かめよ.
[必須でない] ラズパイのホスト名の設定 [方法 2]
前述の apache2 のログから IP アドレスを探して /etc/hosts を書き直すやり方では, 複数のセンサーノード (ラズパイ) が存在する場合には有効に働かない. データベース iotex に接続し, iotex2018_hosts よりラズパイ の IP を取得して /etc/hosts を作成する方が良い. そこで, iotex2018_hosts テーブルから /etc/hosts を更新する ruby スクリプトを作成する.
以下のようにスクリプトを作成し, 前述の方法 1 と同様に crontab で定期的に実行すれば, ラズパイのホスト名を設定することができる.
インストール vm# apt-get update; apt-get install ruby-mysql2 ruby スクリプトの例 #!/usr/bin/env ruby # coding: utf-8 require "mysql2" require "yaml" # 設定ファイルの読み込み mydb = YAML.load_file("/home/hogehoge/conf/db_info.yml") # データベースへの接続 client = client = Mysql2::Client.new(:username => mydb["USER"], :password => mydb["PASS"], :database => mydb["DBNM"]) # SQL 文の実行 result = client.query("select ip,hostname from iotex2018_hosts") result.each do |row| puts "#{row["ip"]} : #{row["hostname"]}" end 設定情報 (/home/hogehoge/conf/db_info.yml) SERV: "localhost" USER: "hogehoge" PASS: "......" (適宜入力) DBNM: "iotex"
zabbix の設定
zabbix の画面 (http://10.176.0.XXX/zabbix/) を開く. 「設定」-> 「ホスト」から自分のラズパイを選択し, 「エージェントのインターフェイス」を IP アドレスではなく DNS 名に変更する. 接続方法も DNS をクリックすること.
次に, ラズパイ用のスクリーンを用意する. まずは初期設定を行う.
次に, 作成したスクリーンを選択し, そこにグラフを嵌め込んでいく. リソースとして「グラフ」や「シンプルグラフ」を使うと良いだろう. ダイナミックアイテムのチェックボックスにチェックを入れておくと良い (複数のホストに対して同じスクリーンを使えるようになる).
最終的には以下のようなスクリーンを作ると良い.
ラズパイの設置
- ラズパイを突っ張り棒にくっつけ, 教室に設置すること.
- データが grafana, zabbix 上で更新されていることを確認すること.
- 設置する教室としては, 情報処理演習室, 5 棟 3 階のデータベース実験室を使うこと. 他の部屋に設置することも推奨するが, その場合はラズパイの無線設定を変更しないといけないことに注意せよ.
- 設置が終われば, 冬休み中に自動的に環境情報データが取得されることになる. このデータを冬休み開けの授業で使うので, 必ず 1/8 (火) までに課題を終えておくこと.
課題
- 仮想マシン上で grafana でダッシュボードを作成し, そのスナップショットを wbt から提出せよ.
- データが更新されていることが示すために, スナップショットを取った後, 10 分程度の時間をおいて, 再度スナップショットを取ること. グラフの横軸は数時間程度にしておくこと.
- zabbix のスクリーンを作成し, ラズパイのデータを示すこと. そのスナップショットを wbt から提出せよ.