我正在尝试设置一个 systemd 服务,该服务需要访问我通常不想安装的文件系统(如果相关,我想在 btrfs 上设置 Snapper,但想使用平面子卷布局如各个地方所述,例如。这里,并希望.snapshots
为其他所有内容卸载目录)。
我知道可以为服务提供自己的私有挂载命名空间,但大多数文档都讨论了限制访问通常可用的数据,而不是授予访问通常无法访问的内容。如何确保 Snapper 具有系统其他部分不会的安装?
编辑:当然我能更换Exec=
值,然后运行主要的事情,但这在很多方面都是不优雅的(一方面,上面的示例并不是我唯一一次想要这样做,另一次我想这样做)不希望主服务以 root 身份运行,我也需要手动更改它,而不仅仅是使用User=
)。但是,如果我确实走这条路,我是否还需要脚本来卸载文件系统,或者 systemd 会自动清理它吗?
编辑2:明显的解决方法是使用ExecStartPre=
来进行安装,但不幸的是,根据文档,这不适用于这种情况:
文件系统名称空间是为服务管理器分叉的每个进程单独设置的。
ExecStartPre=
因此,一旦该进程退出,在该进程的命名空间中建立的挂载将被自动清除,并且将不可用于分叉的后续进程ExecStart=
(类似的情况也适用于为单元配置的各种其他命令)。同样,JoinsNamespaceOf=
不允许在单元之间共享内核安装命名空间,它只允许共享/tmp/
和/var/tmp/
目录。
答案1
一般来说,您正在寻找的unshare -m
是PrivateMounts
:
PrivateMounts=true
您还可以使用选项向 fstab 添加该路径的条目group=xxx
,其中xxx
是用户的组。这将允许用户无需 root 身份即可执行安装。
然后,您可以像平常一样继续创建服务文件,添加如下内容:
ExecStartPre=mount ....
挂载应该在单独的挂载命名空间中执行,该命名空间不会与其余进程共享,并且会在服务退出时自动卸载。唯一的问题是用户甚至可以在根挂载命名空间中执行挂载。