前回に引き続き、今回もPlamo Linuxの特徴的な部分のうちシステム起動回りの処理を解説しましょう。もっともこのあたりに関しては、Plamo Linuxが従来のやり方
さまざまな/sbin/init
Linux/
Linux/
/sbin/
カーネルから起動された/sbin/
Plamo Linuxが採用しているsysvinitは、"SystemV
Plamo Linuxの元になったSlackware Linuxでは、SystemVとは別系統のUnixであるBSD-Unixが用いていた/etc/
"sysvinit"では処理を行うスクリプトをファイル名の順に実行していくため、途中に時間がかかる処理があると以後の作業が遅延してしまいます。また、処理の多くは独立して実行できるものの、それらを並列実行するような仕組みは用意されていません。
このあたりを改良するために考案されたのがUpstartやOpenRC、Init-ngといった実装で、各処理に依存関係を定義し、依存関係にない処理は並列で実行する等、システム起動にかかる時間を短縮するための仕組みがさまざまに考案されました。
起動処理の高速化に加えて、/sbin/
一方、Systemdは
sysvinitの設定ファイル
前節で紹介したように、最近では"Systemd"が/sbin/
/etc/inittab
前節で触れたように、"sysvinit"にはシステムの動作モードを意味する
- ランレベル0は全てのデーモン類を停止してシステムを終了するシャットダウンモード、
- 1はrootユーザのログインのみを許可するシングルユーザーモード、
- 2は複数ユーザがログインできるものの、NFS等のネットワークサービスは停止したモード、
- 3が全ての機能が利用できる通常モード、
- 4は独自設定可能な予備用モードでデフォルトは3と同じ、
- 5は3に加えてあらかじめウィンドウシステムも起動してGUIログインを可能にするモード、
- 6が全てのサービスを終了してリブートするモード、
とされています。
この
"sysvinit"の/sbin/
$ cat -n /etc/inittab 1 # /etc/inittab derived from LFS 20170713 2 # Begin /etc/inittab 3 4 id:3:initdefault: 5 6 si::sysinit:/etc/rc.d/init.d/rc S 7 8 l0:0:wait:/etc/rc.d/init.d/rc 0 9 l1:S1:wait:/etc/rc.d/init.d/rc 1 10 l2:2:wait:/etc/rc.d/init.d/rc 2 11 l3:3:wait:/etc/rc.d/init.d/rc 3 12 l4:4:wait:/etc/rc.d/init.d/rc 4 13 l5:5:wait:/etc/rc.d/init.d/rc 5 14 l6:6:wait:/etc/rc.d/init.d/rc 6 15 16 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now 17 18 su:S016:once:/sbin/sulogin
4行目の"id:3:initdefault:"がデフォルトのランレベルの設定で、通常はランレベル3
6行目の"si::
8行目から14行目は各ランレベルの処理で、それぞれ"/etc/
この設定の場合、カーネルから起動された/sbin/
ランレベル3は通常モード、すなわちコンソール画面でユーザ名とパスワードを入力してログインするモードです。あらかじめXを起動してGUI画面でログインしたい場合は4行目を"id:5:initdefault"のようにします。また、起動時にgrubのメニュー画面からカーネルパラメータから"1"や"5"等、ランレベルを指定することもできます。
linux /boot/vmlinuz-6.1.47-plamo64 root=XXXXX ro net.ifnames=0 net.ifnames=0 quiet 5
16行目の"ca:12345:..."の行は"Ctrl"+"Alt"+"Del"を同時押しした際の処理で、MS-DOSやWindowsに習って/sbin/
物理的に保護されていないマシンでは、リセットボタンや電源OFFで強制的にシステムを落した上で、再起動時に上述のカーネルパラメータを使ってランレベル1で起動することができます。その際、この行を指定しておくと/sbin/
18行目から先の部分はコンソールからのログイン用にgettyを起動する処理で、今回の話題との関連は薄いため省略します。
/etc/rc.d/rc[0-6].d/
さて、それでは実際に各ランレベルでどのような処理が行われるのかを見てみましょう。
前述のように、/sbin/
実際に/etc/
$ ls /etc/rc.d/rc3.d/ K05lightdm@ S21smartd@ S25netfs@ S32httpd@ S36bluetooth-autoconnect@ S10rsyslogd@ S21unbound@ S25random@ S32php-fpm@ S40crond@ S10vboxadd@ S22nsd@ S26ntpd@ S32proftpd@ S45samba@
これらのリンクが指しているのは/etc/
$ ls -l /etc/rc.d/rc3.d/ lrwxrwxrwx 1 root root 17 6月 9日 17:50 K05lightdm -> ../init.d/lightdm* lrwxrwxrwx 1 root root 18 6月 9日 17:46 S10rsyslogd -> ../init.d/rsyslogd* lrwxrwxrwx 1 root root 24 8月 9日 15:54 S10vboxadd -> /etc/rc.d/init.d/vboxadd* lrwxrwxrwx 1 root root 15 6月 9日 17:51 S18acpid -> ../init.d/acpid* ...
さて、それではこの"/etc/
$ cat -n /etc/rc.d/init.d/rsyslogd 1 #!/bin/sh 2 ######################################################################## ... 33 case "${1}" in 34 start) 35 log_info_msg "Starting rsyslogd..." 36 parms='-i /run/rsyslogd.pid' 37 start_daemon /sbin/rsyslogd $parms 38 evaluate_retval 39 ;; 40 41 stop) 42 log_info_msg "Stopping..." 43 killproc -p $pid /sbin/rsyslogd 44 evaluate_retval 45 ;; 46 47 restart) 48 ${0} stop 49 sleep 1 50 ${0} start 51 ;; 52 53 *) 54 echo "Usage: ${0} {start|stop|restart}" 55 exit 1 56 ;; 57 esac 58 59 exit 0
このスクリプトに限らず、/etc/
"start"と"stop"以外にも、この例のように"stop"と"start"を連続して行う"restart"や 設定ファイルを読み直す"reload"、動作状況を表示する"status"といった引数を受け付けるスクリプトもあります。また、デーモンの起動/終了以外にも、ファイルシステムをマウント/アンマウントしたり、ネットワークの初期化/終了を担当するスクリプトもあります。
一方、シンボリックリンク経由でこのスクリプトを呼び出す"/etc/
すなわち、/etc/
これら/etc/
パッケージを作る際には、
なお、"/etc/
あるデーモンの機能が不要になった場合、削除せずに
実のところ、Plamo Linuxではデフォルトでインストールするパッケージの中にも、セキュリティ等への考慮から自動起動しないサービスがいくつかあります。
$ ls /etc/rc.d/init.d/ acpid* dhcpd modules* random* sshd* atd* dovecot mountfs* rc* swap* autofs eudev* mountvirtfs* rc_initpkg* sysctl* avahi* eudev_retry* netfs* reboot* template* bluetooth gpm network* rngd* unbound ...
上記スクリプトのうち、autofsやbluetooth, dhcpdといった実行属性が付いていない
Plamo Linuxの起動画面で黄色の"[ WARN ]"と表示されるのが、実行属性が付いていないスクリプトを呼び出した例です。パッケージをインストールしたのに必要なデーモンが動いていないような場合、この/etc/
さて、今回は"sysvinit"について紹介しましたが、読者の方はこの実装を見てどのように感じられたでしょう?
Linuxの元となったUnixには
筆者の目には、シンプルなシェルスクリプトとシンボリックリンクの組み合わせだけで必要な機能を実現していく"sysvinit"の実装は、まさにこの
もちろん、