Systemd 动态用户 (2020)

Lobsters Hottest 工具

摘要

本文介绍了 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 定时器的爱还不够

Lobsters Hottest

本文提倡在 Linux 上使用 systemd 定时器替代传统的 cron 作业来执行定时任务,强调其更好的集成性、日志记录以及更清晰的语法。

Flatpak 将依赖 systemd

Lobsters Hottest

Flatpak 的下一个重要版本可能将依赖 systemd,以将权限管理移至服务层,这可能会破坏与不使用 systemd 的发行版的兼容性。