为什么有些 systemd 服务处于“屏蔽”状态?

为什么有些 systemd 服务处于“屏蔽”状态?

当我运行命令时sudo systemctl list-unit-files(我认为 sudo 是可选的),我得到显示所有服务及其状态的输出。

以下是来自我的机器的一个片段:

UNIT FILE                                  STATE
...
debian-fixup.service                       static  
debug-shell.service                        disabled
display-manager.service                    enabled 
dns-clean.service                          enabled 
dsmcad.service                             enabled 
emergency.service                          static  
failsafe-x.service                         static  
friendly-recovery.service                  masked  
fuse.service                               masked  
gdm.service                                masked  
getty-static.service                       static  
[email protected]                             enabled 
gpsd.service                               indirect
[email protected]                           static  
gpu-manager.service                        enabled 
halt-local.service                         static  
halt.service                               masked  
hostname.service                           masked
...

我想知道为什么有些服务处于“屏蔽”状态。我认为这意味着“这比‘禁用’更好,因为该服务无法启动,无论是手动启动还是通过 systemd 启动”。

如何获取有关服务单元状态的更多信息?

谁将这些单位置于其各自的状态?

例如,我尝试过 sudo systemctl help dsmcad- 这只会显示documentation = ...来自单元文件的那一行。/etc/systemd/system/dsmcad.service

注意:在这里我知道确切地dsmcad 服务是什么以及它有什么用,我自己已经安装了它。我对通用解决方案更感兴趣。

答案1

mask是 的增强版本disable。使用disable会删除指定单元文件的所有符号链接。如果使用 ,mask单元将链接到/dev/null。如果您检查 ,例如通过 ,则会显示这一点systemctl status halt.service。 的优点mask是可以防止任何类型的激活,即使是手动的。

注意:systemctl list-unit-files正在列出单位的状态文件(静态、启用、禁用、屏蔽、间接),与服务状态无关。要查看服务使用systemctl list-units

答案2

'mask' 是单元文件的状态,被视为“第三级关闭”(stop-1st、disable-2nd、mask-3rd)。标记为 masked 的服务既不能手动启动(使用 start 命令),也不能由系统启动(在系统启动时)。因此,在服务上使用 systemctl mask 命令时要小心。

答案3

由于您请求的是有关屏蔽状态的信息,因此需要指出的是,可以在启动后的服务中观察到该信息,该服务已修改其定义,重新加载(systemctl daemon-reload)并且新状态不好一个容易理解的例子是以下场景:

a) the service is running well (already started)
b) edit the service definition file and delete everything in its contents
c) reload
d) state masked will be observed too

因此,屏蔽状态可能源自不正确的服务定义。因此,用户可能通过不正确的编辑服务而导致未屏蔽状态。

观察:我不确定这是故意发生的还是一个简单的错误(默认选项),但它可能是一些值得分享的有趣信息

答案4

hostname.service被掩盖为多余的,因为systemd在启动期间很早就设置了主机名(来自 /etc/hostname)。

此设置由 Debian systemd 包提供。

$ ls -l /lib/systemd/system/hostname.service
lrwxrwxrwx 1 root root 9 Apr  8 22:47 /lib/systemd/system/hostname.service -> /dev/null
$ dpkg-query --search /lib/systemd/system/hostname.service
systemd: /lib/systemd/system/hostname.service

类似地,Debian 现在可以在没有 shell 脚本的halt情况下运行,它由systemd 关闭(源代码这里) 反而。

如果某项服务已被手动屏蔽,则会安装该屏蔽/etc/systemd/system

在 Debian/Ubuntu 上删除服务时也会被屏蔽。我不知道为什么。

相关内容