
Linuxシステムのブートには、さまざまなコンポーネントとタスクが関係しています。ハードウェア自体がBIOSまたはUEFIにより初期化され、BIOSまたはUEFIがブートローダでカーネルを起動します。この時点以降、ブートプロセスは完全にオペレーティングシステムの制御下に入り、systemdによって処理されます。systemdは、日常的な使用、保守、または緊急時のためにセットアップをブートする一連の「ターゲット」を提供します。
Linuxのブートプロセスは、いくつかの段階から成り、それぞれ別のコンポーネントが実行しています。次のリストに、主要なすべてのコンポーネントが関与するブートプロセスと機能を簡潔にまとめています。
BIOS/UEFI: コンピュータの電源をオンにした後、BIOSまたはUEFIが画面とキーボードを初期化し、メインメモリをテストします。この段階まで、コンピュータは大容量ストレージメディアにアクセスしません。続いて、現在の日付、時刻、および最も重要な周辺機器に関する情報が、CMOS値からロードされます。最初のハードディスクとそのジオメトリが認識されると、システム制御がBIOSからブートローダに移ります。BIOSがネットワークブートをサポートしている場合は、ブートローダを提供するブートサーバを設定することもできます。AMD64/Intel 64システムでは、PXEのブートが必要になります。他のアーキテクチャの場合は、通常、BOOTPプロトコルを使ってブートローダを取得します。
ブートローダ: 最初のハードディスクの先頭の 512バイト物理データセクタがメインメモリにロードされ、このセクタの先頭に常駐するブートローダが起動します。ブートローダによって実行されたコマンドがブートプロセスの残りの部分を確定します。したがって、最初のハードディスクの先頭512バイトのことを 「マスタブートレコード」(MBR)といいます。次に、ブートローダは、実際のオペレーティングシステム(この場合はLinuxカーネル)に制御を渡します。GRUB 2(Linuxのブートローダ)の詳細については、第12章 ブートローダGRUB 2を参照してください。ネットワークブートを行う場合、BIOSがブートローダとしての役割を果たします。BIOSは、ブートサーバからブートイメージを取得し、システムを起動します。この作業はローカルハードディスクから完全に独立した処理として行われます。
ルートファイルシステムをブート環境内からマウントできなかった場合は、ブートを続行する前にルートファイルシステムを確認して修復しておく必要があります。Ext3ファイルシステムおよびExt4ファイルシステムでは、ファイルシステムチェッカが自動的に起動されます。XFSファイルシステムおよびBtrfsファイルシステムでは修復プロセスが自動化されていないため、ファイルシステムを修復するために使用できるオプションに関する情報が表示されます。ファイルシステムを修復してからブート環境を終了すると、システムによってルートファイルシステムのマウントが再試行されます。マウントに成功した場合は、通常どおりブートが続行されます。
カーネルとinitramfs:
システムに制御を渡すために、ブートローダは、カーネルとRAMベースの初期ファイルシステム(initramfs)をメモリにロードします。カーネルは、initramfsのコンテンツを直接使用できます。initramfsには、実際のルートファイルシステムのマウント処理を行うinitと呼ばれる小さな実行可能ファイルが含まれています。大容量ストレージにアクセスするために特別なハードウェアドライバが必要な場合、それらはinitramfs内になければなりません。initramfsの詳細については、 11.2項 「initramfs」を参照してください。システムにローカルハードディスクがない場合、initramfsがルートファイルシステムをカーネルに提供する必要があります。そのためには、iSCSIやSANなどのネットワークブロックデバイスを使用しますが、NFSをルートデバイスとして使用することもできます。
initプロセスの名前付け一般的に「init」という名前が付くのは、次の2つの異なるプログラムです。
ルートファイルシステムをマウントするinitramfsプロセス
システムを設定するオペレーティングシステムプロセス
そのため、この章では、それぞれを「initramfs上のinit」および「systemd」と呼びます。
initramfs上のinit:
このプログラムは、適切なルートファイルシステムをマウントするために必要なすべてのアクションを実行します。必要なファイルシステムにカーネル機能を提供し、大容量ストレージコントローラ用のデバイスドライバにudevを提供します。ルートファイルシステムが見つかると、エラーをチェックしてからマウントします。これが正常に実行されれば、initramfsはクリアされ、ルートファイルシステムでsystemdデーモンが実行されます。initramfs上のinitの詳細については、11.3項 「initramfs上のinit」を参照してください。udevの詳細については、第20章 udevによる動的カーネルデバイス管理を参照してください。
systemd:
systemdは、サービスを起動し、ファイルシステムをマウントすることで、システムの実際のブートを処理します。systemdは第14章 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を再インストールする必要はありません。
関連するファイル(/etc/sysctl.confまたは/etc/sysctl.d/*.conf)を編集して、sysctlインタフェースでカーネル変数の値を変更した場合、次にシステムを再起動したときに変更内容が失われます。実行時にsysctl --systemを使用して値をロードしても、変更内容はinitramfsファイルに保存されません。dracut -fを呼び出してファイルを更新する必要があります(-fオプションを指定すると、既存のinitramfsファイルが上書きされます)。
initramfs上のinit #
initramfs上のinitの主な目的は、実際のルートファイルシステムのマウントとアクセスの準備をすることです。システム設定に応じて、initramfs上のinitは次のタスクを実行します。
ハードウェア設定によっては、使用するコンピュータのハードウェアコンポーネント(ハードディスクになる最も重要なコンポーネント)にアクセスするために特殊なドライバが必要になる場合があります。最終的なルートファイルシステムにアクセスするには、カーネルが適切なファイルシステムドライバをロードする必要があります。
ロードされるモジュールごとに、カーネルはデバイスイベントを生成します。udevは、これらのイベントを処理し、RAMファイルシステム上で必要なブロック特殊ファイルを/dev内に生成します。これらの特殊ファイルがないと、ファイルシステムや他のデバイスにアクセスできません。
RAIDまたはLVMの下でルートファイルシステムを保持するようにシステムを設定した場合、initramfs上のinitはLVMまたはRAIDを設定して、後でルートファイルシステムにアクセスできるようにします。
YaSTを使用せずに/usrパーティションまたはswapパーティションを直接変更する場合は、さらに作業が必要です。これらの手順を忘れてしまうと、システムが緊急モードで起動されます。緊急モードでの起動を回避するには、次の手順を実行します。
/etc/fstabの関連するエントリを編集し、以前のパーティションを論理ボリュームに置き換えます。
次のコマンドを実行します。
root #mount-aroot #swapon-a
mkinitrdまたはdracutを使用して、初期RAMディスク(initramfs)を再生成します。
z Systemsの場合は、さらにgrub2-installを実行します。
RAIDおよびLVMの詳細については、Chapter 7, Advanced Disk Setupを参照してください。
ネットワークマウントしたルートファイルシステム(NFSを介してマウント)を使用するようにシステムを設定した場合、initramfs上のinitは、適切なネットワークドライバがロードされ、ドライバがルートファイルシステムにアクセスできるように設定されていることを確認する必要があります。
ファイルシステムがiSCSIやSANなどのネットワークブロックデバイスに常駐している場合は、ストレージサーバへの接続もinitramfs上のinitによって設定されます。SUSE Linux Enterprise Desktopは、プライマリターゲットを使用できない場合の、セカンダリiSCSIターゲットからのブートをサポートしています。
初期ブート時にインストールプロセスの一環としてinitramfs上のinitが呼び出される場合、そのタスクは上記で説明したタスクと異なります。
インストールプロセスを開始すると、マシンは、インストールカーネルと、YaSTインストーラを含む特殊なinitをロードします。YaSTインストーラは、RAMファイルシステムで実行され、インストールメディアにアクセスしてオペレーティングシステムをインストールするために、そのメディアの場所に関する情報を必要とします。
で説明しているように、ブートプロセスは、ほとんどのハードウェア設定で使用できる最小限のドライバセットで開始されます。initは、ハードウェア設定に適したドライバセットを確定する、初期ハードウェアスキャンプロセスを開始します。11.2項 「initramfs」これらのドライバは、システムをブートするために必要なカスタムinitramfsを生成するために使用されます。ブートに必要なくてもコールドプラグには必要なモジュールがある場合は、systemdを使用してロードできます。詳細については、14.6.4項 「カーネルモジュールのロード」を参照してください。
ハードウェアが適切に認識されると、適切なドライバがロードされます。udevプログラムが特殊なデバイスファイルを作成し、initは、YaSTインストーラを使用してインストールシステムを起動します。
最後に、initはYaSTを起動し、これによってパッケージのインストールとシステム設定が開始されます。