🐧 Linux 総合学習プラットフォーム
OS内部/起動の仕組み ・ 上級

起動シーケンスの全体像

電源投入からログインプロンプトまでには、いくつもの段階が順に実行されます。まずファームウェア(BIOSまたはUEFI)がハードウェアを初期化し、ブートローダ(GRUB)を読み込みます。GRUBはLinuxカーネルとinitramfsをメモリへ展開してカーネルへ制御を渡します。カーネルはデバイスを認識して最初のユーザ空間プロセスである init(現在はsystemd)を起動し、systemdが各サービスを並列に立ち上げてシステムが利用可能な状態になります。各段階が「次へ橋渡しする」連鎖だと捉えると、障害切り分けの起点が見えてきます。

電源ボタンを押してからログイン画面が出るまでの数秒〜数十秒。その短い間に、何段階ものプログラムが順番にバトンを渡し合っている。

この一連の流れを起動シーケンス、またはブートプロセスと呼ぶ。ふだんは意識しなくていい世界だ。

だが「電源を入れても画面が真っ黒のまま」「特定のサービスだけ起動してこない」といったトラブルでは話が変わる。どの段階で詰まったのかが分かれば、調べる場所がぐっと絞れるからだ。

🔗
たとえ各段階は、自分の仕事を終えたら次へ制御を引き渡すリレー走者のようなものだ。どの走者でバトンが落ちたかさえ分かればいい。

🗺 起動は4つの段階に分かれる

起動はおおまかに4つの段階に分けられる。順に、ファームウェア(BIOSまたはUEFI)、ブートローダ(GRUB)、カーネルとinitramfs、そして最初のユーザ空間プロセスである init(現在はsystemd)だ。

電源ONBIOS/UEFIGRUBブートローダカーネル+ initramfsinitsystemdログインハードウェア / カーネル空間ユーザ空間一本道。どの段で止まったかが分かれば調べる場所が絞れる

電源ON → BIOS/UEFI → GRUB → カーネル+initramfs → init/systemd → ログイン、という一本道をイメージしておくとよい。以降の各トピックがこの道のどこを指しているのかが見通せる。

もっと大きく捉えると、二つの局面に分かれる。ファームウェアからカーネルが立ち上がるまでがハードウェアとカーネル空間の世界、initが動き始めてからログインまでがユーザ空間の世界だ。

⚡ まず最初に動くもの

電源が入ってまず動くのは、マザーボード上のROMに焼かれたファームウェアだ。古くからあるものをBIOS(Basic Input/Output System)、後継として主流になったものをUEFI(Unified Extensible Firmware Interface)という。

この段階の仕事は二つある。一つは、CPUやメモリ、ディスクといった最低限のハードウェアが正常かを点検すること(POST: Power-On Self-Test)。もう一つは、次に制御を渡すブートローダを探して読み込むことだ。

💡
ポイントブートローダの探し方で、BIOSとUEFIの道が分かれる。BIOSはMBR、UEFIはESP上の .efi ファイルから読み込む。

ブートローダの探し方で、BIOSとUEFIの道が分かれる。BIOSはディスク先頭のMBR(マスターブートレコード)にある小さなプログラムを読み込む。UEFIはディスク上のEFIシステムパーティション(ESP)に置かれた .efi 形式のブートローダファイルを直接読み込む。

UEFIにはSecure Bootという仕組みもある。署名されていないブートローダの起動を拒否して、マルウェアの混入を防ぐものだ。

🥾 次に動くブートローダ

ファームウェアから呼び出されるのがブートローダで、Linuxでは GRUB(GRand Unified Bootloader)が広く使われている。

GRUBの役割は、起動するカーネルを選ばせ、そのカーネル本体と、起動初期に使う一時的なファイルシステムであるinitramfsをメモリ上に展開し、カーネルに制御を渡すことだ。

起動時に黒い画面でカーネルの一覧メニューが出るのがGRUBだ。複数のカーネルや旧バージョンを選んで起動できるのもこの段階の働きである。詳しい中身は次のトピックで掘り下げる。

🐔 カーネルがディスクを読むまで

制御を受け取ったカーネルは、まず自分自身をメモリ上に展開し、CPUやメモリ管理を初期化したうえで、接続されたデバイスを次々に認識していく。

ここで厄介な問題が立ちはだかる。本物のルートファイルシステムはディスク上にあるのに、そのディスクを読むためのドライバ自体がモジュールとして必要なのだ。読むためにドライバがいり、ドライバはディスクの中にある。鶏と卵の堂々巡りである。

🔗
たとえ金庫の中に金庫の鍵が入っている状態だ。initramfsは、その鍵だけを先に外へ出しておく小さな控え室にあたる。

これを解くのがinitramfs(initial RAM filesystem)だ。GRUBがあらかじめメモリに載せておいた小さな仮のファイルシステムに必要なドライバを同梱しておき、これを使ってまず本物のルートファイルシステムをマウントできる状態にする。

準備が整うと、カーネルはルートファイルシステムを正式にマウントし、その中にある最初のユーザ空間プログラムを起動する。ここまでがカーネル空間の仕事だ。

🚪 ログイン画面まで運ぶもの

カーネルが起動する最初のユーザ空間プロセスが init で、現在の多くのディストリビューションでは systemd がその役を担う。このプロセスには必ず PID 1 が割り当てられ、以降に動くすべてのプロセスの大もとの親になる。

systemd は、ネットワーク・ログ・各種デーモンといったサービスを、依存関係を解きほぐしながら可能なものから並列に起動していく。

すべての必要なサービスが立ち上がり、目標とする状態(後述する target)に到達すると、コンソールにログインプロンプトが、あるいはディスプレイマネージャがログイン画面を表示する。ここまで来て、最初に押した電源ボタンがログイン画面につながる。

🧭 起動はsystemdから始まるわけではない

よくある誤解は、「Linuxの起動 = systemdの起動」と捉えてしまうことだ。実際にはsystemdが動き始める前に、ファームウェア・GRUB・カーネルという3つの段階がすでに終わっている。

つまずき画面が真っ黒ならファームウェア/GRUBより手前、GRUBは出るのにカーネルが起動しないならカーネル/initramfs、ログインできるのにサービスが上がらないならsystemdを疑う。

この4段階の地図を持っていると、症状から疑う段階を切り分けられる。画面が真っ黒のまま何も出ないならファームウェアやGRUBより手前を、GRUBメニューは出るのにカーネルが起動しないならカーネルやinitramfsを、ログインはできるが特定のサービスが立ち上がらないならsystemdを疑う。

dmesg ……カーネルが起動以降に何を認識したかを追う。systemd-analyze と journalctl ……systemdがどのサービスにどれだけ時間をかけたかを追う。

実務では、カーネルが起動以降に何を認識したかは dmesg で、systemdがどのサービスにどれだけ時間をかけたかは systemd-analyze と journalctl で追跡する。

原因を闇雲に探すのではなく、まず4段階のどこで連鎖が途切れたのかを切り分ける。起動まわりのあらゆる調査は、まずこれが出発点になる。

この項目に出てくる用語

ブートローダぶーとろーだ
ファームウェアの後にカーネルを読み込んで起動させる小さなプログラム。Linuxでは主にGRUBが使われる。
GRUBぐらぶ
Linuxで広く使われるブートローダ。起動メニューを表示し、カーネルや起動パラメータを選んで読み込む。
カーネルかーねる
OSの中核。ハードウェアとソフトウェアの間に立ち、メモリ・プロセス・デバイスを管理する。
initいにっと
カーネルが最初に起動するユーザ空間プロセス(PID 1)。他のすべてのプロセスの起点となる。
systemdしすてむでぃー
現代Linuxの標準的なinitシステム兼サービス管理基盤。unit単位で管理し、サービスを並列に起動する。
initramfsいにっとらむえふえす
起動初期にメモリ上へ展開される一時的なルートファイルシステム。本来のルートをマウントするための橋渡し。

関連コマンド

dmesgsystemd-analyzejournalctl

▶ 学習アプリでこの続きを学ぶ・演習する