开机自启systemd

本机(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.5systemctl --version
kded 版本kded 6.26.0plasma-kded6.service → /nix/store/…-kded-6.26.0/bin/kded6
生成的自启单元落点/run/user/1000/systemd/generator.late/app-<id>@autostart.servicesystemctl --user show … -p FragmentPath
kded6 已加载模块数29busctl --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.serviceactive running(已跑 17h)/etc/xdg/autostart/wechat.desktop(nix)
app-org.telegram.desktop@autostart.serviceactive running~/.config/autostart/
app-org.fcitx.Fcitx5@autostart.serviceactive runningsw/etc/xdg/autostart
app-org.kde.discover.notifier@autostart.serviceactive runningsw/etc/xdg/autostart
app-org.kde.kdeconnect.daemon@autostart.serviceactive runningsw/etc/xdg/autostart
app-geoclue-demo-agent@autostart.serviceinactive deadsw/etc/xdg/autostart
app-xdg-user-dirs@autostart.serviceinactive dead(oneshot)sw/etc/xdg/autostart
app-org.kde.plasma-fallback-session-restore@autostart.serviceinactive deadsw/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
重启 kdedsystemctl --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 是否随之变化(本次未做写入实验)。