systemd の /etc/systemd/systemにファイルがいっぱい初期設定されています。
ここには、「別名」で登録したユニットファイル<も>配置されます。
ユニットの別名とは?
たとえば、ssh.service とsshd.service がある。
これらは、どちらも同じことを意味している。
ssh.serviceを見ても
takuya@:system$ sudo systemctl status ssh.service ssh.service ● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2022-01-09 23:26:53 JST; 18min ago
sshd.serviceを見ても
takuya@:system$ sudo systemctl status sshd.service ● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2022-01-09 23:26:53 JST; 18min takuya@:system$ sudo systemctl status
これら、2つの別名は単なる名前の違いでしかなく、実際のサービスは同じものを指しています。
これをエイリアス(別名)と呼びます。
別名はリンクファイルでしかない。
sshd.service は /etc/systemd/system に定義された「別名」でしかない。
エイリアス(別名)を変更してみる
sshd という別名を、好きな名前に変更することができる。
cd /etc/systemd/system sudo mv sshd.service ssh-server.sevice sudo systemctl daemon-reload
これで、ssh-server.serivice で別名の名前を変更できる
変更結果の確認。
もともとあったAlias名=sshd.serviceではアクセスができなくなります。
$ sudo systemctl status sshd.service Unit sshd.service could not be found.
変更後は、自分で決めた別名でアクセスできる。
$ sudo systemctl status ssh-server.service ● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2022-01-09 23:26:53 JST; 24min ago
このように、別名の実際は、単なるリンク・ファイル名がサービス名称として機能しています。
では、この別名ファイルはどこのタイミングで生成されるのでしょうか。
ユニットファイルのAlias定義
systemdのユニットファイルにはAliasという記載があって
$ cat ssh.service [Unit] Description=OpenBSD Secure Shell server (略) [Install] WantedBy=multi-user.target Alias=sshd.service
Alias=sshd.service と記載されているのです。しかし、Alias(別名)はインストール時に使われるだけで、実際には、/etc/systemd/systemに作ったファイル名が「サービス名称」として認識されます。Alias記述は、「インストール時に/etc/systemd/systemにリンクを作成しろ」という命令でしかありません。
ユニットファイルより、実際にリンク名のほうが優先
Aliasはインストール時に使われるので、その後、そのファイルがどこに配置されて、どのような名前になっているのか一切わからないのです。
別名はめんどくさい。
systemctl を使っていると「同じサービス」が「違う名前」出てくるんだけど、単なる別名でリンクが貼り付けられていると考えたら良さそうです。
ほんとうに、systemdは面倒な子です。
ユニットファイルのAlias記述を見ても実際のサービス名称が保証されない管理機構なので、ユニットファイルに完全に信頼できない。と考えるとちょっと空恐ろしい気がします。
定義ファイルに記載した名前より、実際のリンクファイルのファイル名を優先している現状は、意図しないコードの実行を引き起こす可能性が上がってしまう、チェックが漏れる。勝手にリンクを書き換えられえて同名のエイリアスを乗っ取られるなど、ちょっと考えただけでもセキュリティ懸念があります。 /etc/systemd/systemはいずれ技術的負債になっていく。そんな気がします。