レオンハルトジャパン公式BLOG

技術的な情報を公開するスペースです。

宇宙一わかりにくいラズパイ入門(仮称)⑤

宇宙一わかりにくいラズパイ入門(仮称)④の続きです。
宇宙一わかりにくいラズパイ入門(仮称)⑤では、キーワードは「感謝の気持ち」です。サービスの起動/停止について広く浅く、ちょっと深いところまで理解しましょう。

宇宙一わかりにくいラズパイ入門(仮称)の趣旨

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

f:id:lhj:20160307172747p:plain

かなり見やすくなってきました。しかし、まだまだ見にくい方も多いかもしれません。そして自動起動しているかどうかを示しているランレベル(2~5)の「on」に色があると嬉しいですよね。そのためには chkconfig というパッケージをインストールしてがあげましょう。CentOS 6.x 以下に慣れている方にはお決まりのコマンドです。「古い」とは言わず、かなり見やすくなるので宇宙一わかりにくい(略)ではオススメします。

# chkconfigをインスール
pi@raspberrypi:~$ sudo apt-get install -y chkconfig

# 表示
pi@raspberrypi:~$ chkconfig --list

f:id:lhj:20160311111035p:plain

「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 コマンドで確認し、アクセスしましょう。

f:id:lhj:20160311120656p:plain

ホームページが表示されるとラズパイを動かしているのが実感できますね。ワクワクします。そして感謝の気持ちです。世の中のオッサン大人の方によく言われると思いますよね。はっきり言って「ウザイ」と思うかもしれません。しかし、世界中で使われているパッケージでは「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サービスは、株式会社ソラコム登録商標または商標です。