InfraAcademy

InfraAcademy Blog

既定のターゲットはどう変える?LPIC-1のsystemd・systemctlを、ターゲットとユニットの練習問題8問で整理する

著者: ryu | #Linux #LPIC #systemd
Linuxをブラウザで試してみる

Linux・ネットワーク・AWSを、環境構築なしで実践学習できます

この記事を共有

こんにちは、インフラエンジニアの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 が必要

似たサブコマンドが多い分野ですが、「今だけか、次の起動からか」で分けて考えると、問題文を読んだときに選択肢を絞りやすくなります。今日の練習のコマンドを一度打っておけば、試験本番でも画面の様子が思い浮かぶはずですよ。

参考

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

株式会社InfraAcademy 代表 / エンジニア

大手メーカーでインフラエンジニアとして勤務した後、ベンチャー企業・スタートアップでフルスタックエンジニアを経験。その後、起業し学習サービス「InfraAcademy」を運営しています。
保有資格:ネットワークスペシャリストなど 運営会社:株式会社InfraAcademy

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る