システム起動と systemd - GRUB/runlevel/systemctl【LPIC-1 101.2/101.3】
この記事で達成できること
- ブートプロセスの 4 段階(BIOS/UEFI → ブートローダ → カーネル → init/systemd)を順に説明できる
- GRUB2 の設定を
/etc/default/grub経由で安全に変更できる systemctlでサービスの起動・停止・自動起動を制御できる- ブートターゲットと SysVinit ランレベルの対応を答えられる
shutdownで時刻指定の再起動・停止を実行できるdmesg/journalctlでブート時のログを調査できる
LPIC-1 主題 101.2「システムのブート」と 101.3「ランレベル/ブートターゲットを変更してシステムをシャットダウン・リブートする」の中核。サーバー運用の起点となる知識をまとめる。
ブートプロセスはどう進むのか
電源投入から利用可能になるまで、Linux は 4 段階を順にたどる。各段階が次の段階をロードする「バトンリレー」構造を押さえれば、どこで止まったかを切り分けられる。
| 段階 | 担当 | 主な役割 |
|---|---|---|
| 1. ファームウェア | BIOS / UEFI | ハードウェア初期化、ブートデバイス選択 |
| 2. ブートローダ | GRUB2 | カーネルと initramfs をメモリへロード |
| 3. カーネル | Linux kernel | ハードウェア検出、ルートファイルシステムをマウント |
| 4. init | systemd | サービス起動、ターゲット到達 |
BIOS は MBR(ディスク先頭 512 バイト)からブートローダを読み込み、UEFI は EFI システムパーティション上のブートローダ(*.efi)を読み込む。どちらの環境でも、現代の主要ディストリビューションは GRUB2 をブートローダに、systemd を init システムに採用している。
カーネルが読み込む initramfs(初期 RAM ファイルシステム)は、ルートファイルシステムをマウントするために必要なドライバ群を含む一時的な環境。これによりルートが暗号化・LVM・特殊なストレージ上にあってもマウントできる。
GRUB2 の設定はどこを編集するのか
GRUB2 の動作は生成済みの grub.cfg ではなく、/etc/default/grub と /etc/grub.d/ を編集してから再生成するのが正しい手順。grub.cfg を直接書き換えてはいけない。
GRUB2 の主要ファイルは次の通り。
| ファイル | 役割 |
|---|---|
/boot/grub/grub.cfg(Debian系) |
生成される最終設定。直接編集しない |
/boot/grub2/grub.cfg(RHEL系) |
同上。ディストリでパスが異なる |
/etc/default/grub |
タイムアウト、既定エントリ、カーネルパラメータの定義元 |
/etc/grub.d/ |
メニューエントリ生成スクリプト群 |
/etc/default/grub の代表的な項目。
GRUB_TIMEOUT=5 GRUB_DEFAULT=0 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_TIMEOUT はメニュー表示秒数、GRUB_DEFAULT は既定で選択されるエントリ、GRUB_CMDLINE_LINUX_DEFAULT はカーネルに渡す起動パラメータ。
grub.cfg を再生成する
編集後は grub.cfg を再生成して反映する。コマンド名はディストリビューションで異なる。
sudo grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ... Found linux image: /boot/vmlinuz-6.1.0-18-amd64 Found initrd image: /boot/initrd.img-6.1.0-18-amd64 done
Debian / Ubuntu 系には上記をラップした update-grub がある。RHEL / Fedora 系では grub2-mkconfig -o /boot/grub2/grub.cfg を使う。
| ディストリビューション | 再生成コマンド | 出力先 |
|---|---|---|
| Debian / Ubuntu | update-grub または grub-mkconfig -o ... |
/boot/grub/grub.cfg |
| RHEL / Fedora / CentOS | grub2-mkconfig -o ... |
/boot/grub2/grub.cfg |
grub.cfg を直接編集しても、次回 grub-mkconfig 実行時に上書きされて消える。恒久的な変更は必ず /etc/default/grub または /etc/grub.d/ を編集してから再生成する。
systemctl でサービスをどう操作するのか
systemd では systemctl がサービス制御の中心。起動・停止・状態確認・自動起動設定をすべてこのコマンドで行う。
systemd が管理する対象は「ユニット」と呼ばれ、種別ごとに拡張子が異なる。
| ユニット種別 | 拡張子 | 内容 |
|---|---|---|
| サービス | .service |
デーモン・プロセス |
| ターゲット | .target |
ユニットのグループ(旧ランレベル相当) |
| ソケット | .socket |
ソケット起動の待ち受け |
| マウント | .mount |
ファイルシステムのマウント点 |
主要な systemctl サブコマンド
systemctl status sshd systemctl start sshd systemctl stop sshd systemctl restart sshd systemctl enable sshd systemctl disable sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: enabled)
Active: active (running) since Fri 2026-05-30 09:00:00 JST; 2h ago
status の Active: 行が現在の稼働状態、Loaded: 行末の enabled/disabled が自動起動設定。start は今すぐ起動、enable は次回ブート以降の自動起動を設定する。
start と enable は別物。start は即時起動するが再起動後は元に戻り、enable は自動起動を設定するが今すぐは起動しない。両方を同時に行うなら systemctl enable --now sshd を使う。
ブートターゲットとランレベルはどう対応するのか
systemd のブートターゲットは、SysVinit のランレベル(0〜6)を置き換えた概念。試験では両者の対応表が頻出する。
| SysVinit ランレベル | systemd ターゲット | 状態 |
|---|---|---|
| 0 | poweroff.target |
システム停止(電源オフ) |
| 1 | rescue.target |
シングルユーザー(レスキュー) |
| 2, 3, 4 | multi-user.target |
マルチユーザー(CUI) |
| 5 | graphical.target |
マルチユーザー+GUI |
| 6 | reboot.target |
再起動 |
ランレベル 2・3・4 はいずれも multi-user.target に対応する点に注意。GUI 起動が graphical.target(旧ランレベル 5)、CUI 起動が multi-user.target(旧ランレベル 3)と覚えると整理しやすい。
既定ターゲットの確認と変更
systemctl get-default sudo systemctl set-default multi-user.target
graphical.target Removed "/etc/systemd/system/default.target". Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/multi-user.target.
get-default は次回ブート時のターゲットを表示し、set-default でそれを変更する。default.target は実体がシンボリックリンクで、これが指す先が既定ターゲットになる。
実行中にターゲットを切り替える
sudo systemctl isolate multi-user.target runlevel
N 5
isolate は再起動せずに現在のターゲットを切り替える(指定ターゲットに属さないユニットは停止される)。SysVinit 互換の runlevel コマンドは「直前のランレベル」「現在のランレベル」を表示する(上記は直前なし N、現在 5)。
システムを安全に停止・再起動するには
停止・再起動は shutdown コマンドを基本とする。時刻指定と警告メッセージにより、他ユーザーへの影響を抑えられる。
shutdown の時刻指定
sudo shutdown -h now sudo shutdown -r +10 sudo shutdown -h 23:30 sudo shutdown -c
Shutdown scheduled for Fri 2026-05-30 23:30:00 JST, use 'shutdown -c' to cancel.
-h は停止(halt/poweroff)、-r は再起動。時刻は now(即時)、+m(m 分後)、hh:mm(時刻指定)で渡す。shutdown -c は予約された停止をキャンセルする。
関連コマンドの整理
| コマンド | 動作 |
|---|---|
shutdown -h +m |
m 分後に停止(推奨。警告を全ユーザーに通知) |
shutdown -r +m |
m 分後に再起動 |
reboot |
即時再起動(systemctl reboot 相当) |
poweroff |
即時に電源オフ(systemctl poweroff 相当) |
halt |
システム停止(電源オフは伴わない場合がある) |
wall |
ログイン中の全ユーザーへメッセージ送信 |
echo "10分後にメンテナンス再起動します" | wall
shutdown は予約時に自動で wall 相当の警告を送る。手動で任意の通知を送りたい場合は wall を単体で使う。
ブートのトラブルはどこを見るのか
ブートに関する問題は、カーネルメッセージとブートログから切り分ける。dmesg と journalctl が二本柱。
dmesg | less journalctl -k journalctl -b journalctl -b -1
[ 0.000000] Linux version 6.1.0-18-amd64 ... [ 1.234567] EXT4-fs (sda1): mounted filesystem ...
dmesg はカーネルリングバッファ(ハードウェア検出・ドライバのメッセージ)を表示する。journalctl -k はカーネルメッセージのみ、journalctl -b は今回のブート、journalctl -b -1 は前回のブートのログを表示する。直前のブートで失敗した原因を -b -1 で追えるのが systemd の利点。
systemd-analyze を使うとブート所要時間を分析できる。systemd-analyze blame は各サービスの起動にかかった時間を降順で表示し、起動が遅い原因の特定に役立つ。
よくあるミスと対処
実務と試験の両方でつまずきやすいポイントを整理する。
ミス1: ランレベルとターゲットの対応を逆に覚える
ランレベル 5 が graphical.target(GUI)、ランレベル 3 が multi-user.target(CUI)。「数字が大きい 5 が GUI」と方向で覚える。ランレベル 2・3・4 がすべて multi-user.target に集約される点も頻出。
ミス2: grub.cfg を直接編集する
grub.cfg への直接編集は再生成で消える。/etc/default/grub を編集 → grub-mkconfig(または update-grub)で反映が正しい手順。
ミス3: enable と start を混同する
enable は自動起動設定で今すぐは起動せず、start は即時起動で再起動後は戻る。両方なら enable --now。
ミス4: shutdown の時刻指定を誤る
shutdown -h +10 は「10 分後」であって「10 時」ではない。時刻を指定するなら shutdown -h 22:00 の形式を使う。引数なしの shutdown(時刻省略)は環境により +1 相当になり即時停止しないため、即時なら明示的に now を付ける。
ミス5: get-default と isolate を混同する
set-default は次回ブートの既定ターゲットを変える(永続)。isolate は今すぐ切り替えるが永続しない。永続変更と一時変更を区別する。
トラブルシューティング
症状: enable したのに再起動後サービスが起動していない
原因: enable のみ実行し、依存するターゲットに wantedby されていない、または start していないだけで設定自体は正しい
確認:
systemctl is-enabled sshd systemctl status sshd
対処: is-enabled が enabled なら設定は正常。即起動も必要なら systemctl enable --now sshd を使う。disabled なら enable を再実行する。
症状: GUI で起動してしまう(CUI にしたい)
原因: 既定ターゲットが graphical.target になっている
確認:
systemctl get-default
対処: sudo systemctl set-default multi-user.target で CUI を既定にする。今すぐ切り替えるなら sudo systemctl isolate multi-user.target も併用する。
症状: カーネルパラメータを変えたのに反映されない
原因: /etc/default/grub を編集しただけで grub.cfg を再生成していない
確認:
cat /proc/cmdline
対処: sudo grub-mkconfig -o /boot/grub/grub.cfg(Debian系は update-grub、RHEL系は grub2-mkconfig)を実行し再起動する。/proc/cmdline で現在の起動パラメータを照合できる。
作業完了チェックリスト
- [ ] ブートの 4 段階を順に説明できる
- [ ]
/etc/default/grub編集後にgrub-mkconfigで再生成した - [ ]
systemctl enable --nowで自動起動と即起動を区別できた - [ ] ランレベルとターゲットの対応表を答えられる
- [ ]
shutdown -r +10で時刻指定再起動を実行できた - [ ]
journalctl -bでブートログを確認できた
まとめ
| 場面 | コマンド | 目的 |
|---|---|---|
| サービス操作 | systemctl start/enable --now |
起動と自動起動 |
| 状態確認 | systemctl status / is-enabled |
稼働・自動起動の確認 |
| 既定ターゲット | systemctl get-default/set-default |
次回ブートの状態 |
| 一時切替 | systemctl isolate <target> |
再起動せず切り替え |
| GRUB 設定 | /etc/default/grub → grub-mkconfig |
起動オプション変更 |
| 停止・再起動 | shutdown -h/-r |
時刻指定で安全に |
| ログ調査 | dmesg / journalctl -b |
ブート時の問題切り分け |
システム起動と systemd はサーバー運用のすべての起点。ログ管理やプロセス制御と組み合わせると、障害時の切り分け力が一段上がる。