本連載は、Linux 認定試験 LPICに対応しています。一般的なLinuxユーザーレベルのトピックは省略し、システム管理とサーバ管理の内容を取り上げています。また、LPIC対策だけでなく、関連するトピックについて系統的な理解を問う問題も出題しています。連載の特徴は、対象となるプログラムのバージョンを可能な限り明記していること、比較的新しくまとまった解説がまだ少ないトピック、重要だが理解しにくいトピックを優先して取り上げていることです。問題を解き、その解説を読むことにより実践でLinuxを活用できる力を身に付けます。
このトピックに関連した設定や試験問題を解く際には、以下の項目がポイントになります。
【1】システムの起動シーケンスの概要を把握しておく
システムの起動シーケンスを把握するとLinuxの仕組みや設定方法が分かり、システムトラブルへの対処もできるようになります。
以下は一般的なLinuxの起動シーケンスです。
電源投入 |
|
↓ |
|
BIOS |
BIOSがディスクの先頭ブロック(MBR)に書き込まれたブートローダをメモリにロードする |
↓ |
|
ブートローダ |
ブートローダがカーネル(vmlinuz)とイニシャルRAMディスク(initrd)をメモリにロードする。Linuxの代表的なブートローダにはLILOとGRUBがある |
↓ |
|
カーネル |
カーネルは自身の初期化シーケンスを実行し、メモリにロードされている小さなファイルシステムinitrdをマウントする |
↓ |
|
initrd |
カーネルはinitrdを利用してルートファイルシステムをマウントする(一般的にはinitrdを使用しますが、使用しない設定もある) |
↓ |
|
init |
カーネルは自身の初期化の最終段階で1番目のユーザープロセスであるinit(プロセスIDは1)を生成する。起動時のカーネルオプションの指定により、init以外のプロセス(例えば/bin/bash)を生成することもできる。 |
↓ |
|
/etc/inittab |
initは起動すると/etc/inittabを読む。/etc/inittabにはシステムのランレベルと、initが起動するプログラムが記述されている |
↓ |
|
rcスクリプト |
initは/etc/inittabに指定されている、rcスクリプト(Run Control Script)である/etc/rc.sysinit、/etc/rcを実行する |
【2】代表的なブートローダ GRUBとLILOの仕組みを把握しておく
ブートローダはディスクの先頭ブロック(MBR:Master Boot Record)に書き込まれています。PCのマザーボード上のICに書き込まれたプログラムBIOS(Basic Input Output System)から呼び出されて実行され、カーネルをメモリにロードするプログラムです。Linuxの代表的なブートローダにはLILO(LInux LOader)とGRUB(GRand Unified Bootloader)があります。
LILOはGRUBが開発される前まで、Linuxの標準のブートローダとして使用されてきました。設定ファイル/etc/lilo.confにカーネルとinitrdのファイル名、カーネルオプションなどを記述し、/sbin/liloコマンドにより設定を行います。
prompt timeout=200 default=CentOS boot=/dev/hda map=/boot/map install=/boot/boot.b message=/boot/message lba32 image=/boot/vmlinuz-2.6.9-67.EL label=CentOS initrd=/boot/initrd-2.6.9-67.EL.img read-only append="rhgb quiet root=/dev/hda1" |
設定ファイル/etc/lilo/confで指定したカーネルとinitrdの位置情報は、/boot/mapにディスクのセクタ番号で記録されます。カーネルとinitrdを再構成した場合は、たとえファイル名に変更がなくても、/sin/liloコマンドを実行して/boot/mapファイルの情報を更新する必要があります。
GRUBはGNUによって開発された高機能なブートローダです。現在は多くのLinuxディストリビューションでGRUBが使用されています。設定ファイル/boot/grub/grub.conf(CentOS 4.4の場合/boot/grub/menu.lstはgrub.confへのシンボリックリンク)にカーネルとinitrdのファイル名、カーネルオプションなどを記述し、/sbin/grubコマンドあるいはシェルスクリプト/sbin/grub-installにより設定を行います。
default=0 timeout=5 splashimage=(hd0,0)/boot/grub/splash.xpm.gz hiddenmenu title CentOS-4 i386 (2.6.9-42.EL) root (hd0,0) kernel /boot/vmlinuz-2.6.9-42.EL ro root=LABEL=/ rhgb quiet initrd /boot/initrd-2.6.9-42.EL.img |
ブートローダによってカーネルや、カーネルを経由してinitに渡すオプションを指定できます。
CentOS 4.4のgrub.confでは次のオプションが指定されています。
rhgb | Red Hat Graphical Boot。システムのブートプロセスをグラフィカルに表示するオプションです。カーネルを経由してinitに渡され、シェルスクリプト/etc/rc.sysinitの中で実行されます |
---|---|
quiet | ほとんどのカーネルメッセージを抑制し、表示を行わないオプションです |
また、次のようなオプション指定もできます。
init=/bin/bash | カーネルが生成する1番目のプロセスをinitではなくbashに設定します。/etc/inittabの記述ミスでシステムが立ち上がらないときなど、この方法で立ち上げ、シェルから回復作業ができます |
---|---|
現在立ち上がっているカーネルにどのようなオプションが指定されているかは/proc/cmdlineファイルで確認できます。
# cat /proc/cmdline ro root=LABEL=/1 rhgb quiet |
【3】initrdの役割と仕組みを把握しておく
initrd(initial ram disk)はブートローダによってメモリにロードされる小さなルートファイルシステムです。カーネルは起動時にこのinitrdをマウントし、initrdの中のプログラムやモジュールを利用してディスク上の本来のルートファイルシステムをマウントします。
initrdの中にはext2ファイルシステムモジュールext3.ko、Journaling Block Deviceモジュールjbd.koが含まれていて、インタプリタnashがinitスクリプトを実行することにより本来のルートファイルシステムがマウントされます。initrdの中のローダブルモジュールのバージョンはカーネルバージョンと同一である必要があるので、カーネルを再構築したときはmkinitrdコマンドによりinitrdを作り直す必要があります。
# mkinitrd /boot/initrd-2.6.9-42.EL.img `uname -r` |
initrdにはcpio形式とファイルシステム形式があります。CentOS 4.4ではcpio形式です。gzipで圧縮されたinitrdを解凍した後、それぞれのinitrdに次のようにしてアクセスします。
cpio形式のinitrdを展開する
# cpio -iI initrd |
ファイルシステム形式のinitrdをマウントする
# mount -o loop initrd /mnt |
Copyright © ITmedia, Inc. All Rights Reserved.