向 systemd 解释 /var 已符号链接到 /home/var

向 systemd 解释 /var 已符号链接到 /home/var

假设安装了 Debian 不稳定版本,使用 systemd 进行初始化,有两个文件系统分区//home。进一步假设,由于与物理磁盘有关的原因,我已将的内容移动/var/home/var并用适当的符号链接替换/var目录。(请不要试图劝阻我移动/var/home分区,或将其变成 systemd 参数 ;-)

使用此配置,必须通知 systemd,任何需要 中的任何内容的单元在安装/var后才能启动。我知道有问题的单元(因为它试图在启动序列的早期访问 中的文件)是,但可能还有很多我还没有注意到的其他单元。/home/var/libsystemd-random-seed.service

配置的最佳方法是什么一般规则“任何需要从 开始的东西都/var无法启动,直到安装后才能启动”?我将接受“向受影响的每个单元文件添加和指令”/home形式的答案Requires=After=除非你可以证明没有更好的选择。

Debian 不稳定版本中当前的 systemd 版本是 224。

答案1

嗯,init 本身无法真正知道给定服务需要哪些文件,因此仍然需要在某处声明“此服务使用 /var”依赖项反正

当然,这应该由开发人员和打包人员来完成,而不是由您来完成。例如,前面提到的systemd-random-seed.service 已经具有所有必要的依赖项:

$ systemctl cat systemd-random-seed
#/usr/lib/systemd/system/systemd-random-seed.service
# 该文件是 systemd 的一部分。
...
默认依赖项 = 否
RequiresMountsFor=/var/lib/systemd/random-seed
...

因此,对于你来说,“更好的选择”是使用绑定挂载代替符号链接。这将自然地挂接到 systemd 的 .mount 单元依赖项中,同时提供与符号链接相同的功能。

也就是说,如果您在 上有绑定挂载/var,那么所有已经依赖于 的单元var.mount将自动(间接)依赖于home.mount

/etc/fstab 文件
/home/var /var 无绑定 0 0

(如果这不可接受,也许编译一个带有依赖项的自定义 systemd 版本会更好地满足您的“要求”。)


如果你的某些 .service 单元缺少适当的依赖关系,则另一种选择 – 你可以变成/var自动挂载使用 systemd 的 autofs4 支持。

使用自动挂载,任何试图访问 /var 下文件的进程都将被阻止,直到文件系统挂载完成。因此,无需编辑单个服务单元即可创建全局“依赖项”。

为此,请将x-systemd.automount选项添加到 fstab 中。(或者,如果您更喜欢var.mountfstab,那么var.automount也可以创建一个相应的。)

/etc/fstab 文件
/home/var /var 无 bind,x-systemd.automount 0 0

当然这个再次要求是/var绑定挂载而不是符号链接。

答案2

一年多以后,随着 systemd (229) 版本随 ubuntu 16.04 一起发布,fstab 中支持这样的依赖项挂载。

所以做起来很简单。

# /etc/fstab
home/var /var x-systemd.requires=/home,x-systemd.automount,none bind 0 0

从这篇文章中得到了这个想法 https://copyninja.info/blog/systemd_automount_entry.html

相关内容