Raspbian†
Raspberry Pi用としてメンテナンスされているDebian系ディストリビューションの一つ。
Debian系なのでAPT(apt-get)を利用してパッケージをインストールする事が出来る。
初期設定を簡素化する為にRaspbian特有のシェルスクリプトが準備されており、
Linux初心者でも楽に最低限のOS設定をする事が出来るようになっている。
イメージバックアップ†
Raspberry PiではSDカードにOSをインストールする事を前提としている為、
ddコマンドによるイメージバックアップ・リストアが簡単に実行できるが、
小さい容量のSDカードへリストアすると、SDカード容量不足でddが欠落してしまう。
よって、Raspberry Pi(Raspbian)では専用のOSコピー(バックアップ)コマンドが用意されており、
こちらを利用する方が正確にコピーを取得する事が出来る。
+
| | rpi-clone
|
- 参考サイト
billw2/rpi-clone
Raspberry PiでIoTなシステム開発
- コマンド実行
バックアップ取得前に、コピー先SDカードをRaspberry Piに接続しておく。
今回はSDカードが、"/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
|
Crystal Signal Pi†
Raspberry Piでパトライト(回転灯)を実装する追加モジュール。
(株)インフィニットループが開発・販売をしており、amazonで購入出来る。
APIも用意されている為、監視システムからパトライト代わりに光らせる事も可能。
1. インストール
詳細はオフィシャルページのマニュアル参照。
インストール先やapacheのスクリプト設定は固定となるが、インストール用スクリプトが用意されている。
インストールにはroot権限が必要なのでrootユーザか、sudoでスクリプトを実行する。
スクリプト実行時はシェルをbashにする必要があるので、bash以外を利用している人は注意する。
# curl -O https://raw.githubusercontent.com/infiniteloop-inc/crystal-signal/master/install.sh
# ./install.sh
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
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-
4. APIスクリプト
Crystal Signal PiはAPIを備えているので、スクリプトを用意すればパトライト代わりに光らせる事が出来る。
参考までに作成したスクリプトを掲載。
バーストした時にLEDへ負荷が掛からないように、一度APIを叩くと1分間はAPIを叩けないようにしてみた。
+
| | スクリプト [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;
}
|
+
| | 実行方法
|
・レベル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
|
乱数生成器†
乱数を取得する際に使用する/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
# 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
# systemctl start rng-tools
・エントロピープールの確認
---
# cat /proc/sys/kernel/random/entropy_avail