16 ブートプロセスの概要 #
Linuxシステムのブートには、さまざまなコンポーネントとタスクが関係しています。マシンのアーキテクチャに依存する、ファームウェアとハードウェアの初期化プロセスの後、ブートローダGRUB 2でカーネルを起動します。この時点以降、ブートプロセスはオペレーティングシステムの制御下に入り、systemdによって処理されます。systemdは、日常的な使用、保守、または緊急時のために設定をブートする一連の「ターゲット」を提供します。
16.1 用語集 #
この章ではあいまいに解釈される可能性のある用語を使用します。ここでの使用方法を理解するには、以下の定義を読んでください。
init一般的に「init」という名前が付くのは、次の2つの異なるプロセスです:
ルートファイルシステムをマウントする
initramfsプロセス実際のルートファイルシステムから実行される他のすべてのプロセスを開始するオペレーティングシステムプロセス
両方のケースで、
systemdプログラムがこのタスクを担当します。ルートファイルシステムをマウントするために、まずinitramfsから実行されます。成功したら、最初のプロセスとしてルートファイルシステムから再実行されます。これら2つのsystemdプロセスの混同を避けるため、まず「init on initramfs」として最初のプロセスを実行し、「systemd」として2番目のプロセスを実行します。-
initrd/initramfs initrd(最初のRAMディスク)は、カーネルによってロードされ、一時ルートファイルシステムとして/dev/ramからマウントされるルートファイルシステムイメージを含むイメージファイルです。ファイルシステムのマウントには、ファイルシステムドライバが必要です。カーネル2.6.13以降、initrdは、ファイルシステムドライバのマウントが必要ない、
initramfs(最初のRAMファイルシステム)で置き換えられました。SUSE Linux Enterprise Desktopは、initramfsを排他的に使用します。ただし、initramfsは/boot/initrdとして格納されるため、多くの場合「initrd」と呼ばれます。この章では、initramfsという名前を排他的に使用します。
16.2 Linuxのブートプロセス #
Linuxのブートプロセスは、いくつかの段階から成り、それぞれ別のコンポーネントが実行しています。
16.2.1 初期化とブートローダの段階 #
初期化段階中に、マシンのハードウェアが設定され、デバイスが準備されます。このプロセスはハードウェアアーキテクチャによって異なります。
SUSE Linux Enterprise Desktopは、すべてのアーキテクチャでブートローダGRUB 2を使用します。アーキテクチャおよびファームウェアによって、GRUB 2ブートローダの起動は、 マルチステップのプロセスとなる可能性があります。ブートローダの目的は、カーネルおよび、RAMベースの初期ファイルシステム(initramfs)をロードすることです。GRUB 2についての詳細については、第18章 「ブートローダGRUB 2」を参照してください。
16.2.1.1 AArch64およびAMD64/Intel 64での初期化とブートローダ段階 #
コンピュータの電源をオンにした後、BIOSまたはUEFIが画面とキーボードを初期化し、メインメモリをテストします。この段階まで、コンピュータは大容量ストレージメディアにアクセスしません。続いて、現在の日付、時刻、および最も重要な周辺機器に関する情報が、CMOS値からロードされます。ブートメディアとそのジオメトリが認識されると、システム制御がBIOS/UEFIからブートローダに移ります。
従来のBIOSが備わっているマシンでは、ブートディスクの先頭の512バイト物理データセクタ(マスタブートレコード、MBR)のコードのみをロードできます。最小のGRUB 2のみがMBRに適合します。その唯一の目的は、MBRと最初のパーティション(MBRパーティションテーブル)の間のギャップから、またはBIOSブートパーティション(GPTパーティションテーブル)からファイルシステムドライバを含むGRUB 2コアイメージをロードすることです。このイメージにはファイルシステムドライバが含まれるため、ルートファイルシステム上にある/bootにアクセスできます。/bootには、カーネルとinitramfsイメージとともに、GRUB 2コアの追加のモジュールも含まれます。このパーティションにアクセスすると、GRUB 2はカーネルをロードし、initramfsはメモリにイメージを作成し、カーネルに制御を移します。
BIOSシステムが、暗号化された/bootパーティションを含む暗号化されたファイルシステムからブートする場合、復号化のパスワードを2度入力する必要があります。最初にGRUB 2によって/bootを復号化した後で、systemd用に暗号化されたボリュームをマウントする必要があります。
UEFIを搭載したマシンでは、従来のBIOSを搭載するマシンよりも、ブートプロセスははるかに簡単です。ファームウェアは、GPTパーティションテーブルを備えたディスクのFATでフォーマットされたシステムパーティションから読み取ることができます。このEFIシステムパーティション(/boot/efiとしてマウントされる実行中のシステム)は、ファームウェアによって直接ロードされ実行される完全に装備されたGRUB 2をホストする十分なスペースを保持します。
BIOS/UEFIがネットワークブートをサポートしている場合は、ブートローダを提供するブートサーバを設定することもできます。その後、システムはPXEを介してブートできます。BIOS/UEFIはブートローダとして動作します。ブートサーバからブートイメージを取得し、ローカルのハードディスクとは無関係にシステムを起動します。
16.2.1.2 IBM Zでの初期化とブートローダ段階 #
IBM Zでは、ブートプロセスは、zipl (zイニシャルプログラムロード)と呼ばれるブートローダによって初期化される必要があります。ziplは複数のファイルシステムからの読み込みをサポートしますが、SLEデフォルトファイルシステム(Btrfs)またはスナップショットからのブートはサポートしません。したがって、SUSE Linux Enterprise Desktopはブート時に完全なBtrfsサポートを保証する2段階のブートプロセスを使用します。
ziplは、Ext2、Ext3、Ext4、またはXFSファイルシステムでフォーマットできるパーティション/boot/ziplからブートします。このパーティションには、メモリにロードされる最小のカーネルとinitramfsが含まれます。initramfsには、Btrfsドライバ(その他の間)およびブートローダGRUB 2が含まれます。カーネルはinitgrubパラメータで開始され、GRUB 2を開始するように指示されます。カーネルはルートファイルシステムをマウントするため、
/bootにアクセス可能になります。これでGRUB 2がinitramfsから開始されます。/boot/grub2/grub.cfgから設定を読み込み、/bootから最終的なカーネルとinitramfsをロードします。これで新しいカーネルがKexecを介してロードされます。
16.2.2 カーネルの段階 #
ブートローダがシステム制御に渡されると、ブートプロセスはすべてのアーキテクチャで同じになります。ブートローダはカーネルとRAMベースの初期ファイルシステム(initramfs)をメモリにロードし、カーネルが引き継ぎます。
カーネルはメモリ管理を設定し、CPUタイプとその機能を検出した後で、ハードウェアを初期化し、initramfsでロードされたメモリから一時ルートファイルシステムをマウントします。
16.2.2.1 initramfsファイル #
initramfs(初期RAMファイルシステム)は、カーネルがRAMディスクにロードできる、小さなcpioアーカイブです。/boot/initrdにあります。dracutというツールで作成することもできます。詳細については、man 8 dracutを参照してください。
initramfsは、実際のルートファイルシステムがマウントされる前にプログラムを実行できるようにする最低限のLinux環境を提供します。この最低限のLinux環境は、BIOSまたはUEFIルーチンによってメモリにロードされ、十分なメモリがあること以外に特定のハードウェア要件はありません。initramfsには必ず、initという名前の実行可能ファイルがあります。これは、ブートプロセスの進行に伴い、ルートファイルシステム上の実際のsystemdデーモンを実行します。
ルートファイルシステムをマウントして実際のオペレーティングシステムを起動する前に、カーネルには、ルートファイルシステムが配置されているデバイスにアクセスするための対応ドライバが必要です。こうしたドライバには、特定のハードディスク用の特殊なドライバや、ネットワークファイルシステムにアクセスするためのネットワークドライバが含まれる場合もあります。ルートファイルシステムに必要なモジュールは、initramfs上のinitによってロードされます。モジュールをロードしたら、udevによって必要なデバイスがinitramfsに提供されます。ブートプロセス後半で、ルートファイルシステムが変更された後、デバイスを再生成する必要があります。これは、systemd unit systemd-udev-trigger.serviceで実行されます。
16.2.2.1.1 initramfsの再生成 #
initramfsには、ドライバが含まれるため、そのドライバのいずれかの新しいバージョンが利用可能になるとすぐにinitramfsをアップデートする必要があります。これは、ドライバアップデートを含むパッケージをインストールするときに自動的に実行されます。YaSTまたはzypperは、initramfsを生成するコマンドの出力を表示することで、これについて通知します。ただし、initramfsを手動で再生成する必要がある特定の状況があります。
- ハードウェアの変更によるドライバの追加
ハードウェア(たとえば、ハードディスク)を変更する必要が生じ、ブート時にそのハードウェア用の他のドライバがカーネル内に必須の場合には、
initramfsファイルを更新する必要があります。/etc/dracut.conf.d/10-DRIVER.confを開くか作成し、次の行を追加します(先頭の空白に注意):force_drivers+=" DRIVER1 "
DRIVER1はドライバのモジュール名で置き換えます。複数のドライバを追加する必要がある場合は、それぞれをスペースで区切って指定します。
force_drivers+=" DRIVER1 DRIVER2 "
手順16.1「initramfsの生成」に従って手順を進めます。
- RAIDまたはLVMへのシステムディレクトリの移動
スワップファイル、または実行中のシステムの
/usrなどのシステムディレクトリをRAIDまたは論理ボリュームに移動するときには常に、ソフトウェアRAIDまたはLVMドライバのサポートを含むinitramfsを作成する必要があります。これを行うには、
/etc/fstabにそれぞれのエントリを作成し、新しいエントリをマウントします(たとえば、mount -aおよび/またはswapon -aを使用)。手順16.1「initramfsの生成」に従って手順を進めます。
- ルートファイルシステムを含むLVMグループまたはBtrfs RAIDへのディスクの追加
ルートファイルシステムを含む論理ボリュームグループまたはBtrfs RAIDにディスクを追加(または削除)する際には常に、 大きくなったボリュームのサポートを含む
initramfsを作成する必要があります。手順16.1「initramfsの生成」の指示に従います。手順16.1「initramfsの生成」に従って手順を進めます。
- カーネル変数の変更
関連するファイル(
/etc/sysctl.confまたは/etc/sysctl.d/*.conf)を編集して、sysctlインタフェースでカーネル変数の値を変更した場合、次にシステムを再起動したときに変更内容が失われます。実行時にsysctl --systemを使用して値をロードしても、変更内容はinitramfsファイルに保存されません。手順16.1「initramfsの生成」の説明に従って手順を進め、アップデートする必要があります。
次の手順のすべてのコマンドをrootユーザとして実行する必要があります。
/bootディレクトリを入力します。#cd /bootdracutを使用して新しいinitramfsファイルを生成し、MY_INITRAMFSを任意のファイル名に置き換えます。#dracut MY_INITRAMFSまたは、
dracut -fFILENAMEを実行して、既存のinitファイルを置き換えます。(以前のステップで
dracut -fを実行した場合は、このステップはスキップします)。以前のステップで作成したinitramfsファイルからinitrdへのシンボリックリンクを作成します。#ln -sf MY_INITRAMFSinitrdIBM Zアーキテクチャで、
grub2-installを補足的に実行します。
16.2.3 initramfs上のinit段階 #
initramfsからカーネルによってマウントされた一時ルートファイルシステムには、(以下のinitramfs上のinitと呼ばれる)実行可能なsystemdが含まれます。16.1項 「用語集」も参照してください。このプログラムは、適切なルートファイルシステムをマウントするために必要なすべてのアクションを実行します。必要なファイルシステムにカーネル機能を提供し、大容量ストレージコントローラ用のデバイスドライバにudevを提供します。
initramfs上のinitの主な目的は、実際のルートファイルシステムのマウントとアクセスの準備をすることです。システム設定に応じて、initramfs上のinitは次のタスクを実行します。
- カーネルモジュールのロード
ハードウェア設定によっては、使用するコンピュータのハードウェアコンポーネント(ハードディスクになる最も重要なコンポーネント)にアクセスするために特殊なドライバが必要になる場合があります。最終的なルートファイルシステムにアクセスするには、カーネルが適切なファイルシステムドライバをロードする必要があります。
- ブロック特殊ファイルの提供
カーネルはロードされたモジュールに応じて、デバイスイベントを生成します。
udevは、これらのイベントを処理し、RAMファイルシステム上で必要なブロック特殊ファイルを/dev内に生成します。これらの特殊ファイルがないと、ファイルシステムや他のデバイスにアクセスできません。- RAIDとLVMのセットアップの管理
RAIDまたはLVMの下でルートファイルシステムを保持するようにシステムを設定した場合、
initramfs上のinitはLVMまたはRAIDを設定して、後でルートファイルシステムにアクセスできるようにします。- ネットワーク設定の管理
ネットワークマウントしたルートファイルシステム(NFSを介してマウント)を使用するようにシステムを設定した場合、
initは適切なネットワークドライバがロードされ、ドライバがルートファイルシステムにアクセスできるように設定されていることを確認する必要があります。ファイルシステムがiSCSIやSANなどのネットワークブロックデバイスに常駐している場合は、ストレージサーバへの接続も
initramfs上のinitによって設定されます。SUSE Linux Enterprise Desktopは、プライマリターゲットを使用できない場合の、セカンダリiSCSIターゲットからのブートをサポートしています。
ルートファイルシステムをブート環境内からマウントできなかった場合は、ブートを続行する前にルートファイルシステムを確認して修復しておく必要があります。Ext3ファイルシステムおよびExt4ファイルシステムでは、ファイルシステムチェッカが自動的に起動されます。XFSファイルシステムおよびBtrfsファイルシステムでは修復プロセスが自動化されていないため、ファイルシステムを修復するために使用できるオプションに関する情報が表示されます。ファイルシステムが正常に修復された場合、ブート環境を終了すると、システムはルートファイルシステムのマウントを再試行します。成功した場合、ブートは通常どおり続行されます。
16.2.3.1 インストールプロセスのinitramfs上のinit段階 #
初期ブート時にインストールプロセスの一環としてinitramfs上のinitが呼び出される場合、そのタスクは上記で説明したタスクと異なります。インストールシステムはinitramfsからsystemdを起動せず、これらのタスクはlinuxrcで実行されます。
- インストールメディアの検出
インストールプロセスを開始すると、マシンは、インストールカーネルと、YaSTインストーラを含む特殊な
initをロードします。YaSTインストーラは、RAMファイルシステムで実行され、インストールメディアにアクセスしてオペレーティングシステムをインストールするために、そのメディアの場所に関する情報を必要とします。- ハードウェア認識の開始および適切なカーネルモジュールのロード
16.2.2.1項 「
initramfsファイル」で説明しているように、ブートプロセスはほとんどのハードウェア構成で使用できる最小限のドライバセットで開始されます。AArch64、POWER、およびAMD64/Intel 64マシンでは、linuxrcは、ハードウェア構成に適したドライバセットを判断する、初期ハードウェアスキャンプロセスを開始します。IBM Zでは、ドライバのリストおよびそのパラメータは、linuxrcまたはparmfileなどを介して提供される必要があります。これらのドライバは、システムをブートするために必要なカスタム
initramfsを生成するために使用されます。ブートに必要なくてもコールドプラグには必要なモジュールがある場合は、systemdを使用してロードできます。詳細については、19.6.4項 「カーネルモジュールのロード」を参照してください。- インストールシステムのロード
ハードウェアが適切に認識されると、適切なドライバがロードされます。
udevプログラムが特殊なデバイスファイルを作成し、linuxrcは、YaSTインストーラを使用してインストールシステムを起動します。- YaSTの起動
最後に、
linuxrcはYaSTを起動し、これによってパッケージのインストールとシステム設定が開始されます。
16.2.4 systemd段階 #
「実際の」ルートファイルシステムが見つかると、エラーをチェックしてからマウントします。これが正常に実行されれば、initramfsはクリアされ、ルートファイルシステムでsystemdデーモンが実行されます。systemdはLinuxのシステムおよびサービスマネージャです。PID 1として起動する親プロセスで、ユーザスペースサービスを起動して維持するinitシステムとして機能します。詳細については第19章 「systemdデーモン」を参照してください。