Slide 1

Slide 1 text

Linuxのブートプロセス Mar. 2nd, 2025 Satoru Takeuchi X: satoru_takeuchi 1

Slide 2

Slide 2 text

はなすこと ● マシンの電源を入れてからLinuxのinitプロセスが起動するまでの流れ ○ initプロセスは最近のLinuxディストリビューションの場合は大体 systemd ● 前提 ○ アーキテクチャはx86_64 ○ ファームウェアはUEFI BIOS ○ ブートローダはGRUB ○ 1台のディスクを搭載した物理マシン上に GRUBとLinuxをインストールしている ● 以下は省略。別動画で説明するかも ○ Secure Boot ○ initramfs 2

Slide 3

Slide 3 text

大まかな流れ 1. 人間がマシンの電源を入れる 2. マシン上のUEFI BIOSが起動 3. UEFI BIOSがハードウェアを初期化 4. UEFI BIOSがGRUBをロードして実行 5. GRUBがvmlinuzファイルをロード 6. GRUBがカーネル展開コードを実行 7. 展開コードがカーネルをロードして実行 8. カーネルがシステムを初期化してinitプロセスを実行 3

Slide 4

Slide 4 text

マシン上のUEFI BIOSが起動 ● マシンは電源を入れると特定アドレス(0xFFFFFFF0)上に存在するUEFI BIOSプロ グラムを動かすようになっている ● UEFI BIOSはマシンの不揮発性メモリ上に存在しており、システム起動時に物理ア ドレス空間の上述のアドレスにマップされている ○ 📝 つまり物理アドレスが物理メモリ以外のデータを指すことがある ○ 📝 UEFI BIOS以外にも物理アドレス空間にマップされるデータは他にもあるが、本動画では以下 のようなイメージを持っていればいい 4 物理アドレス空間 0 0xFFFFFFF0 不揮発性メモリ上の UEFI BIOS 物理メモリ 物理メモリ

Slide 5

Slide 5 text

UEFI BIOSがハードウェアを初期化 ● CPUの動作確認、初期化 ○ ブート直後は機能制限されていて、 UEFI BIOSが制限を外すというイメージ ● メモリの動作確認、初期化 ○ これをする前は物理メモリにアクセスできない! ● ディスクなどのその他ハードウェアを初期化 ● どこの領域にどんなデータがマップされているかを記録 ○ 📝 後でカーネルが使う 5

Slide 6

Slide 6 text

UEFI BIOSがGRUBをロードして実行 1. GPT形式のパーティションテーブルでフォーマットされたディスクを探す 2. BSP(Boot Strap Partition)というGUIDを持つパーティションを見つける a. 📝 このパーティションは FAT32ファイルシステムでフォーマットされている 3. BSPから「UEFIアプリケーション」と呼ばれる実行ファイルを見つける a. 📝 UEFIアプリケーションを実行するのは LinuxではなくUEFI BIOS 4. UEFI BIOSはUEFIアプリケーションとして存在しているGRUBを実行 a. 通常はGRUBがデフォルトで動作するように設定されている 6 UEFI BIOS 物理アドレス空間 disk (1) GRUBを読み出し GRUB (2) GRUBをロード&実行

Slide 7

Slide 7 text

GRUBがvmlinuzファイルをロード(前提知識) ● BSPはLinux動作時に通常(“/boot/efi/”)にマウントされている ○ GRUB EFIアプリケーションのファイル名は通常 ”/boot/efi/EFI/BOOT/BOOTX86.EFI” ● vmlinuzファイルは通常ブートパーティション(“/boot/”)に存在する ○ 名前は”vmlinuz-<カーネバージョン>” ○ 📝 GRUBはLinuxの一部のファイルシステム (e.g. ext4, XFS)を読み出せる ■ “/boot”はGRUBが読み出せるファイルシステムでなければならない ● カーネル圧縮イメージのフォーマット(bzImage形式と呼ばれる): 7 setup header カーネル展開コード カーネル圧縮イメージ カーネル展開コードやカーネルの ロード先メモリアドレス、エントリポイ ントを保持

Slide 8

Slide 8 text

GRUBがvmlinuzファイルをロード 1. 設定に基づき、システムに存在するカーネルの一覧を取得し、ユーザにどのカーネ ルをどんなブートパラメタで起動するかを選択させる a. この動画で重要なのはルートファイルシステムを指定する ”root”パラメタ 2. vmlinuzファイルをメモリ上にロード 8 物理アドレス空間 カーネル展開 コード カーネル圧縮 イメージ disk GRUB (1) vmlinuzファイルを読み出し (2) ロード * スペースの都合でsetup headerは省略

Slide 9

Slide 9 text

GRUBがカーネルの展開コードを実行 ● カーネル展開コードのエントリポイントにジャンプして実行開始 9 物理アドレス空間 カーネル展開 コード カーネル圧縮 イメージ disk GRUB ジャンプ

Slide 10

Slide 10 text

展開コードがカーネルをメモリマップして実行 1. カーネル展開コードがカーネル圧縮イメージを展開してメモリ上にマップ 2. カーネルのエントリポイントにジャンプ 10 物理アドレス空間 カーネル展開 コード カーネル圧縮 イメージ disk カーネル (1) 読み出し (2) 展開&コピー&エントリポイントにジャンプ

Slide 11

Slide 11 text

カーネルがシステムを初期化してinitプロセスを実行 1. ハードウェアやカーネルそのものの初期設定 a. 📝 UEFI BIOSはマシンの起動に必要な最低限の初期化しかしないが、カーネルによるハードウェ アの初期設定はシステムが稼働し続けるために必要な設定をするという違いがある 2. “root”ブートパラメタで指定した場所にあるrootファイルシステムをディスクから読み 出してmount 3. ルートファイルシステム上のinitプログラムをメモリマップして実行 11 物理アドレス空間 disk カーネル (1) rootファイルシステムを読 み出してmount (2) initプログラムをメモリマップ &実行 init

Slide 12

Slide 12 text

おわりに ● マシンの電源を入れた後は様々なコンポーネントが取り決めに基づいて段階的に システムが起動していく ● ものすごく長大だが、これでもかなり省略している。本物はもっと複雑 ● 理解するのは大変だし知っていてもそれほど得はしないが、かっこいい 12