
Linuxシステムのブートには、さまざまなコンポーネントとタスクが関係しています。ハードウェア自体がBIOSまたはUEFIにより初期化され、BIOSまたはUEFIがブートローダでカーネルを起動します。この時点以降、ブートプロセスは完全にオペレーティングシステムの制御下に入り、systemdによって処理されます。systemdは、日常的な使用、保守、または緊急時のためにセットアップをブートする一連の「ターゲット」を提供します。
Linuxのブートプロセスは、いくつかの段階から成り、それぞれ別のコンポーネントが実行しています。次のリストに、主要なすべてのコンポーネントが関与するブートプロセスと機能を簡潔にまとめています。
BIOS/UEFI. コンピュータの電源をオンにした後、BIOSまたはUEFIが画面とキーボードを初期化し、メインメモリをテストします。この段階まで、コンピュータは大容量ストレージメディアにアクセスしません。続いて、現在の日付、時刻、および最も重要な周辺機器に関する情報が、CMOS値からロードされます。最初のハードディスクとそのジオメトリが認識されると、システム制御がBIOSからブートローダに移ります。BIOSがネットワークブートをサポートしている場合は、ブートローダを提供するブートサーバを設定することもできます。x86_64システムの場合、PXEブートを利用する必要があります。他のアーキテクチャの場合は、通常、BOOTPプロトコルを使ってブートローダを取得します。
ブートローダ. 最初のハードディスクの先頭の 512バイト物理データセクタがメインメモリにロードされ、このセクタの先頭に常駐するブートローダが起動します。ブートローダによって実行されたコマンドがブートプロセスの残りの部分を確定します。したがって、最初のハードディスクの先頭 512バイトのことをマスタブートレコード(MBR)といいます。次に、ブートローダは、実際のオペレーティングシステム(この場合はLinuxカーネル)に制御を渡します。GRUB 2 (Linuxのブートローダ)の詳細については、第13章 ブートローダGRUB 2を参照してください。ネットワークブートを行う場合、BIOSがブートローダとしての役割を果たします。BIOSは、ブートサーバからブートイメージを取得し、システムを起動します。この作業はローカルハードディスクから完全に独立した処理として行われます。
カーネルとinitramfs.
システムに制御を渡すために、ブートローダは、カーネルとRAMベースの初期ファイルシステム(initramfs)をメモリにロードします。カーネルは、initramfsのコンテンツを直接使用できます。initramfsには、実際のルートファイルシステムのマウント処理を行うinitと呼ばれる小さな実行可能ファイルが含まれています。大容量ストレージにアクセスするために特別なハードウェアドライバが必要な場合、それらはinitramfs内になければなりません。initramfsの詳細については、 10.2項 「initramfs」を参照してください。システムにローカルハードディスクがない場合、initramfsがルートファイルシステムをカーネルに提供する必要があります。そのためには、iSCSIやSANなどのネットワークブロックデバイスを利用しますが、NFSをルートデバイスとして使うことも可能です。
initプロセスの名前付け一般的に「init」という名前が付くのは、次の2つの異なるプログラムです。「」
ルートファイルシステムをマウントするinitramfsプロセス
システムを設定するオペレーティングシステムプロセス
そのため、この章では、それぞれを「initramfs上のinit」および「systemd」と呼びます。
initramfs上のinit.
このプログラムは、適切なルートファイルシステムをマウントするために必要なすべてのアクションを実行します。必要なファイルシステムにカーネル機能を提供し、大容量ストレージコントローラ用のデバイスドライバにudevを提供します。ルートファイルシステムが見つかると、エラーをチェックしてからマウントします。これが正常に実行されれば、initramfsはクリアされ、ルートファイルシステムでsystemdデーモンが実行されます。initramfs上のinitの詳細については、10.3項 「initramfs上のinit」を参照してください。udevの詳細については、第17章 udevによる動的カーネルデバイス管理を参照してください。
systemd.
systemdは、サービスを起動し、ファイルシステムをマウントすることで、システムの実際のブートを処理します。systemdは第11章 systemdデーモンで説明されています。
initramfs #
initramfsは、カーネルがRAMディスクにロードできる、小さなcpioアーカイブです。また、実際のルートファイルシステムがマウントされる前にプログラムを実行できるようにする最低限のLinux環境を提供します。この最低限のLinux環境は、BIOSまたはUEFIルーチンによってメモリにロードされ、十分なメモリがあること以外に特定のハードウェア要件はありません。initramfsには必ず、initという名前の実行可能ファイルがあります。これは、ブートプロセスの進行に伴い、ルートファイルシステム上の実際のsystemdデーモンを実行します。
ルートファイルシステムをマウントして実際のオペレーティングシステムを起動する前に、カーネルには、ルートファイルシステムが配置されているデバイスにアクセスするための対応ドライバが必要です。こうしたドライバには、特定のハードディスク用の特殊なドライバや、ネットワークファイルシステムにアクセスするためのネットワークドライバが含まれる場合もあります。ルートファイルシステムに必要なモジュールは、initramfs上のinitによってロードされます。モジュールをロードしたら、udevによって必要なデバイスがinitramfsに提供されます。ブートプロセス後半で、ルートファイルシステムが変更された後、デバイスを再生成する必要があります。これには、udevtriggerコマンドでsystemd unit udev.serviceを実行します。
インストール済みのシステムのハードウェア(たとえば、ハードディスク)を変更する必要が生じ、このハードウェアはブート時にカーネル内に存在する他のドライバを必要とする場合には、initramfsファイルを更新する必要があります。このためには、dracut を呼び出します(オプション-f-fは既存のinitramfsファイルを上書きします)。新しいハードウェア用のドライバを追加するには、/etc/dracut.conf.d/01-dist.confを編集して次の行を追加します。
force_drivers+="driver1"
driver1はドライバのモジュール名で置き換えます。複数のドライバを追加する必要がある場合は、それぞれをスペースで区切ったリスト形式で記述します(driver1 driver2)。
initramfsまたは initの更新
ブートローダは、カーネルと同じようにinitramfsまたはinitをロードします。GRUB 2はブート時に正しいファイルのディレクトリを検索するので、initramfsまたはinitを更新した後にGRUB 2を再インストールする必要はありません。
initramfs上のinit #
initramfs上のinitの主な目的は、実際のルートファイルシステムのマウントとアクセスの準備をすることです。システム設定に応じて、initramfs上のinitは次のタスクを実行します。
ハードウェア設定によっては、使用するコンピュータのハードウェアコンポーネント(ハードディスクになる最も重要なコンポーネント)にアクセスするために特殊なドライバが必要になる場合があります。最終的なルートファイルシステムにアクセスするには、カーネルが適切なファイルシステムドライバをロードする必要があります。
ロードされるモジュールごとに、カーネルはデバイスイベントを生成します。udevは、これらのイベントを処理し、RAMファイルシステム上で必要なブロック特殊ファイルを/dev内に生成します。これらの特殊ファイルがないと、ファイルシステムや他のデバイスにアクセスできません。
RAIDまたはLVMの下でルートファイルシステムを保持するようにシステムを設定した場合、initramfs上のinitはLVMまたはRAIDを設定して、後でルートファイルシステムにアクセスできるようにします。Chapter 12, Advanced Disk Setup, Deployment GuideでRAIDとLVMに関する情報を参照してください。
ネットワークマウントしたルートファイルシステム(NFSを介してマウント)を使用するようにシステムを設定した場合、initramfs上のinitは、適切なネットワークドライバがロードされ、ドライバがルートファイルシステムにアクセスできるように設定されていることを確認する必要があります。
ファイルシステムがiSCSIやSANなどのネットワークブロックデバイスに常駐している場合は、ストレージサーバへの接続もinitramfs上のinitによって設定されます。
初期ブート時にインストールプロセスの一環としてinitramfs上のinitが呼び出される場合、そのタスクは上記で説明したタスクと異なります。
インストールプロセスを開始すると、マシンは、インストールカーネルと、YaSTインストーラを含む特殊なinitをロードします。RAMファイルシステムで実行されるYaSTインストーラには、インストールメディアにアクセスしてオペレーティングシステムをインストールするために、そのメディアの場所に関する情報が必要になります。
で説明しているように、ブートプロセスは、ほとんどのハードウェア設定で使用できる最小限のドライバセットで開始されます。initは、ハードウェア設定に適したドライバセットを確定する、初期ハードウェアスキャンプロセスを開始します。10.2項 「initramfs」これらのドライバは、システムをブートするために必要なカスタムinitramfsを生成するために使用されます。ブートに必要なくてもコールドプラグには必要なモジュールがある場合は、systemdを使用してロードできます。詳細については、11.6.3項 「カーネルモジュールのロード」を参照してください。
ハードウェアが適切に認識されるとすぐに、適切なドライバがロードされます。udevプログラムが特殊なデバイスファイルを作成し、initは、YaSTインストーラを使用してインストールシステムを起動します。
最後に、initはYaSTを起動し、これによってパッケージのインストールとシステム設定が開始されます。