systemdとターゲット
SysVinit の時代に「ランレベル」と呼ばれていた起動状態は、systemd では「ターゲット」という単位に置き換わりました。101 試験では数字とターゲット名の対応が問われ、特に 3 と 5 の区別、1 と 6 の意味は毎回のように出ます。「調べる」「恒久的に変える」「今すぐ切り替える」が別々のサブコマンドである点も焦点です。
数字とターゲットは一対一ではありません
| ランレベル | ターゲット | 状態 |
|---|---|---|
| 0 | poweroff.target | システム停止 |
| 1 | rescue.target | シングルユーザーモード |
| 2 | multi-user.target | マルチユーザー (Debian 系では 2 も 3 も同じ) |
| 3 | multi-user.target | マルチユーザー、CUI |
| 4 | multi-user.target | 未使用 / 任意 |
| 5 | graphical.target | マルチユーザー、GUI |
| 6 | reboot.target | 再起動 |
2・3・4 はいずれも multi-user.target に対応します。互換のため /lib/systemd/system/runlevel3.target のような symlink が用意されており、ls -l で実体を確かめられます。
このほか default.target は起動時に到達する既定のターゲットへの symlink です。rescue と emergency の差も出ます。rescue は各種ファイルシステムがマウントされ基本サービスも一部動いた状態、emergency は root だけが読み取り専用でマウントされたほぼ何も動いていない状態で、より壊れているときに使うのが emergency です。
set-default は今すぐには効きません
| コマンド | 何をするか |
|---|---|
systemctl get-default | 現在のデフォルトターゲットを表示する |
systemctl set-default graphical.target | 次回以降のデフォルトを変更する |
systemctl isolate multi-user.target | 今すぐそのターゲットへ切り替える (再起動なし) |
systemctl list-units --type=target | 現在アクティブなターゲットを一覧する |
systemctl list-units --type=target --all | 非アクティブも含めて一覧する |
runlevel | 前回と現在のランレベルを互換表示する |
set-default と isolate の違いが最重要です。set-default は /etc/systemd/system/default.target という symlink を張り替えるだけで、今動いている状態は変わりません。効くのは次回の起動からです。対して isolate は今その場で切り替えます。
ターミナル
systemctl get-default
# multi-user.target
ls -l /etc/systemd/system/default.target
# default.target -> /lib/systemd/system/multi-user.targetこの環境で打つと学習環境が落ちます
停止と再起動のコマンドは、書式だけ覚えてください。systemctl poweroff は shutdown -h now や init 0、systemctl reboot は shutdown -r now や init 6 に相当します。
演習ではブラウザ内の仮想マシンが動いているので、poweroff reboot isolate を実行すると環境そのものが落ちて作業が消えます。調べるための get-default と、恒久設定を変える set-default の範囲にとどめてください。
なお shutdown は systemd 環境でも使えます。shutdown -h +10 "メッセージ" で時間指定とログイン中ユーザーへの通知ができ、shutdown -c で予約を取り消せます。この -c は得点源です。
よくある引っかけ
ランレベル 5 を「停止」と答える誤答が典型です。停止は 0、再起動は 6 です。「数字が小さい方が停止」と覚えると混同しにくくなります。
set-default で即座に画面が切り替わると思い込むのも誤りです。切り替わるのは次回の起動からで、今すぐなら isolate です。
systemctl list-units --type=target は既定ではアクティブなユニットしか出しません。「なぜ graphical.target が出ないのか」という問題は --all が答えです。