redhat系のlinuxディストリビューションでは、起動時のサービス立ち上げには、chkconfigコマンドとか、ntsysvコマンドとかを使うことになると思うんだが、先日ちょっと使ってみたら、fedora16では、chkconfigではすべてのサービスをいじれるわけではないことに気付いたので、メモ書き。(デーモンとサービスという表記が混ざるけど、この記事の中では同じもんと思ってます。はい。)
まず、chkconfigが何をしているかというと、/etc/rc.d/init.d 以下にある、各種デーモンの起動スクリプトを、/etc/rc.d/rc[0-6].d/以下に適当な名前でシンボリックリンクを張るということ。
たとえば、chkconfig –level 2345 sshd on とすると、rc[2-5].dの中にS??sshdという名前で、rc0.d rc1.d rc6.d の中にK??sshdという名前でそれぞれシンボリックリンクができる。例えば、この状態でランレベル1になるとsshdが停止し、ランレベル5になると、sshdが立ち上がるという仕組みになっている。(??は起動順、停止順に振られる2桁の数字。起動スクリプトにコメントで書いてある。)
ランレベルが変わり、たとえば3になったとすると、/etc/inittab を読んだり /etc/event.d/rc3 を読んだりして、とにかく /etc/rc.d/rc 3 を実行する。 で、この rc というスクリプトを読めば分かるけど、(fedora16な環境ではすでに存在しないため読めない!) /etc/rc.d/rc3.d のなかで、Kから始まるスクリプトを停止して、Sから始めるスクリプトを起動するという処理がかかれている。というわけ。 この辺の話は検索すればたくさん出てくるので、とりあえずこんなもん。後者のやりかたupstartについては、ここ(WayBack Machine 経由)が参考になりそう。
で、Fedora16。
Fedora16には/etc/rc.d/rcスクリプトがないし、inittabはすべてコメントで頭に ”# inittab is no longer used when using systemd.” とかかれる始末。
inittabを読むsysvinitや、/etc/event.dを使うUpstartと違って、fedora15から現在使われているsystemdでは、この辺の管理が変わってきていて、/etc/rc.d/init.dには、あまりスクリプトが置いてない。ntpdやsshdもない。
試しに、fedora16でchkconfigを叩いてみると、
“注記: この出力は SysV サービスのみであり、ネイティブな systemd のサービスは含まれていません。
systemd services. SysV 設定のデータはネイティブな systemd の設定によって上書きされます。”
と表示され、いくつかデーモンが表示される。ネイティブなsystemdのサービスとはなんじゃい、ということだが、それは、/lib/systemd/以下にファイルが配置されているようだ。
/lib/systemd/system/ntpd.serviceなどのファイルを見ると、サービスを起動、停止するコマンドのようなものがかかれている。この辺の仕組みはまだよく分かっていないので、適当に今度まとめる。
とりあえず、fedora16でのサービスの起動、停止、起動時に勝手に立ち上げるようにするにはsystemctlコマンドか、以前からあったserviceコマンドを使う。というか、serviceコマンドはsystemctlコマンドを呼ぶようになっただけ。serviceコマンドの方がタイプが少なくて簡単。
sshd 起動
systemctl start sshd.service (または service sshd start 以下同様)
sshd 停止
systemctl stop sshd.service
sshdを起動時に立ち上げるようにする
systemctl enable sshd.service
などなど。
勝手に立ち上がらないようにするには、disable、起動状態を見るにはstatusやshowなど。いろいろある。
systemctlコマンドは他にもいろいろと機能がある様子で、引数なしにsystemctlコマンドを叩くと、.service のみならず、.deviceなる項目も出てくるので、いろいろできる様子。この辺のことはまたしらべてから。
また、systemdではランレベルとかはどうなっているのかも気になる。/lib/systemd/system/runlevel?.targetというファイルは、それぞれgraphical.targetやmultiuser.target、reboot.targetなどへのシンボリックリンクになっているので、ランレベルという概念がなにやら希薄になっているような気がする。それもまた気が向いたら読んでみる。
systemctlコマンドって、叩くのが面倒なので、この辺はGUIで設定した方が楽なんだけど、どこにもみあたらない。コマンド名がわからんので探せないが、、、。まぁ、あとで”ソフトウェアの追加/削除”でさがしてみるか、、、。 system-config-serviceかな?いれてみよう。
そもそもこんなことを気にしはじめたのは、某UNIX、というかAIXでどうやって起動時にデーモンを勝手に立ち上げるかということを気にしたから。そもそも、普段はめったなことでは落とさないんだけど、どうしてそんなことが必要なんだろうというのはさておいて、、、。ランレベル変更時に起動スクリプトを処理するのではなくて、inittabに必要なことを書いてしまうという方式で、(管理コマンドを通さずにinittabをいじっちゃいけないみたい)面倒だなぁ、chkconfigは楽だよなぁ、と思ったからなのでした。
起動スクリプトを適切に用意するのは、適切に終了するためのコマンドを指定できるから、便利なのだと思うけど、どういうことになってるんだろ。
この記事誰得なんだろうという気がしないでもないが、
この記事は適宜追記・書き換えします。