こんにちは、インフラエンジニアのryuです。
今回は、LPIC-1の101試験で出題されるsystemdとsystemctlを、練習問題で確かめていきます。
systemctl start や systemctl restart は、サービスを動かすときによく打つコマンドだと思います。ただ、試験では起動時のターゲットの変え方や、ランレベルとの対応、enable と start の違いなど、普段はあまり意識しないところまで聞かれます。
この記事では、まず出題範囲を確認し、ターゲットとユニットの基本を整理します。そのあとで練習問題8問を解いてもらいます。
サービスが起動しないときの切り分けは、systemdのサービスが起動しないときの調べ方で解説しています。今回はそちらと分けて、試験で問われる知識に絞ります。
systemdはLPIC-1のどこで出題される?¶
最初に、出題範囲を確認しておきましょう。
systemdがいちばんまとまって出てくるのは、101試験(101-500)の主題101「システムアーキテクチャ」です。中でも次の項目が中心になります。
| 項目 | 内容 | 重み |
|---|---|---|
| 101.2 | システムのブート | 3 |
| 101.3 | ランレベル・ブートターゲットの変更と、システムのシャットダウン・再起動 | 3 |
101.3の主な知識は、既定のランレベルやブートターゲットを設定すること、シングルユーザーモードを含めてランレベルやターゲットを切り替えること、シャットダウンや再起動の前にユーザーへ知らせてプロセスを正しく終了させることです。
対象のファイルやコマンドには、/etc/inittab、shutdown、init、/etc/init.d/、telinit、systemd、systemctl、/etc/systemd/、/usr/lib/systemd/、wall が並んでいます。
古いSysVinitの init や telinit も範囲に残っているので、systemdだけでなく、ランレベルとの対応も押さえておく必要があります。
ターゲットとユニットとは?¶
systemdの問題を解くときに、まず整理しておきたいのがユニットとターゲットの関係です。
systemdは、管理する対象をユニットという単位で扱います。ユニットにはいくつか種類があり、ファイル名の末尾で見分けられます。
| ユニットの種類 | 例 | 何を表すか |
|---|---|---|
| service | sshd.service |
デーモンなどのサービス |
| target | multi-user.target |
ほかのユニットをまとめたグループ |
| timer | logrotate.timer |
定期実行のタイマー |
| mount | home.mount |
ファイルシステムのマウント |
| socket | sshd.socket |
ソケットによる起動 |
この中で、試験で特によく聞かれるのがターゲットです。
ターゲットは、起動時にどのユニットまで動かすかをまとめたグループです。SysVinitのランレベルに近い役割を持っています。
たとえば multi-user.target は、GUIなしで複数のユーザーがログインできる状態です。graphical.target は、そこにGUIのログイン画面を加えた状態で、multi-user.target を含んでいます。
timerユニットについては、cronとsystemd timerの違いで詳しく書いているので、あわせて読んでみてください。
ランレベルとターゲットの対応¶
SysVinitのランレベルとsystemdのターゲットは、次のように対応させて覚えておきましょう。
| ランレベル | 対応するターゲット | 状態 |
|---|---|---|
| 0 | poweroff.target |
電源を切る |
| 1 | rescue.target |
シングルユーザー(レスキュー)モード |
| 3 | multi-user.target |
GUIなしのマルチユーザー |
| 5 | graphical.target |
GUIありのマルチユーザー |
| 6 | reboot.target |
再起動 |
systemdには runlevel3.target や runlevel5.target という互換用の名前もあります。これらは、SysVinitとの互換のために用意されたもので、多くの環境では multi-user.target や graphical.target への別名になっています。
rescue.target とよく比べられるのが emergency.target です。emergency.target はさらに最小限の状態で、メインのコンソールで緊急用のシェルだけが動きます。
ユニットファイルの置き場所¶
ユニットファイルが置かれる場所も、試験に出やすいポイントです。
| ディレクトリ | 中身 |
|---|---|
/usr/lib/systemd/system/ |
パッケージが入れたユニットファイル(ディストリビューションによっては /lib/systemd/system/) |
/run/systemd/system/ |
実行中に作られる一時的なユニットファイル |
/etc/systemd/system/ |
管理者が置く・変更するユニットファイル |
同じ名前のユニットファイルがあるときは、/etc/systemd/system/ が /usr/lib/systemd/system/ より優先されます。 パッケージのファイルを直接書き換えず、/etc 側に置いて上書きするのが基本の考え方です。
ユニットファイルを編集したあとは、systemctl daemon-reload でsystemdに読み込み直させます。これを忘れると、ファイルを直しても古い内容のまま動くことがあります。
既定のターゲットの確認と切り替え¶
ここからは、101.3の中心になるターゲットの操作です。
似た名前のコマンドが多いので、何が変わるのか(今だけか、次の起動からか)で分けて覚えると混乱しにくくなります。
systemctl get-default # 起動時の既定のターゲットを表示する
sudo systemctl set-default multi-user.target # 次の起動から、既定のターゲットを変える
sudo systemctl isolate multi-user.target # 今すぐ、そのターゲットの状態に切り替える
sudo systemctl rescue # 今すぐ、レスキューモードに切り替える
set-default は、/etc/systemd/system/default.target というシンボリックリンクの向き先を変えるコマンドです。今動いている状態はそのままで、次に起動したときから反映されます。
一方の isolate は、指定したターゲットとそれに必要なユニットを起動し、それ以外のユニットを止めます。こちらは今すぐ切り替わりますが、再起動すると既定のターゲットに戻ります。
isolateで切り替えられるのは、ユニットファイルにAllowIsolate=yesが書かれているターゲットだけです。multi-user.targetやrescue.targetなどの主なターゲットには設定されています。
SysVinitの書き方では、今すぐ切り替えるときは init 3 や telinit 3、今のランレベルの確認は runlevel を使います。runlevel は、直前のランレベルと現在のランレベルを並べて表示します。
起動時だけ一時的に別のターゲットで立ち上げたいときは、ブートローダーでカーネルのコマンドラインに systemd.unit=rescue.target のように付け加えます。パスワードを忘れたときの復旧などで使う方法です。
シャットダウンと再起動の書き方¶
101.3には、シャットダウンと再起動も含まれています。shutdown は時間指定とメッセージの送信ができるので、書き方を確認しておきましょう。
sudo shutdown -h +10 "10分後にメンテナンスで停止します" # 10分後に停止し、ログイン中のユーザーにメッセージを送る
sudo shutdown -r now # 今すぐ再起動する
sudo shutdown -c # 予約したシャットダウンを取り消す
wall "これから再起動します" # ログイン中の全ユーザーの端末にメッセージを送る
-h は停止、-r は再起動です。時間は now、+10(10分後)、22:00 のように指定できます。
systemdの環境では、systemctl poweroff や systemctl reboot でも同じように停止・再起動ができます。
enableとstartの違いを手元で確かめよう¶
もう1つ、試験でも実務でも間違えやすいのが、enable と start の違いです。
start は今すぐサービスを起動するだけで、enable は次の起動から自動で起動するように設定するだけです。どちらか一方だけでは、もう片方の効果はありません。
| コマンド | 今すぐ起動する | 次の起動から自動で起動する |
|---|---|---|
systemctl start sshd |
する | しない |
systemctl enable sshd |
しない | する |
systemctl enable --now sshd |
する | する |
systemctl disable sshd |
止めない | しない |
systemctl mask sshd |
起動できなくなる | しない |
enable は、ユニットファイルの [Install] セクションにある WantedBy= を見て、/etc/systemd/system/multi-user.target.wants/ のようなディレクトリにシンボリックリンクを作ります。disable はそのリンクを消します。
mask はさらに強い設定で、ユニットを /dev/null へのシンボリックリンクにします。こうすると、手動の start でも、ほかのユニットからの依存でも起動できなくなります。元に戻すときは unmask です。
今日やる練習:状態を表示するコマンドを打ってみる¶
systemdで動いているLinuxがあれば、次のコマンドを打ってみてください。どれも状態を表示するだけなので、設定は何も変わりません。
systemctl get-default # 既定のターゲットを確認する
ls -l /etc/systemd/system/default.target # default.target のリンク先を確認する
systemctl list-units --type=target # 今動いているターゲットの一覧を見る
systemctl list-unit-files --type=service | head -20 # サービスの有効・無効の一覧を見る
systemctl is-enabled sshd # sshd が自動起動する設定か確認する
systemctl is-active sshd # sshd が今動いているか確認する
list-unit-files の STATE 列には、enabled や disabled のほかに static や masked が出てくることがあります。static は、ユニットファイルに [Install] セクションがなく、単独では enable できないユニットです。ほかのユニットから呼ばれて動きます。
is-enabled と is-active は、それぞれ自動起動の設定と今の状態を表示します。2つの結果が食い違うサービス(有効だけど止まっている、など)を探してみると、enable と start が別物だということがよく分かります。
コンテナの中のLinuxでは、systemdが動いていないことがあります。その場合は systemctl がエラーになるので、仮想マシンなどsystemdで起動しているLinuxで試してください。
LPIC-1のsystemd・systemctlの練習問題8問¶
ここまでの内容を、練習問題で確かめましょう。問題はすべてオリジナルです。答えを選んだら、すぐ下の解説で、ほかの選択肢がなぜ違うのかも確認してください。
問題1:既定のターゲットの確認¶
起動時の既定のターゲットを表示するコマンドはどれですか。
- A.
systemctl get-default - B.
systemctl set-default - C.
systemctl isolate default.target - D.
systemctl list-units --type=service
正解:A
get-defaultは、起動時の既定のターゲットを表示します。set-defaultは既定のターゲットを変更するコマンド、isolateはターゲットに今すぐ切り替えるコマンドです。list-units --type=serviceはサービスのユニットの一覧を表示します。
問題2:次の起動からGUIなしにする¶
次の起動から、GUIなしのマルチユーザーの状態で起動するように設定したいと考えています。正しいコマンドはどれですか。
- A.
systemctl isolate multi-user.target - B.
systemctl set-default multi-user.target - C.
systemctl set-default graphical.target - D.
systemctl enable rescue.target
正解:B 次の起動からの既定のターゲットは
set-defaultで変えます。GUIなしのマルチユーザーはmulti-user.targetです。Aのisolateは今すぐ切り替えるだけで、次の起動には影響しません。Cは GUIありの状態になります。
問題3:ランレベルとターゲットの対応¶
SysVinitのランレベル5に対応するsystemdのターゲットはどれですか。
- A.
multi-user.target - B.
rescue.target - C.
graphical.target - D.
reboot.target
正解:C ランレベル5はGUIありのマルチユーザーで、
graphical.targetに対応します。multi-user.targetはランレベル3、rescue.targetはランレベル1、reboot.targetはランレベル6に対応します。
問題4:今すぐ切り替える¶
再起動せずに、今すぐレスキューモード(シングルユーザーモード)に切り替えるコマンドとして、正しいものはどれですか。
- A.
systemctl set-default rescue.target - B.
systemctl isolate rescue.target - C.
systemctl enable rescue.target - D.
systemctl get-default rescue.target
正解:B
isolateは、指定したターゲットに今すぐ切り替えます。systemctl rescueでも同じように切り替えられます。Aは次の起動からの既定を変えるだけです。Cのenableは自動起動の設定で、Dのget-defaultは既定を表示するだけのコマンドです。
問題5:enableとstart¶
systemctl enable httpd だけを実行しました。このときの httpd の状態として正しいものはどれですか。なお、実行前の httpd は停止しており、自動起動も無効だったとします。
- A. 今すぐ起動し、次の起動からも自動で起動する
- B. 今すぐ起動するが、次の起動からは自動で起動しない
- C. 今は停止したままで、次の起動から自動で起動する
- D. 今は停止したままで、手動でも起動できなくなる
正解:C
enableは自動起動の設定をするだけで、今すぐには起動しません。今すぐ起動もしたいときはsystemctl startを別に実行するか、systemctl enable --nowを使います。Dはmaskしたときの状態です。
問題6:起動できないようにする¶
あるサービスを、手動の systemctl start でも、ほかのユニットからの依存でも起動できないようにしたいと考えています。正しいコマンドはどれですか。
- A.
systemctl stop - B.
systemctl disable - C.
systemctl mask - D.
systemctl daemon-reload
正解:C
maskはユニットを/dev/nullへのシンボリックリンクにして、どの方法でも起動できなくします。stopは今動いているサービスを止めるだけ、disableは自動起動をやめるだけで、どちらも手動では起動できます。daemon-reloadはユニットファイルを読み込み直すコマンドです。
問題7:ユニットファイルの優先順位¶
sshd.service というユニットファイルが、/usr/lib/systemd/system/ と /etc/systemd/system/ の両方にあります。systemdが使うのはどちらですか。
- A.
/usr/lib/systemd/system/sshd.service - B.
/etc/systemd/system/sshd.service - C. 2つのファイルの内容を行ごとにまとめたもの
- D. 名前が重なるので、どちらも読み込まれない
正解:B 同じ名前のユニットファイルがあるときは、
/etc/systemd/system/のほうが優先されます。パッケージが入れた/usr/lib/systemd/system/のファイルは書き換えず、管理者は/etc側で設定を変えます。
問題8:シャットダウンの予約¶
ログイン中のユーザーにメッセージを送ったうえで、10分後にシステムを停止したいと考えています。正しいコマンドはどれですか。
- A.
shutdown -r now "メンテナンスで停止します" - B.
shutdown -h +10 "メンテナンスで停止します" - C.
shutdown -c +10 "メンテナンスで停止します" - D.
wall -h +10 "メンテナンスで停止します"
正解:B
-hは停止、+10は10分後の指定です。メッセージを付けると、ログイン中のユーザーに送られます。Aは今すぐ再起動、Cの-cは予約したシャットダウンを取り消すオプションです。wallはメッセージを送るコマンドで、停止の予約はできません。
8問のうち、何問正解できたでしょうか。迷った問題は、今日の練習のコマンドを打って、実際の表示と照らし合わせてみてください。
InfraAcademyで、LPIC-1の練習を続ける¶
systemdの問題は、コマンドの名前が似ているので、問題文だけで覚えようとすると混ざりやすい分野です。実際に get-default を打ってリンク先を見たり、is-enabled と is-active の結果を比べたりすると、違いがはっきりします。
InfraAcademyでは、ブラウザ上で動くLinuxの練習環境で、ファイルの確認やシンボリックリンクの操作などの基本を自分のPCを用意せずに試せます。systemctlで実際にターゲットを切り替える練習は、systemdで起動している仮想マシンなどで行ってください。
問題演習は、トップページのInfraAcademy の資格模擬問題から「(無料)LPICの練習問題で毎日トレーニング300問」を解いてみてください。systemdの問題を間違えたら、選択肢に出てきたサブコマンドを1つずつ手元で打って、何が表示されるかを確かめると次に迷いにくくなります。
同じ101試験の範囲では、プロセス管理(ps・kill・ジョブ制御・nice)の練習問題や、ファイルシステムとマウントの練習問題も用意しています。手を動かす課題をまとめてやりたい人は、LPIC-1のハンズオン課題に進んでみてください。
学ぶ順番はLinuxの学習ロードマップ、LPICの勉強全体の進め方はLPICの勉強方法にまとめています。
まとめ¶
LPIC-1のsystemd・systemctlで押さえておきたいポイントを振り返ります。
- 中心になるのは101試験の101.3(重み3)。
init・telinit・runlevelなどSysVinitの書き方も範囲に残っている - ランレベル1・3・5・0・6は、
rescue・multi-user・graphical・poweroff・rebootのターゲットに対応する set-defaultは次の起動から、isolateは今すぐ切り替える。違いは「いつ反映されるか」startは今すぐ起動、enableは自動起動の設定。maskはどの方法でも起動できなくする- 同じ名前のユニットファイルは
/etc/systemd/system/が優先され、編集後はdaemon-reloadが必要
似たサブコマンドが多い分野ですが、「今だけか、次の起動からか」で分けて考えると、問題文を読んだときに選択肢を絞りやすくなります。今日の練習のコマンドを一度打っておけば、試験本番でも画面の様子が思い浮かぶはずですよ。
参考¶
- 101.3 Change runlevels / boot targets and shutdown or reboot system(LPI Learning Materials)
- 101.3 Lesson 1(LPI Learning Materials)
- Exam 101 Objectives(Linux Professional Institute)
- systemctl(systemd マニュアル, freedesktop.org)
- systemd.special(systemd マニュアル, freedesktop.org)
- systemd.unit(systemd マニュアル, freedesktop.org)
- shutdown(systemd マニュアル, freedesktop.org)



