![使用 systemd-nspawn 绑定挂载](https://linux22.com/image/746208/%E4%BD%BF%E7%94%A8%20systemd-nspawn%20%E7%BB%91%E5%AE%9A%E6%8C%82%E8%BD%BD.png)
我正在使用 systemd-nspawn,并尝试使用绑定安装启用启动时的容器。我已经pacstrap
安装并初始化了系统,并且可以在命令行上启动它,如下所示:
$ sudo /usr/bin/systemd-nspawn --quiet --boot --link-journal=try-guest --network-veth -U --settings=override --machine=jekyll --bind-ro /home/xyz/Documents/jekyll:/home/jekyll/site --private-users=off
并且我的绑定安装没有问题。然而当我这样做时
$ sudo cp /usr/lib/systemd/system/[email protected] /etc/systemd/system/machines.target.wants/[email protected]
并将ExecStart
服务文件中的行替换为
ExecStart=/usr/bin/systemd-nspawn --quiet --boot --link-journal=try-guest --network-veth -U --settings=override --machine=%i --bind-ro /home/xyz/Documents/jekyll:/home/jekyll/site --private-users=off
然后做
$ sudo systemctl daemon-reload
$ sudo systemctl restart systemd-nspawn@jekyll
绑定挂载不存在。有人能告诉我如何让它工作吗?
答案1
当您运行此命令时...
sudo systemctl restart systemd-nspawn@jekyll
...systemd 不会在 /etc/systemd/system/machines.target.wants/ 中看到您修改过的单元文件。Systemd 只会在/lib/systemd/system
、/etc/systemd/system
和中查找单元文件/run/systemd/system
。目录中的文件/etc/systemd/system/<sometarget>.wants
应作为符号链接指向其中一个目录。
如果您想使用修改后的ExecStart
指令启动服务,则无需复制任何内容。只需运行(以 root 身份):
systemctl edit [email protected]
在出现的编辑器中,添加以下内容:
[Service]
ExecStart=
ExecStart=/usr/bin/systemd-nspawn --quiet --boot --link-journal=try-guest \
--network-veth -U --settings=override --machine=%i \
--bind-ro /home/xyz/Documents/jekyll:/home/jekyll/site \
--private-users=off
这将创建一个文件,该文件将在您启动服务时与库存单元文件合并,并且您的绑定挂载应该可用。/etc/systemd/system/[email protected]/override.conf
要使机器在启动时启动,只需运行:
systemctl enable systemd-nspawn@jekyll
回答评论中的问题:
这里的大部分信息来自systemd.unit 手册页。 这部分 ”单元文件加载路径”提供了有关 Systemd 如何定位单元文件的详细信息。
使用插入文件覆盖单元文件的部分内容在“描述“ 部分:
除了单元文件 foo.service 之外,可能还存在一个“插入式”目录 foo.service.d/。解析单元文件本身后,将解析此目录中所有带有“.conf”后缀的文件。这对于更改或添加单元的配置设置非常有用,而无需修改单元文件。插入式文件必须包含适当的节标题。对于实例化的单元,此逻辑将首先查找实例“.d/”子目录(例如“[电子邮件保护]/”)并读取其“.conf”文件,然后读取模板“.d/”子目录(例如“[电子邮件保护]/”)和那里的“.conf”文件。此外,对于包含破折号(“-”)的单元名称,还会搜索通过在所有破折号后截断单元名称而生成的目录集。具体来说,对于单元名称 foo-bar-baz.service,不仅会搜索常规的插入目录 foo-bar-baz.service.d/,还会搜索 foo-bar-.service.d/ 和 foo-.service.d/。这对于为一系列相关单元定义公共插入目录很有用,这些单元的名称以公共前缀开头。此方案对于 mount、automount 和 split 单元特别有用,它们的系统命名结构以破折号作为组件分隔符。请注意,前缀层次结构中较低名称的插入文件将覆盖较高名称的文件,即 foo-bar-.service.d/10-override.conf 将覆盖 foo-.service.d/10-override.conf。
我们在设置之前需要清除的事实ExecStart
(即,在设置配置的链接之前我们需要的事实ExecStart=
)来自示例部分:
请注意,对于插入式文件,如果要从解析为列表(而非依赖项)的设置中删除条目,例如 AssertPathExists=(或服务单元中的 ExecStart=),则需要先清除列表,然后重新添加除要删除的条目之外的所有条目。依赖项(After= 等)不能重置为空列表,因此只能在插入式中添加依赖项。如果要删除依赖项,则必须覆盖整个单元。
使用systemctl edit
创建(或编辑)覆盖文件来自systemctl 手册页。
答案2
与其在服务文件中修改设置,不如将其配置进入以你的容器命名的/etc/systemd/nspawn/
文件中….nspawn
,例如 -jekyll.nspawn
绑定挂载可以在以下部分中给出[Files]
:
[Files]
BindReadOnly=…
调整这些设置将不需要daemon-reload
生效。