第3章 システムの初期化

目次

3.1. ブートストラッププロセスの概要
3.2. 1段目: BIOS
3.3. 2段目: ブートローダー
3.4. 3段目: ミニDebianシステム
3.5. 4段目: 通常のDebianシステム
3.5.1. ランレベルの意味
3.5.2. ランレベルの設定
3.5.3. ランレベル管理例
3.5.4. 各initスクリプトのデフォールトのパラメーター
3.5.5. ホスト名
3.5.6. ファイルシステム
3.5.7. ネットワークインターフェースの初期化
3.5.8. ネットワークサービスの初期化
3.5.9. システムメッセージ
3.5.10. カーネルメッセージ
3.5.11. udevシステム
3.5.12. カーネルモジュール初期化

Debianシステムが以下に起動され設定されるかの知っていることはシステム管理者として賢明です。正確で詳細な情報がインストールされたパッケージのソースや文書中にあるとは言え、我々ほとんどにとってちょっと大変過ぎます。

著者などの過去の知見に基づきDebianシステムの要点とそれらの設定の簡単な参考となる概論を提供するように勤めました。Debianシステムは動く標的なので、システムの状況が変わっているかもしれません。システムに変更を加える前に、各パッケージの最新文書を参照下さい。

3.1. ブートストラッププロセスの概要

コンピューターシステムは、電源投入イベントからユーザーに機能の完備したオペレーティングシステム(OS)を提供するまでブートストラッププロセスを数段通過します。

単純化のため、デフォールトのインストールをした典型的なPCプラットフォームに限定し議論します。

典型的なブートストラッププロセスは4段ロケットのようです。各段のロケットは次の段のロケットにシステムのコントロールを引き継ぎます。

もちろん、これらに関して異なる設定をすることはできます。例えば、自分自身で専用カーネルをコンパイルした場合、ミニDebianシステムのステップをスキップできます。自分自身で確認するまでは、あなたのシステムがこの様になっていると決めつけないで下さい。

[注記] 注記

伝統的なPCプラットフォームでないSUNとかMacintoshシステム等では、ROM上のBIOSやディスク上のパーティション(「ディスクパーティション設定」)が非常に異なっているかもしれません。そのような場合にはプラットフォーム特定の文書をどこかで求めて下さい。

3.2. 1段目: BIOS

BIOSは電源投入イベントが引き起こすブートプロセスの1段目です。CPUのプログラムカウンターが電源投入イベントで初期化され、読出し専用メモリー(ROM)上にあるBIOSが特定のメモリーアドレスから実行されます。

BIOSはハードウエアーの基本的な初期化(POST: 電源投入時自己診断)を行い、システムのコントロールをあなたが提供する次のステップにシステムのコントロールを引き継ぎます。BIOSは通常ハードウエアーによって供給されます。

BIOS初期画面はどのキーを押すとBIOS設定画面に入ってBIOSの挙動を設定できるかを通常表示しています。よく使われるキーはF1やF2やF10やEscやInsやDelです。もしBIOS初期画面が洒落た画像表示で隠されている場合、Esc等の何らかのキーをおすとこれを無効にできます。こういったキーはハードウエアーに大いに依存します。

BIOSが起動するコードのハードウエアー上の場所や優先順位はBIOS設定画面から選択できます。典型的には最初に見つかった選択されたデバイス(ハードディスクやフロッピーディスクやCD-ROM等)の最初の数セクターがメモリー上にロードされこの初期コードが実行されます。この初期コードは次のいずれでもよろしい。

  • ブートローダーコード
  • FreeDOSのような踏み石OSのカーネルコード
  • この小さな空間に収まればターゲットOSのカーネルコード

典型的にはプライマリハードディスクの指定されたパーティションからシステムが起動されます。伝統的PCのハードディスクの最初の2セクターにマスターブートレコード(MBR)が含まれます。ブート選択に含まれるディスクのパーティション情報はこのMBRの最後に記録されています。BIOSから実行される最初のブートローダーコードは残りの部分を占めます。

3.3. 2段目: ブートローダー

ブートローダーはBIOSによって起動されるブートプロセスの2段目です。それはシステムのカーネルイメージとinitrdイメージをメモリーにロードし、それらにコントロールを引き継ぎます。このinitrdイメージはルートファイルシステムイメージで、そのサポートは使われるブートローダー次第です。

Debianシステムは通常Linuxカーネルをデフォールトのシステムカーネルとして使っています。現在の2.6カーネルにとってのinitrdイメージは技術的に言うならinitramfs (初期RAMファイルシステム)イメージです。initramfsイメージはルートファイルシステム中のファイルのgzipされたcpioアーカイブです。

Debianシステムのデフォールトインストールでは、GRUBブートローダーの1段目のコードをPCプラットホームのMBRの中に置きます。多くのブートローダーと設定の選択肢があります。

表3.1 ブートローダーのリスト

ブートローダー パッケージ ポプコン サイズ initrd 説明
GRUB Legacy grub * V:10, I:86 168 サポート ディスクパーティションやvfatやext3等のファイルシステムを理解するぐらいスマートです。(lennyのデフォールト)
GRUB 2 grub-pc * V:3, I:14 1796 サポート ディスクパーティションやvfatやext3等のファイルシステムを理解するぐらいスマートです。
GRUB 2 grub-rescue-pc * V:0.03, I:0.5 276 サポート GRUB 2のブート可能なレスキューイメージ(CDとフロッピー) (PC/BIOSバージョン)
Lilo lilo * V:0.5, I:3 1124 サポート ハードディスク上のセクター位置に依存します。(旧式)
Isolinux syslinux * V:1.1, I:7 160 サポート ISO9660ファイルシステムを理解します。ブートCDに使われています。
Syslinux syslinux * V:1.1, I:7 160 サポート MSDOSファイルシステム(FAT)理解します。ブートフロッピーで使われます。
Loadlin loadlin * V:0.03, I:0.2 144 サポート 新しいシステムがFreeDOS/MSDOSシステムから起動されます。
Neil TurtonのMBR mbr * V:0.8, I:5 96 非サポート MSDOSのMBRを代替するフリーソフトです。ディスクパーティションを理解するだけです。

[警告] 警告

grub-rescue-pcパッケージのイメージから作ったブート可能なレスキューメディア(CDかフロッピー)無しにブートローダーを試してはいけません。これさえあると、ハードディスク上に機能するブートローダーが無くともシステムの起動ができます。

GRUB Legacyのメニューの設定は"/boot/grub/menu.lst"にあります。例えば、次のような内容です。

title           Debian GNU/Linux
root            (hd0,2)
kernel          /vmlinuz root=/dev/hda3 ro
initrd          /initrd.img

GRUB 2のメニューの設定は"/boot/grub/grub.cfg"にあります。 "/etc/grub.d/*"の雛形と"/etc/default/grub"の設定から"/usr/sbin/update-grub"を使って自動的に作られます。例えば、次のような内容です。

menuentry "Debian GNU/Linux" {
        set root=(hd0,3)
        linux /vmlinuz root=/dev/hda3
        initrd /initrd.img
}

これらの例で、これらのGRUBパラメーターは次の意味です。

表3.2 GRUBパラメーターの意味

GRUBパラメーター 意味
root GRUB legacyでは"(hd0,2)"またGRUB 2では"(hd0,3)"と設定することでプライマリディスクの3つ目のパーティションを使用
kernel カーネルパラメーター"root=/dev/hda3 ro"とともに"/vmlinuz"にあるカーネルを使用
initrd "/initrd.img"にあるinitrd/initramfsイメージを使用

[注記] 注記

GRUB legacyプログラムが使うパーティション値はLinuxカーネルやユーティリティーツールが使う値より1つ少ない数字です。GRUB 2プログラムはこの問題を修正します。

[ティップ] ティップ

UUID (「UUIDを使ってパーティションをアクセス」参照)は、"/dev/hda3"のようなファイル名に代わるブロックの特定デバイスを確定するのに使え、例えば"root=UUID=81b289d5-4341-4003-9602-e254a17ac232 ro"です。

[ティップ] ティップ

チェインロード(連鎖導入)とよばれる技術を使うと、あるブートローダーから他のブートローダーを起動できます。

"info grub"とgrub-install(8)を参照下さい。

3.4. 3段目: ミニDebianシステム

ミニDebianシステムはブートローダーによって起動されるブートプロセスの3段目です。メモリー上でルートファイルシステムとともにシステムカーネルを実行します。これはオプションの起動プロセスの準備段階です。

[注記] 注記

"ミニDebianシステム"は著者がこの3段目のブートプロセスを本文書中で記述するために作った言葉です。このシステムは一般にinitrdとかinitramfsシステムと呼ばれています。類似のメモリー上のシステムはDebianインストーラーでも使われています。

"/init"スクリプトはこのメモリー上のルートファイルシステムで最初に実行されるプログラムです。それはユーザー空間でカーネルを初期化し次の段階にコントロールを引き継ぐシェルプログラムです。このミニDebianシステムは、メインのブートプロセス始まる前にカーネルモジュールを追加したり、ルートファイルシステムを暗号化されたファイルシステムとしてマウントする等のブートプロセスの柔軟性を提供します。

"break=init" 等をカーネルブートパラメーターとして与えると、本部分のブートプロセスに割り込みrootシェルを獲得できます。この他の割り込み条件は"/init"スクリプトを参照下さい。このシェル環境はあなたの機器のハードウエアーを詳細に検査できるだけ十分洗練されています。

ミニDebianシステムは機能を削ったシステムで、主にbusybox(1)というGNUツールで提供されます。

[注意] 注意

読出しのみのルートファイルシステム上では、mountコマンドには"-n"オプションを使う必要があります。

3.5. 4段目: 通常のDebianシステム

[注記] 注記

本セクションは、古典的System Vスタイルのlenny上のブートシステムについての記述です。Debianはイベントドリブンのブートシステムに移行中です。The future of the boot system in DebianDependency based boot sequenceを参照下さい。

通常のDebianシステムはミニDebianシステムによって起動されるブートプロセスの4段目です。ミニDebianシステムのシステムカーネルはこの環境ででも実行され続けます。ルートファイルシステムはメモリー上から本当にハードディスク上にあるファイルシステムに切り替えられます。

"/sbin/init"プログラムが最初のプログラムとして実行され、メインのブートプロセス遂行します。Debianは通常sysv-rcによる伝統的なsysvinitスキームを使います。詳細な説明は、init(8)とinittab(5)と"/usr/share/doc/sysv-rc/README.runlevels.gz"を参照下さい。次にこのメインのブートプロセスの簡略化した概論を記します。

  1. Debianシステムはランレベル N(無し)に入り、"/etc/inittab"の記述にしたがいシステムを初期化します。
  2. Debianシステムはランレベル Sに入り、シングルユーザーモード下でハードウエアーの初期化等を完了するシステム初期化をします。
  3. Debianシステムは指定されたマルチユーザーランレベル (2〜5)の内の1つに入り、システムサービスをスタートします。

マルチユーザーモードで使われる最初のランレベルランレベルは、"init="というカーネルブートパラメーターもしくは"/etc/inittab"の"initdefault"行で指定されます。インストールされたままのDebianシステムはランレベル 2でスタートします。

initシステムが実行する全ての実際のスクリプトファイルは"/etc/init.d/"ディレクトリーの中にあります。

[ティップ] ティップ

単一の設定ファイル"/etc/runlevel.conf"を使うsysv-rcパッケージ提供のブートメカニズム代替のブートメカニズムに関しては、file-rcパッケージを参照下さい。"/etc/init.d/rc"と"/etc/init.d/rcS"と"/usr/sbin/update-rc.d"と"/usr/sbin/invoke-rc.d"のスクリプトによって両メカニズムには互換性があります。

3.5.1. ランレベルの意味

ランレベルはその設定に1つのディレクトリーを使い次に記す特定の意味があります。

表3.3 ランレベルとその用途説明のリスト

ランレベル ディレクトリー ランレベル用途の説明
N 無し システムのブートアップ(無し)レベル("/etc/rcN.d/"ディレクトリーは無し)
0 /etc/rc0.d/ システム停止
S /etc/rcS.d/ ブート時のシングルユーザーモード(別名:"s")
1 /etc/rc1.d/ マルチユーザーモードから切り替えたシングルユーザーモード
2 /etc/rc2.d/ マルチユーザーモード
3 /etc/rc3.d/ ,,
4 /etc/rc4.d/ ,,
5 /etc/rc5.d/ ,,
6 /etc/rc6.d/ システム再起動
7 /etc/rc7.d/ 有効なマルチユーザーモードだが通常不使用
8 /etc/rc8.d/ ,,
9 /etc/rc9.d/ ,,

コンソールからランレベルを、例えば4に、次のようにして変更できます。

$ sudo telinit 4
[注意] 注意

Debianシステムは2から5のランレベル間で如何なる意味の違いも事前に付与しません。Debianシステムのシステム管理者はこれに変更を加えられます。(つまりDebianは、Red Hat LinuxともSun Microsystems社のSolarisともHewlett Packard社のHP-UXともIBM社のAIXとも…違います。)

[注意] 注意

Debianシステムは7から9のランレベルに対応するディレクトリーをパッケージインストール時に充足することはありません。伝統的なUnixバリアントはこれらのランレベルを使いません。

3.5.2. ランレベルの設定

ランレベルのディレクトリー中のシムリンク名前は、"S<2-digit-number><original-name>"か"K<2-digit-number><original-name>"という形式となっています。2桁数字はスクリプトの実行順序決定に使われます。"S"は"スタート(Start)"と言う意味で、"K"は"停止(Kill)"と言う意味です。

init(8)かtelinit(8)コマンドがランレベルを"<n>"に変更すると、次のスクリプトを実行します。

  1. "/etc/rc<n>.d/"中の"K"で始まるスクリプト名が、引数"stop"1つつけてアルファベット順に実行されます。(サービス停止)
  2. "/etc/rc<n>.d/"中の"S"で始まるスクリプト名が、引数"start"1つつけてアルファベット順に実行されます。(サービス開始)

例えば、ランレベルのディレクトリーに"S10sysklogd"と"S20exim4"があった時に、"../init.d/exim4"にシムリンクされた"S20exim4"の前に、"../init.d/sysklogd"にシムリンクされた"S10sysklogd"が実行されます。

[警告] 警告

メンテナよりあなたのほうが知識があるのでもなければ"/etc/rcS.d/"の中のシムリンクに変更を加えようとするのはお勧めできません。

3.5.3. ランレベル管理例

例えば、次に示すRed Hat Linuxのようなランレベルを設定してみます。

  • initはデフォールトとしてランレベル=3でシステムを起動します。
  • initはランレベル=(0,1,2,6)でgdm(1)を起動しません。
  • initはランレベル=(3,4,5)でgdm(1)を起動します。

これは、"/etc/inittab"ファイルをエディターで変更して起動するランレベル変更し、sysv-rc-confbum等の使いやすいランレベル管理ツールを使ってランレベルを編集することでできます。こうする代わりにコマンドラインだけを使うなら、(gdmパッケージをデフォールトでインストールしディスプレーマネージャーとして選択した後に)次に示すようにします。

# cd /etc/rc2.d ; mv S21gdm K21gdm
# cd /etc ; perl -i -p -e 's/^id:.:/id:3:/' inittab

ディスプレーマネージャーデーモン(xdmgdmkdmwdm)が起動される際には、"/etc/X11/default-display-manager"ファイル内容を確認する事を覚えておいて下さい。

[注記] 注記

startx(1)コマンドを使えば、どのコンソールシェルからもXが起動できます。

3.5.4. 各initスクリプトのデフォールトのパラメーター

"/etc/init.d/"の中の各initスクリプトのデフォールトパラメーターは、"/etc/default/"の中の環境変数のアサインメントのみを含む対応ファイルによって与えられます。このディレクトリー名の選択はDebianシステム特定です。それは、Red Hat Linuxや他のディストリビューションで使われる"/etc/sysconfig"ディレクトリーにほぼ相当します。例えば、"/etc/default/cron"を使うと"/etc/init.d/cron"がどう機能するかを制御できます。

"/etc/default/rcS"ファイルを使うとmotd(5)やsulogin(8)等のブート時のデフォールトをカスタム化できます。

もしそのような変数の変更で希望の挙動が得られない場合には、initスクリプト自体を変更することができます。これらスクリプトは管理者が編集可能な設定ファイルです。

3.5.5. ホスト名

カーネルがシステムのホスト名を維持管理します。ランレベル Sの"/etc/init.d/hostname.sh"にシムリンクされたinitスクリプトは、(hostnameコマンドを使って)"/etc/hostname"に保存された名前を使ってブート時にホスト名を設定します。このファイルには、完全修飾ドメイン名ではなく、システムのホスト名のみが含まれているべきです。

現在のホスト名を確認するには、hostname(1)を引数無しで実行します。

3.5.6. ファイルシステム

ルートファイルシステムはカーネル起動時にカーネルによってマウントされますが、他のファイルシステムは次のinitスクリプトでランレベル S中でマウントされます。

  • "/proc"と"/sys"等中のカーネルファイルシステムに関しては、"`/etc/init.d/mountkernfs.sh"
  • "/dev"中の仮想ファイルシステムに関しては、"`/etc/init.d/mountdevsubfs.sh"
  • "/etc/fstab"を使う普通のファイルシステムに関しては"`/etc/init.d/mountall.sh"
  • ""/etc/fstab"を使うネットワークファイルシステムに関しては"`/etc/init.d/mountnfs.sh"

ファイルシテムのマウントオプションは"/etc/fstab"で設定されます。「マウントオプションによるファイルシステムの最適化」を参照下さい。

[注記] 注記

ネットワークファイルシステムの実際のマウントはネットワークインターフェースの起動を待ちます。

[警告] 警告

各ブートアップごとに、全てのファイルシステムをマウントした後で、"/tmp"と"/var/lock"と"/var/run"中の一時ファイルはクリーンされます。

3.5.7. ネットワークインターフェースの初期化

ネットワークインターフェースはランレベル Sで"/etc/init.d/ifupdown-clean"と"/etc/init.d/ifupdown"にシムリンクされたinitスクリプトよって初期化されます。それらの設定に関しては、5章ネットワークの設定を参照下さい。

3.5.8. ネットワークサービスの初期化

多くのネットワークサービス(6章ネットワークアプリケーション参照)はブート時に、例えば"/etc/init.d/exim4"にシムリンクされている"/etc/rc2.d/S20exim4"(RUNLEVEL=2の場合)等という、マルチユーザーモード下のinitスクリプトによってデーモンプロセスとして起動されます。

ネットワークサービスの一部はスーパーサーバーinetd(もしくはその同等)を用いて必要に応じて起動されます。inetdは、"/etc/init.d/inetd"にシムリンクされた"/etc/rc2.d/S20inetd"(RUNLEVEL=2の場合)によってブート時に起動されます。基本的に、inetdは一つの実行デーモンにより複数の他デーモンを起動できるようにすることで、システムのロードを下げます。

サービス要求がスーパーサーバー inetdに到達する度に、そのプロトコルとサービスが"/etc/protocols"と"/etc/services"というデーターベースを照覧することで確認されます。さらにinetdは、"/etc/inetd.conf"の中にある通常のインターネットサービスか、"/etc/rpc.conf"の中にあるSun RPC準拠サービスを照覧します。

時々、inetdが対象となるサーバーを直接起動せずに、対象となるサーバー名を"/etc/inetd.conf"中に引数とし記載したTCPデーモンラッパープログラムtcpd(8)を起動することがあります。この様な場合には、tcpdは要求を記録し"/etc/hosts.deny"や"/etc/hosts.allow"を用いた追加確認後で適切なサーバープログラムを起動します。

システムのセキュリティーのためにできるだけ多くのネットワークサービスを無効にします。「サーバーのサービスへのアクセスの制限」を参照下さい。

inetd(8)とinetd.conf(5)とprotocols(5)とservices(5)とtcpd(8)とhosts_access(5)とhosts_options(5)とrpcinfo(8)とportmap(8)と"/usr/share/doc/portmap/portmapper.txt.gz"を参照下さい。

3.5.9. システムメッセージ

ログファイルとスクリーン上の両方のシステムメッセージに関して、 "/etc/default/syslogd"と"/etc/syslog.conf"によってカスタム化できます。syslogd(8)とsyslog.conf(5)を参照下さい。さらに「ログアナライザー」を参照下さい。

3.5.10. カーネルメッセージ

ログファイルとスクリーン上の両方のカーネルメッセージに関して、"/etc/default/klogd"によってカスタム化できます。このファイル中に"KLOGD='-c 3'"と設定し"/etc/init.d/klogd restart"を実行します。klogd(8)を参照下さい。

エラーメッセージのレベルを次に記すように直接変更してもいいです。

# dmesg -n3

表3.4 カーネルエラーレベルのリスト

エラーレベル値 エラーレベル名 意味
0 KERN_EMERG システムは不安定
1 KERN_ALERT 直ぐアクションが必要
2 KERN_CRIT クリチカルなコンディション
3 KERN_ERR エラーコンディション
4 KERN_WARNING 警告コンディション
5 KERN_NOTICE ノーマルだが重要なコンディション
6 KERN_INFO 情報
7 KERN_DEBUG デバグレベルのメッセージ

3.5.11. udevシステム

Linuxカーネル 2.6では、udevシステムがハードウエアーの自動検出と初期化のメカニズムを提供します(udev(7)参照)。カーネルが各デバイスを発見すると、udevシステムはsysfsファイルシステム(「procfsとsysfs」参照)からの情報を使いユーザープロセスを起動し、modprobe(8)プログラム(「カーネルモジュール初期化」参照)を使ってそれをサポートする必要なカーネルモジュールをロードし、対応するデバイスノードを作成します。

[ティップ] ティップ

もし"/lib/modules/<kernel-version>/modules.dep"が何らかの理由でdepmod(8)によって適切に生成されていなかった場合には、モジュールはudevシステムによる期待にそってロードされないかもしれません。これを修正するには、"depmod -a"を実行します。

デバイスノード名は"/etc/udev/rules.d/"の中のファイルによって設定できます。現在のデフォールトのルールは、cdとネットワークデバイス以外は非静的なデバイス名となる動的生成名を作る傾向があります。cdやネットワークデバイスと同様のカスタムルールを追加することでUSBメモリースティック等の他のデバイスにも静的なデバイス名を生成出来ます。"Writing udev rules"か"/usr/share/doc/udev/writing_udev_rules/index.html"を参照下さい。

udevシステムは少々動くターゲットなので、詳細は他のドキュメントに譲り、ここでは最小限の記述に止めます。

[ティップ] ティップ

"/etc/fstab"中のマウントルールでは、デバイス名が静的なデバイス名である必要がありません。"/dev/sda"等のデバイス名ではなくUUIDを使ってデバイスをマウントできます。「UUIDを使ってパーティションをアクセス」を参照下さい。

3.5.12. カーネルモジュール初期化

modprobe(8)プログラムは、ユーザープロセスからカーネルモジュールを追加や削除することで実行中のLinuxカーネルの設定を可能にします。udevシステム(「udevシステム」参照)は、その起動を自動化しカーネルモジュールの初期化を補助します。

"/etc/modules"ファイル中にリストしてプリロードする必要のある(modules(5)参照)次に記すような非ハードウエアーや特殊ハードウエアーのドライバーモジュールがあります。

modprobe(8)プログラムのための設定ファイルは、modprobe.conf(5)で説明されているように"/etc/modprobes.d/"ディレクトリーの下にあります。(あるカーネルモジュールが自動ロードされるのを避けるには、"/etc/modprobes.d/blacklist" ファイル中にブラックリスします。)

depmod(8)プログラムによって生成される"/lib/modules/<version>/modules.dep"ファイルは、modprobe(8)プログラムによって使われるモジュール依存関係を記述します。

[注記] 注記

ブート時にmodprobe(8)を使ってのモジュールロードの問題に出会った場合には、"depmod -a"として"modules.dep"を再構築をするとこの様な問題が解消できるかもしれません。

modinfo(8)プログラムはLinuxカーネルモジュールに関する情報を表示します。

lsmod(8)プログラムは"/proc/modules"の内容を読みやすい形式にして、どのカーネルモジュールが現在ロードされているかを表示します。

[ティップ] ティップ

あなたのシステム上の正確なハードウエアーを特定します。「ハードウエアーの識別」を参照下さい。

[ティップ] ティップ

ブート時に期待されるハードウエアー機能を有効となるように設定もできます。「ハードウエアー設定」を参照下さい。

[ティップ] ティップ

あなたのデバイスのサポートは、カーネルを再コンパイルすれば追加できます。「カーネル」を参照下さい。