如果一个服务是“启用”的,那么就会在某个地方有一个符号链接。
/etc/systemd/system
通常情况下,将其存放在一个单元文件中
/lib/systemd/system
帮助地,在你启用一个服务时,创建的链接和目标的完整路径将会被打印到stdout。
禁用服务会删除符号链接,所以单位文件本身不受影响,但在下一次系统引导时不会加载该服务,因为systemd会读取/etc/systemd/system目录。
然而,禁用的服务可以被加载,并且将会在
启动依赖于它的服务时自动启动;enable和disable只配置了单位的自动启动行为,其状态可以轻松覆盖。
一个被屏蔽(masked)的服务是指其单位文件是对/dev/null的符号链接。这使得即使其他已启用的服务需要该服务,也"无法"加载它。
当你屏蔽一个服务时,会在/etc/systemd/system和/dev/null之间创建一个符号链接,原始单位文件保持不变。当你取消屏蔽一个服务时,符号链接将被删除。
然而,我注意到这些指令并不总是被遵守。
当我试图屏蔽大多数服务时,它会失败:
$ sudo systemctl mask bluetooth.service
Failed to execute operation: Invalid argument
当然,我首先停止了服务。@Anwar建议只有非关键服务才能进行掩码。
除非我自己掩码了它,否则解除掩码的服务也会失败(无声)。我
相信这是因为除了在
/lib/systemd/system
中以符号链接的形式指向
/dev/null
之外,该服务没有任何单元文件存在:
$ file $(locate fuse.service)
/lib/systemd/system/fuse.service: symbolic link to /dev/null
$ sudo systemctl unmask fuse.service
$ systemctl status fuse
● fuse.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead)
我不是唯一一个遇到这个问题的人
为了真正揭示被掩盖的服务x11-common,我不得不删除指向/dev/null
的符号链接,并执行sudo apt-get install --reinstall x11-common && sudo systemctl daemon-reload
。现在当我使用systemctl status x11-common
查询时,我看到该服务有一个漂亮的绿色圆圈,已加载并处于活动状态(已退出),尽管它没有单元文件。
如需进一步参考,可以查看如何使用Systemctl这篇文章。