LPIC Level1 復習ラジオ 03:Linuxの起動とsystemd
音声
目次
カーネルの次に起動するもの
ブートローダーによってLinuxカーネルが読み込まれると、カーネルはCPU、メモリ、デバイスなどを初期化します。
その後、カーネルはユーザー空間で最初に動くプロセスを起動します。この最初のプロセスには、通常PID 1が割り当てられます。
PIDは、Process IDの略です。Linuxが各プロセスを識別するために使用する番号です。
現在の多くのLinuxディストリビューションでは、PID 1としてsystemdが起動します。
ブートローダー → Linuxカーネル → PID 1のプロセス → 各種サービス
initとsystemd
initとは
initは、initializationに由来する名前です。LinuxやUnix系OSで、システムの初期化を担当する仕組みや、最初に起動するプロセスを指す言葉として使われます。
従来はSysVinitなどが広く利用され、起動時にシェルスクリプトを一定の順序で実行してサービスを開始していました。
systemdとは
systemdは、Linux向けのシステムおよびサービスマネージャーです。
PID 1として動作する場合はinitシステムとして働き、ユーザー空間のサービスを起動し、その状態を管理します。
systemdは、サービスだけでなく、ソケット、マウント、タイマー、デバイス、起動目標などをunitという共通の単位で管理します。
unitとは
systemdが管理する対象をunitと呼びます。
unitの設定ファイルには、対象の種類に応じた拡張子が付きます。
| unitの種類 | 主な役割 | 例 |
|---|---|---|
.service |
サービスやデーモンを管理する | sshd.service |
.target |
複数のunitをまとめ、起動目標を表す | multi-user.target |
.socket |
通信ソケットを管理する | cups.socket |
.mount |
ファイルシステムのマウントを管理する | home.mount |
.timer |
決められた時刻や間隔で処理を起動する | example.timer |
サービスはsystemdが管理する対象の一つであり、すべてのunitがサービスというわけではありません。
targetとは
targetは、複数のunitをひとまとめにし、システムの起動状態や到達目標を表すunitです。
従来のSysVinitで使用されていたランレベルに近い役割を持ちますが、完全に同じ仕組みではありません。
| target | 概要 |
|---|---|
rescue.target |
保守作業向けの限定的な状態 |
multi-user.target |
複数ユーザーが利用できる、主に文字ベースの状態 |
graphical.target |
GUIを含む通常の利用状態 |
reboot.target |
再起動を行うための目標 |
poweroff.target |
電源停止を行うための目標 |
既定のtargetを確認する
systemctl get-default
既定のtargetを変更する
sudo systemctl set-default multi-user.target
get-defaultは既定の起動targetを表示し、set-defaultは次回以降の起動で使用する既定targetを設定します。
systemctlによるサービス管理
systemctlは、systemdの状態を確認し、systemdが管理するunitを操作するコマンドです。
基本構文は次のとおりです。
systemctl コマンド unit名
例として、SSHサーバーのunit名をsshd.serviceとします。ディストリビューションによってはssh.serviceなど、名前が異なる場合があります。
| 操作 | コマンド例 |
|---|---|
| 状態を確認する | systemctl status sshd.service |
| 起動する | sudo systemctl start sshd.service |
| 停止する | sudo systemctl stop sshd.service |
| 再起動する | sudo systemctl restart sshd.service |
| 設定を再読み込みさせる | sudo systemctl reload sshd.service |
reloadに対応していないサービスもあります。その場合は、設定反映にrestartが必要になることがあります。
startとenableの違い
startとenableは意味が異なります。
start
sudo systemctl start sshd.service
現在の起動中システムで、そのサービスを開始します。これだけでは、次回のOS起動時に自動起動するとは限りません。
enable
sudo systemctl enable sshd.service
次回以降、必要なtargetなどに合わせて自動起動できるように設定します。これだけでは、現在停止中のサービスが直ちに起動するとは限りません。
自動起動を設定し、同時に今すぐ起動する
sudo systemctl enable --now sshd.service
自動起動を解除する
sudo systemctl disable sshd.service
journalとjournalctl
systemd-journaldは、カーネルや各種サービスなどからログを収集し、journalとして保存するサービスです。
journalctlは、journalに保存されたログを表示・検索するコマンドです。
ログを表示する
journalctl
引数を付けずに実行すると、閲覧権限のあるjournalの内容を古いものから表示します。
特定のunitのログを表示する
journalctl -u sshd.service
-uは、指定したunitに関係するログへ絞り込むために使います。
今回の起動以降のログを表示する
journalctl -b
新しいログを継続して表示する
journalctl -f
-fは、新しく追加されるログを追跡して表示します。
末尾付近を表示する
journalctl -e
サービスが起動しない場合は、systemctl statusで状態を確認し、journalctl -uで詳しいログを見る、という流れが基本です。
起動状態を確認する流れ
例えばSSHサービスが動作しているかを確認する場合、次の順番で整理できます。
-
unitの状態を確認する
systemctl status sshd.service -
現在動作中かだけを確認する
systemctl is-active sshd.service -
自動起動が設定されているか確認する
systemctl is-enabled sshd.service -
unitに関するログを確認する
journalctl -u sshd.service
activeとenabledは別の状態です。現在動いていても自動起動が無効な場合や、逆に自動起動が有効でも現在は停止している場合があります。
30秒チェック
- Linuxカーネルの後に起動する最初のユーザー空間プロセスには、通常何番のPIDが割り当てられるでしょうか。
- systemdが管理する対象をまとめて何と呼ぶでしょうか。
systemctl startとsystemctl enableの違いは何でしょうか。- 特定のunitのjournalを表示するには、どのコマンドを使うでしょうか。
答えを表示
- PID 1
- unit
- startは現在のシステムで起動し、enableは起動時に自動起動する設定を行う
journalctl -u unit名
要約
- カーネルは、通常PID 1のプロセスを最初のユーザー空間プロセスとして起動します。
- 現在の多くのLinuxでは、systemdがinitシステムとして動作します。
- systemdは、サービスやtargetなどをunitとして管理します。
- targetは、複数のunitをまとめた起動目標です。
systemctlはsystemdとunitの状態確認・操作に使います。startは現在の起動、enableは自動起動の設定です。journalctlはjournalに保存されたログの表示・検索に使います。