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 から提出せよ.