読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】電源を入れてからログイン画面まで何が起きてるん?BIOS・UEFI・ブートローダ・カーネル・initramfs・init【LPICレベル1】

17レスカテゴリ:Linux
1: 名無しさん

サーバーが起動の途中で止まった
どこまで進んだか見当を付けたいけど、起動の流れがよう分からん

2: 名無しさん

前提のおさらい。カーネルは /proc と /sys で機器やドライバの情報を見せていて、ドライバの多くはモジュールとして読み込まれる

3: 名無しさん

>>1
大きく分けるとこの順
1. ファームウェア(BIOS か UEFI)が機器を調べて、起動するディスクを選ぶ
2. ブートローダ(GRUB など)がカーネルと initramfs をメモリに読み込む
3. カーネルが動き出して、initramfs の中のドライバで本物のルートファイルシステムをマウントする
4. 最初のプロセス init(今は多くが systemd)がサービスを順に起動する

4: 名無しさん

>>3
BIOS と UEFI で違うのはどこ?

5: 名無しさん

>>4
BIOS はディスクの先頭の512バイト(MBR)にあるブートローダの最初の部分を読み込んで動かす。UEFI は ESP(EFI システムパーティション、FAT で作る)の中の .efi ファイルを動かして、どれを動かすかはファームウェアの設定に登録しておく

6: 名無しさん

>>5
MBR の512バイトの内訳
起動用のコード446バイト、パーティションテーブル64バイト(16バイト × 4つ)、最後の2バイトが印(55 AA)

7: 名無しさん

>>3
initramfs は何のためにあるん?

8: 名無しさん

>>7
ルートファイルシステムを読むためのドライバ(ディスクのコントローラや LVM・暗号化など)がモジュールになってると、それを読み込むまでルートが読めない。そこで、最小限のドライバと道具を入れた小さいファイルシステムを先にメモリに展開して使う

9: 名無しさん

>>3
カーネルに起動のオプションを渡すのは?

10: 名無しさん

>>9
カーネルパラメータ。ブートローダのメニューで足すか、設定ファイルに書く。今のものは /proc/cmdline で見られる
試したら console=ttyS0 root=/dev/vda … rw のように、コンソールとルートの場所が入ってた
single や 1 でシングルユーザー、systemd.unit=rescue.target で systemd のレスキュー、init=/bin/bash で init の代わりに bash

11: 名無しさん

>>1
起動のときのメッセージを後から見るには?

12: 名無しさん

>>11
dmesg でカーネルのメッセージ(リングバッファ)。-T で時刻を読める形に、-l err でエラーだけ、-w で新しいものを待って出し続ける

13: 名無しさん

>>12
長く動いてたマシンで dmesg を見たら、最初の行はもう起動のずっと後のものやった。リングバッファは一杯になると古いものから上書きされるから、起動直後のメッセージは消えてることがある

14: 名無しさん

>>13
systemd の環境なら journalctl -b でこの起動からのログ、journalctl -b -1 で1つ前の起動のログ。ジャーナルを保存してない環境では No journal files were found と出て何も見られへんかったから、/var/log/ の下のファイルを見る

15: 名無しさん

>>3
init が SysVinit か systemd かで、4番目の中身が変わるんやな

16: 名無しさん

>>15
そう。/sbin/init は Debian 13 では ../lib/systemd/systemd へのリンクやった。古い仕組みの SysVinit や Upstart では別のプログラムになる

17: 名無しさん

>>3
ファームウェア → ブートローダ → カーネルと initramfs → init。止まった場所の見当はこれで付けられる

管理人のひとこと