7.1 Linuxのブートプロセス

Linuxのブートプロセスは、いくつかの段階から成り、それぞれを別のコンポーネントが代表しています。次のリストに、主要なすべてのコンポーネントが関与するブートプロセスと機能を簡潔にまとめています。

  1. BIOS コンピュータに電源を投入すると、BIOSで画面とキーボードの初期化およびメインメモリのテストが行われます。この段階まで、コンピュータは大容量ストレージメディアにアクセスしません。続いて、現在の日付、時刻、および最も重要な周辺機器に関する情報が、CMOS値からロードされます。最初のハードディスクとそのジオメトリが認識されると、システム制御がBIOSからブートローダに移ります。BIOSがネットワークブートをサポートしている場合は、ブートローダを提供するブートサーバを設定することもできます。x86システムの場合、PXEブートを利用する必要があります。他のアーキテクチャの場合は、通常BOOTPプロトコルを使ってブートローダを取得します。

  2. ブートローダ 最初のハードディスクの先頭の 512バイト物理データセクタがメインメモリにロードされ、このセクタの先頭に常駐するブートローダが起動します。ブートローダによって実行されたコマンドがブートプロセスの残りの部分を確定します。したがって、最初のハードディスクの先頭 512バイトのことをマスタブートレコード(MBR)といいます。次に、ブートローダは実際のオペレーティングシステム(この場合はLinuxカーネル)に制御を渡します。GRUB(Linuxのブートローダ)の詳細については、セクション 8.0, ブートローダGRUBを参照してください。ネットワークブートを行う場合、BIOSがブートローダとしての役割を果たします。BIOSは、ブートサーバから起動するためのイメージを取得し、それを使ってシステムを起動します。この作業にローカルのハードディスクからは完全に独立した処理として行われます。

  3. カーネルとinitramfs システムに制御を渡すために、ブートローダは、カーネルとRAMベースの初期ファイルシステム(initramfs)をメモリにロードします。カーネルは、initramfsの内容を直接使用できます。initramfsには、実際のルートファイルシステムのマウント処理を担当するinitと言う名前の小さな実行可能ファイルが含まれています。大容量ストレージにアクセスするために特別なハードウェアドライバが必要な場合、それらはinitramfs内になければなりません。initramfsについての詳細は、セクション 7.1.1, initramfsを参照してください。システムにローカルハードディスクがない場合、initramfsがルートファイルシステムをカーネルに提供する必要があります。そのためには、iSCSIやSANなどのネットワークブロックデバイスを利用しますが、NFSをルートデバイスとして使うことも可能です。

  4. initramfs上のinit このプログラムは、適切なルートファイルシステムをマウントするために必要なすべてのアクションを実行します。たとえば、udevに必要なファイルシステム用のカーネル機能や、大容量ストレージコントローラ用のデバイスドライバを提供します。ルートファイルシステムが見つかると、エラーをチェックしてからマウントします。これが正常に実行されれば、initramfsはクリアされ、ルートファイルシステムのinitが実行されます。initについての詳細は、セクション 7.1.2, initramfs上のinitを参照してください。udevについての詳細は、「セクション 11.0, udevを使用した動的カーネルデバイス管理」を参照してください。

  5. init initは、さまざまなレベルでシステムの実際のブートを処理し、各種の機能を提供します。initについては、セクション 7.2, initプロセスで説明しています。

7.1.1 initramfs

initramfsは、カーネルがRAMディスクにロードできる、小さなcpioアーカイブです。また、実際のルートファイルシステムがマウントされる前にプログラムを実行できるようにする最低限のLinux環境を提供します。この最低限のLinux環境は、BIOSルーチンでメモリにロードされます。十分な容量のメモリがあること以外には具体的なハードウェア要件はありません。initramfsには必ず、initという名前の実行可能ファイルがあります。これは、ブートプロセスが進行するにつれて、ルートファイルシステム上の本当のinitプログラムを実行することになります。

ルートファイルシステムをマウントして実際のオペレーティングシステムを起動する前に、カーネルには、ルートファイルシステムが配置されているデバイスにアクセスするための対応ドライバが必要です。こうしたドライバには、特定のハードディスク用の特殊なドライバや、ネットワークファイルシステムにアクセスするためのネットワークドライバが含まれる場合もあります。ルートファイルシステムで必要となるモジュールは、initramfs上のinitによってロードされます。モジュールをロードしたら、udevによって必要なデバイスがinitramfsに提供されます。ブートプロセス後半で、ルートファイルシステムが変更された後、デバイスを再生成する必要があります。これには、udevtriggerコマンドでboot.udevを実行します。

インストール済みのシステムのハードウェア(たとえば、ハードディスク)を変更する必要が生じ、このハードウェアがブート時にカーネル内に他のドライバが存在することを必要とする場合には、initramfsを更新する必要があります。これは、initramfsの前身であるinitrdの場合と同様に、mkinitrdを呼び出すことによって行えます。引数を付けずにmkinitrdを呼び出すと、initramfsが作成されます。mkinitrd -Rを呼び出すと、initrdが作成されます。SUSE® Linux Enterprise Serverでは、ロードするモジュールは/etc/sysconfig/kernel内の変数INITRD_MODULESで指定されます。インストール後、この変数は自動的に正しい値に設定されます。モジュールは、INITRD_MODULESに指定されている順序で正確にロードされます。このことは、デバイスファイルの/dev/sd?の設定の正確性に依存している場合にのみ重要になります。ただし、現在のシステムで/dev/disk/ディレクトリ下にあるデバイスファイルを使用することもできます。これらのファイルは、by-idby-path、およびby-uuidなどのサブディレクトリに分類されており、常に同じディスクを表します。これは、該当するマウントオプションの指定により、インストール時にも可能です。

重要: initramfsまたはinitrdの更新

ブートローダは、カーネルと同じようにinitramfsまたはinitrdをロードします。GRUBはブート時にディレクトリ内の正しいファイルを検索するので、initramfsまたはinitrdの更新後にGRUBを再インストールする必要はありません。

7.1.2 initramfs上のinit

initramfs上のinitの主な目的は、実際のルートファイルシステムのマウントとそのファイルシステムへのアクセスの準備です。システム設定に応じて、initは次のタスクを実行します。

カーネルモジュールのロード

ハードウェア設定によっては、使用するコンピュータのハードウェアコンポーネント(ハードディスクになる最も重要なコンポーネント)にアクセスするために特殊なドライバが必要になる場合があります。最終的なルートファイルシステムにアクセスするには、カーネルが適切なファイルシステムドライバをロードする必要があります。

ブロック特殊ファイルの提供

ロードされるモジュールごとに、カーネルはデバイスイベントを生成します。udevは、これらのイベントを処理し、RAMファイルシステム上で必要なブロック特殊ファイルを/dev内に生成します。これらの特殊ファイルがないと、ファイルシステムや他のデバイスにアクセスできません。

RAIDとLVMのセットアップの管理

RAIDまたはLVMの下でルートファイルシステムを保持するようにシステムを設定した場合、initはLVMまたはRAIDをセットアップして、後でルートファイルシステムにアクセスできるようにします。第15章 高度なディスクセットアップでRAIDとLVMに関する情報を参照してください。

ネットワーク設定の管理

ネットワークマウントしたルートファイルシステム(NFSを介したマウント)を使用するようにシステムを設定した場合、linuxrcは適切なネットワークドライバがロードされ、ドライバがルートファイルシステムにアクセスできるように設定されていることを確認する必要があります。

ファイルシステムがiSCSIやSANなどのネットワークブロックデバイスに常駐している場合は、ストレージサーバへの接続もinitramfsによって設定されます。

初期ブート時にlinuxrcがインストールプロセスの一環として呼び出される場合、そのタスクは前に説明したタスクと異なります。

インストールメディアの検出

インストールプロセスを開始すると、使用するコンピュータでは、YaSTインストーラでインストールカーネルと特殊なinitrdがインストールメディアからロードされます。RAMファイルシステムで実行されるYaSTインストーラには、インストールメディアにアクセスしてオペレーティングシステムをインストールするために、そのメディアの場所に関する情報が必要になります。

ハードウェア認識の開始および適切なカーネルモジュールのロード

で説明しているように、ブートプロセスは、ほとんどのハードウェア設定で使用できる最小限のドライバセットで開始されます。initは、ハードウェア設定に適したドライバセットを確定する、初期ハードウェアスキャンプロセスを開始します。セクション 7.1.1, initramfsブートプロセスに必要なモジュール名は、/etc/sysconfig/kernelディレクトリ中のINITRD_MODULESに書き込まれます。これらのモジュール名は、システムをブートするために必要なカスタムinitramfsを生成するために使用されます。ブートではなくcoldplugで必要なモジュールは、/etc/sysconfig/hardware/hwconfig-*ディレクトリに書き込まれます。ブートプロセス時には、このディレクトリ中の設定ファイルに記述されているすべてのデバイスが初期化されます。

インストールシステムまたはレスキューシステムのロード

ハードウェアが正しく認識され、適切なドライバがロードされ、udevがデバイス特定ファイルを作成するとすぐに、linuxrcはインストールシステムを起動します。このシステムには、実際のYaSTインストーラまたはレスキューシステムが含まれています。

YaSTの開始

最後に、initはYaSTを起動します。これはパッケージのインストールとシステム設定を開始します。