LinuxServer システムの起動(停止)とランレベルについて
Linux使うにはマシンの電源を入れなければなりません。(あたりまえですが)
マシンの電源を入れた後、Linuxがどのように起動して行くのか説明して行きます。
システムの起動順番
Linuxは次の順番で起動してきます。
・BIOS → ブートローダ → カーネル → init
Linux起動の事をシステムのブートと呼びます。
・BIOS
コンピュータの電源を入れると、まずこのBIOSが起動し、POST(*)と呼ばれる、
マシン上にあるハードウエア(キーボード、マウス、CPUやメモリ、HDDなど)の
初期化と自己診断処理を実施します。
*POST=PowerOnSelfTest
PSOTをクリアすると、BIOSは記憶装置内(HDD)のMBR(MasterBootRecord)からブートローダを呼び出します。
MBRとはHDDの先頭セクタ(512バイト)ことで、ブートローダを呼び出す為のプログラムが格納されています。
・ブートローダ
最近のLinuxシステムではブートローダにGRUBが使用されます。
ブートローダはMBRに格納されている第一段階部分と、記憶装置内の別の場所に格納されている第二段階部分があります。
2段構成の理由は第一段階部分の入るHDDの先頭セクタ(512バイト)では全てを格納することができない為です。
第一段階のブートローダから第二段階のブートローダを呼び出し、第二段階のブートローダがカーネルを
ロードし、カーネルに制御を移す役割を果たします。
・カーネル
カーネル(kernel)とは、オペレーティングシステム(OS)の核となり、マシンに接続された周辺機器や、
アプリケーションソフトの監視を行い、プロセス間の通信、割りこみ処理といった仕事も、
カーネルによって行なわれています。
ブートローダからロードされたカーネルはハードウェアを認識と制御を行い、ルートパーティションの
マウントなど様々な初期化処理を行った上で、initという特別な最初のプロセスを起動します。
・init
カーネルがディスクから読み込まれてデバイス・ドライバの初期化処理を終えた直後に、/sbin/initが起動します。
/sbin/initは最初に起動されるプロセスで、PID(プロセス ID)は必ず1です。
設定ファイル’/etc/inittab’の記述に基づいて、自動起動するべきプロセスを立ちあげるなど、
アプリケーションレベルの初期化を行います。
ここまで、エラーが無く進むと、Linuxは起動します。
起動時に何があったか確認する
システム起動中の処理は’dmesg’コマンドで確認することができます。
[コマンド]
# dmesg
[実行例]
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Linux version 3.5.2-1.fc17.x86_64 (mockbuild@) (gcc version 4.7.0 20120507 (Red Hat 4.7.0-5) (GCC) ) #1 SMP Wed Aug 15 16:09:27 UTC 2012
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.5.2-1.fc17.x86_64 root=/dev/mapper/VolGroup-lv_root ro rd.md=0 rd.dm=0 rd.lvm.lv=VolGroup/lv_swap quiet SYSFONT=latarcyrheb-sun16 rhgb rd.lvm.lv=VolGroup/lv_root rd.luks=0 KEYTABLE=jp106 LANG=en_US.UTF-8
[ 0.000000] Disabled fast string operations
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009dbff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000009dc00-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000003fffcfff] usable
以下省略
また、/var/log/messagesと/var/log/boot.logにも起動時のログが記録されます。
さらに、’/proc/cmdline’ファイルにはブートローダからカーネルに渡されたパラメータが記録されます。
[コマンド]
# cat /proc/cmdline
[実行例]
BOOT_IMAGE=/vmlinuz-3.5.2-1.fc17.x86_64 root=/dev/mapper/VolGroup-lv_root ro rd.md=0 rd.dm=0 rd.lvm.lv=VolGroup/lv_swap quiet
SYSFONT=latarcyrheb-sun16 rhgb rd.lvm.lv=VolGroup/lv_root rd.luks=0 KEYTABLE=jp106 LANG=en_US.UTF-8
SysVinitと/sbin/init
Linuxの起動について、カーネルのブート後に/sbin/initが起動します。
/sbin/initは、/etc/inittabに記述された設定に従い、システムに必要な
プロセスを順次起動させていきます。
この/sbin/initを使用したプロセス起動は’Sysvinit’と呼ばれる古くからある仕組みです。
‘Sysvinit’は以下の流れでプロセスを起動させていきます。
1:initが/etc/inittabを読み込みます
2:initが/etc/rc.sysinitスクリプトを実行します
3:initが/etc/rcスクリプトを実行します
4:/etc/rcスクリプトはシステムの動作状態に合わせたプロセス起動スクリプトを実行します
‘Sysvinit’はプロセスを決められた順番で起動するため、処理に時間が掛かるという
デメリットがあるため、最近のLinuxではこの’Sysvinit’に代わり、Upstartやsystemdという
仕組みを利用する動きがあります。
initプロセスとランラベル
initが実行した/etc/rcスクリプトはシステムの動作状態に合わせた
プロセス起動スクリプトを実行しますが、このシステムの動作状態のことを
ランレベルと呼びます。
ランレベルはシステムの起動時にブートローダによって選択されるますが、
システムの起動中に変更する事もできますが、システム全体で既定されていますので
ユーザ毎に変えることはできません。
RedHat系Linuxのランレベルは次のように定義されています。
ランレベル | 説明 |
0 | システムを停止する |
1、Sまたはs | シングルユーザモード |
2 | テキストログインによるマルチユーザモード(NFSサーバなし) |
3 | テキストログインによるマルチユーザモード |
4 | 未使用 |
5 | グラフィカルログインによるマルチユーザモード |
6 | システムを再起動する |
シングルユーザモードとはネットワークやデーモンを起動せず、
root以外のログインを許可しないモードのことで、システムメンテナンス等で
使用します。
ランレベルの確認と変更、起動スクリプト
initプロセスはランレベルに応じたスクリプトを実行し、プロセスを起動して行きますが、
システムで定義されたデフォルトのランレベルは’/etc/inittab’に記述されています。
viコマンド等で/etc/initttabを開くと「initdefault」というデフォルトランレベルを
定義した記述があります。
デフォルトのランレベルをテキストログインのマルチユーザモードから、
グラフィカルログインのマルチユーザモードに切り替えるには、/etc/inittabの
記述を次のように変更します。
[変更例]
id:3:initdefault: → id:5:initdefault:
次に、ログイン中のマシンがどのランレベルで起動したのかを確認するにはrunlevelコマンドを使用します。
runlevelコマンドは現在のランレベル(左の値)と1つ前のランレベル(右の値)を確認します。
[コマンド]
# runlevel
[実行例]現在のランレベルが3,1つ前のランレベルがN(無設定)
N 3
また、ランレベルを変更するにはrootユーザでtelinit(init)コマンドを使用します。
[コマンド]
# telinit 3
または
# init 3
テキストログインのマルチユーザモードに変更します。
Sysvinitでは/etc/init.dディレクトリ以下に配置されているスクリプトで
各種プロセスを起動しています。
テキストログインとグラフィカルログインでは起動するプロセスも異なりますので、
initプロセスは、デフォルトのランレベルにより、/etc/rc[ランレベル].dディレクトリ以下の
起動スクリプトを実行します。
/etc/rc[ランレベル].dディレクトリ以下の起動スクリプトはシンボリックリンクで、
実体は/etc/init.dディレクトリに存在します。
起動スクリプトを使用することにより、プロセスの起動/停止が行えます。
システムの停止と再起動
システムを停止/再起動するにはrootユーザで’shutdown’コマンドを使用します。
shutdownコマンドはランレベルを指定した停止/再起動は行えませんが、
時刻を指定したり、ログイン中のユーザへメッセージを通知して
システムの停止、もしくは再起動が可能です。
[コマンド]システムの停止と再起動を行う
shutdown -オプション [message]
オプションは次のとおりです.
-h:シャットダウン後にシステムを停止(halt)
-r:シャットダウン後にシステムを再起動(reboot)
-k:シャットダウンを行わず、メッセージを通知(know)
-c:実行中のシャットダウンを取り消す(cancel)
の指定は、次の書式に従います。
HH:MM HH時MM分に実行(24時間制)
+XX XX分後に実行
now 直ちに実行
[コマンド実行例]
#shutdown -h now
[実行結果]
直ちにシステムを停止します。
[コマンド実行例]
#shutdown -r +5
[実行結果]
5分後にシステムを再起動します。
[コマンド実行例]
#shutdown -k now “すぐにログアウトしてください”
[実行結果]
すぐにログアウトしてくださいというメッセージを通知します
以下のコマンドはshutdownコマンドを互換したものになります。
halt:haltコマンドはすぐにシステムを停止します。
デフォルトでは電源を切りませんが、-pオプションを付加すると電源を切ります。
poweroff:システムを停止します。shutdown -h nowコマンドと同じです。
reboot:システムをすぐに再起動します。shutdown -r nowと同じです。
また、システムを停止と再起動はランレベル変更でも行えますので、
実行時間の指定とユーザへの通知が行えませんがtelinit(init)コマンドも有効です。
[コマンド実行例]
# init 0
[実行結果]
ランレベルを0(システム停止)に変更
[コマンド実行例]
# telinit 6
[実行結果]
ランレベルを6(リブート)に変更