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

我想通过在启动时禁用plymouth服务来改善我的Ubuntu GNOME 16.04的启动时间。 我在各种网站上找到了两个关于如何做到这一点的答案:

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

除非我知道他们做了什么,否则我无法执行上述任何一项。

如果enabled了某个服务,则会在其中的某个位置添加符号链接

 /etc/systemd/system 

单位文件,通常在某个地方

 /lib/systemd/system 

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

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

但是, 可以加载已禁用的服务,并且如果启动了依赖它的服务,则将启动该服务 ; enabledisable仅配置单元的自动启动行为,并且可以轻松覆盖状态。

掩码服务是其单元文件是/dev/null的符号链接的服务。 这使得加载服务“不可能”,即使其他已启用的服务需要它。

当您mask服务时,会在/etc/systemd/system创建一个符号链接到/dev/null ,而原始单元文件保持不变。 unmask服务时,将删除符号链接。

但是,我注意到这些命令并不总是得到尊重。

当我试图掩盖大多数服务时,它失败了:

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

当然,我先停止了服务。 @Anwar建议屏蔽仅适用于非关键服务。

取消屏蔽蒙面服务,除非我自己屏蔽它,也会失败(默默地)。 我相信这是因为除了以/dev/null的符号链接forms外,服务中没有任何单元文件,这次是在/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/nullsudo apt-get install --reinstall x11-common && sudo systemctl daemon-reload 。 现在,当我使用systemctl status x11-common查询它时,我看到该服务有一个漂亮的绿色圆圈并且已加载并激活(退出),尽管它没有单元文件。

有关进一步参考,有关如何使用Systemctl的文章可能会有所帮助。

这很简单。

  • systemctl startsystemctl stop :立即启动(停止)有问题的单元;
  • systemctl enablesystemctl disable在引导时标记(取消标记) 自动启动的单元(以特定于单元的方式,在[Install]部分中描述);
  • systemctl masksystemctl unmask :disallows(允许)所有和任何尝试启动有问题的单元(手动或作为任何其他单元的依赖项,包括默认引导目标的依赖项)。 请注意,systemd中自动启动的标记是通过将默认引导目标的人为依赖项添加到相关单元来实现的,因此“mask”也不允许自动启动。

参考: systemctl(1) 。

更多:Lennart Poettering(2011-03-02)。 “三个层次” 。 systemd for Administrators 。 0pointer.de。

简而言之,

  • disable会在启动时disable设备。 但是该单元可以在启动后随时启动。

  • mask完全禁用该单元。 它不能在没有暴露的情况下启动。 这自动意味着它将在启动期间失败。