systemd 服务的额外挂载点

systemd 服务的额外挂载点

我正在尝试设置一个 systemd 服务,该服务需要访问我通常不想安装的文件系统(如果相关,我想在 btrfs 上设置 Snapper,但想使用平面子卷布局如各个地方所述,例如。这里,并希望.snapshots为其他所有内容卸载目录)。

我知道可以为服务提供自己的私有挂载命名空间,但大多数文档都讨论了限制访问通常可用的数据,而不是授予访问通常无法访问的内容。如何确保 Snapper 具有系统其他部分不会的安装?

编辑:当然我更换Exec=值,然后运行主要的事情,但这在很多方面都是不优雅的(一方面,上面的示例并不是我唯一一次想要这样做,另一次我想这样做)希望主服务以 root 身份运行,我也需要手动更改它,而不仅仅是使用User=)。但是,如果我确实走这条路,我是否还需要脚本来卸载文件系统,或者 systemd 会自动清理它吗?

编辑2:明显的解决方法是使用ExecStartPre=来进行安装,但不幸的是,根据文档,这不适用于这种情况:

文件系统名称空间是为服务管理器分叉的每个进程单独设置的。ExecStartPre=因此,一旦该进程退出,在该进程的命名空间中建立的挂载将被自动清除,并且将不可用于分叉的后续进程ExecStart=(类似的情况也适用于为单元配置的各种其他命令)。同样,JoinsNamespaceOf=不允许在单元之间共享内核安装命名空间,它只允许共享/tmp//var/tmp/目录。

答案1

一般来说,您正在寻找的unshare -mPrivateMounts

PrivateMounts=true

您还可以使用选项向 fstab 添加该路径的条目group=xxx,其中xxx是用户的组。这将允许用户无需 root 身份即可执行安装。

然后,您可以像平常一样继续创建服务文件,添加如下内容:

ExecStartPre=mount ....

挂载应该在单独的挂载命名空间中执行,该命名空间不会与其余进程共享,并且会在服务退出时自动卸载。唯一的问题是用户甚至可以在根挂载命名空间中执行挂载。

相关内容