#author("2018-05-20T21:50:56+09:00","default:nowsky","nowsky") #author("2018-05-20T21:51:25+09:00","default:nowsky","nowsky") *Raspbian [#a9c0ad00] -[[Raspbian:+https://www.raspberrypi.org/downloads/raspbian/]] Raspberry Pi用としてメンテナンスされているDebian系ディストリビューションの一つ。 Debian系なのでAPT(apt-get)を利用してパッケージをインストールする事が出来る。 初期設定を簡素化する為にRaspbian特有のシェルスクリプトが準備されており、 Linux初心者でも楽に最低限のOS設定をする事が出来るようになっている。 ~ *イメージバックアップ [#b96f230c] Raspberry PiではSDカードにOSをインストールする事を前提としている為、 ddコマンドによるイメージバックアップ・リストアが簡単に実行できるが、 小さい容量のSDカードへリストアすると、SDカード容量不足でddが欠落してしまう。 よって、Raspberry Pi(Raspbian)では専用のOSコピー(バックアップ)コマンドが用意されており、 こちらを利用する方が正確にコピーを取得する事が出来る。 #region(&color(#ff0000){rpi-clone};) -&font(b){参考サイト}; [[billw2/rpi-clone:+https://github.com/billw2/rpi-clone]] [[Raspberry PiでIoTなシステム開発:+http://www.homu.net/raspberry-pi%E3%81%A7iot%E3%81%AA%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E9%96%8B%E7%99%BA%EF%BC%9Asd%E3%82%AB%E3%83%BC%E3%83%89%E3%81%AE%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%AFrpi/]] -&font(b){コマンド実行}; バックアップ取得前に、コピー先SDカードをRaspberry Piに接続しておく。 今回はSDカードが、&color(#ff0000){"/dev/sda"};に接続されているとする。 # git clone https://github.com/billw2/rpi-clone # ./rpi-clone sda -f --- Do you want to initialize the destination disk /dev/sda? (yes/no): "yes" You may enter a label for the destination rootfs /dev/sda2: [Enter] Final check, is it Ok to proceed with the clone (yes/no)?: "yes" Starting the filesystem rsync to sda (This may take several minutes)... --- Hit Enter when ready to unmount the /dev/sda partitions... [Enter] unmounting /mnt/clone/boot unmounting /mnt/clone #endregion ~ *Crystal Signal Pi [#gfee968c] Raspberry Piでパトライト(回転灯)を実装する追加モジュール。 (株)インフィニットループが開発・販売をしており、[[amazon:+https://www.amazon.co.jp/dp/B06XW4C8YD]]で購入出来る。 APIも用意されている為、監視システムからパトライト代わりに光らせる事も可能。 ~ &size(16){&font(b){1. インストール};}; 詳細は[[オフィシャルページ:+http://crystal-signal.com/]]のマニュアル参照。 インストール先やapacheのスクリプト設定は固定となるが、インストール用スクリプトが用意されている。 インストールにはroot権限が必要なのでrootユーザか、sudoでスクリプトを実行する。 スクリプト実行時はシェルをbashにする必要があるので、bash以外を利用している人は注意する。 # curl -O https://raw.githubusercontent.com/infiniteloop-inc/crystal-signal/master/install.sh # ./install.sh ~ &size(16){&font(b){2. アップデート};}; Crystal Signal Piのミドルウェアアップデートもスクリプトから実行する。 OSアップデートと同時にCrystal Signal Piのミドルウェアもアップデートする場合、 下記のオプションを[fullupdate]に変更して実行する # curl -O https://raw.githubusercontent.com/infiniteloop-inc/crystal-signal/master/install.sh # ./install.sh update ~ &size(16){&font(b){3. スクリプト修正};}; apacheのListenを[0.0.0.0]からIPアドレス指定に変更している場合、 スクリプトからAPIを叩けなくなり、結果としてCrystal Signal Piのアラート停止ボタンも使えなくなる。 停止ボタンを使えるようにするには、下記コマンドを実行してスクリプトを修正する。 ・apacheのListenを192.168.0.1にしている場合 --- # cd /var/lib/crystal-signal/scripts/ # mv Ack.sh Ack.sh- # mv AckNewestOnly.sh AckNewestOnly.sh- # cat Ack.sh- | sed -e 's/localhost/192.168.0.1/g' > Ack.sh # cat AckNewestOnly.sh- | sed -e 's/localhost/192.168.0.1/g' > AckNewestOnly.sh # chmod 755 Ack.sh AckNewestOnly.sh # rm Ack.sh- AckNewestOnly.sh- ~ &size(16){&font(b){4. APIスクリプト};}; Crystal Signal PiはAPIを備えているので、スクリプトを用意すればパトライト代わりに光らせる事が出来る。 参考までに作成したスクリプトを掲載。 バーストした時にLEDへ負荷が掛からないように、一度APIを叩くと1分間はAPIを叩けないようにしてみた。 ~ #region(&color(#ff0000){スクリプト [zabbix_csp.pl]};) #!/usr/bin/perl use strict; use warnings; use utf8; ### ### Const variable ### my $OPT_DEBUG = 0; my $OPT_FORCE = 0; my $OPT_LEVEL = 0; my $OPT_HELP = 0; my @LINE; my $DATE = time; my $DELTA = 0; my $LOCK = "/tmp/zabbix_csp"; my $INTERVAL = 60; my $BIN_CURL = "/usr/bin/curl"; my $OPT_CURL = "-o /dev/null --silent"; my $PROT = "http://"; my $FQDN = "192.168.0.1"; my $TYPE = 0; my $API = 0; my %ALERT; $ALERT{'clear'} = '?ack=1&info=CLEAR'; $ALERT{'information'} = '?color=000,128,000&mode=1&repeat=5&period=1000&info=INFORMATION'; $ALERT{'warning'} = '?color=064,064,000&mode=1&repeat=5&period=1000&info=WARNING'; $ALERT{'average'} = '?color=064,032,000&mode=1&repeat=5&period=1000&info=AVERAGE'; $ALERT{'high'} = '?color=064,000,000&mode=1&repeat=5&period=1000&info=HIGH'; $ALERT{'disaster'} = '?color=128,000,000&mode=1&repeat=5&period=1000&info=DISASTER'; ### ### Main program ### ## Set of execution options ## foreach my $tmp_OPT(@ARGV){ # Default value if(($tmp_OPT eq '-d')||($tmp_OPT eq '--debug')){ $OPT_DEBUG++; }; if(($tmp_OPT eq '-f')||($tmp_OPT eq '--force')){ $OPT_FORCE++; }; if(($tmp_OPT eq '-h')||($tmp_OPT eq '--help' )){ $OPT_HELP++; }; # Alert type if(($tmp_OPT =~ '^-l=')||($tmp_OPT =~ '^--level=')){ $OPT_LEVEL++; $tmp_OPT =~ s/^-l\=//; $tmp_OPT =~ s/^--level=\=//; $TYPE = lc($tmp_OPT); } } if($OPT_DEBUG){ print "VALUE::OPT_DEBUG $OPT_DEBUG\n"; print "VALUE::OPT_FORCE $OPT_FORCE\n"; print "VALUE::OPT_LEVEL $OPT_LEVEL\n"; print "VALUE::OPT_HELP $OPT_HELP\n"; print "-----\n"; } ## Print script help ## if($OPT_HELP){ print "usage: zabbix_csp [-l=\"AlertType\"] [-d DebugMode]\n"; print " [-f ForceExecute] [-h OutputHelp]\n"; print "examp: zabbix_csp -l=warning\n"; print " zabbix_csp -l=warning -d\n"; print " zabbix_csp -l=warning -f\n"; exit 0; } ## Check last log ## # Read log if(-f $LOCK){ open(READ, "$LOCK"); foreach(<READ>){ @LINE = split(/,/, $_); } close(READ); # Get of delta $DELTA = $DATE-$LINE[0]; if($OPT_DEBUG){ print "VALUE::TYPE $TYPE\n"; print "VALUE::LINE(OLD) $LINE[0]\n"; print "VALUE::DATE(NEW) $DATE\n"; print "VALUE::INTERVAL $INTERVAL\n"; print "VALUE::DELTA $DELTA\n"; print "-----\n"; } if(!$OPT_FORCE&&($DELTA<$INTERVAL)){ exit 0; } } # Write log open(WRITE, "> $LOCK"); print WRITE "$DATE,$TYPE"; close(WRITE); ## Running the API ## if(($OPT_LEVEL)&&(exists($ALERT{$TYPE}))){ $API = $PROT.$FQDN."/ctrl/".$ALERT{$TYPE}; if($OPT_DEBUG){ print "VALUE::API $API\n"; print "-----\n"; }else{ system("$BIN_CURL $OPT_CURL \"$API\""); } }else{ print "ERROR:: Hash key does not exist.\n"; exit 1; } #endregion ~ #region(&color(#ff0000){実行方法};) ・レベル4(重度の障害)でスクリプト実行 --- # zabbix_csp.pl -l=HIGH ・LED消灯(停止)の実行 --- # zabbix_csp.pl -l=CLEAR ・1分間インターバルを無視して強制実行 --- # zabbix_csp.pl -l=HIGH -f ・変数表示などのデバッグモード --- # zabbix_csp.pl -l=HIGH -d #endregion ~ *乱数生成器 [#d7d7ad6d] *乱数生成器 [#f4bf86d8] 乱数を取得する際に使用する&font(b){/dev/random};は、 デバイスドライバ等から収集した乱数エントロピーが溜まらないとReadLock状態になる。 Raspberry Piはハードウェアの乱数生成器を搭載しているので、 エントロピープール参照元をハードウェアに設定する事でエントロピーを確保出来る。 ・Raspberry Pi 2 Model B --- # modprobe bcm2708-rng # echo "bcm2708-rng" >> /etc/modules # apt-get install rng-tools # systemctl enable rng-tools.service # systemctl start rng-tools.service # systemctl enable rng-tools # systemctl start rng-tools ・Raspberry Pi 3 Model B --- # modprobe bcm2835-rng # echo "bcm2835-rng" >> /etc/modules # apt-get install rng-tools # systemctl enable rng-tools.service # systemctl start rng-tools.service # systemctl enable rng-tools # systemctl start rng-tools ・エントロピープールの確認 --- # cat /proc/sys/kernel/random/entropy_avail