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
39
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
LINEギフトにおけるバックエンド開発
lycorptech_jp
PRO
0
240
LINE NEWSにおけるバックエンド開発
lycorptech_jp
PRO
0
200
開発組織を進化させる!AWSで実践するチームトポロジー
iwamot
1
170
Goで作って学ぶWebSocket
ryuichi1208
3
2.7k
Visualize, Visualize, Visualize and rclone
tomoaki0705
9
81k
Exadata Database Service on Cloud@Customer セキュリティ、ネットワーク、および管理について
oracle4engineer
PRO
2
1.5k
急成長する企業で作った、エンジニアが輝ける制度/ 20250227 Rinto Ikenoue
shift_evolve
0
110
Amazon Q Developerの無料利用枠を使い倒してHello worldを表示させよう!
nrinetcom
PRO
2
110
大規模アジャイルフレームワークから学ぶエンジニアマネジメントの本質
staka121
PRO
3
1k
いまからでも遅くない!コンテナでWebアプリを動かしてみよう!コンテナハンズオン編
nomu
0
150
サイト信頼性エンジニアリングとAmazon Web Services / SRE and AWS
ymotongpoo
7
1.4k
ディスプレイ広告(Yahoo!広告・LINE広告)におけるバックエンド開発
lycorptech_jp
PRO
0
300
Featured
See All Featured
Embracing the Ebb and Flow
colly
84
4.6k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Building an army of robots
kneath
303
45k
Testing 201, or: Great Expectations
jmmastey
42
7.2k
Bootstrapping a Software Product
garrettdimon
PRO
306
110k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
BBQ
matthewcrist
87
9.5k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Designing Experiences People Love
moore
140
23k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
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