![向 systemd 解释 /var 已符号链接到 /home/var](https://linux22.com/image/1461835/%E5%90%91%20systemd%20%E8%A7%A3%E9%87%8A%20%2Fvar%20%E5%B7%B2%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E5%88%B0%20%2Fhome%2Fvar.png)
假设安装了 Debian 不稳定版本,使用 systemd 进行初始化,有两个文件系统分区/
和/home
。进一步假设,由于与物理磁盘有关的原因,我已将的内容移动/var
到/home/var
并用适当的符号链接替换/var
目录。(请不要试图劝阻我移动/var
到/home
分区,或将其变成 systemd 参数 ;-)
使用此配置,必须通知 systemd,任何需要 中的任何内容的单元在安装/var
后才能启动。我知道有问题的单元(因为它试图在启动序列的早期访问 中的文件)是,但可能还有很多我还没有注意到的其他单元。/home
/var/lib
systemd-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.mount
fstab,那么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