第3章 システムの初期化

目次

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

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

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

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

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

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

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

  • 1段目: BIOS
  • 2段目: ブートローダ
  • 3段目: ミニDebianシステム
  • 4段目: 通常のDebianシステム

もちろん、これらに関して異なる設定をすることはできます。例えば、自分自身で専用カーネルをコンパイルした場合、ミニ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イメージはrootファイルシステムイメージで、そのサポートは使われるブートローダ次第です。

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

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

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

ブートローダ パッケージ popcon サイズ initrd 説明
GRUB Legacy grub V:24, I:91 1908 サポート ディスクパーティションやvfatやext3等のファイルシステムを理解するぐらいスマートです。(lennyのデフォルト)
GRUB 2 grub-pc V:0.9, I:3 1600 サポート ディスクパーティションやvfatやext3等のファイルシステムを理解するぐらいスマートです。
GRUB 2 grub-rescue-pc V:0.04, I:0.5 2852 サポート GRUB 2のブート可能なレスキューイメージ(CDとフロッピー) (PC/BIOSバージョン)
Lilo lilo V:0.7, I:3 1192 サポート ハードディスク上のセクター位置に依存します。(古い)
Isolinux syslinux V:1.1, I:7 160 サポート ISO9660ファイルシステムを理解します。ブートCDに使われています。
Syslinux syslinux V:1.1, I:7 160 サポート MSDOSファイルシステム(FAT)理解します。ブートフロッピーで使われます。
Loadlin loadlin V:0.02, I:0.2 140 サポート 新しいシステムがFreeDOS/MSDOSシステムから起動されます。
Neil TurtonのMBR mbr V:1.0, I:6 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 (「Accessing partition using 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"スクリプトはこのメモリ上のrootファイルシステムで最初に実行されるプログラムです。それはユーザスペースでカーネルを初期化し次の段階にコントロールを引き継ぐシェルプログラムです。このミニDebianシステムは、メインのブートプロセス始まる前にカーネルモジュールを追加したり、rootファイルシステムを暗号化されたファイルシステムとしてマウントする等のブートプロセスの柔軟性を提供します。

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

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

[注意] 注意

読み取りのみのrootファイルシステム上では、mountコマンドには"-n"オプションを option for mount command when you are on使う必要があります。

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

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

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

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

マルチユーザモードで使われる最初のrunlevelは、"init="というカーネルブートパラメータもしくは"/etc/inittab"の"initdefault"行で指定されます。インストールされたままのDebianシステムはrunlevel 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. runlevelの意味

runlevelはその設定に1つのディレクトリを使い特定の意味があります:

表3.3 runlevelsとその意味のリスト。

runlevel ディレクトリ 意味
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/ ,,

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

$ sudo telinit 4
[注意] 注意

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

[注意] 注意

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

3.5.2. runlevelの設定

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

init(8)かtelinit(8)コマンドがrunlevelを"<n>"に変更すると:

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

例えば、runlevelのディレクトリに"S10sysklogd"と"S20exim4"があった時に、"S20exim4"の前に"S10sysklogd"が実行されます。

[警告] 警告

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

3.5.3. runlevel管理例

例えば、Red Hat Linuxのようなrunlevelを設定してみましょう、つまり:

  • runlevel=3をデフォルトとしてシステムを起動します、
  • runlevel=(0,1,2,6)でgdm(1)を起動しません、
  • runlevel=(3,4,5)でgdm(1)を起動します。

これは、"/etc/inittab"ファイルをエディタで変更して起動するrunlevel変更し、sysv-rc-confbum等の使いやすいrunlevel管理ツールを使ってrunlevelを編集することでできます。こうする代わりにコマンドラインだけを使うなら、(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. ホスト名

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

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

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

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

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

多くのネットワークサービス(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は一つの実行デーモンによりいくつかの他のデーモンを起動できるようにすることで、システムのロードを下げます。

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

システムのセキュリティのために"/etc/inetd.conf"にある不使用のサービスは確実にディスエーブルしましょう。NFS他のRPCを使うプログラムためにはSunRPCサービスはアクティブにする必要があります。

時々、inetdが対象となるサーバーを直接起動せずに、対象となるサーバーを名を"/etc/inetd.conf"中に引数とし記載したTCPデーモンラッパープログラムtcpd(8)を起動することがあります。

もし最近のDebianシステムでリモートアクセスで問題に会った場合には、"/etc/hosts.deny"中に"ALL:PARANOID"という文言があるならコメントアウトしましょう。

詳しいことは、inetd(8)とinetd.conf(5)とprotocols(5)とservices(5)とtcpd(8)とhosts_access(5)とhosts_options(5)を参照下さい。

Sun-RPCに関してさらに詳しいことは、rpcinfo(8)とportmap(8)と"/usr/share/doc/portmap/portmapper.txt.gz"を参照下さい。

3.5.8. システムメッセージ

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

3.5.9. カーネルメッセージ

ログファイルとスクリーン上の両方のカーネルメッセージに関して、"/etc/init.d/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.10. 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/"の中のファイルによって設定できます("/usr/share/doc/udev/writing_udev_rules/index.html"参照)。

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

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

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

ハードウエアー以外のモジュールや特殊なハードウエアーモジュールは、次です:

  • ポイント間ネットワークデバイス(TUN)と仮想Ethernetネットワークデバイス(TAP)を提供する、TUN/TAPモジュール、
  • netfilterファイアーウォール機能(iptables(8)と「Netfilter」)を提供するnetfilterモジュール、
  • ワッチドッグタイマードライバのモジュールは、"/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"の内容を読みやすい形式にして、どのカーネルモジュールが現在ロードされているかを表示します。

[ティップ] ティップ

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

[ティップ] ティップ

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

[ティップ] ティップ

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