我应该如何使用“systemctl --global”?

我应该如何使用“systemctl --global”?

Systemd 有一个标志--global,在我的发行版 Ubuntu 上,我发现了一个 catch-22。

  • 如果我以非特权用户身份运行它,systemctl 将没有适当的权限将单元文件复制到/etc.
  • 它无法通过 工作sudo,因为sudo无法设置$DBUS_SESSION_BUS_ADDRESS$XDG_*变量。

它可能会或可能不会通过sudo -E保护环境起作用。如果从会话运行root(例如从虚拟控制台),它肯定有效。

正确的使用方法是什么systemctl --global

答案1

--globalenable:与 和一起使用时disable,对全局用户配置目录进行操作,从而为所有用户将来的所有登录全局启用或禁用单元文件。

systemctl --global标志引用systemctl --user“全局”级别的服务,主要用于enable/disable用户单位全部用户在系统上。

与单位相反systemctl --system,启用的--global单位不开始直到个人用户登录从而“想要”用户单元。 (请注意,sudo/su不要在这个意义上“登录”用户;请参阅下面的替代方案。)

如果你看一下systemd 用户单元搜索路径,您会注意到它包含一些非用户不可写入的“全局”目录root。这些目录中的单元可以由sudo systemctl --global(对于所有用户)或systemctl --user(对于单个用户)进行管理。

ls -l /usr/lib/systemd/user

ls -l /etc/systemd/user

使用sudo systemctl --global仅限于管理单位文件,主要是启用/禁用它们。全局手动启用用户单元会将其符号链接到/etc/systemd/user;中的 Targets/wants 目录下对于个人用户来说是~/.config/systemd/user.

ls -l ~/.config/systemd/user

在桌面系统上,可能有相当多的可用全局用户单元,可能在(包)安装期间默认启用。 “内存中”的单元列表还包括生成的和瞬态的单元/“文件”,例如设备范围。例如,使用--type service缩小范围。

systemctl --global list-unit-files
systemctl --global list-units

systemctl --global list-units --all

虽然用户单元文件的列表--global可能看起来与个体的列表非常相似--user,但后者在搜索路径中包括(非全局)用户特定的目录。也可以看看user.conf, 在哪里附加用户目录可以配置。

systemctl --user list-units
systemctl --user list-unit-files

对于单位搜索目录的“实时”列表,包括user.conf当前用户的自定义添加,请使用systemctl show

systemctl --user show --property 'UnitPath' --value

(刚刚注意到,虽然systemctl --global list-unit-files排除了 中的那些~/.config/systemd/usersystemctl --global list-units但包括了它们。似乎不正确,或者至少不一致?)


由于用户单元在用户登录之前不会加载/执行,因此它们没有--global status.您可以查看每个登录用户(您自己和其他人)的设备状态。

由于从 systemd 的角度来看, sudo/su实际上并没有执行“正确的登录”,因此它不应该用于管理其他用户的单位。相反,看看--machine,其中@.host可用于指代当前系统:。sudo systemctl --user --machine [email protected]

# NOTE: demo status for yourself, but via sudo.
sudo systemctl --user --machine "${USER}@.host" status

要以另一个用户的身份“登录”,作为具有所有 DBus 等设施的单独会话,请使用machinectl开始一个shell. (请注意,这machinectl login也会启动一个 shell,但作为一个更麻烦的“手动”登录过程。)

# NOTE: demo logging in as yourself, but with a custom/different login shell.
sudo machinectl shell "${USER}@.host" /bin/sh

也可以看看loginctl,特别是enable-linger它允许长时间运行的--user服务,而无需“手动”登录。

相关内容