LinuCレベル2 201試験の出題範囲「2.01.2 システム起動のカスタマイズ」の技術的内容についての解説をまとめました。
重要度 3 概要 さまざまなターゲットのシステムサービスの動作を照会および変更する。systemd と Linux のブートプロセスについての十分な理解が必要である。これには、systemd ターゲットの操作も含まれる。 詳細 systemd/usr/lib/systemd/, /etc/systemd/, /run/systemd/, systemctl, systemd-deltasystemctl status,systemctl list-units,systemctl start/stop,systemctl enable/disable,systemctl mask/unmasksystemd のrescue モードと emergency モード。

SysVinitの概要
SysVinitは、初めにinitプロセスを開始します。initプロセスは、/etc/inittabに記述されたプロセスを順に起動します。
SysVinitは前のプロセスの終了を待って次のプロセスを起動する事から、いずれかのプロセスの終了までに時間がかかると後続のプロセス全てが遅れることとなり、結果として最終的な起動までに時間がかかるという問題(デメリット)がありました。
現在ではこの問題を改善した、Upstartやsystemdといった新しい仕組みが採用されることが多くなっています。
Red Hat Enterprise Linux 9.6ではSysVinitの新しい仕組み、systemdが使われているため、/etc/inittabファイルを参照すると以下のように記載されています。
[root@RHEL96 ~]# cat /etc/inittab
# inittab is no longer used.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
Upstartの概要
UpstartはSysVinitの新しいシステムです。SysVinitとの違いは、イベント駆動型である点です。
Upstartではイベントをトリガーとしてジョブを起動し、プロセスが起動させます。
systemdの概要
systemdはUpstartより新しい、Linux OSのシステムとサービスを管理するデーモンです。デーモンの詳細は以下でまとめています。
詳細はsuseのドキュメントで詳しく内容を確認できます。
systemdは、Linuxオペレーティングシステムのシステムおよびサービスマネージャです。

initの概要
initはOS起動時に最初に起動されるプロセスで、PID(プロセス ID)は必ず 1 になります。
initは他のすべてのプロセスの親となるプロセスで、SysVinitとも呼ばれ、1970年代から使われています。
SysVinitは、SysVinit ⇒ Upstart ⇒ systemdの順に新しい仕組みとなっています。本質的にはこれらの仕組みはすべてinitを最初に起動する仕組みになっています。
SysVinitを使用するシステムの場合、設定ファイル /etc/inittab の記述に基づいて、自動起動するべきプロセスを立ちあげるなど、アプリケーションレベルの初期化を行います。
以降、init プロセスは全てのプロセスの親プロセスとして起動し続けます。
Upstartやsystemdでは、「/etc/inittab」ファイルは使用されません。
systemctlコマンド
systemdは、systemctlコマンドで操作を行います。
systemctlは、initシステムを制御する中央管理ツールです。systemdシステムおよびサービスマネージャの状態を調べ、制御するために使用されます。

サブコマンドを含めた、systemctlコマンドの使い方を表にまとめました。
| コマンド | 説明 |
|---|---|
| systemctl start <ユニット(サービス等)> | ユニット(サービス等)を開始 |
| systemctl stop <ユニット(サービス等)> | ユニット(サービス等)を停止 |
| systemctl status <ユニット(サービス等)> | ユニット(サービス等)の状態を表示 |
| systemctl enable <ユニット(サービス等)> | ユニット(サービス等)の自動起動の有効化 |
| systemctl disable <ユニット(サービス等)> | ユニット(サービス等)の自動起動の無効化 |
| systemctl mask <ユニット(サービス等)> | ユニット(サービス等)の無効化(マスク) |
| systemctl unmask <ユニット(サービス等)> | ユニット(サービス等)の有効化(アンマスク) |
| systemctl get-default | デフォルトターゲットの名前を表示 |
| systemctl set-default <ターゲット名> | デフォルトターゲットを設定 |
| systemctl list-units | ユニット(サービス等)の一覧を表示する –type=service サービスユニットを表示 –type=target ターゲットユニットを表示 |
| systemctl isolate | 他のユニットを停止して対象のユニットを起動 |
ターゲットとランレベル
Linuxは起動時に.targetファイルによってGUIで起動する、CUIで起動するなどを決定しています。各ランレベルによってCUI、GUIが決まり、ランレベルごとにターゲットが決まっています。
ブートプロセスは、特定のターゲットユニットの実行順に並列化されます。
systemdは、/etc/systemd/system/default.targetファイルを使用して、Linuxシステムをブートするターゲットを判断します。このファイルは、グラフィカルログインマネージャをブートするgraphical.targetへのリンクになっています。systemdは、default.targetの依存関係であるすべてのターゲットユニットを有効にし、さらにこれらの依存関係の依存関係すべてを再帰的に有効にします。すべてのサービスが開始されると、システムの使用準備が整い、ログインマネージャが表示されます。これで、システムにログインして、システムの使用を開始できるようになります。

systemdでは、システムが起動する際、デフォルトでは「default.target」というターゲットが起動されます。「default.target」はSysVinitでのデフォルトのランレベルに相当します。
| ランレベル | ターゲット |
|---|---|
| 0 | poweroff.target |
| 1 | rescue.target |
| 2~4 | multi-user.target |
| 5 | graphical.target |
| 6 | reboot.target |
以下のsystemctl set-default <ターゲット名>コマンドで、起動時のターゲットを変更することでGUI、CUIなどでの操作を決めるランレベルを設定します。
systemctl set-default <ターゲット名>
現在設定されているターゲットについては以下のコマンドで行います。
systemctl get-default
たとえば、Red Hat Enterprise Linux 9.6でターゲットとランレベルを確認すると以下のようになります。
[root@RHEL96 ~]# systemctl get-default
graphical.target
[root@RHEL96 ~]# runlevel
N 5
ユニットやターゲットファイルの格納場所
systemctlコマンドで起動するユニット(サービス)や、起動時のターゲットに関するファイルは以下の場所に保存されています。
/usr/lib/systemd/system
Red Hat Enterprise Linux 9.6(RHEL9.6)で実際に確認してみます。

上図のように、ターゲットファイルとユニットファイル(サービスに関するファイル)が保存されています。

