Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Linuxのブートプロセス
Search
Satoru Takeuchi
PRO
March 02, 2025
Technology
5
51
Linuxのブートプロセス
以下動画のテキストです
https://youtu.be/aqiENZbyC8Q
Satoru Takeuchi
PRO
March 02, 2025
Tweet
Share
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
シェルのジョブ
sat
PRO
1
20
常駐サービスを実現するデーモンプロセス
sat
PRO
0
24
絶対殺すSIGKILLシグナルと絶対死なないプロセス
sat
PRO
3
80
シェルのセッション
sat
PRO
2
31
RubyでKubernetesプログラミング
sat
PRO
4
180
プロセスの生成 exec編
sat
PRO
1
40
プロセスの生成 fork&exec編
sat
PRO
0
36
プロセスの生成 コピーオンライトを使ったfork編
sat
PRO
0
35
プロセスの生成 fork編
sat
PRO
0
38
Other Decks in Technology
See All in Technology
2/18 Making Security Scale: メルカリが考えるセキュリティ戦略 - Coincheck x LayerX x Mercari
jsonf
0
180
Goで作って学ぶWebSocket
ryuichi1208
3
2.7k
Raycast AI APIを使ってちょっと便利な拡張機能を作ってみた / created-a-handy-extension-using-the-raycast-ai-api
kawamataryo
0
210
役員・マネージャー・著者・エンジニアそれぞれの立場から見たAWS認定資格
nrinetcom
PRO
3
5.8k
大規模アジャイルフレームワークから学ぶエンジニアマネジメントの本質
staka121
PRO
3
1.1k
php-conference-nagoya-2025
fuwasegu
0
150
わたしがEMとして入社した「最初の100日」の過ごし方 / EMConfJp2025
daiksy
14
4.9k
EMConf JP 2025 懇親会LT / EMConf JP 2025 social gathering
sugamasao
2
190
クラウド関連のインシデントケースを収集して見えてきたもの
lhazy
1
160
開発組織を進化させる!AWSで実践するチームトポロジー
iwamot
1
320
MIMEと文字コードの闇
hirachan
2
1.4k
JavaにおけるNull非許容性
skrb
2
2.6k
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
67
11k
Automating Front-end Workflow
addyosmani
1368
200k
Six Lessons from altMBA
skipperchong
27
3.6k
GitHub's CSS Performance
jonrohan
1030
460k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
A Philosophy of Restraint
colly
203
16k
Git: the NoSQL Database
bkeepers
PRO
427
65k
KATA
mclloyd
29
14k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
Transcript
Linuxのブートプロセス Mar. 2nd, 2025 Satoru Takeuchi X: satoru_takeuchi 1
はなすこと • マシンの電源を入れてからLinuxのinitプロセスが起動するまでの流れ ◦ initプロセスは最近のLinuxディストリビューションの場合は大体 systemd • 前提 ◦ アーキテクチャはx86_64
◦ ファームウェアはUEFI BIOS ◦ ブートローダはGRUB ◦ 1台のディスクを搭載した物理マシン上に GRUBとLinuxをインストールしている • 以下は省略。別動画で説明するかも ◦ Secure Boot ◦ initramfs 2
大まかな流れ 1. 人間がマシンの電源を入れる 2. マシン上のUEFI BIOSが起動 3. UEFI BIOSがハードウェアを初期化 4.
UEFI BIOSがGRUBをロードして実行 5. GRUBがvmlinuzファイルをロード 6. GRUBがカーネル展開コードを実行 7. 展開コードがカーネルをロードして実行 8. カーネルがシステムを初期化してinitプロセスを実行 3
マシン上のUEFI BIOSが起動 • マシンは電源を入れると特定アドレス(0xFFFFFFF0)上に存在するUEFI BIOSプロ グラムを動かすようになっている • UEFI BIOSはマシンの不揮発性メモリ上に存在しており、システム起動時に物理ア ドレス空間の上述のアドレスにマップされている
◦ 📝 つまり物理アドレスが物理メモリ以外のデータを指すことがある ◦ 📝 UEFI BIOS以外にも物理アドレス空間にマップされるデータは他にもあるが、本動画では以下 のようなイメージを持っていればいい 4 物理アドレス空間 0 0xFFFFFFF0 不揮発性メモリ上の UEFI BIOS 物理メモリ 物理メモリ
UEFI BIOSがハードウェアを初期化 • CPUの動作確認、初期化 ◦ ブート直後は機能制限されていて、 UEFI BIOSが制限を外すというイメージ • メモリの動作確認、初期化
◦ これをする前は物理メモリにアクセスできない! • ディスクなどのその他ハードウェアを初期化 • どこの領域にどんなデータがマップされているかを記録 ◦ 📝 後でカーネルが使う 5
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をロード&実行
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 カーネル展開コード カーネル圧縮イメージ カーネル展開コードやカーネルの ロード先メモリアドレス、エントリポイ ントを保持
GRUBがvmlinuzファイルをロード 1. 設定に基づき、システムに存在するカーネルの一覧を取得し、ユーザにどのカーネ ルをどんなブートパラメタで起動するかを選択させる a. この動画で重要なのはルートファイルシステムを指定する ”root”パラメタ 2. vmlinuzファイルをメモリ上にロード 8
物理アドレス空間 カーネル展開 コード カーネル圧縮 イメージ disk GRUB (1) vmlinuzファイルを読み出し (2) ロード * スペースの都合でsetup headerは省略
GRUBがカーネルの展開コードを実行 • カーネル展開コードのエントリポイントにジャンプして実行開始 9 物理アドレス空間 カーネル展開 コード カーネル圧縮 イメージ disk
GRUB ジャンプ
展開コードがカーネルをメモリマップして実行 1. カーネル展開コードがカーネル圧縮イメージを展開してメモリ上にマップ 2. カーネルのエントリポイントにジャンプ 10 物理アドレス空間 カーネル展開 コード カーネル圧縮
イメージ disk カーネル (1) 読み出し (2) 展開&コピー&エントリポイントにジャンプ
カーネルがシステムを初期化してinitプロセスを実行 1. ハードウェアやカーネルそのものの初期設定 a. 📝 UEFI BIOSはマシンの起動に必要な最低限の初期化しかしないが、カーネルによるハードウェ アの初期設定はシステムが稼働し続けるために必要な設定をするという違いがある 2. “root”ブートパラメタで指定した場所にあるrootファイルシステムをディスクから読み
出してmount 3. ルートファイルシステム上のinitプログラムをメモリマップして実行 11 物理アドレス空間 disk カーネル (1) rootファイルシステムを読 み出してmount (2) initプログラムをメモリマップ &実行 init
おわりに • マシンの電源を入れた後は様々なコンポーネントが取り決めに基づいて段階的に システムが起動していく • ものすごく長大だが、これでもかなり省略している。本物はもっと複雑 • 理解するのは大変だし知っていてもそれほど得はしないが、かっこいい 12