モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

今時のLinux(Ubuntu11)での起動シーケンス

Ubuntu11.10でGUIインターフェイスがUnityになって使いにくくなったため、他のUbuntuベースのディストリビューション - KubuntuとかMintとか入れたりしてたんですが、起動時のディスプレイマネージャやスプラッシュ画面がかわってしまい、どこでその設定を直すんだろ?と疑問が起きました。


というか、最初にGUI起動しないためにはどうすんの??ということすらわからずでした。
LinuxGUI起動しないようにするのは/etc/inittab のデフォルトランレベルを5から3にすりゃいいだけじゃね?と思った方、僕と同じ古代の人です :)
今のUbuntuなんかだと、すでにランベレルは後方互換性のために残っているだけのおまけのようになっています。
なんと正解は、/etc/init/にある、lightdm.confやkdm.confなどのディスプレイマネージャの設定ファイルに「manual」と追記することなのです。*1


(追記)
本来は/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT に「text」を追加するのが正しいです。


コメントでhitoさんから教えていただきましたが、Ubuntu 11.10のリリース当初版の lightdm-1.0.6-0ubuntu1.2 では「text」指定が効かないバグがあったそうです。
https://bugs.launchpad.net/ubuntu/+source/lightdm/+bug/873334
最新の lightdm-1.0.6-0ubuntu2 で直っているとのこと。
https://launchpad.net/ubuntu/+source/lightdm/1.0.6-0ubuntu2
ただ、自分が素のUbuntu11.10を作って試してみた限りでは、普通に upgrade 掛けてもこのバージョンには上がりませんでした。
この修正済みのバージョンを利用している場合は、コメントでkouさんが指摘されてるように、 /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT に「text」を追加するのが正解です。
(/追記)


(また、そのままだとディスプレイマネージャが起動してないグラフィック画面が表示され真っ暗の画面になってしまうので、/etc/default/grubGRUB_TERMINAL=console 行のコメントアウトも外して下さい。
ちなみに kdm.conf と lightdm.conf のように複数のディスプレイマネージャの設定ファイルがある場合、/etc/X11/default-display-manager の設定をみてそちらで起動します。)


そこで今回、Ubuntu11の起動シーケンスについていろいろ勉強したことをまとめてみます。


まず、大まかな起動のしかたですが

ブートローダー起動 → Linuxカーネル起動 → 起動スクリプト実行

という感じに起動してきます。


ブートローダーとは、OSを起動してくるためのプログラムです。
Ubuntu11の場合はGRUB(GRUB2)を使っています。LILOじゃありません :)
GRUBの設定は、/etc/default/grub にあり、ここにスプラッシュ画面を出すかとかコンソールで起動するかなどの設定があります。
また、/etc/grub.d/ 以下にGRUB設定用のシェルスクリプトが並んでいます。
これらのファイルを編集した後、update-grub というコマンドを実行してやります。
すると、/etc/default/grub の設定を元に、/etc/grub.d/ 以下がファイル名順で実行され、/boot/grub/grub.cfg ファイルが生成されます。
起動時には、そのgrub.cfgの内容に従って /boot/ 以下のファイル群から、カーネルと必要なモジュールが呼び出されて起動されていきます。


カーネルが起動してくると、次は起動スクリプトが実行されていきます。
ここで注意することは、Ubuntu11のinitはsysvinitではなくupstartというものが使われているということです。
ちなみにupstartUbuntuだけではなく、Fedora9以降やRHEL6以降でも採用されているそうです。*2
upstartでは /etc/rc2.d/ とかのディレクトリは使われず、/etc/init/ 以下に起動スクリプト群が置かれています。
でも /etc/rc?.d/ があるじゃん!と言われると思いますが、これはupstartから呼び出されるsysvinit互換用のrc-sysinit(?)によって間接的に呼ばれて実行されています。つまり

upstart → /etc/init/ 以下のスクリプト実行
           その中の rc-sysinit → /etc/rc?.d/ 以下のスクリプト実行

という流れになっています。


また /etc/【アプリ名】/ のフォルダだけではなく /etc/default/ 以下にも、各種デーモンやツールのデフォルト設定ファイルがあります。


というわけで、OS起動時にどんなデーモンやプログラムがどんな設定で呼ばれてくるのかを確認するためには、

/etc/default/grub
/etc/grub.d/*
(/etc/boot/grub/grub.cfg)
/etc/init/*
/etc/init/rc-sysinit.conf(ランレベル確認)
/etc/rc?.d/*
/etc/default/*

あたりを確認する必要があります。


普段日常的にapacheやらpostfixやら触ってる人でも、意外に起動シーケンスの変化は追ってなかったりするのでは?(ってそれ僕のこと)
久しぶりにこのへん見て、結構変化してるんだな〜と思いました。

あと、いろいろ間違っている点もあるかと思いますので、問題点ありましたら遠慮なくご指摘下さい。
勉強して修正していきたいと思いますので。

*1:sudo /bin/sh -c 'echo manual >> /etc/init/lightdm.conf' など

*2:Fedora15以降ではupstart→systemdになってるそうです。id:dowhile さんからブ米で教えていただきました