それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

systemd の /etc/systemd/systemのファイル名とAliasの関係について。

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はいずれ技術的負債になっていく。そんな気がします。