“systemctl mask” 和 “systemctl disable” 有什么区别?

“systemctl mask” 和 “systemctl disable” 有什么区别?

我想通过在启动时禁用 plymouth 服务来缩短 Ubuntu GNOME 16.04 的启动时间。我在各个网站上找到了两个关于如何执行此操作的答案,即:

# systemctl disable plymouth-quit-wait.service 
# systemctl mask plymouth-quit-wait.service 

除非我知道它们的作用,否则我无法执行上述任何一项。

答案1

如果某个服务是enabled,那么在某处有一个符号链接

/etc/systemd/system

到一个单元文件,通常在某个地方

/lib/systemd/system

有帮助的是,当您enable使用服务时,创建的链接和目标的完整路径将被打印到标准输出。

禁用该服务删除了符号链接,因此单元文件本身不受影响,但是当 systemd 读取时,该服务不会在下次启动时加载/etc/systemd/system

然而,禁用的服务已加载,并将启动如果依赖它的服务已启动enable并且disable仅为单位配置自动启动行为,并且状态很容易被覆盖。

A蒙面服务是其单元文件为 的符号链接的服务/dev/null。这使得加载该服务变得“不可能”,即使另一个已启用的服务需要它。

当您使用服务时,会创建一个从到 的mask符号链接,而原始单元文件则保持不变。当您使用服务时,符号链接将被删除。/etc/systemd/system/dev/nullunmask

然而,我注意到这些命令并不总是能被遵守。

当我尝试屏蔽大多数服务时,失败了:

$ sudo systemctl mask bluetooth.service
Failed to execute operation: Invalid argument

当然,我首先停止了该服务。@Anwar 建议仅对非关键服务进行屏蔽。

取消屏蔽一个屏蔽服务也会失败(悄无声息),除非我自己屏蔽了它。我相信这是因为除了以 的符号链接形式外,任何地方都没有该服务的单元文件,/dev/null这次是在 中/lib/systemd/system

$ 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可能会有一点用处。

答案2

它非常简单。

  • systemctl start, systemctl stop:启动(停止)相关单元立即地
  • systemctl enable, systemctl disable:标记(取消标记)单位开机时自动启动(以单位特定的方式,在其[Install]章节中描述);
  • systemctl mask, systemctl unmask:禁止(允许)启动相关单元的所有尝试(手动启动或作为任何其他单元的依赖项启动,包括默认启动目标的依赖项)。请注意,systemd 中的自动启动标记是通过从默认启动目标向相关单元添加人为依赖项来实现的,因此“mask”也禁止自动启动。

參考文獻:systemctl(1)

更多:Lennart Poettering(2011-03-02)。 “三级关闭”管理员使用 systemd。 0pointer.de。

答案3

简而言之,

  • disable使得该单元在启动期间被禁用。但该单元可以在启动后的任何时间启动。

  • mask完全禁用该单元。如果不取消屏蔽,则无法启动。这自动意味着它将在启动过程中失败。

相关内容