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 Serverは、initramfs
を排他的に使用します。ただし、initramfs
は/boot/initrd
として格納されるため、多くの場合「initrd」と呼ばれます。この章では、initramfs
という名前を排他的に使用します。
16.2 Linuxのブートプロセス #
Linuxのブートプロセスは、いくつかの段階から成り、それぞれ別のコンポーネントが実行しています。
16.2.1 初期化とブートローダの段階 #
初期化段階中に、マシンのハードウェアが設定され、デバイスが準備されます。このプロセスはハードウェアアーキテクチャ間で大きく異なります。
SUSE Linux Enterprise Serverは、すべてのアーキテクチャでブートローダ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はブートローダとして動作します。BIOSは、ブートサーバからブートイメージを取得し、システムを起動します。この作業はローカルハードディスクから完全に独立した処理として行われます。
16.2.1.2 IBM Zでの初期化とブートローダ段階 #
IBM Zでは、ブートプロセスは、zipl
(zイニシャルプログラムロード)と呼ばれるブートローダによって初期化される必要があります。zipl
はさまざまなファイルシステムからの読み込みをサポートしますが、SLEデフォルトファイルシステム(Btrfs)またはスナップショットからのブートはサポートしません。したがって、SUSE Linux Enterprise Serverはブート時に完全なBtrfsサポートを保証する2段階のブートプロセスを使用します。
zipl
は、Ext2、Ext3、Ext4、またはXFSファイルシステムでフォーマットできるパーティション/boot/zipl
からブートします。このパーティションには、メモリにロードされる最小のカーネルとinitramfsが含まれます。initramfsには、Btrfsドライバ(その他の間)およびブートローダGRUB 2が含まれます。カーネルはinitgrub
パラメータで開始され、GRUB 2を開始するように指示されます。カーネルはルートファイルシステムをマウントするため、
/boot
にアクセス可能になります。これでGRUB 2がinitramfsから開始されます。GRUB 2は/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 -f
FILENAMEを実行して、既存のinitファイルを置き換えます。(以前のステップで
dracut -f
を実行した場合は、このステップはスキップします)。以前のステップで作成したinitramfs
ファイルからinitrd
へのシンボリックリンクを作成します。#
ln -sf MY_INITRAMFSinitrd
IBM 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 Serverは、プライマリターゲットを使用できない場合の、セカンダリiSCSIターゲットからのブートをサポートしています。iSCSIターゲットのブート設定の詳細については、15.3.1項 「YaSTを使った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
デーモン」を参照してください。