本机(KDE Plasma 6.6.6 + systemd 260 用户会话)的「开机自启」实际由两条互相独立的机制承载:
- systemd 用户管理器 —— 承载「应用类自启」与常驻用户服务。systemd 内置的
systemd-xdg-autostart-generator把 XDG 自动启动.desktop生成成用户单元app-<id>@autostart.service(微信、Telegram、fcitx5、KDE Connect 守护等就是这么起来的)。 - kded6(KDED 后台服务) —— 承载「KDE 桌面内部后台模块」(设备自动挂载、时间时区、触摸板、状态栏图标、网络管理等)。由
plasma-kded6.service拉起kded6进程,按~/.config/kded6rc的[Module-<name>] autoload=决定加载哪些模块。
一句话:进程 / 应用自启归 systemd;KDE 桌面内部的后台服务归 kded6rc。两者都在图形登录后被拉起(graphical-session.target / plasma-workspace.target),互不重叠。
前置事实(实测)
只列能对上眼的实测值,全部取自本机 2026-10-13 现场。
| 项 | 实测值 | 出处 |
|---|---|---|
| 桌面会话 | KDE Plasma 6.6.6;会话 plasmax11(X11) | $XDG_CURRENT_DESKTOP=KDE |
| systemd 版本 | 260.5 | systemctl --version |
| kded 版本 | kded 6.26.0 | plasma-kded6.service → /nix/store/…-kded-6.26.0/bin/kded6 |
| 生成的自启单元落点 | /run/user/1000/systemd/generator.late/app-<id>@autostart.service | systemctl --user show … -p FragmentPath |
| kded6 已加载模块数 | 29 | busctl --user call org.kde.kded6 /kded org.kde.kded6 loadedModules |
| kded 模块插件文件数 | 33 个 .so | /run/current-system/sw/lib/qt-6/plugins/kf6/kded/ |
机制一:systemd 用户会话自启
生成器:systemd-xdg-autostart-generator
systemd 内置生成器,登录时扫描 XDG 自动启动目录,把每个 .desktop 生成一个用户单元 app-<desktop-id>@autostart.service,放进 /run/user/<uid>/systemd/generator.late/。用 systemctl --user status app-wechat@autostart.service 可见其 Loaded: … (/etc/xdg/autostart/wechat.desktop; generated)、Docs: man:systemd-xdg-autostart-generator(8)。这就是「systemctl --user 里能看到微信 / Telegram 自启」的原因。
扫描目录(本机 XDG_CONFIG_DIRS 很长,含多个 nix store 的 etc/xdg,外加 ~/.config/autostart):
| 目录 | 本机内容 |
|---|---|
~/.config/autostart(用户级) | 现含 com.qq.QQ.desktop、org.telegram.desktop.desktop |
/etc/xdg/autostart(→ /etc/static/xdg/autostart,nix 生成) | 现仅 wechat.desktop(由 im/wechat.nix 声明) |
/run/current-system/sw/etc/xdg/autostart(系统包自带) | 19 项:at-spi-dbus-bus、baloo_file、geoclue-demo-agent、gmenudbusmenuproxy、kaccess、kglobalacceld、kwrited-autostart、orca-autostart、org.fcitx.Fcitx5、org.kde.discover.notifier、org.kde.kdeconnect.daemon、org.kde.kunifiedpush-distributor、org.kde.plasma-fallback-session-restore、org.kde.plasmashell、pam_kwallet_init、polkit-kde-authentication-agent-1、powerdevil、xdg-user-dirs、xembedsniproxy |
本机 @autostart 单元清单(现场)
| 单元 | 状态 | 来源 |
|---|---|---|
| app-wechat@autostart.service | active running(已跑 17h) | /etc/xdg/autostart/wechat.desktop(nix) |
| app-org.telegram.desktop@autostart.service | active running | ~/.config/autostart/ |
| app-org.fcitx.Fcitx5@autostart.service | active running | sw/etc/xdg/autostart |
| app-org.kde.discover.notifier@autostart.service | active running | sw/etc/xdg/autostart |
| app-org.kde.kdeconnect.daemon@autostart.service | active running | sw/etc/xdg/autostart |
| app-geoclue-demo-agent@autostart.service | inactive dead | sw/etc/xdg/autostart |
| app-xdg-user-dirs@autostart.service | inactive dead(oneshot) | sw/etc/xdg/autostart |
| app-org.kde.plasma-fallback-session-restore@autostart.service | inactive dead | sw/etc/xdg/autostart |
注:app-com.qq.QQ@<hash>.service、app-org.kde.kate@<hash>.service 这类实例是哈希的单元,是运行期由启动器拉起的 GUI 应用(KDE 把每个 GUI 应用也当作 systemd 用户服务管理),不是自启;只有 @autostart 后缀才是自动启动。
静态用户单元(非生成)
除生成单元外,用户可自建常驻单元。本机唯一一条是 ~/.config/systemd/user/hermes-gateway.service([Install] WantedBy=default.target),经 default.target.wants/ 软链开机启用;另有 hermes-gateway.service.d/override.conf 注入代理环境变量。
怎么加一条自启
- 应用类(推荐,最省事):把
*.desktop放进~/.config/autostart/(或图形界面「系统设置 → 开机与关机 → 自动启动」里添加)。登录时自动生成app-…@autostart.service,无需任何单元文件。 - 常驻服务(需守护 / 重启 / 依赖):写
~/.config/systemd/user/xxx.service([Install] WantedBy=default.target),再systemctl --user enable --now xxx.service。 - 声明式(要 nixos-rebuild):
systemd.user.services.xxx。随系统世代走,改一次要 rebuild —— 轻量自启不建议走这条。
机制二:kded6rc(KDED 后台服务)
kded6 是什么、谁拉起
kded6 是 KDE Daemon(常驻进程),注册 org.kde.kded6 D-Bus 总线名,按需 / 按配置加载一批「kded 模块」(插件 .so)。由用户单元 plasma-kded6.service(PartOf=graphical-session.target,After=plasma-kcminit.service)拉起。
kded6rc 格式
配置文件 ~/.config/kded6rc,INI 格式,每个模块一段:
[Module-<模块名>]
autoload=true
autoload=false 即关闭该后台服务;缺省(无该段)= 用模块自带默认。本机 kded6rc 当前无任何 Module 段(仅 [PlasmaBrowserIntegration] shownCount=4)⇒ 29 个模块全按默认加载。图形入口 =「系统设置 → 开机与关机 → 后台服务」(KCM id kcm_kded,已实测存在)。
本机已加载模块(29,现场实测)
lookandfeelautoswitcher、ktimezoned、audioshortcutsservice、device_automounter、remotenotifier、gtkconfig、wpad-detector、mprisservice、devicenotifications、printmanager、inotify、statusnotifierwatcher、smbwatcher、kded_touchpad、freespacenotifier、plasma-session-shortcuts、appmenu、baloosearchmodule、bluedevil、donationmessage、kscreen、desktopnotifier、kameleon、browserintegrationflatpakintegrator、kded_bolt、oom-notifier、plasma_accentcolor_service、networkmanagement、keyboard
可用模块插件(33 个 .so,在 /run/current-system/sw/lib/qt-6/plugins/kf6/kded/)
除上面 29 个外还有:browserintegrationreminder、filenamesearchmodule、geotimezoned、soliduiserver(这 4 个本机未加载)。
怎么开关一个后台模块
- 图形:系统设置 → 开机与关机 → 后台服务,勾选即写
kded6rc。 - 命令行:
kwriteconfig6 --file kded6rc --group Module-device_automounter --key autoload false,再systemctl --user restart plasma-kded6.service。 - 查已加载:
busctl --user call org.kde.kded6 /kded org.kde.kded6 loadedModules。
管理命令
| 用途 | 命令 |
|---|---|
| 列出全部用户单元(含 @autostart) | systemctl --user list-units --type=service --all |
| 看某自启单元状态 / 来源 | systemctl --user status app-wechat@autostart.service |
| 只看 @autostart 清单 | systemctl --user list-units 'app-*@autostart.service' |
| 停 / 起某个自启(本次会话) | systemctl --user stop|start app-xxx@autostart.service |
| 列出 enabled 的用户单元 | systemctl --user list-unit-files --state=enabled |
| 启用自建用户单元 | systemctl --user enable --now xxx.service(改文件后先 daemon-reload) |
| 重载用户管理器 | systemctl --user daemon-reload |
| kded6 已加载模块 | busctl --user call org.kde.kded6 /kded org.kde.kded6 loadedModules |
| 改 kded 模块开关 | kwriteconfig6 --file kded6rc --group Module-<name> --key autoload false |
| 重启 kded | systemctl --user restart plasma-kded6.service |
| 查看 kded 单元定义 | systemctl --user cat plasma-kded6.service |
踩坑记录
- 现象:
~/.config/kded5rc里写着[Module-device_automounter] autoload=true、[Module-browserintegrationreminder] autoload=false,却看不出效果。
成因:本机已无 kded5(command -v kded5为空),Plasma 6 的 kded 读的是kded6rc;kded5rc是 KF5 时代留下的死文件。
怎么改:改kded6rc(或走「后台服务」KCM),别动 kded5rc。 - 现象:想直接
systemctl --user enable app-wechat@autostart.service来启用自启。
成因:app-<id>@autostart.service是生成器产物(位于/run/user/…/systemd/generator.late/,标记generated),不可 enable。
怎么改:自启靠往~/.config/autostart/放 / 删.desktop控制,不碰生成单元。 - 现象:想让某系统级自启(如微信)对某用户单独停用。
怎么改:在~/.config/autostart/放同名.desktop且写Hidden=true(用户级覆盖系统级)。 - 现象:Flatpak 应用(QQ)自启时
Exec带--file-forwarding … @@u %U @@。
怎么改:自启用干净写法Exec=flatpak run com.qq.QQ(本机~/.config/autostart/com.qq.QQ.desktop即如此)。
边界与待实测
- 本档只覆盖「图形登录后由 systemd 用户会话 + kded6 拉起的东西」;系统级 systemd 服务(
systemctl,非--user)与 NixOS 声明式systemd.services/systemd.user.services只点到为止。 - 待实测:QQ 的
com.qq.QQ.desktop是否真生效需注销 → 重登验证;本次会话尚未出现app-com.qq.QQ@autostart.service(当前 QQ 是运行期哈希实例)。 - 待实测:kded6rc 写入 Module 段后,重启
plasma-kded6.service时loadedModules是否随之变化(本次未做写入实验)。