私が知る限り、Linuxシステムをブートすると、ランレベルに記載されているサービス(rcX.d
)が開始されます。
systemctl
コマンドを使用して起動中にサービスを開始できるようにすると、そのサービスはそのデフォルトのランレベルに追加されますか?
実際にはそうではありませんが、実行できます:
systemctl show -p WantedBy service-name
どのターゲットで実行されるかを見つけるには、例えば:
systemctl show -p WantedBy tlp.service
WantedBy=multi-user.target
これは、tlp
を有効にすると、multi-user.target
に入ると開始されることを示しています。
また、実行レベルは非推奨であり、systemdは代わりにtargetを使用することに言及する価値があります。
┌─────────┬───────────────────┐
│Runlevel │ Target │
├─────────┼───────────────────┤
│0 │ poweroff.target │
├─────────┼───────────────────┤
│1 │ rescue.target │
├─────────┼───────────────────┤
│2, 3, 4 │ multi-user.target │
├─────────┼───────────────────┤
│5 │ graphical.target │
├─────────┼───────────────────┤
│6 │ reboot.target │
└─────────┴───────────────────┘
私が知る限り、Linuxシステムをブートすると、ランレベル(rcX.d)に記載されているサービスが開始されます。
systemd
initシステムは、実行レベルの概念をネイティブに使用しません。代わりに、依存関係のメカニズムを使用して他のユニットをグループ化する「ターゲット」の概念を導入します。
「デフォルトのランレベル」であったものがdefault.target
ユニットになり、アクティブ化(開始)されると、要件依存関係を介して他のユニットを「プルイン」(アクティブ化)できます。
(systemd
doesは、telinit
のようなツールで使用されるrunlevelX.target
のような名前のエイリアスをターゲットに与えるという形で、実行レベルの概念に互換性レイヤーを提供しますが、それはsystemdでは、サービスまたはその他のユニットは、これらの擬似ランレベルに属する必要はありません。)
したがって、サービス(または任意のユニット)を有効にすると、systemdはそのユニットの[Install]
セクションを見て、そこで指定されたアクションを実行します。たとえば、私のマシンでsshd.service
を見てみましょう:
# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH Daemon
Wants=sshdgenkeys.service
After=sshdgenkeys.service
After=network.target
[Service]
ExecStart=/usr/bin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
[Install]
WantedBy=multi-user.target
# This service file runs an SSH daemon that forks for each incoming connection.
# If you prefer to spawn on-demand daemons, use sshd.socket and [email protected].
systemctl enable sshd.service
を記述すると、systemdはこのユニットを見て、Wants=
ディレクティブに従ってmulti-user.target
からsshd.service
へのWantedBy=multi-user.target
依存関係を追加します。
(この依存関係は、/etc/systemd/system/multi-user.target.wants
から/usr/lib/systemd/system/sshd.service
へのシンボリックリンクとして物理的に保存されます。)
起動すると、default.target
がアクティブ化され、依存関係を介して他のすべてのものが取り込まれます。これは「初期トランザクション」と呼ばれ、それだけです。
default.target
は、おそらくgraphical.target
(Wants=multi-user.target
)またはmulti-user.target
のエイリアスです。いずれにしても、multi-user.target
がアクティブになり、上記の依存関係を介してsshd.service
を取り込みます。