ランレベル - 足の速さじゃないっすよ
- 2014/03/20
- 19:01
当病院にはインターネット向けに公開している Web サーバ (CentOS 5.3) がありますが、それを日々更新している担当者から 「Web サーバに root でログインできないんすけど…」 と相談がありました。
まさかアンタ、Caps Lock を ON にした状態でパスワードを打っているんじゃないでしょうね…。
そう疑いましたがそうではなく、どうやら root のパスワードが使えなくなってしまったようです。
有効期限が切れたのかイマイチその理由がわかりませんが、とにかく root パスワードを再設定するために今回初めて 「シングルユーザモード」 を使いました。
ということで、今回は シングルユーザモード を含む 「ランレベル」 についてメモしていきます。
ランレベル
Linux には ランレベル という Linux 特有の 動作モード があります。
…って、動作モードと言われても (個人的には) しっくりこないのですが、簡単に言うと 「Linux をどんな機能・どんな見てくれで操作したいか」 を決めるもので、以下のようなイメージだと個人的には思っている。。
・Windows のようにグラフィカルに操作したい … ランレベル 5
・Linux っていえばコマンドラインでしょう … ランレベル 3
・Linux ってセーフモードはないの? … ランレベル 1

↑図1:ランレベルによって起動する Linux のデーモンが異なる
そんなランレベルは 数字 で表します。
後述しますが、Linux は起動時に inittab ファイルに書かれた 0 ~ 6 までの数字を判別し、その数値に規定されたスクリプト群を読込みながらデーモンを立ち上げる動きをしています。
- ランレベル一覧 -
ランレベル 0 … シャットダウン
ランレベル 1 … シングルユーザモード
ランレベル 2 … マルチユーザモード (ネットワーク機能 OFF)
ランレベル 3 … マルチユーザモード (コマンドライン)
ランレベル 4 … 未使用
ランレベル 5 … マルチユーザモード (グラフィカル)
ランレベル 6 … 再起動
※注意
前回メモの anacron と同様、今回のメモも 「ランレベルを理解する」 ことに全身全霊をかけています。
今回の検証 OS も CentOS と Ubuntu の2つですが、これらの 差異はガン無視 でメモしていきます。。
ランレベルのコマンド
ここで少し、ランレベルに関するコマンドをメモします。
以下の3つ以外にもあると思いますが、今僕が知っているコマンドはこちらです。
1.chkconfig
2.runlevel
3.telinit
1.chkconfig は使用頻度がとにかく高いです。
これは各種プログラムのランレベルを調整するもので、Windows でいう services.msc の詳細版でしょうか。
Linux ではパッケージをインストールしても、それが自動的にスタートアップに登録されていないことが多いので、マシンを起動するたびにその都度プログラムを手動で実行しなければなりません。
そういったとき chkconfig コマンドを使ってランレベルを指定してあげると、上記のような煩わしい手間を省けます。
2.runlevel はあまり使わないと思います。
こちらは現在稼動している Linux のランレベルを表示するコマンドです。
runlevel コマンドを実行すると 「3 5」 といったように、半角数字が2つが半角スペースを挟んで表示されますが、これは左の数字が 「遷移前のランレベル」 を意味しており、右側の数字が 「現在のランレベル」 を意味します。中には 「N / S」 と表示されることがありますが、「N」 は物理的なマシンの起動、「S」 はシングルユーザーモード (ランレベル1) からの遷移です。
3.telinit もあまり使わないと思います。 少なくとも、今の僕は使ったことがないです。
telinit コマンドはランレベルの遷移を意味しており 「telinit + ランレベル」 の組み合わせで実行します。
例えばランレベル5 (グラフィカル) にログインした状態で telinit 3 とコマンド実行すると、デスクトップ画面から一転してコマンドライン画面へ遷移します。同時にこのとき runlevel コマンドを実行しますと、今切り替わったコマンドライン画面は ランレベル5 から遷移であることから 「5 3」 と結果が表示されます。
なんとなくですが、shutdown コマンドを使うよりも、telinit 0 でシャットダウンした方が 理解している感 があってカッコイイ気がする。 ランレベルマスターになった暁には、使ってみようかな……やっぱやめたw
rc スクリプト
このランレベルごとに起動するスクリプト群のことを 「rc スクリプト」 と呼ぶそうです。
rc スクリプトは /etc/rc.d/ のディレクトリ配下にありましたので、以下に見ていこうと思います。
まず ls /etc/rc.d/ コマンドを実行すると、ランレベルごとの rc スクリプトが出てきます (一部省略)。
これらの数字がランレベルを意味していることは 容易に想像できると思います。
……そんな偉そうなことを言いながらも、ランレベルを知らないときは 「なんだコノ 0 から 6 までの文字は… (((( ;゚Д゚))」 と恐怖しておりました。。
さて、ここでは rc3.d を例に挙げていきます。
rc3.d はディレクトリですので、ls コマンドからスクリプト群の実体が確認できます。

↑図2: ls /etc/rc.d/rc3.d/ の結果
K50netconsole や S10network といったファイルが確認できますが、これが rc スクリプト群です。
telinit コマンドが実行されたとき、または Linux カーネル起動時の inittab からのランレベルが確認できたタイミングで、Linux はこれらの rc スクリプトを順に実行していきます。
ちなみに rc スクリプトは シンボリックリンク です。
リンク先は /etc/init.d/ ディレクトリにあり file または ls -l コマンドなどから確認が取れます。ためしに S10network のリンクを見ると 「S10network -> ../init.d/network」 と書いてあり、スクリプトの実体が /etc/init.d/network であることが分かります。

↑図3:ランレベル5 での ls -l /etc/rc.d/rc3.d/ の結果
図2 と 3 では 「赤線と青線」 でコマンドの出力結果を囲んでいますが、これは意味があります。
色線で囲んだスクリプトのリンク名に注目してみてください。
赤線 … リンク名が K から始まっている (プログラムの終了)
青線 … リンク名が S から始まっている (プログラムの開始)
赤線で囲われた K から始まる名前のリンクが実行されると、そのリンク先のスクリプトに 「stop」 の引数を渡して実行します。一方、青線で囲われた S から始まるリンクでは、「start」 の引数を渡して実行します。K は Kill の意味、また S は Start の意味なので、これは分かりやすいですね。

↑図4:リンク名によてスクリプトの動作が変わる
それにしても 「なんで参照先のスクリプトが同じなのに動作が違うの?」 と疑問に思いましたが、Linux では、リンクのファイル名によってスクリプトの動作が異なることがあるようですね。いやはや、これには驚きました。
rc スクリプト名の変化
では次に chkconfig コマンドを使って rc スクリプトの変化を見てみます。
ここでは sshd を例に挙げましょう。
1.CentOS 6.3 をインストールした直後に chkconfig --list sshd コマンドを実行すると、以下のような出力されます。
「数字:ON / OFF」 とありますが、数字がランレベルを意味していて ON / OFF がデーモンの起動状態です。
2.ここでランレベル3 となる /etc/rc.d/rc3.d/ ディレクトリを覗いてみます (ls の結果は省略します)。
sshd の起動を意味する S55sshd がありました。
先ほども書きましたが、これはリンクですので file コマンドを流してみると 「/etc/rc.d/rc3.d/S55sshd: symbolic link to '../init.d/sshd'」 が表示されます。
3.次はここで chkconfig sshd off コマンドを流します。すると……、
当たり前ですが、全てのランレベルの sshd が OFF になりました。
4.ではここで、さっきと同じように /etc/rc.d/rc3.d/ ディレクトリを覗きます (ls の結果省略)。
先ほどは 「S55sshd」 だったのに対し、今回は 「K25sshd」 のリンクが作成されています。
chkconfig でプログラムのランレベルを変更すると、スクリプトのリンクそのものが変わっていくようですね。
マシン終了時について
マシンの終了動作に関することを少々メモします。
CentOS を終了、または再起動させるときに表示されるメッセージがあります (図5)。
このメッセージ、いったい何を意味しているのかずっと疑問だったのですが、今回ランレベルについてメモしていくにつれてようやく理解ができました。どうやらこのメッセージは 各種デーモンの終了 を意味していたようです。

↑図5:CentOS 再起動時に表示されるメッセージ
ランレベル6 で実行されるスクリプト群 (/etc/rc6.d/) と、この終了時に表示されるメッセージを見比べてみると、デーモンたちがスクリプト群の順番に従って終了していることが見て取れます。またこのとき、起動していないデーモンに関しては停止の実行をスキップしているようです。
またランレベル6 の S00killall に関しては、残ったデーモンの終了を意味しています。
具体的には /var/lock/subsys というディレクトリ配下に存在するデーモンに対して、停止の命令を投げかけるようです。…でもそれだったら最初からこのスクリプトを実行すればいいのでは、なぜ各デーモンを順番に停止させていくのだろう……という疑問になったので、安直な考えで /etc/rc.d/init.d/killall start とコマンドを打ってみました。
すると……いくつかのデーモンに [ failure ] という輝かしい実行結果が返ってきました。
こういうモノなのか、あるいはたまたま失敗したのかは分かりませんが、再起動などに関してはおとなしく reboot か shutdown -h now あたりを使っとけ、ということですね。。
あと ランレベル6 の rc スクリプトには、もうひとつ S から始まるリンク S01reboot がありますが、この実体は /etc/init.d/halt というスクリプトでした。しかし、ランレベル0 の終了を意味するリンクである S01halt の実体も /etc/init.d/halt だったので、おそらくこれもリンク名の違いによって渡される引数が違い、再起動または終了処理が別々に走っているのでしょう。
そんな /etc/init.d/halt について色々調べたところ、以下のような 驚愕の事実 が判明。
halt というコマンドがあるのですが、なんとこのコマンドは shutdown -h -q now と同じ意味だったのです!!
……Linux ユーザからすれば 「そんなこと当たり前だろ!!」 と思われるでしょうか、僕はこのコマンドを 今はじめて知りました (本気で)。どうやらワタクシは Linux ユーザ失格のようで。。。OTL
inittab
稼働中の Linux からランレベルを選択 (変更) するときは telinit コマンドを使うことで実現できますが、停止状態のマシンがパワーオンしたときは /etc/inittab ファイルを参照してランレベルを選択します。
この inittab を開いてみると、最終行に 「id:3:initdefault:」 という一行が記述されており、ここの数字が Linux がパワーオンされたときに選ばれるランレベルになります。

↑図6:デフォルトでは id:5:initdefault:
※僕の環境 (CentOS 6.3) では /etc/inittab に 「id:3:initdefault:」 の一行しか書かれていませんでしたが、ディストリビューションによっては沢山の情報が書かれている場合があるそうです。本項では 「id:3:initdefault:」 の動作に関してのみ理解していきますが、もっと根本の init の仕組みについては別の機会に書いていく予定です。
その inittab ファイルは、Kernel がロードし終えたときに実行する init が参照します。
細かい話は抜きにして、停止したマシンがパワーオンすると BIOS → ブートローダー → Kernel みたいな流れ (だと信じて疑わない) でカーネルがロードされていき、そして init を起動します。
init は Linux の 「プロセス」 を理解するには欠かせないモノなので、本来ならスルースキルを発動させたくないのですが、ここもまたスルーいたします。。。
そんな init の実体は /sbin/init です。
バイナリファイルなので中身の確認はできませんが init は /etc/inittab を参照しているようで、そこに書かれたランレベルにしたがって、rc スクリプトを実行させます。その指定行が前述の 「id:3:initdefault:」 です。

↑図7:id:3:initdefault: はマシン起動時に実行する rc スクリプト
それにしても話はそれますが、crontab とか inittab とか、この tab ってナンザンショ。
そう思って調べたところ、これは table を意味しているそうですね。 設定ファイルが表のように見えるから? よく分かりませんが、とりあえず略さず書くと inittab = init table 、crontab = cron table となりそうですね。
ランレベル1
ここで冒頭の 「シングルユーザモード」 についてメモします。
シングルユーザモードのランレベルは 1 でして、主に OS のメンテナンスに使われる動作モードです。
前述もしましたが Windows でいうセーフモードのようなイメージで、root のパスワードを忘れてしまった際にはこちらから再設定が可能でした。 また rc1.d ディレクトリを覗くと分かりますが、起動するデーモンは少ないようです。
あと特徴としては、複数のユーザがログインできる 「マルチユーザモード」 とは対照的に、root ユーザでしかログインすることができず、その上操作はコマンドラインに限定されるのがシングルユーザモードでもあります。

↑図8:ランレベル1 では root ユーザのみ
では、最後に root ユーザのパスワード変更方法 を以下にメモします。
以下の方法は CentOS 6.3 による root パスワード変更なので、他ディストリビューションでの動作は未確認ですが、たぶんできると思います。 もし失敗しても、ネットで調べれば解決法が沢山出てきますわよw
1.CentOS 起動から GRUB に入る
OS 起動時にありがちな 「Press any key to enter menu」 というイミフなメッセージが表示されたら、キーボードの適当なキーを押します。
Kernel Panic のメモでも軽く取り上げましたが、たしか GRUB はブートローダーでしたね。

↑図9:このとき僕は Enter キーよりも K キーあたりを押す。理由は特にない…
2.ブート情報の書き換え
GRUB に入ると Kernel が選択できるので、一番上の Kernel を選択します。
このとき [ E ] キーを押すのを忘れずに。 僕はいつも [ Enter ] キーをぶっ叩いてしまい、コマンドを書き換えることなく Linux が立ち上がってしまうことが多いです。 これによって 約2分 のロスです。 時間は有限なのです。。。

↑図10:Kernel Panic のとき、目に焼き付くほど見た画面…
次に 「kernel /」 から始まる行を選択して、同じく [ E ] キーを押します。
すると 「<TYPE=pc KEYTABLE=...」 のような一行が表示されますので、末尾に 「1」 または 「single」 と入力します。 入力を確認したら [ Enter ] キーを押して編集モードを抜け、そして [ B ] キーを押下します。

↑図11:single と打つとカッコイイけど、僕は 1 を入力する。。
言うまでもありませんが、ここに入力した数字が Linux 起動時のランレベルになります。
試しに 「3」 とやってみたところ、コマンドラインのマルチユーザモードが立ち上がりました。
3.root パスワードの変更
パスワードの変更は特に変わったこともせず、passwd コマンドから設定します。
ちなみにパスワードを変更したら reboot コマンドを実行した方がいいです。
ちょっと横着して telinit 5 を実行してみたところ、いつまで経ってもランレベルが切り替わらない という、いわゆる 動作不良 が発生してしまったからです。
これはたまたまかもしれませんが、とりあえず reboot は色々な意味で最強なコマンドでございますw
最後に
初めて 「シングルユーザモード」 という言葉を知ったのは、Linux ではなく OS X がきっかけでした。
「管理者のパスワード忘れちった。対処してよwww」
という 無茶振り (僕はマックど素人…) をされ、そのときにシングルユーザモードを知りました。
当時は (今もですが) Linux ど素人の僕でしたが、辛うじて Linux コマンドを知っており…、
(あれ? なんでマックで Linux コマンドが使えるんだ…?)
と、不思議だったのを覚えています。
今思えば、あのときが 「OS X が UNIX 系である」 ことを知った瞬間かもしれませんね。
そんな OS X ですが、一昔前に こんな経験 をしたことがあります。
あのときは 「OsiriX」 (オザイリクス) というアプリを動かすために、「スノーレパード」 という OS X を購入する必要がありました。
それじゃさっそく最寄りの ナニガシ電機 に在庫問い合わせしてみようと、ダイヤルを回したのですが……、
ナニガシ 「お電話ありが(ry」
ワタクシ 『あのー、スノーレパードの在庫を確認したいのですが』
ナニギシ 「………あの、もう一度よろしいでしょうか?」
ワタクシ 『あ、はい。スノーレパード……OS X 10.6 っていうパソコンの OS なんですが…』
ナニグシ 「……えっと、ゲームソフト でしょうか?」
ワタクシ 『……… HA!?』
ナニゲシ 「……ゲームコーナーの方にお繋ぎいたしますね」
ワタクシ 『―――』
嘘のようで、本当のお話。。。OTL
まさかアンタ、Caps Lock を ON にした状態でパスワードを打っているんじゃないでしょうね…。
そう疑いましたがそうではなく、どうやら root のパスワードが使えなくなってしまったようです。
有効期限が切れたのかイマイチその理由がわかりませんが、とにかく root パスワードを再設定するために今回初めて 「シングルユーザモード」 を使いました。
ということで、今回は シングルユーザモード を含む 「ランレベル」 についてメモしていきます。
ランレベル
Linux には ランレベル という Linux 特有の 動作モード があります。
…って、動作モードと言われても (個人的には) しっくりこないのですが、簡単に言うと 「Linux をどんな機能・どんな見てくれで操作したいか」 を決めるもので、以下のようなイメージだと個人的には思っている。。
・Windows のようにグラフィカルに操作したい … ランレベル 5
・Linux っていえばコマンドラインでしょう … ランレベル 3
・Linux ってセーフモードはないの? … ランレベル 1

↑図1:ランレベルによって起動する Linux のデーモンが異なる
そんなランレベルは 数字 で表します。
後述しますが、Linux は起動時に inittab ファイルに書かれた 0 ~ 6 までの数字を判別し、その数値に規定されたスクリプト群を読込みながらデーモンを立ち上げる動きをしています。
- ランレベル一覧 -
ランレベル 0 … シャットダウン
ランレベル 1 … シングルユーザモード
ランレベル 2 … マルチユーザモード (ネットワーク機能 OFF)
ランレベル 3 … マルチユーザモード (コマンドライン)
ランレベル 4 … 未使用
ランレベル 5 … マルチユーザモード (グラフィカル)
ランレベル 6 … 再起動
※注意
前回メモの anacron と同様、今回のメモも 「ランレベルを理解する」 ことに全身全霊をかけています。
今回の検証 OS も CentOS と Ubuntu の2つですが、これらの 差異はガン無視 でメモしていきます。。
ランレベルのコマンド
ここで少し、ランレベルに関するコマンドをメモします。
以下の3つ以外にもあると思いますが、今僕が知っているコマンドはこちらです。
1.chkconfig
2.runlevel
3.telinit
1.chkconfig は使用頻度がとにかく高いです。
これは各種プログラムのランレベルを調整するもので、Windows でいう services.msc の詳細版でしょうか。
Linux ではパッケージをインストールしても、それが自動的にスタートアップに登録されていないことが多いので、マシンを起動するたびにその都度プログラムを手動で実行しなければなりません。
そういったとき chkconfig コマンドを使ってランレベルを指定してあげると、上記のような煩わしい手間を省けます。
chkconfig 'デーモン名' on (or off) |
2.runlevel はあまり使わないと思います。
こちらは現在稼動している Linux のランレベルを表示するコマンドです。
runlevel コマンドを実行すると 「3 5」 といったように、半角数字が2つが半角スペースを挟んで表示されますが、これは左の数字が 「遷移前のランレベル」 を意味しており、右側の数字が 「現在のランレベル」 を意味します。中には 「N / S」 と表示されることがありますが、「N」 は物理的なマシンの起動、「S」 はシングルユーザーモード (ランレベル1) からの遷移です。
[gen@chan ~]# runlevel S 5 |
3.telinit もあまり使わないと思います。 少なくとも、今の僕は使ったことがないです。
telinit コマンドはランレベルの遷移を意味しており 「telinit + ランレベル」 の組み合わせで実行します。
例えばランレベル5 (グラフィカル) にログインした状態で telinit 3 とコマンド実行すると、デスクトップ画面から一転してコマンドライン画面へ遷移します。同時にこのとき runlevel コマンドを実行しますと、今切り替わったコマンドライン画面は ランレベル5 から遷移であることから 「5 3」 と結果が表示されます。
telinit 'ランレベル' |
なんとなくですが、shutdown コマンドを使うよりも、telinit 0 でシャットダウンした方が 理解している感 があってカッコイイ気がする。 ランレベルマスターになった暁には、使ってみようかな……やっぱやめたw
rc スクリプト
このランレベルごとに起動するスクリプト群のことを 「rc スクリプト」 と呼ぶそうです。
rc スクリプトは /etc/rc.d/ のディレクトリ配下にありましたので、以下に見ていこうと思います。
まず ls /etc/rc.d/ コマンドを実行すると、ランレベルごとの rc スクリプトが出てきます (一部省略)。
[gen@chan ~]# ls /etc/rc.d/ init.d rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d |
これらの数字がランレベルを意味していることは 容易に想像できると思います。
……そんな偉そうなことを言いながらも、ランレベルを知らないときは 「なんだコノ 0 から 6 までの文字は… (((( ;゚Д゚))」 と恐怖しておりました。。
さて、ここでは rc3.d を例に挙げていきます。
rc3.d はディレクトリですので、ls コマンドからスクリプト群の実体が確認できます。

↑図2: ls /etc/rc.d/rc3.d/ の結果
K50netconsole や S10network といったファイルが確認できますが、これが rc スクリプト群です。
telinit コマンドが実行されたとき、または Linux カーネル起動時の inittab からのランレベルが確認できたタイミングで、Linux はこれらの rc スクリプトを順に実行していきます。
ちなみに rc スクリプトは シンボリックリンク です。
リンク先は /etc/init.d/ ディレクトリにあり file または ls -l コマンドなどから確認が取れます。ためしに S10network のリンクを見ると 「S10network -> ../init.d/network」 と書いてあり、スクリプトの実体が /etc/init.d/network であることが分かります。

↑図3:ランレベル5 での ls -l /etc/rc.d/rc3.d/ の結果
図2 と 3 では 「赤線と青線」 でコマンドの出力結果を囲んでいますが、これは意味があります。
色線で囲んだスクリプトのリンク名に注目してみてください。
赤線 … リンク名が K から始まっている (プログラムの終了)
青線 … リンク名が S から始まっている (プログラムの開始)
赤線で囲われた K から始まる名前のリンクが実行されると、そのリンク先のスクリプトに 「stop」 の引数を渡して実行します。一方、青線で囲われた S から始まるリンクでは、「start」 の引数を渡して実行します。K は Kill の意味、また S は Start の意味なので、これは分かりやすいですね。

↑図4:リンク名によてスクリプトの動作が変わる
それにしても 「なんで参照先のスクリプトが同じなのに動作が違うの?」 と疑問に思いましたが、Linux では、リンクのファイル名によってスクリプトの動作が異なることがあるようですね。いやはや、これには驚きました。
rc スクリプト名の変化
では次に chkconfig コマンドを使って rc スクリプトの変化を見てみます。
ここでは sshd を例に挙げましょう。
1.CentOS 6.3 をインストールした直後に chkconfig --list sshd コマンドを実行すると、以下のような出力されます。
[gen@chan ~]# chkconfig --list sshd sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off |
「数字:ON / OFF」 とありますが、数字がランレベルを意味していて ON / OFF がデーモンの起動状態です。
2.ここでランレベル3 となる /etc/rc.d/rc3.d/ ディレクトリを覗いてみます (ls の結果は省略します)。
[gen@chan ~]# ls /etc/rc.d/rc3.d/ K10saslauthd S08iptables S10network S55sshd S90crond |
sshd の起動を意味する S55sshd がありました。
先ほども書きましたが、これはリンクですので file コマンドを流してみると 「/etc/rc.d/rc3.d/S55sshd: symbolic link to '../init.d/sshd'」 が表示されます。
3.次はここで chkconfig sshd off コマンドを流します。すると……、
[gen@chan ~]# chkconfig --list sshd sshd 0:off 1:off 2:off 3:off 4:off 5:off 6:off |
当たり前ですが、全てのランレベルの sshd が OFF になりました。
4.ではここで、さっきと同じように /etc/rc.d/rc3.d/ ディレクトリを覗きます (ls の結果省略)。
[gen@chan ~]# ls /etc/rc.d/rc3.d/ K10saslauthd K25sshd S08iptables S10network S90crond |
先ほどは 「S55sshd」 だったのに対し、今回は 「K25sshd」 のリンクが作成されています。
chkconfig でプログラムのランレベルを変更すると、スクリプトのリンクそのものが変わっていくようですね。
マシン終了時について
マシンの終了動作に関することを少々メモします。
CentOS を終了、または再起動させるときに表示されるメッセージがあります (図5)。
このメッセージ、いったい何を意味しているのかずっと疑問だったのですが、今回ランレベルについてメモしていくにつれてようやく理解ができました。どうやらこのメッセージは 各種デーモンの終了 を意味していたようです。

↑図5:CentOS 再起動時に表示されるメッセージ
ランレベル6 で実行されるスクリプト群 (/etc/rc6.d/) と、この終了時に表示されるメッセージを見比べてみると、デーモンたちがスクリプト群の順番に従って終了していることが見て取れます。またこのとき、起動していないデーモンに関しては停止の実行をスキップしているようです。
またランレベル6 の S00killall に関しては、残ったデーモンの終了を意味しています。
具体的には /var/lock/subsys というディレクトリ配下に存在するデーモンに対して、停止の命令を投げかけるようです。…でもそれだったら最初からこのスクリプトを実行すればいいのでは、なぜ各デーモンを順番に停止させていくのだろう……という疑問になったので、安直な考えで /etc/rc.d/init.d/killall start とコマンドを打ってみました。
すると……いくつかのデーモンに [ failure ] という輝かしい実行結果が返ってきました。
こういうモノなのか、あるいはたまたま失敗したのかは分かりませんが、再起動などに関してはおとなしく reboot か shutdown -h now あたりを使っとけ、ということですね。。
あと ランレベル6 の rc スクリプトには、もうひとつ S から始まるリンク S01reboot がありますが、この実体は /etc/init.d/halt というスクリプトでした。しかし、ランレベル0 の終了を意味するリンクである S01halt の実体も /etc/init.d/halt だったので、おそらくこれもリンク名の違いによって渡される引数が違い、再起動または終了処理が別々に走っているのでしょう。
そんな /etc/init.d/halt について色々調べたところ、以下のような 驚愕の事実 が判明。
# halt |
halt というコマンドがあるのですが、なんとこのコマンドは shutdown -h -q now と同じ意味だったのです!!
……Linux ユーザからすれば 「そんなこと当たり前だろ!!」 と思われるでしょうか、僕はこのコマンドを 今はじめて知りました (本気で)。どうやらワタクシは Linux ユーザ失格のようで。。。OTL
inittab
稼働中の Linux からランレベルを選択 (変更) するときは telinit コマンドを使うことで実現できますが、停止状態のマシンがパワーオンしたときは /etc/inittab ファイルを参照してランレベルを選択します。
この inittab を開いてみると、最終行に 「id:3:initdefault:」 という一行が記述されており、ここの数字が Linux がパワーオンされたときに選ばれるランレベルになります。

↑図6:デフォルトでは id:5:initdefault:
※僕の環境 (CentOS 6.3) では /etc/inittab に 「id:3:initdefault:」 の一行しか書かれていませんでしたが、ディストリビューションによっては沢山の情報が書かれている場合があるそうです。本項では 「id:3:initdefault:」 の動作に関してのみ理解していきますが、もっと根本の init の仕組みについては別の機会に書いていく予定です。
その inittab ファイルは、Kernel がロードし終えたときに実行する init が参照します。
細かい話は抜きにして、停止したマシンがパワーオンすると BIOS → ブートローダー → Kernel みたいな流れ (だと信じて疑わない) でカーネルがロードされていき、そして init を起動します。
init は Linux の 「プロセス」 を理解するには欠かせないモノなので、本来ならスルースキルを発動させたくないのですが、ここもまたスルーいたします。。。
そんな init の実体は /sbin/init です。
バイナリファイルなので中身の確認はできませんが init は /etc/inittab を参照しているようで、そこに書かれたランレベルにしたがって、rc スクリプトを実行させます。その指定行が前述の 「id:3:initdefault:」 です。

↑図7:id:3:initdefault: はマシン起動時に実行する rc スクリプト
それにしても話はそれますが、crontab とか inittab とか、この tab ってナンザンショ。
そう思って調べたところ、これは table を意味しているそうですね。 設定ファイルが表のように見えるから? よく分かりませんが、とりあえず略さず書くと inittab = init table 、crontab = cron table となりそうですね。
ランレベル1
ここで冒頭の 「シングルユーザモード」 についてメモします。
シングルユーザモードのランレベルは 1 でして、主に OS のメンテナンスに使われる動作モードです。
前述もしましたが Windows でいうセーフモードのようなイメージで、root のパスワードを忘れてしまった際にはこちらから再設定が可能でした。 また rc1.d ディレクトリを覗くと分かりますが、起動するデーモンは少ないようです。
あと特徴としては、複数のユーザがログインできる 「マルチユーザモード」 とは対照的に、root ユーザでしかログインすることができず、その上操作はコマンドラインに限定されるのがシングルユーザモードでもあります。

↑図8:ランレベル1 では root ユーザのみ
では、最後に root ユーザのパスワード変更方法 を以下にメモします。
以下の方法は CentOS 6.3 による root パスワード変更なので、他ディストリビューションでの動作は未確認ですが、たぶんできると思います。 もし失敗しても、ネットで調べれば解決法が沢山出てきますわよw
1.CentOS 起動から GRUB に入る
OS 起動時にありがちな 「Press any key to enter menu」 というイミフなメッセージが表示されたら、キーボードの適当なキーを押します。
Kernel Panic のメモでも軽く取り上げましたが、たしか GRUB はブートローダーでしたね。

↑図9:このとき僕は Enter キーよりも K キーあたりを押す。理由は特にない…
2.ブート情報の書き換え
GRUB に入ると Kernel が選択できるので、一番上の Kernel を選択します。
このとき [ E ] キーを押すのを忘れずに。 僕はいつも [ Enter ] キーをぶっ叩いてしまい、コマンドを書き換えることなく Linux が立ち上がってしまうことが多いです。 これによって 約2分 のロスです。 時間は有限なのです。。。

↑図10:Kernel Panic のとき、目に焼き付くほど見た画面…
次に 「kernel /」 から始まる行を選択して、同じく [ E ] キーを押します。
すると 「<TYPE=pc KEYTABLE=...」 のような一行が表示されますので、末尾に 「1」 または 「single」 と入力します。 入力を確認したら [ Enter ] キーを押して編集モードを抜け、そして [ B ] キーを押下します。

↑図11:single と打つとカッコイイけど、僕は 1 を入力する。。
言うまでもありませんが、ここに入力した数字が Linux 起動時のランレベルになります。
試しに 「3」 とやってみたところ、コマンドラインのマルチユーザモードが立ち上がりました。
3.root パスワードの変更
パスワードの変更は特に変わったこともせず、passwd コマンドから設定します。
[root@chan ~]# passwd New password: ******** Retype new password: ******** passwd: all authentication tokens updated successfully. [root@chan ~]# reboot |
ちなみにパスワードを変更したら reboot コマンドを実行した方がいいです。
ちょっと横着して telinit 5 を実行してみたところ、いつまで経ってもランレベルが切り替わらない という、いわゆる 動作不良 が発生してしまったからです。
これはたまたまかもしれませんが、とりあえず reboot は色々な意味で最強なコマンドでございますw
最後に
初めて 「シングルユーザモード」 という言葉を知ったのは、Linux ではなく OS X がきっかけでした。
「管理者のパスワード忘れちった。対処してよwww」
という 無茶振り (僕はマックど素人…) をされ、そのときにシングルユーザモードを知りました。
当時は (今もですが) Linux ど素人の僕でしたが、辛うじて Linux コマンドを知っており…、
(あれ? なんでマックで Linux コマンドが使えるんだ…?)
と、不思議だったのを覚えています。
今思えば、あのときが 「OS X が UNIX 系である」 ことを知った瞬間かもしれませんね。
そんな OS X ですが、一昔前に こんな経験 をしたことがあります。
あのときは 「OsiriX」 (オザイリクス) というアプリを動かすために、「スノーレパード」 という OS X を購入する必要がありました。
それじゃさっそく最寄りの ナニガシ電機 に在庫問い合わせしてみようと、ダイヤルを回したのですが……、
ナニガシ 「お電話ありが(ry」
ワタクシ 『あのー、スノーレパードの在庫を確認したいのですが』
ナニギシ 「………あの、もう一度よろしいでしょうか?」
ワタクシ 『あ、はい。スノーレパード……OS X 10.6 っていうパソコンの OS なんですが…』
ナニグシ 「……えっと、ゲームソフト でしょうか?」
ワタクシ 『……… HA!?』
ナニゲシ 「……ゲームコーナーの方にお繋ぎいたしますね」
ワタクシ 『―――』
嘘のようで、本当のお話。。。OTL
スポンサーサイト