Red Hat Certified System Administrator (RHCSA) #4: 起動とシステム: systemd、target、GRUB2、password recovery

読了 9分

#3 シェルスクリプト で条件文と繰り返しによる作業の自動化ツールを固めたなら、今回はシステムそのものを扱う領域に入ります。RHEL システムが起動してサービスが立ち上がるまでの流れ、つまり 起動と systemd です。RHCSA でこの領域は出題頻度が非常に高く、特に root パスワードの復旧 はほぼ毎回の試験に登場する定番の作業です。

この記事では systemd が何であり systemctl でサービスをどう制御するのか、起動 target をどう変えるのか、GRUB2 でカーネルパラメータをどう編集するのか、そして root パスワードを忘れたときにどう復旧するのかを、コマンド単位で整理します。RHEL 実務トラックの systemd 編 で概念を掴んだなら、この記事はその作業を試験形式で手に覚え直す場です。

systemd とは何か #

systemd は RHEL 7 から標準になった init システムであり、サービスマネージャー です。カーネルが起動を終えると PID 1 として systemd が真っ先に立ち上がり、その後のすべてのサービスを systemd が起動し、止め、監視します。かつての SysVinit のスクリプト方式とは異なり、systemd はサービスを unit という単位で宣言的に管理し、依存関係に従って並列に立ち上げます。

systemd の核心となる概念は次の 2 つです。

  • unit。systemd が管理する対象の単位です。サービス、マウント、ソケット、target などがすべて unit です。
  • target。複数の unit を束ねたグループです。システムが到達すべき状態 (例: マルチユーザーコンソール、グラフィカルデスクトップ) を表します。

unit の種類 #

unit は拡張子で種類を区別します。RHCSA でよく目にする種類は次のとおりです。

拡張子種類説明
.serviceサービスデーモン (sshd、httpd など) を定義
.targettargetunit のグループ。起動状態を表す
.mountマウントファイルシステムのマウントを定義
.socketソケットソケットベースのアクティベーションを定義
.timerタイマーcron を置き換える予約実行

unit ファイルは 2 か所に置かれます。パッケージがインストールした既定の unit は /usr/lib/systemd/system/ に、管理者が修正または追加した unit は /etc/systemd/system/ にあります。同じ名前であれば /etc/ 側が優先 されます。

systemctl でサービスを制御する #

systemctl は systemd を操作する単一のコマンドです。RHCSA で最も確実に覚えておくべきコマンドなので、動作別に整理します。

開始、停止、再起動 #

# サービスを開始
sudo systemctl start sshd

# サービスを停止
sudo systemctl stop sshd

# サービスを再起動
sudo systemctl restart sshd

# 設定だけを読み直す (対応するサービスに限る)
sudo systemctl reload sshd

サービス名の後ろの .service は省略できます。systemctl start sshdsystemctl start sshd.service は同じように動作します。

起動時の自動開始の有無 #

start と enable の違いは RHCSA の核心となる落とし穴です。start は今すぐ開始 することであり、enable は起動のたびに自動で開始 されるよう登録することです。両者は別物なので、start だけして enable を忘れると再起動後にサービスが消えて失点します。

# 起動時の自動開始を登録
sudo systemctl enable sshd

# 自動開始を解除
sudo systemctl disable sshd

# 今すぐ開始 + 自動開始の登録を一度に
sudo systemctl enable --now httpd

enable --now は enable と start を同時に行います。試験で「サービスを開始し、起動時にも動作するようにせよ」という問題が出たら、この 1 行が最も安全です。

状態の確認 #

# サービスの状態を詳しく見る
systemctl status sshd

# 実行中かどうかだけを確認 (active/inactive)
systemctl is-active sshd

# 自動開始の登録の有無を確認 (enabled/disabled)
systemctl is-enabled sshd

systemctl status の出力では 2 つの行に注目します。Loaded: 行の enabled/disabled は起動時の自動開始の有無であり、Active: 行の active (running)/inactive (dead) は現在の実行状態です。

mask でサービスを完全に遮断 #

disable は自動開始を止めるだけで、別のサービスが依存関係で起こしたり手動の start は依然として可能です。そもそも開始自体を止めるには mask を使います。mask は unit を /dev/null へシンボリックリンクし、どんな方法でも起動されないようにします。

# サービスを完全に遮断
sudo systemctl mask firewalld

# 遮断を解除
sudo systemctl unmask firewalld

masked の状態では start を試みても拒否されます。遮断を解くには必ず先に unmask する必要があります。

起動 target #

target はシステムが到達する状態を束ねた unit です。かつての SysVinit の runlevel を置き換えるもので、RHCSA でよく扱う target は次の 2 つです。

targetかつての runlevel説明
multi-user.target3テキストコンソール、ネットワークを含む。サーバーの標準
graphical.target5multi-user にグラフィカルデスクトップを追加

このほか rescue.target (シングルユーザー復旧) と emergency.target (最小環境) も復旧の場面で使われます。

既定 target の確認と変更 #

# 現在の既定 target を確認
systemctl get-default

# 既定 target をマルチユーザー (テキスト) に変更
sudo systemctl set-default multi-user.target

# 既定 target をグラフィカルに変更
sudo systemctl set-default graphical.target

set-default は次回の起動から適用される永続的な設定です。「起動時にグラフィックなしでテキストモードで立ち上がるようにせよ」という問題は set-default multi-user.target で解決します。

今すぐ target を切り替える #

再起動なしで現在実行中のシステムの状態だけを変えるには isolate を使います。

# 今すぐマルチユーザーモードに切り替え
sudo systemctl isolate multi-user.target

# 今すぐグラフィカルモードに切り替え
sudo systemctl isolate graphical.target

set-default は次回の起動に、isolate は今すぐ適用されるという違いを区別します。永続的な変更を望むなら set-default を、一時的な確認を望むなら isolate を使います。

systemctl でサービスを分析する #

運用とトラブルシューティングでは、どの unit が立ち上がっていて何に依存するのかを読まなければなりません。

# ロードされた unit の一覧
systemctl list-units

# サービスタイプのみ、失敗したものも含む
systemctl list-units --type=service --all

# 失敗した unit だけを抽出
systemctl --failed

# インストールされたすべての unit ファイルと自動開始の状態
systemctl list-unit-files

systemctl --failed は起動後に何が立ち上がれなかったかを一目で見せてくれ、問題のサービスを素早く見つける出発点になります。

依存関係を追跡する #

# 特定の target が引き込む unit のツリー
systemctl list-dependencies graphical.target

# 特定のサービスが依存する対象
systemctl list-dependencies sshd

list-dependencies は target がどのサービスを束ねているか、サービスが何を必要とするかをツリーで見せます。graphical.target が multi-user.target を含む構造も、このコマンドで確認できます。

GRUB2 ブートローダー #

GRUB2 は RHEL のブートローダーです。カーネルをメモリに載せてカーネルパラメータを渡す役割を担い、RHCSA では 起動時にカーネルパラメータを一時的に編集 する作業がパスワードの復旧に直結するため重要です。

起動時の一時編集 #

システムが起動するときに GRUB2 メニューが出たら、起動する項目にカーソルを合わせて e を押します。すると、その項目の起動設定を編集できます。linux で始まる行を探してカーネルパラメータを追加または修正したあと Ctrl+x で起動すると、その一度の起動にだけ適用 されます。再起動すると元に戻るので、安全に試せます。

この一時編集が root パスワード復旧の核心です。linux 行の末尾に rd.break を追加して起動すると、root シェルに落ちます。

永続的な変更 #

カーネルパラメータを永続的に変えるには、/etc/default/grub を修正したあと設定を再生成します。

# /etc/default/grub を編集したあと設定を生成
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

RHEL 9 では grubby コマンドで個別のパラメータだけを手軽に追加する方法もあります。

# すべてのカーネルにパラメータを追加
sudo grubby --update-kernel=ALL --args="quiet"

# パラメータを削除
sudo grubby --update-kernel=ALL --remove-args="quiet"

root パスワードの復旧 (最頻出) #

RHCSA でほぼ毎回出る作業です。root パスワードがわからないときに rd.break で初期 RAM ディスクの段階で止めたあと、ルートファイルシステムを再び書き込み可能にマウントしてパスワードを変える手順です。順番を丸ごと覚えておくのが最も速いです。

ステップ 1: rd.break で起動 #

  1. システムを再起動し、GRUB2 メニューで起動項目にカーソルを合わせて e を押します。
  2. linux で始まる行を探し、末尾に rd.break を追加します。
  3. Ctrl+x で起動すると、switch_root プロンプトが出る root シェルに落ちます。

ステップ 2: ルートファイルシステムを再マウント #

この段階で実際のルートは /sysroot に読み取り専用でマウントされています。パスワードを変えるには、書き込み可能に再マウントする必要があります。

# /sysroot を読み取り/書き込みで再マウント
mount -o remount,rw /sysroot

# 実際のルートへ chroot
chroot /sysroot

ステップ 3: パスワードの変更 #

# root パスワードを変更
passwd root

ステップ 4: SELinux relabel を予約 #

ここが最も多く抜け落ちる段階です。/etc/shadow がパスワードの変更で修正されたので、SELinux コンテキストがずれている可能性があります。次回の起動で全体の relabel を実行 するよう予約ファイルを作ります。

# 次回の起動時に全体の relabel を予約
touch /.autorelabel

このファイルを作らないと SELinux コンテキストがずれてログインできなかったり起動が止まったりすることがあります。必ず実行します。

ステップ 5: 抜け出して再起動 #

# chroot を終了
exit

# switch_root シェルを終了 (起動を再開)
exit

2 つ目の exit で起動が再開されると、/.autorelabel が全体の relabel を実行します。relabel はシステムの規模に応じて数分かかり、終わると自動でもう一度再起動します。そのあと新しいパスワードで root ログインができます。

relabel を待ちたくなければ、chroot の中で /.autorelabel の代わりに restorecon -v /etc/shadow でそのファイルだけコンテキストを復旧する方法もあります。ただし安全にいくなら /.autorelabel を推奨します。

試験ポイント #

  • start と enable は別物 です。今すぐの開始は start、起動時の自動開始は enable であり、両方とも必要なら enable --now を使います。
  • mask は disable より強力 です。disable は自動開始だけを止め、mask は手動の start と依存関係による開始まですべて遮断します。
  • set-default と isolate を区別 します。起動の既定値の変更は set-default (永続)、今すぐの切り替えは isolate (一時) です。
  • 起動時の e 編集は一時的な適用 です。一度の起動にだけ反映され、再起動すると消えるので復旧作業に安全です。
  • root パスワード復旧の順番 を丸ごと覚えます。rd.break の追加 → mount -o remount,rw /sysrootchroot /sysrootpasswd roottouch /.autorelabelexit を 2 回です。
  • /.autorelabel を絶対に抜かしません。 この段階を忘れて SELinux のせいでログインが止まるのは RHCSA の定番の失点です。

まとめ #

この記事で押さえたこと:

  • systemd は PID 1 の init であり、サービスマネージャー です。すべての対象を unit で扱い、target でグループ化します。
  • systemctl の核心となる動作。start/stop/restart、enable/disable、status、mask を動作別に区別して身につけました。
  • 起動 target。multi-user と graphical を get-default・set-default で永続的に変更し、isolate で即時に切り替えます。
  • サービスの分析。list-units、–failed、list-dependencies で何が立ち上がっていて何に依存するのかを読みます。
  • GRUB2。起動時に e でカーネルパラメータを一時編集し、grub2-mkconfig・grubby で永続的に反映します。
  • root パスワードの復旧。rd.break から /.autorelabel まで順番を丸ごと覚えておくのが最善です。

次へ: ローカル storage 1 #

起動と systemd でシステム運用の土台を固めました。ここから RHCSA で作業数が最も多く合格を分ける領域、ストレージに入ります。

#5 ローカル storage 1: パーティション、swap、LVM の基礎 では、ディスクにパーティションを作り、swap 領域を追加し、LVM の physical volume・volume group・logical volume の概念を直接作ってみながら整理します。

X