SUSE SLES12 の大きな変化 systemd、さらば init

SUSE Linux Enterprise Server 12(SLES12) では,init に代わり systemd が採用されています。

openSUSE で既に採用されており、あらかじめ知識として知っておくべき事でした。

openSUSE 12 から、

「随分起動と終了が速くなったなぁ」

と単純に考えていたのですが、本気で付き合わなかった罰は後から付いてきます。

init を使わないので、当然 /etc/inittab も使わなければ /etc/init.d/ の下にあるスクリプト群も使いません。一部の互換性の為に存在しているだけです。

という事で、SLES12 以降では /usr/sbin/rcXXXXX のスクリプトを使って、コマンドラインからサービスの再起動を行います。まず、SLES11 から SLES12 に乗り換えたオペレータがハマる第一の関門です。/etc/init.d/ のスクリプトが随分少ないな、と不審に思っていましたが、サービスの起動の仕掛けが全く変わりました。

そもそも init とは

init は Linux が起動して、最初に実行するプロセスです。/etc/inittab に記述された runlevel によって ..../rcN.d/ 配下のシンボリックリンク先、 /etc/init.d/xxxxx のシェルを順次実行します。サービスは逐次起動します。DOS で言う所の Autoexec.bat みたいなものです。したがって時間が掛かります。

シャットダウンプロセスも init のシャットダウンプロセスによって順次終了します。

しかし、サービスの中には依存性のないものもあり、いちいち前の処理が終わってから起動/終了しなくても構わないサービスもあります。平行起動しても構わないものであれば同時に起動してもよい。終了、シャットダウンする時も、別に逐次処理で終了する必要はない。

そこで systemd

systemd によって、システムの起動と終了は格段に高速になるという事です。

SUSE Linux では systemd のパラメータを記述した、サービスユニット設定ファイルは /etc/systemd/system の下にあります。xxxxx.service というファイル名です。サービスは UNIT という概念で管理されます。

例えば httpd のサービスは次の様に記載されています。

sles12:/etc/systemd/system # cat httpd.service
[Unit]
Description=The Apache Webserver
Wants=network.target nss-lookup.target
After=network.target nss-lookup.target
Before=getty@tty1.service

[Service]
Type=notify
PrivateTmp=true
EnvironmentFile=/etc/sysconfig/apache2
ExecStart=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND -k start
ExecReload=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND -k graceful
ExecStop=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND -k graceful-stop

[Install]
WantedBy=multi-user.target
Alias=httpd.service
sles12:/etc/systemd/system #

この中の wants という記述が、サービスの依存性を示します。apache が起動する前に起動すべきサービスはこれですよ、という事です。そこで不要な依存性を排除して、非同期にサービスを起動するのが systemd という訳です。

過去のクセで /etc/ini.d/apache2 restart などのコマンドでサービスのリスタートは行えなくなりました。ただし SUSE Linux の場合 /usr/sbin/rcXXXX というシェルがあるので、このシェルを使ってコマンドラインからサービスの再起動ができます。

SLES11 までは /usr/sbin/rcXXXXX は /etc/init.d/XXXXX へのシンボリックリンクでした。


sles11:/usr/sbin # ls rc* -al
lrwxrwxrwx 1 root root 17 Aug 2 2012 rcacpid -> /etc/init.d/acpid
lrwxrwxrwx 1 root root 21 Jun 23 2012 rcalsasound -> /etc/init.d/alsasound
lrwxrwxrwx 1 root root 19 Oct 9 2013 rcapache2 -> /etc/init.d/apache2
lrwxrwxrwx 1 root root 16 Jun 23 2012 rcarpd -> /etc/init.d/arpd
lrwxrwxrwx 1 root root 15 Jun 23 2012 rcatd -> /etc/init.d/atd
: 略

SLES12 からは /usr/sbin/rcXXXXX は /usr/sbin/service というスクリプトへのシンボリックリンクです。

sles12:/usr/sbin # ls rc* -al
lrwxrwxrwx 1 root root 7 Nov 7 02:26 rcSuSEfirewall2 -> service
lrwxrwxrwx 1 root root 7 Nov 7 13:10 rcapache2 -> service
lrwxrwxrwx 1 root root 7 Nov 7 02:08 rcapcupsd -> service
lrwxrwxrwx 1 root root 7 Nov 7 02:17 rcatd -> service
lrwxrwxrwx 1 root root 7 Nov 7 02:21 rcauditd -> service
lrwxrwxrwx 1 root root 7 Nov 7 02:25 rcautofs -> service
: 略

/usr/sbin/service のスクリプトは /usr/bin/systemctl を呼び出します。これが systemd を制御します。/usr/lib/systemd/systemdに、デーモンの実体があります。

単純に systemctl を実行すると、サービスの一覧が出てきます。

sles12:~ # systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys..._misc.automount loaded active running Arbitrary Executable File F
sys-devi...i_video0.device loaded active plugged /sys/devices/pci0000:00/000
sys-devi...net-eth0.device loaded active plugged Ethernet Connection I217-V
sys-devi...sda-sda1.device loaded active plugged WDC_WD20EZRX-00D
sys-devi...sda-sda2.device loaded active plugged WDC_WD20EZRX-00D
sys-devi...sda-sda3.device loaded active plugged WDC_WD20EZRX-00D
sys-devi...sda-sda4.device loaded active plugged WDC_WD20EZRX-00D
sys-devi...sda-sda5.device loaded active plugged WDC_WD20EZRX-00D
sys-devi...sda-sda6.device loaded active plugged WDC_WD20EZRX-00D
: 以下略

systemctl は他にも、サービスの詳細な状態を調べたり、サービスの再起動、有効・無効化などのチェックに利用するコマンドです。

通常は yast(2) の Services Manager (従来の Run Level Editorに代わるもの)でサービスの起動と停止、有効・無効化、サービスの状態を調べます。

SUSE SLES12 の大きな変化 systemd、さらば init_a0056607_8282344.jpg


SUSE SLES12 の大きな変化 systemd、さらば init_a0056607_15132179.jpg






/sbin/init は実体はなく /usr/lib/systemd/systemd へリンクしているため、一応、従来の init コマンドと互換性を確保しています。

sles12:~ # whereis init
init: /sbin/init /etc/init.d /usr/share/man/man1/init.1.gz
/usr/src/linux-3.0.76-0.11/init /usr/src/linux-3.12.28-4/init
sles12:~ # ls /sbin/init -al
lrwxrwxrwx 1 root root 26 Nov 7 02:00 /sbin/init -> ../usr/lib/systemd/systemd
sles12:~ #

更に詳しい説明は管理ガイドをご参考ください。
SUSE Linux Enterprise Server 12 管理ガイド

当たり前の事ですが、起動は早くなっても中で systemd がサービスを処理しているため、 Login: プロンプトが出てからの動作は非常に重いです。

サービスの再起動や再起動などで init を使っていたクセがあった私にとっては

さらば init

なのですね。


-Key Word-
SUSE Linux SLES12 init initd systemd systemctl サービスの管理 サービスの起動 サービスの終了 サービスの再起動 できない。

サブスクリプション購入はこちら


他の情報はこちら
islandcenter.jp

by islandcenter | 2014-11-11 08:38 | SUSE | Comments(0)