web-dev-qa-db-ja.com

systemctlを使用してサービスを有効にすると、そのサービスはどのランレベルで実行されますか?

私が知る限り、Linuxシステムをブートすると、ランレベルに記載されているサービス(rcX.d)が開始されます。

systemctlコマンドを使用して起動中にサービスを開始できるようにすると、そのサービスはそのデフォルトのランレベルに追加されますか?

4
Shrey Kanna

実際にはそうではありませんが、実行できます:

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     │
└─────────┴───────────────────┘
3
Ravexina

私が知る限り、Linuxシステムをブートすると、ランレベル(rcX.d)に記載されているサービスが開始されます。

これはもう事実ではありません。

systemd initシステムは、実行レベルの概念をネイティブに使用しません。代わりに、依存関係のメカニズムを使用して他のユニットをグループ化する「ターゲット」の概念を導入します。

「デフォルトのランレベル」であったものがdefault.targetユニットになり、アクティブ化(開始)されると、要件依存関係を介して他のユニットを「プルイン」(アクティブ化)できます。

systemddoesは、telinitのようなツールで使用されるrunlevelX.targetのような名前のエイリアスをターゲットに与えるという形で、実行レベルの概念に互換性レイヤーを提供しますが、それはsystemdでは、サービスまたはその他のユニットは、これらの擬似ランレベルに属する必要はありません。)

サービスを有効にする(通常)とは、2つのユニット間に人為的な依存関係を作成することです。

したがって、サービス(または任意のユニット)を有効にすると、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.targetWants=multi-user.target)またはmulti-user.targetのエイリアスです。いずれにしても、multi-user.targetがアクティブになり、上記の依存関係を介してsshd.serviceを取り込みます。

1
intelfx