我正在尝试更多地了解我的桌面环境是如何启动的,尤其是我的用户服务。在我当前的 Ubuntu 20.04 会话中,默认情况下有几十个服务处于活动状态,大多数都是systemd --user
作为全局服务启动的。这让人很难理解到底发生了什么。
我想创建一个单独的用户,以便我可以使用它来调试、实验并从尽可能最小的基本服务集开始。例如显示管理器、窗口管理器、dbus --session
面板以及进入图形会话所需的一切。
首先,我正在寻找一种方法来屏蔽或禁用systemd --user
仅针对特定用户的所有服务,并仅加载用户明确指定的一些服务(例如~/.config/systemd/user
)?这可能吗?
答案1
在阅读了更多关于图形会话中程序如何启动的内容后,我了解到程序启动的方式基本上有三种。以下列表假设一个 Xorg 会话,对于 Wayland 可能有所不同:
- 由显示管理器(例如 gdm)或 xinit 启动
.desktop
通过系统上各个默认路径下的文件启动(例如/etc/xdg/autostart
或/usr/share/applications
)。- 以用户服务形式启动
systemd --user
因此,图形化 Xorg 会话最终运行的内容不仅取决于systemd --user
启动的单元,还取决于其中的内容/etc/xdg/autostart
以及 X 会话的配置方式。
可以通过 屏蔽每个 systemd 用户服务system --user mask $SERVICE
。可以通过以下方式获取服务列表:
systemctl --user list-units -t service --state=running --full --all --plain --no-legend | awk -F ' ' '{ print $1 }'
正如 @heynnema 提到的,这样很容易破坏你的系统,例如我最终掩盖了我的dbus.socket
,然后 Xorg 不再启动,可能是因为会话所需的某些进程依赖于 D-Bus。
桌面组件(例如 XDG Autostart)
会话的某些组件可能由 XDG 自动启动.desktop
文件管理。要禁用自动启动的组件,.desktop
必须为当前用户复制相应的桌面文件(例如从/etc/xdg/autostart
或 /usr/share/applications)到~/.config/autostart
并且必须包含Hidden=true
。
但是,如果您的会话使用systemd
,则这些.desktop
文件如果包含,可能会被自动忽略X-GNOME-HiddenUnderSystemd=true
。
假设当前会话的名称如下,${XDG_SESSION_DESKTOP}
可以使用以下一行来检查会话需要哪些组件,并查看它们是否由 systemd 管理:
components=$(cat /usr/share/gnome-session/sessions/$XDG_SESSION_DESKTOP.session|grep RequiredComponents | awk -F '=' '{ print $2 }' | tr ';' '\n' | awk 'NF'); for component in $components; do file=$(locate -r "/${component}.desktop$" | grep -v "/home" ); systemd=$(grep "X-GNOME-HiddenUnderSystemd" $file); echo "$file: $systemd"; done | sort -u
有些方面可能特定于 GNOME 桌面。