「Arch ブートプロセス」の版間の差分
(→カーネル: 同期) |
(→initramfs: 同期) |
||
179行目: | 179行目: | ||
== initramfs == |
== initramfs == |
||
− | カーネルがロードされた後、カーネルは [[mkinitcpio|initramfs]] (initial RAM ファイルシステム) を解凍して、initial root ファイルシステムにします。カーネルは最初のプロセスとして {{ic|/init}} を起動します。''初期ユーザー空間''の始まりです。 |
||
+ | {{ic|/}} のルートファイルシステムは空の [https://www.kernel.org/doc/html/latest/filesystems/ramfs-rootfs-initramfs.html rootfs] として始まります。これは ramfs や tmpfs の特殊なインスタンスです。これは一時的なルートファイルシステムで、initramfs (''init''ial ''RAM'' ''f''ile ''s''ystem) イメージがここへ解凍されます。 |
||
− | initramfs の目的は root ファイルシステムにアクセスできる位置にシステムをブートストラップすることです (詳しくは [[FHS]] を見て下さい)。これは IDE, SCSI, SATA, USB/FW (外部ハードウェアから起動する場合) などのデバイスのために必要なモジュールがカーネルに入っていない場合 initramfs からモジュールをロードできなくてはならないということを意味しています; (プログラムやスクリプトから明示的に指定されるか [[udev|udev]] を通すかして) 正しいモジュールがロードされると、ブートプロセスが再開されます。従って、initramfs に含めなくてはならないのは root ファイルシステムにアクセスするために必要なモジュールだけで、使用する全てのモジュールを入れる必要はありません。ほとんどのモジュールは後の init プロセス中に、udev によってロードされます。 |
||
+ | |||
+ | initramfs の目的は root ファイルシステムにアクセスできる位置にシステムをブートストラップすることです (詳しくは [[FHS]] を見て下さい)。これは IDE, SCSI, SATA, USB/FW (外部ハードウェアから起動する場合) などのデバイスのために必要なモジュールがカーネルに入っていない場合 initramfs からモジュールをロードできなくてはならないということを意味しています; (プログラムやスクリプトから明示的に指定されるか [[udev]] を通すかして) 正しいモジュールがロードされると、ブートプロセスが再開されます。従って、initramfs に含めなくてはならないのは root ファイルシステムにアクセスするために必要なモジュールだけで、使用する全てのモジュールを入れる必要はありません。ほとんどのモジュールは後の init プロセス中に、[[udev]] によってロードされます。 |
||
+ | |||
+ | まず、カーネルは組み込みの initramfs を一時的なルートファイルシステムに解凍します。Arch Linux の[[カーネル#公式サポートカーネル|公式カーネル]]では組み込みの initramfs として空のアーカイブが用いられます(Linux のビルドの際のデフォルトです)。そして、カーネルは、[[#ブートローダー|ブートローダー]]から渡されたコマンドラインにより指定された外部の initramfs ファイルを解凍します。この際、組み込みの initramfs にあったファイルは上書きされます。このような外部の initramfs イメージは [[mkinitcpio]] や [[dracut]]、[[booster]] によって生成でき、Arch の''初期ユーザ空間''のセットアップの方法として推奨されています。 |
||
== 初期ユーザ空間 == |
== 初期ユーザ空間 == |
2022年6月22日 (水) 16:44時点における版
関連記事
Arch Linux を起動するためには、GRUB や Syslinux などの Linux 対応のブートローダを、Master Boot Record もしくは GUID Partition Table にインストールする必要があります。ブートローダは、ブートプロセスが始まる前にカーネルや初期 RAM ディスクをロードする仕事を行います。BIOS と UEFI で起動の流れはかなり異なっています。このページや関連するページに詳しい説明があります。
目次
ファームウェアの種類
BIOS
BIOS (Basic Input-Outout System) とはシステムの電源を入れた時に最初に実行されるプログラム(ファームウェア)のことです。ほとんどの場合、BIOS はマザーボード内のフラッシュメモリに保存され、システムストレージとは独立しています。
UEFI
Unified Extensible Firmware Interface は、パーティションテーブルとファイルシステムの両方の読み取りをサポートしています。UEFI か MBR か、にかかわらず、UEFI は NVRAM を起動せず、代わりにブートエントリに依存します。
UEFI 仕様では FAT12、FAT16、および FAT32 ファイルシステム (UEFI 仕様バージョン2.8、セクション13.3.1.1 を参照) のサポートが義務付けられていますが、規格に準拠しているベンダーは任意でファイルシステムのサポートを追加できます。たとえば、Apple Mac は独自のHFS+ファイルシステムドライバをサポートしています。UEFI の実装では、光ディスク用の ISO-9660 もサポートされています。
UEFIは、boot loaders 、ブートマネージャ、 UEFI シェル などの EFI アプリケーションを起動します。これらのアプリケーションは通常、 EFI システムパーティション にファイルとして保存されます。各ベンダーは、EFI システムパーティションの /EFI/vendor_name
フォルダにファイルを格納できます。アプリケーションを起動するには、NVRAM または UEFI シェルにブートエントリを追加します。
UEFI 仕様では、互換性サポートモジュール (CSM) によるレガシー BIOS ブートがサポートされています。UEFI で CSM が有効な場合、UEFI はすべてのドライブの CSM ブートエントリを生成します。CSM ブートエントリがブート元として選択された場合、UEFI の CSM はドライブの MBR ブートストラップコードからのブートを試みます。
システムの初期化
BIOS
- システムの電源が入れられ POST が実行される
- BIOS がブートに必要なシステムハードウェア (ディスクやキーボードコントローラなど) を初期化する
- (BIOS のディスク順で) 最初のディスクの最初の440バイト (Master Boot Record) が BIOS によって実行される
- BIOS から MBR ブートコードにコントロールが移り、次のステージのコードが起動する (通常はブートローダーのコード)
- 起動した(2番目の)コード(ブートローダー)はサポートと設定ファイルを読み込む
- 設定ファイルのデータに基づき、ブートローダーはカーネルと initramfs をシステムメモリ (RAM) にロードしてカーネルを起動する
UEFI
- システムのスイッチが入る - power-on self-test (POST) が実行されます。
- POST 後に、UEFI は起動に必要なハードウェア(ディスク、キーボード、コントローラなど)を初期化します。
- ファームウェアは NVRAM 内のブートエントリを読み込み、どの EFI アプリケーションを起動するかや、どこから(例えば、どのディスクやパーティションから)起動するかを判断します。
- ブートエントリは単にディスクであることもあります。この場合、ファームウェアは EFI システムパーティションをそのディスク上から探し、フォールバックブートパス
\EFI\BOOT\BOOTx64.EFI
(IA32 (32-bit) UEFI のシステムではBOOTIA32.EFI
)から EFI アプリケーションを見つけようとします。これは UEFI の起動可能リムーバブルメディアの動作です。
- ブートエントリは単にディスクであることもあります。この場合、ファームウェアは EFI システムパーティションをそのディスク上から探し、フォールバックブートパス
- ファームウェアが EFI アプリケーションを起動します。
セキュアブート が有効化されている場合、ブートプロセスでは EFI バイナリの正統性を署名によって検証します。
UEFI でのマルチブート
それぞれの OS やベンダーは互いに影響を与えずに EFI システムパーティション 内に固有のファイルを保持することができるので、UEFI を用いたマルチブートは単に、特定のオペレーティングシステムのブートローダに対応する異なる EFI アプリケーションを起動する問題になります。ゆえに、他の OS をロードするためにブートローダのチェインロードメカニズムに頼る必要がありませn。
Windows と Arch のデュアルブート も参照してください。
ブートローダー
ブートローダーは、ファームウェア(BIOS または UEFI) によって起動されるソフトウェアです。カーネルは必要な カーネルパラメータ と 初期RAMディスク を設定ファイルに基づいてロードします。UEFI の場合、EFI ブートスタブを使用して、UEFI からカーネル自体を直接起動できます。ブート前にカーネルパラメータを編集するために、別のブートローダやブートマネージャを使うこともできます。
機能比較
名前 | ファームウェア | パーティションテーブル | マルチブート | ファイルシステム | 備考 | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|
BIOS | UEFI | MBR | GPT | Btrfs | ext4 | ReiserFS | VFAT | XFS | |||
EFISTUB | – | Yes | Yes | Yes | – | – | – | – | ファームウェアから継承1 | – | カーネルはEFI実行可能ファイルに変換され、UEFI ファームウェアまたは別のブートローダーから直接ロードされます。 |
Unified カーネルイメージ | – | Yes | Yes | Yes | – | – | – | – | ファームウェアから継承1 | – | systemd-stub(7) やカーネル、initramfs、カーネルコマンドラインを EFI 実行ファイルにパックしたものです。UEFI ファームウェアや他のブートローダから直接読み込めます。 |
Clover | UEFI をエミュレート | Yes | Yes | Yes | Yes2 | No | 暗号化非対応 | No | ファームウェアから継承1 | No | rEFIt のフォークは、macOS on non-Apple hardware を実行するように変更されました。 |
GRUB | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | BIOS / GPT 構成では、BIOSシステム が必要です。 RAID、LUKS1、LVMをサポートします(シンプロビジョニングボリュームはサポートしません) |
Limine | Yes | Yes | Yes | Yes | Yes | No | 暗号化非対応 | No | Yes | No | |
rEFInd | No | Yes | Yes | Yes | Yes2 | 暗号化非対応 | 暗号化非対応 | テールパッキング機能は非対応 | ファームウェアから継承1 | No | 明示的な構成なしでカーネルとパラメーターの自動検出をサポートします。そして、fastboot をサポートします[3]。 |
Syslinux | Yes | 部分的 | Yes | Yes | 部分的 | マルチデバイスボリューム、圧縮、暗号化は非対応 | 暗号化非対応 | No | Yes | MBR のみ。スパース inode 非対応 | 特定の ファイルシステム 機能はサポートされていません。[4] ファイルシステムドライバーがありません [5] は、インストールされているファイルシステムにのみアクセスできます。 |
systemd-boot | No | Yes | 手動インストールのみ | Yes | Yes2 | サイドロード可3 | サイドロード可3 | サイドロード可3 | ファームウェアから継承1 | サイドロード可3 | ESP または拡張ブートローダーパーティション(XBOOTLDRパーティション)以外のパーティションからバイナリを起動することはできません。 Unified カーネルイメージは、 esp/EFI/Linux に置かれた場合、自動検出をサポートします。
|
GRUB Legacy | Yes | No | Yes | No | Yes | No | No | Yes | Yes | XFS v4 のみ | 廃止。GRUB に移行。 |
LILO | Yes | No | Yes | No | Yes | No | 暗号化非対応 | Yes | Yes | Yes | 廃止 制限による (Btrfs、GPT、RAIDなど) |
- ファイルシステムのサポートはファームウェアから継承されます。 UEFI 仕様では、FAT12、FAT16、および FAT32 ファイルシステムのサポートが義務付けられていますが、ベンダーはオプションで追加のファイルシステムのサポートを追加できます。[6] たとえば、Apple Mac のファームウェアは HFS+ ファイルシステムをサポートしています。 ファームウェアが起動時に UEFIドライバー をロードするためのインターフェースを提供する場合、ファイルシステムドライバーを(個別に取得して)ロードすることにより、追加のファイルシステムのサポートを追加できます。
- A boot manager 他の EFI アプリケーション、たとえば
CONFIG_EFI_STUB = y
および Windowsbootmgfw.efi
で構築された Linux カーネルイメージのみを起動できます。 - systemd-boot は UEFI ファイルシステムドライバの読み込みをサポートしています。ドライバは efifs により提供され、
esp/EFI/systemd/drivers/
に配置する必要があります。
Wikipedia:Comparison of boot loaders も参照してください。
カーネル
ブートローダー は、カーネルを含んでいる vmlinux イメージを起動します。
カーネルは、マシンのハードウェアとプログラムとの間を仲介する低いレベル(カーネル空間)で機能します。カーネルは、ユーザスペースに移行する前にまずハードウェアの列挙と初期化を行います。より詳細な説明は Wikipedia:ja:カーネル と Wikipedia:ja:Linuxカーネル を見てください。
initramfs
/
のルートファイルシステムは空の rootfs として始まります。これは ramfs や tmpfs の特殊なインスタンスです。これは一時的なルートファイルシステムで、initramfs (initial RAM file system) イメージがここへ解凍されます。
initramfs の目的は root ファイルシステムにアクセスできる位置にシステムをブートストラップすることです (詳しくは FHS を見て下さい)。これは IDE, SCSI, SATA, USB/FW (外部ハードウェアから起動する場合) などのデバイスのために必要なモジュールがカーネルに入っていない場合 initramfs からモジュールをロードできなくてはならないということを意味しています; (プログラムやスクリプトから明示的に指定されるか udev を通すかして) 正しいモジュールがロードされると、ブートプロセスが再開されます。従って、initramfs に含めなくてはならないのは root ファイルシステムにアクセスするために必要なモジュールだけで、使用する全てのモジュールを入れる必要はありません。ほとんどのモジュールは後の init プロセス中に、udev によってロードされます。
まず、カーネルは組み込みの initramfs を一時的なルートファイルシステムに解凍します。Arch Linux の公式カーネルでは組み込みの initramfs として空のアーカイブが用いられます(Linux のビルドの際のデフォルトです)。そして、カーネルは、ブートローダーから渡されたコマンドラインにより指定された外部の initramfs ファイルを解凍します。この際、組み込みの initramfs にあったファイルは上書きされます。このような外部の initramfs イメージは mkinitcpio や dracut、booster によって生成でき、Arch の初期ユーザ空間のセットアップの方法として推奨されています。
初期ユーザ空間
初期ユーザー空間の最終段階として、本当の root がマウントされ、initial root ファイルシステムを置き換えます。/sbin/init
が実行され、/init
プロセスを置き換えます。Arch は init プロセスとして systemd を使っています。
後期ユーザ空間
getty
init は virtual terminal (典型的には6つ) ごとに getty を1回呼び出し、各ttyを初期化してユーザ名とパスワードを要求します。ユーザ名とパスワードが与えられると、getty はそれらを /etc/passwd
と /etc/shadow
と照合し、 login を呼び出します。あるいは、システム上にディスプレイマネージャがあれば、getty はそれを起動します。
ログイン
ログイン プログラムは、環境変数を設定し、/etc/passwd
に基づいてユーザーのシェルを起動することによって、ユーザーのセッションを開始します。
ログイン プログラムは、ログインに成功するとログインシェルを実行する直前に /etc/motd (message of the day) の内容を表示します。利用規約を表示してユーザーに地域のポリシーや伝えたいことを思い出させるのに適した場所です。
シェル
ユーザーの シェル が起動されると、通常はユーザーにプロンプトを表示する前に bashrc などの実行時設定ファイルが実行されます。アカウントが ログイン時に_X_を起動 に設定されている場合、実行時設定ファイルは startx または xinit を呼び出します。
ディスプレイマネージャ
ディスプレイマネージャ は、tty の getty ログインプロンプトを置き換えるように設定できます。
起動後にディスプレイマネージャを自動的に初期化するには、 systemd からサービスユニットを手動で有効にする必要があります。サービス・ユニットの有効化と起動の詳細は、systemd#ユニットを使う を参照してください。
グラフィカルセッション
xinit はユーザの xinitrc runtime configuration fileを実行しこれは通常 ウィンドウマネージャ を開始します。ユーザがウィンドウマネージャを終了すると、xinit、 startx、 シェル、 ログイン、の順序で終了して getty に戻ります。