宇宙一わかりにくいラズパイ入門(仮称)⑤
宇宙一わかりにくいラズパイ入門(仮称)④の続きです。
宇宙一わかりにくいラズパイ入門(仮称)⑤では、キーワードは「感謝の気持ち」です。サービスの起動/停止について広く浅く、ちょっと深いところまで理解しましょう。
宇宙一わかりにくいラズパイ入門(仮称)の趣旨
Raspberry Pi2 Model B に Raspbian(Jessie)をインストールして「IoT×Blockchain までやってしまうよ!」な企画を開始しました。はっきり言って「超絶わかりにくい」ので良質な書籍やブログを読むことをオススメします。皆様の貴重なお時間をムダにするのは本懐ではありません。興味がある方だけ読んでみてください(にっこり)
サービスとは
ラズパイ起動後、インストール済みのパッケージ(ソフトウェア)が起動しているのか知りたいですよね。Windowsで言うなら「スタートアップ機能」です。厳密にはスタートアップ機能以外にもあるのですが「イメージできればそれでいい」が宇宙一わかりにくい(略)のスタイルです。まず、ラズパイ起動後はどうなっているんだろう?を確認しましょう。 dmesg コマンドです。ここでは grep コマンドで一部を表示させてみましょう。
# dmesgコマンドで、systemdを検索 pi@raspberrypi:~$ dmesg | grep systemd [ 2.767398] random: systemd urandom read with 72 bits of entropy available [ 2.785582] systemd[1]: systemd 215 running in system mode. (+PAM +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ -SECCOMP -APPARMOR) [ 2.805007] systemd[1]: Detected architecture 'arm'. [ 3.077401] systemd[1]: Inserted module 'ipv6' [ 3.095782] systemd[1]: Set hostname to <raspberrypi>. [ 4.030930] systemd[1]: Starting Forward Password Requests to Wall Directory Watch. [ 4.045082] systemd[1]: Started Forward Password Requests to Wall Directory Watch. [ 4.058533] systemd[1]: Expecting device dev-ttyAMA0.device... [ 4.077060] systemd[1]: Starting Remote File Systems (Pre). [ 4.095108] systemd[1]: Reached target Remote File Systems (Pre). [ 4.107037] systemd[1]: Starting Encrypted Volumes. [ 4.124265] systemd[1]: Reached target Encrypted Volumes. [ 4.135587] systemd[1]: Starting Arbitrary Executable File Formats File System Automount Point. [ 4.157653] systemd[1]: Set up automount Arbitrary Executable File Formats File System Automount Point. (略) # dmesgコマンドで、systemdの検索結果数を把握 pi@raspberrypi:~$ dmesg | grep systemd | wc -l 72
なぜ、systemd のみ表示させたのでしょうか?よく見ると「Starting」とか「Started」と記録(ログ)されているでしょう?それは皆様がこれからインストールするパッケージ、例えばホームページを公開するためには必要なWebサーバー(e.g. ApacheやNginx)をラズパイ起動時に自動起動するかどうかを制御/確認するためです。せっかく、ラズパイ起動したのに、いちいち手動起動させるなんてナンセンスですね。そして、dmesg コマンドは Raspbian(Jessie) の重要な情報を得るのに大切なコマンドです。覚えておきましょう。
systemdをもっとわかりすく
systemd の検索結果だけでも72ありましたし、よくわからないという方も多いでしょう。もっと見やすくできないでしょうか?まずは、Raspbian(Jessie) でデフォルトに組み込まれている insserv コマンドを実行しましょう。
# insservコマンド pi@raspberrypi:~$ insserv -s K:06:0 6:networking K:07:0 6:umountfs K:01:0 6:urandom K:01:0 1 6:avahi-daemon K:04:0 6:umountnfs.sh K:02:0 6:sendsigs K:03:0 1 6:rsyslog K:08:0 6:umountroot K:09:0:halt K:09:6:reboot (中略) S:17:S:raspi-config S:11:S:udev-finish S:08:S:checkroot-bootclean.sh S:07:S:checkfs.sh S:11:S:procps S:01:2 3 4 5:sudo
reboot コマンドや raspi-config コマンドが使えるというのがわかります。しかし、ちょっとわかりにくいですよね。では sysv-rc-conf というパッケージをインストールしてあげましょう。
# sysv-rc-confをインスール pi@raspberrypi:~$ sudo apt-get install -y sysv-rc-conf # 表示 pi@raspberrypi:~$ sysv-rc-conf --list alsa-utils 0:off 1:on 6:off S:on avahi-daemon 0:off 1:off 2:on 3:on 4:on 5:on 6:off bootlogs 1:on 2:on 3:on 4:on 5:on (中略) umountroot 0:off 6:off urandom 0:off 6:off S:on x11-common S:on # グラフィカルモードで表示する場合 pi@raspberrypi:~$ sudo sysv-rc-conf
かなり見やすくなってきました。しかし、まだまだ見にくい方も多いかもしれません。そして自動起動しているかどうかを示しているランレベル(2~5)の「on」に色があると嬉しいですよね。そのためには chkconfig というパッケージをインストールしてがあげましょう。CentOS 6.x 以下に慣れている方にはお決まりのコマンドです。「古い」とは言わず、かなり見やすくなるので宇宙一わかりにくい(略)ではオススメします。
# chkconfigをインスール pi@raspberrypi:~$ sudo apt-get install -y chkconfig # 表示 pi@raspberrypi:~$ chkconfig --list
「on」が緑色になって見やすいですね。例えば、障害時にパッと見るには chkconfig が一番かと思います。sysv-rc-con と chkconfig の「両刀使い」ですとサービス管理が楽かもしれません。insserv は敷居が高いですが覚えておいて損はないでしょう。Raspbian(Jessie) インストール後、すぐに使えるコマンドですからね。
systemd(systemctlコマンド)を触ってみよう
systemctl コマンドは Raspbian(Jessie) 以外のCentOS 7.x でも使えるコマンドですので「systemctl使い」になると良いでしょう。まずは Nginx というパッケージをインストールしてから触ってみましょうか。使わなければアンインストールすれば良いだけですね。ちなみに、アンインストールにも宇宙一わかりにくい(略)ならではのチップス(tips)があります。
# Nginxのインストール pi@raspberrypi:~$ sudo apt-get install -y nginx # サービスの確認 pi@raspberrypi:~$ systemctl status nginx ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled) Active: active (running) since Wed 2016-03-09 11:44:09 JST; 2min 32s ago Main PID: 1316 (nginx) CGroup: /system.slice/nginx.service tq1316 nginx: master process /usr/sbin/nginx -g daemon on; master_process on tq1317 nginx: worker process tq1318 nginx: worker process tq1319 nginx: worker process mq1320 nginx: worker process
active (running)が確認できますね。そして、5つのプロセス(process)が動いていることがわかるでしょう。実は、プロセス確認は別のコマンドでもできます。ちょっとやってみましょう。
# psコマンドを使い、grepでnginxを検索するけど、grep文字は除く ps -ef | grep nginx | grep -v grep root 1945 1 0 14:36 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; www-data 1946 1945 0 14:36 ? 00:00:00 nginx: worker process www-data 1947 1945 0 14:36 ? 00:00:00 nginx: worker process www-data 1948 1945 0 14:36 ? 00:00:00 nginx: worker process www-data 1949 1945 0 14:36 ? 00:00:00 nginx: worker process
ほら、5つのプロセスが確認できますね。systemctl コマンドは ps コマンドの役割も担います。便利ですね。では、いよいよサービス起動/停止です。
# サービスの停止 pi@raspberrypi:~$ sudo systemctl stop nginx # サービスの確認(inactive (dead)を確認) # オプション「-l」はプロセスを非表示させます。 pi@raspberrypi:~$ systemctl status nginx -l ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled) Active: inactive (dead) since Wed 2016-03-09 11:47:30 JST; 3s ago Process: 1373 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS) Main PID: 1316 (code=exited, status=0/SUCCESS) # サービスの起動 pi@raspberrypi:~$ sudo systemctl start nginx # サービスの確認(active (running)を確認) pi@raspberrypi:~$ systemctl status nginx -l ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled) Active: active (running) since Wed 2016-03-09 11:48:04 JST; 3s ago Process: 1373 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS) Process: 1395 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 1392 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 1397 (nginx)
せっかく、Nginx をインストールしたのですからブラウザーで開いてみましょうか。プライベートIPアドレスを ifconfig コマンドで確認し、アクセスしましょう。
ホームページが表示されるとラズパイを動かしているのが実感できますね。ワクワクします。そして感謝の気持ちです。世の中のオッサン大人の方によく言われると思いますよね。はっきり言って「ウザイ」と思うかもしれません。しかし、世界中で使われているパッケージでは「Thank you for using xxx.」と書かれている場合が多いのです。素敵ですよね。そんな世界と同じ考えと思えば良いだけなんですね。
他の方法もあるよ
何がなんでも「systemctl使い」になる必要もありません。いろいろな方法があるので少し紹介しましょう。
serviceコマンドだよ
# サービスの停止 pi@raspberrypi:~$ sudo service nginx stop # サービスの停止確認 pi@raspberrypi:~$ service nginx status -l ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled) Active: inactive (dead) since Wed 2016-03-09 17:18:44 JST; 12s ago Process: 2324 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS) Process: 2270 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 2268 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 2272 (code=exited, status=0/SUCCESS) # サービスの起動 pi@raspberrypi:~$ sudo service nginx start # サービスの起動確認 pi@raspberrypi:~$ service nginx status ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled) Active: active (running) since Wed 2016-03-09 17:19:03 JST; 2s ago Process: 2324 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS) Process: 2372 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 2370 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 2374 (nginx) CGroup: /system.slice/nginx.service tq2374 nginx: master process /usr/sbin/nginx -g daemon on; master_... tq2375 nginx: worker process tq2376 nginx: worker process tq2377 nginx: worker process mq2378 nginx: worker process
/etc/init.dだよ
# サービスの停止 pi@raspberrypi:~$ sudo /etc/init.d/nginx stop Stopping nginx (via systemctl): nginx.service. # サービスの停止確認 pi@raspberrypi:~$ /etc/init.d/nginx status ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled) Active: inactive (dead) since Wed 2016-03-09 17:23:56 JST; 14s ago Process: 2466 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS) Process: 2372 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 2370 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 2374 (code=exited, status=0/SUCCESS) # サービスの起動 pi@raspberrypi:~$ sudo /etc/init.d/nginx start Starting nginx (via systemctl): nginx.service. # サービスの起動確認 pi@raspberrypi:~$ /etc/init.d/nginx status ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled) Active: active (running) since Wed 2016-03-09 17:24:25 JST; 14s ago Process: 2466 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS) Process: 2514 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 2512 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 2516 (nginx) CGroup: /system.slice/nginx.service tq2516 nginx: master process /usr/sbin/nginx -g daemon on; master_... tq2517 nginx: worker process tq2518 nginx: worker process tq2519 nginx: worker process mq2520 nginx: worker process
いっぱいありますね。混乱しないで、今のことは「いろんな方法があるんだね!」がわかればOKですよ。
サービスの自動起動のon/offをしてみよう
今まではサービスを手動で起動/停止してみました。今度はラズパイ起動時に自動起動させるかどうかをやってみましょう。方法はいくつかありますから、ドドンと書いてみます。あくまで基本は「systemctl使い」です。そして、いろいろなコマンドで叩いてみて自分に一番あっているやり方を見つければいいだけですね。
systemctlコマンドだよ
# サービスの自動起動をoff pi@raspberrypi:~$ sudo systemctl disable nginx Synchronizing state for nginx.service with sysvinit using update-rc.d... Executing /usr/sbin/update-rc.d nginx defaults Executing /usr/sbin/update-rc.d nginx disable insserv: warning: current start runlevel(s) (empty) of script `nginx' overrides LSB defaults (2 3 4 5). insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `nginx' overrides LSB defaults (0 1 6). # サービスの確認(disabled) pi@raspberrypi:~$ systemctl is-enabled nginx disabled # サービスの自動起動をon pi@raspberrypi:~$ sudo systemctl enable nginx Synchronizing state for nginx.service with sysvinit using update-rc.d... Executing /usr/sbin/update-rc.d nginx defaults insserv: warning: current start runlevel(s) (empty) of script `nginx' overrides LSB defaults (2 3 4 5). insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `nginx' overrides LSB defaults (0 1 6). Executing /usr/sbin/update-rc.d nginx enable # サービスの確認(enabled) pi@raspberrypi:~$ systemctl is-enabled nginx enabled
sysv-rc-confコマンドだよ
# サービスの自動起動をoff pi@raspberrypi:~$ sudo sysv-rc-conf nginx off # サービスの確認(ランレベル[2~5]がof) pi@raspberrypi:~$ sysv-rc-conf --list | grep nginx nginx 0:off 1:off 2:off 3:off 4:off 5:off 6:off # サービスの自動起動をon pi@raspberrypi:~$ sudo sysv-rc-conf nginx on # サービスの確認(ランレベル[2~5]がon) pi@raspberrypi:~$ sysv-rc-conf --list | grep nginx nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off
chkconfigコマンドだよ
# サービスの自動起動をoff pi@raspberrypi:~$ sudo chkconfig nginx off # サービスの確認(ランレベル[2~5]がof) pi@raspberrypi:~$ chkconfig --list | grep nginx nginx 0:off 1:off 2:off 3:off 4:off 5:off 6:off # サービスの自動起動をon pi@raspberrypi:~$ sudo chkconfig nginx on # サービスの確認(ランレベル[2~5]がon) pi@raspberrypi:~$ chkconfig --list | grep nginx nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off
insservコマンドだよ
# サービスの自動起動をoff pi@raspberrypi:~$ sudo insserv -r nginx # サービスの確認(ランレベル[2~5]がof) pi@raspberrypi:~$ chkconfig --list | grep nginx nginx 0:off 1:off 2:off 3:off 4:off 5:off 6:off # サービスの自動起動をon pi@raspberrypi:~$ sudo insserv -d nginx # サービスの確認(ランレベル[2~5]がon) pi@raspberrypi:~$ chkconfig --list | grep nginx nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off
(それでも続く)
※ Amazon Web Services、“Powered by Amazon Web Services”ロゴ、及び本ブログで使用されるその他のAWS商標は、米国その他の諸国における、Amazon.com, Inc.またはその関連会社の商標です。
※ SORACOM、その他のSORACOMサービスは、株式会社ソラコムの登録商標または商標です。