使用 systemd-nspawn 绑定挂载

使用 systemd-nspawn 绑定挂载

我正在使用 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生效

相关内容