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

起動シーケンスの全体像

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

Linuxマシンの電源ボタンを押してから、ログインプロンプトやデスクトップ画面が出るまでの数秒から数十秒の間に、実は何段階もの異なるプログラムが順番にバトンを渡し合っています。ふだんは意識する必要のない世界ですが、「電源を入れても画面が真っ黒のまま」「特定のサービスだけ起動してこない」といったトラブルに出くわすと、この一連の流れ——起動シーケンス、あるいはブートプロセスと呼ばれる連鎖——を理解しているかどうかで、原因にたどり着く速さがまるで変わってきます。ここでの考え方の軸は単純で、各段階は「自分の仕事を終えたら、次の段階に制御を引き渡す」という橋渡しの連続だということです。どの橋で詰まったのかが分かれば、調べるべき場所はぐっと絞り込めます。

起動はおおまかに4つの段階に分けられます。順に、ファームウェア(BIOSまたはUEFI)、ブートローダ(GRUB)、カーネルとinitramfs、そして最初のユーザ空間プロセスである init(現在はsystemd)です。電源ON → BIOS/UEFI → GRUB → カーネル+initramfs → init/systemd → ログイン、という一本道をイメージしておくと、以降の各トピックがこの道のどこを指しているのかが見通せます。大きく分けると、ファームウェアからカーネルが立ち上がるまでがハードウェアとカーネル空間の世界、initが動き始めてからログインまでがユーザ空間の世界、という二つの局面に分かれている、と捉えるとさらに整理しやすくなります。

第1段階 — ファームウェア(BIOS/UEFI)

電源が入ってまず動くのは、マザーボード上のROMに焼かれたファームウェアです。古くからあるものをBIOS(Basic Input/Output System)、その後継として主流になったのがUEFI(Unified Extensible Firmware Interface)です。この段階の仕事は、CPUやメモリ、ディスクといった最低限のハードウェアが正常かを点検し(POST: Power-On Self-Test)、次に制御を渡す相手であるブートローダを探して読み込むことです。BIOSはディスク先頭のMBR(マスターブートレコード)にある小さなプログラムを読み込む方式、UEFIはディスク上のEFIシステムパーティション(ESP)に置かれた .efi 形式のブートローダファイルを直接読み込む方式、という違いがあります。UEFIにはSecure Bootという、署名されていないブートローダの起動を拒否してマルウェアの混入を防ぐ仕組みもあります。

第2段階 — ブートローダ(GRUB)

ファームウェアから呼び出されるのがブートローダで、Linuxでは GRUB(GRand Unified Bootloader)が広く使われています。GRUBの役割は、起動するカーネルを選ばせ、そのカーネル本体と、起動初期に使う一時的なファイルシステムであるinitramfsをメモリ上に展開し、カーネルに制御を渡すことです。起動時に黒い画面でカーネルの一覧メニューが出るのがGRUBで、複数のカーネルや旧バージョンを選んで起動できるのもこの段階の働きです。GRUBの詳細は次のトピックで扱います。

第3段階 — カーネルとinitramfs

制御を受け取ったカーネルは、まず自分自身をメモリ上に展開し、CPUやメモリ管理を初期化したうえで、接続されたデバイスを次々に認識していきます。このとき活躍するのがinitramfs(initial RAM filesystem)です。本物のルートファイルシステムはディスク上にありますが、そのディスクを読むためのドライバ自体がモジュールとして必要、という鶏と卵の問題が起こります。そこでGRUBがあらかじめメモリに載せておいた小さな仮のファイルシステム(initramfs)に必要なドライバを同梱しておき、これを使ってまず本物のルートファイルシステムをマウントできる状態にします。準備が整うと、カーネルはルートファイルシステムを正式にマウントし、その中にある最初のユーザ空間プログラムを起動します。ここまでがカーネル空間の仕事です。

第4段階 — init(systemd)からログインまで

カーネルが起動する最初のユーザ空間プロセスが init で、現在の多くのディストリビューションでは systemd がその役を担います。このプロセスには必ず PID 1 が割り当てられ、以降に動くすべてのプロセスの大もとの親になります。systemd は、ネットワーク・ログ・各種デーモンといったサービスを、依存関係を解きほぐしながら可能なものから並列に起動していきます。すべての必要なサービスが立ち上がり、目標とする状態(後述する target)に到達すると、コンソールにログインプロンプトが、あるいはディスプレイマネージャがログイン画面を表示し、システムは利用可能になります。

よくある誤解と実務の使いどころ

よくある誤解は、「Linuxの起動 = systemdの起動」と捉えてしまうことです。実際にはsystemdが動き始める前に、ファームウェア・GRUB・カーネルという3つの段階がすでに終わっています。たとえば画面が真っ黒のまま何も出ない場合はファームウェアやGRUBより手前を、GRUBメニューは出るのにカーネルが起動しない場合はカーネルやinitramfsを、ログインはできるが特定のサービスが立ち上がらない場合はsystemdを、というように、症状から疑う段階を切り分けられます。実務では、カーネルが起動以降に何を認識したかは dmesg で、systemdがどのサービスにどれだけ時間をかけたかは systemd-analyze と journalctl で追跡します。この『どの段階の問題か』をまず分類する習慣が、起動トラブル対応の最短ルートになります。原因を闇雲に探すのではなく、まず4段階のどこで連鎖が途切れたのかを切り分ける——これが、起動まわりのあらゆる調査に共通する出発点です。

この項目に出てくる用語

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

関連コマンド

dmesgsystemd-analyzejournalctl

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