Systemd 动态用户 (2020)
摘要
本文介绍了 systemd 动态用户,该功能在运行时为 systemd 单元创建临时 Unix 用户,无需手动管理服务用户。文中包含配置示例和用例。
<p><a href="https://lobste.rs/s/kjuxof/systemd_dynamic_users_2020">评论</a></p>
查看缓存全文
缓存时间: 2026/08/08 20:37
# systemd 动态用户
Source: https://ethulhu.co.uk/systemd-dynamicuser
Linux 的 init 系统 systemd (https://en.wikipedia.org/wiki/Systemd) 存在一些争议,但它也有一些非常巧妙的特性,其中我最喜欢的是*动态用户*。Lennart Poettering 的博客中有完整的来龙去脉 (http://0pointer.net/blog/dynamic-users-with-systemd.html),但我将在下面总结要点,并记录一些技巧。
目录...
- 用户和组与名称服务开关,天哪! (https://ethulhu.co.uk/systemd-dynamicuser#users-and-groups-and-name-service-switch-oh-my)
- 简单服务 (https://ethulhu.co.uk/systemd-dynamicuser#simple-services)
- 沙盒化 Steam? (https://ethulhu.co.uk/systemd-dynamicuser#sandboxed-steam)
- 实现 (https://ethulhu.co.uk/systemd-dynamicuser#implementation)
## 用户和组与名称服务开关,天哪!
在 Linux 上,当你创建一个用户时,通常会被添加到 `/etc/passwd`,其所属组也会被添加到 `/etc/groups`。然而,这些数据库及其他数据实际上可以来自多个来源,由名称服务开关(Name Service Switch)(https://en.wikipedia.org/wiki/Name_Service_Switch) 控制,而在现代 Linux 上,其中一个来源就是 systemd。
当配置为动态用户后,systemd 会为一个 Unit 的整个生命周期创建一个用户来运行该 Unit。该用户永远不会被添加到 `/etc/passwd`,只存在于运行时,当 Unit 结束时该用户也随之消失。虽然默认情况下这些用户被严格限制,但他们仍然是完整的 Linux 用户,可以被添加到组中、写入磁盘,或者被授予能力(capabilities)。特别是,systemd 提供了一套用于*状态目录(State Directories)*的机制,这些目录对创建的用户可写,在 Unit 结束后仍然保留,并在下次 Unit 运行时自动调整属主,使其可由下一个动态创建的用户写入。这些目录可用于存储服务数据,或模拟主目录。
## 简单服务
动态用户的一个非常实用的效果是简化了服务的打包和运行。无需在安装服务时创建一个用户来运行它,并在卸载服务时再删除该用户;服务包只需安装一个服务文件,因为用户是在运行时创建的。例如,下面是我一个 Web 服务的配置:
``
$ cat /lib/systemd/system/log.eth.moe
[Unit]
Description=Backend server for https://log.eth.moe
[Service]
# Create a user at runtime.
# It will have a random name.
DynamicUser=yes
# Set the user's primary group to www-data.
Group=www-data
# Create a temporary runtime directory at /run/log-eth-moe/.
RuntimeDirectory=log-eth-moe
# Create a persistent state directory at /var/lib/log-eth-moe/.
StateDirectory=log-eth-moe
ExecStart=/usr/bin/log.eth.moe -socket /run/log-eth-moe/listen.sock -dir /var/lib/log-eth-moe/
[Install]
WantedBy=multi-user.target
``
一般来说,每当你想让一个非人类用户来运行某些东西时,它也很有用。例如,下面是我在树莓派上运行 Kodi 媒体中心 (https://kodi.tv/) 的配置 (https://github.com/ethulhu/kodi-systemd-service/):
``
$ cat /lib/systemd/system/kodi.service
[Unit]
Description=Kodi Media Center
相似文章
Systemd 261 发布,带来 systemd-sysinstall、IMDSD 和 storagectl
Systemd 261 已发布,包含多项重大新特性,包括系统安装器 systemd-sysinstall、用于统一云元数据访问的 IMDSD 以及用于存储管理的 storagectl。
你对 systemd 定时器的爱还不够
本文提倡在 Linux 上使用 systemd 定时器替代传统的 cron 作业来执行定时任务,强调其更好的集成性、日志记录以及更清晰的语法。
Flatpak 将依赖 systemd
Flatpak 的下一个重要版本可能将依赖 systemd,以将权限管理移至服务层,这可能会破坏与不使用 systemd 的发行版的兼容性。
今日记录:在NixOS上符号链接点文件
一位开发者分享了在NixOS上使用systemd-tmpfiles符号链接点文件的技巧,无需依赖home-manager或其他工具。
在Debian中用OpenRC替换Systemd
在Debian上使用OpenRC替换Systemd的指南,包括安装步骤和面临的挑战。