本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。
本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:
由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。
systemd.nspawn — 容器配置
/etc/systemd/nspawn/
machine
.nspawn
/run/systemd/nspawn/
machine
.nspawn
/var/lib/machines/
machine
.nspawn
容器配置文件(后缀名必须是
.nspawn
)
用于封装本地容器的
运行时配置。
systemd-nspawn(1)
将会在启动一个容器时,搜索并读取对应的容器配置文件。
容器配置文件的名称必须与其定义的本地容器的名称保持一致。
这些配置文件并非必须,
仅在某个容器的执行环境确实与默认配置不一致的时候,才有可能需要专门使用一个特定的配置文件。
因为容器配置文件中的各项配置大多可以直接在 systemd-nspawn 命令行上指定,
所以仅在确实需要将某个容器的特殊配置持久保存起来的时候,才必须专门使用一个特定的配置文件。
容器配置文件的语法与
XDG
Desktop Entry Specification 规定的 .desktop
文件以及 Microsoft Windows 的
.ini
文件相同。
单元文件中的布尔值
可以有多种写法。
[ 1
, yes
, true
, on
] 含义相同,
[ 0
, no
,
false
, off
]
含义相同。
空白行和以 # 或 ; 开头的行 都会被忽略。 行尾的反斜线(\)视为续行符, 并在续行时 被替换为一个空格符。
.nspawn
文件搜索规则¶容器配置文件的名称由容器的名称加上
.nspawn
后缀确定,
容器的名称可以明确的通过 systemd-nspawn 命令的
--machine=
选项指定,
也可以根据目录或镜像文件的名称派生。如果在
/etc/systemd/nspawn/
与
/run/systemd/nspawn/
目录中找到了对应的配置文件,
那么将会应用其中的全部配置(但依然有可能会被命令行上的设置所覆盖),
同时将会停止进一步的搜索。
如果没有找到对应的配置文件,
那么将会进一步在容器镜像文件的所在目录、或容器根目录的所在父目录中搜索。
如果找到了对应的配置文件,那么将会仅应用其中的非特权指令,
所有特权指令,
也就是有可能造成权限提升或者要求访问主机资源(例如主机的文件或目录)的配置指令,
都将被忽略。
至于究竟有哪些选项属于特权指令,请继续阅读后文。
由系统管理员维护的配置文件(可信任)
应该放在
/etc/systemd/nspawn/
目录中,
而由容器发行商提供的配置文件(不可信任)应该放在
/var/lib/machines/
目录中。
注意,/var/lib/machines/
目录下的配置文件中包含的特权指令(见上文)都将被忽略。
如果你想要在容器发行商提供的配置文件中添加特权指令,
那么应该将容器发行商提供的配置文件复制到
/etc/systemd/nspawn/
目录中,
然后编辑它,这样才能使得特权指令生效。
关于如何搜索与解释容器配置文件的精确规则,可以通过
systemd-nspawn 的 --settings=
选项进行设置,详见
systemd-nspawn(1)
手册。
可以在容器配置文件中包含 "[Exec]
"
小节,用于设置各种与进程执行相关的参数:
Boot=
¶接受一个布尔值,默认值为 no 。若设为 yes 则表示 systemd-nspawn
将会自动搜索并调用一个 init
进程,
同时将 Parameters=
设置的命令行参数传递给被调用的
init
进程。此选项与 systemd-nspawn
的 --boot
命令行开关相对应。注意:(1) Boot=yes
不可与
ProcessTwo=yes
同时使用。(2)当使用 systemd-nspawn@.service
模版时,就隐含的设置了 ProcessTwo=yes
。
Ephemeral=
¶接受一个布尔值,默认值为 no 。若设为 yes 则表示以无痕模式运行容器,
也就是,在启动时为容器的文件系统生成一个临时快照,并在容器终止时立即删除这个快照。
此选项等价于 --ephemeral
命令行选项(参见
systemd-nspawn(1)
手册)。
ProcessTwo=
¶接受一个布尔值,默认值为 no 。若设为 yes 则表示以 PID=2 运行指定的进程。
此选项与 systemd-nspawn 的 --as-pid2
命令行开关相对应。
因为 init 进程必须以 PID=1 运行,所以 ProcessTwo=yes
不可与
Boot=yes
同时使用。
Parameters=
¶接受一个空格分隔的参数列表。
当 Boot=no
时,
它必须是一个以二进制可执行文件开头的命令行(可以带有命令行参数);
当 Boot=yes
时,
它必须是传递给被调用的 init 进程的命令行参数。
此选项的值与传递给 systemd-nspawn
的命令行参数相对应。
Environment=
¶接受一个以
"key=value
"
格式表示的环境变量赋值表达式。
用于给被调用的容器主进程设置环境变量。
可以多次使用此选项以设置多个环境变量。
此选项与 systemd-nspawn 的 --setenv=
命令行选项相对应。
User=
¶接受一个 UNIX 用户名。
用于设置运行容器主进程的用户。
该用户必须在容器内部真实存在。
此选项与 systemd-nspawn 的 --user=
命令行选项相对应。
WorkingDirectory=
¶设置容器内部进程的工作目录。必须设为一个以容器内部的文件系统名字空间为基准的绝对路径。
此选项与 systemd-nspawn 的 --chdir=
命令行选项相对应。
PivotRoot=
¶设置在容器启动后,用于在容器内部取代 /
的替代目录。
可以设为一个单独的绝对路径或者一对冒号分隔的绝对路径。这些绝对路径都必须以容器内部的文件系统名字空间为基准。
此选项与 systemd-nspawn 的 --pivot-root=
命令行选项相对应。
Capability=
, DropCapability=
¶接受一个
空格分隔的
capabilities(7)
列表。 Capability=
用于在默认已经拥有的 capabilities
基础之上添加更多的 capabilities ;
DropCapability=
用于在默认已经拥有的 capabilities 基础之上删除特定的 capabilities 。
此二选项分别与 systemd-nspawn 的 --capability=
与
--drop-capability=
命令行选项相对应。
注意, Capability=
是一个特权指令,
仅在
.nspawn
文件位于
/etc/systemd/nspawn/
与
/run/system/nspawn/
目录中时才能生效(见上文)。
而 DropCapability=
是非特权指令,
在所有位置都有效。
NoNewPrivileges=
¶接受一个布尔值,为容器中的进程设置 PR_SET_NO_NEW_PRIVS
标记的值。
此选项等价于
--no-new-privileges=
命令行选项(参见
systemd-nspawn(1)
手册)。
KillSignal=
¶当 systemd-nspawn
自身接收到 SIGTERM 信号时,应该给容器内 PID=1 进程发送什么信号,
从而使得容器可以正常有序的关闭。
当 Boot=yes
时默认值为 SIGRTMIN+3
(对于兼容 systemd 规范的 init 来说,SIGRTMIN+3
信号会触发正常的关机流程)。所有可用的信号请参考
signal(7) 手册。
Personality=
¶设置容器的体系架构(目前仅支持 "x86
" 与 "x86-64
" 两个值)。
此选项与 systemd-nspawn 的
--personality=
命令行选项相对应。
MachineID=
¶设置传递给容器的128位"machine ID"(UUID) 。
此选项与 systemd-nspawn 的
--uuid=
命令行选项相对应。
这是一个特权指令(见前文)。
PrivateUsers=
¶设置容器对用户名字空间的支持。此选项与 systemd-nspawn 的
--private-users=
命令行选项相对应,并且可以接受的值也完全相同。这是一个特权指令(见前文)。
对于从 systemd-nspawn@.service
模版实例化而来的容器来说,
此选项的默认值为 yes 。
NotifyReady=
¶设置容器内的 init 进程对通知机制的支持。
此选项等价于 systemd-nspawn 的 --notify-ready=
命令行选项,并且可以接受的值也完全相同。
详见 systemd-nspawn(1)
手册。
SystemCallFilter=
¶设置容器的系统调用过滤器。
此选项等价于 systemd-nspawn 的 --system-call-filter=
命令行选项,并且可以接受的值也完全相同。
详见 systemd-nspawn(1)
手册。
LimitCPU=
, LimitFSIZE=
, LimitDATA=
, LimitSTACK=
, LimitCORE=
, LimitRSS=
, LimitNOFILE=
, LimitAS=
, LimitNPROC=
, LimitMEMLOCK=
, LimitLOCKS=
, LimitSIGPENDING=
, LimitMSGQUEUE=
, LimitNICE=
, LimitRTPRIO=
, LimitRTTIME=
¶为容器设置特定的 POSIX 资源限制。等价于
--rlimit=
命令行选项,并且可以接受的值也完全相同。详见
systemd-nspawn(1)
手册。
OOMScoreAdjust=
¶设置该容器的 OOM ("Out Of Memory") 计分调整值。此选项等价于
--oom-score-adjust=
命令行选项,并且可以接受的值也完全相同。详见
systemd-nspawn(1)
手册。
CPUAffinity=
¶设置该容器的CPU关联性。此选项等价于 --cpu-affinity=
命令行选项,并且可以接受的值也完全相同。详见
systemd-nspawn(1)
手册。
Hostname=
¶设置容器的初始主机名。此选项等价于
--hostname=
命令行选项,并且可以接受的值也完全相同。详见
systemd-nspawn(1)
手册。
ResolvConf=
¶如何处理容器内的 /etc/resolv.conf
文件(也就是如何处理宿主系统与容器之间的DNS同步)。
此选项等价于 --resolv-conf=
命令行选项,并且可以接受的值也完全相同。详见
systemd-nspawn(1)
手册。
Timezone=
¶如何处理容器内的 /etc/localtime
文件(也就是如何处理宿主系统与容器之间的本地时区同步)。
此选项等价于 --timezone=
命令行选项,并且可以接受的值也完全相同。详见
systemd-nspawn(1)
手册。
LinkJournal=
¶通过软连接或绑定挂载控制容器内的日志对宿主系统的可见性。此选项等价于
--link-journal=
命令行选项,并且可以接受的值也完全相同。详见
systemd-nspawn(1)
手册。
可以在容器配置文件中包含 "[Files]
"
小节,用于设置各种
与文件系统相关的参数:
ReadOnly=
¶接受一个布尔值。默认值为 no 。
设为 yes 表示将容器运行在一个只读文件系统上。
此选项与 systemd-nspawn 的
--read-only
命令行开关相对应。
Volatile=
¶接受一个布尔值或特殊值
"state
" ,
表示是否以易变的状态和/或配置运行容器。
此选项与
systemd-nspawn(1)
的 --volatile=
选项相对应。
Bind=
, BindReadOnly=
¶添加一个从主机到容器的绑定挂载点。
接受一个单独的路径、或者一对冒号分隔的路径、
或者一个以冒号作为分隔符的"路径:路径:挂载选项"三元组。
可以多次使用此选项以添加多个绑定挂载点。
此二选项分别与 systemd-nspawn 的
--bind=
与
--bind-ro=
命令行选项相对应。详见
systemd-nspawn(1)
手册。
此二选项都是特权指令(见前文)。
TemporaryFileSystem=
¶向容器内添加一个 "tmpfs
" 挂载点。
接受一个单独的路径、或者一个以冒号作为分隔符的"路径:挂载选项"。
可以多次使用此选项以添加多个
"tmpfs
" 挂载点。
此选项与 systemd-nspawn 的
--tmpfs=
命令行选项相对应。详见
systemd-nspawn(1)
手册。
此选项是特权指令(见前文)。
Overlay=
, OverlayReadOnly=
¶向容器内添加一个 overlay 挂载点。接受一个以冒号作为分隔符的路径列表。
可以多次使用此选项以添加多个 overlay 挂载点。此二选项分别与 systemd-nspawn 的
--overlay=
与 --overlay-ro=
命令行选项相对应。详见
systemd-nspawn(1) 手册。
此二选项都是特权指令(见前文)。
PrivateUsersChown=
¶接受一个布尔值。设为 yes 表示在容器已启用用户名字空间的前提下,
是否要将容器内文件与目录的拥有者修改为由 PrivateUsers=
指定的特定范围内的 UID/GID 。
此选项与 systemd-nspawn 的 --private-users-chown
命令行开关相对应。
此选项是特权指令(见前文)。
可以在容器配置文件中包含 "[Network]
"
小节,
用于设置各种与网络连接相关的参数:
Private=
¶接受一个布尔值。默认值为 no 。
设为 yes 表示将容器运行在自己专属的网络名字空间内,
也就是不与主机共享任何网络接口及网络配置。
此选项与 systemd-nspawn 的
--private-network
命令行开关相对应。
VirtualEthernet=
¶接受一个布尔值。设为 yes 表示在主机与容器之间创建一个
虚拟以太网连接("veth
"),并且自动隐含了 Private=yes
的设置。
此选项与 systemd-nspawn 的 --network-veth
命令行开关相对应。
此选项是特权指令(见前文)。
对于从 systemd-nspawn@.service
模版实例化而来的容器来说,此选项的默认值为 yes 。
VirtualEthernetExtra=
¶在主机与容器之间设置一个
虚拟以太网连接("veth
")。
接受一对冒号分隔的网口名称("主机网口:容器网口"),
前一个名称表示主机上的网络接口名称,
后一个名称表示容器内的网络接口名称。
如果省略后一个,那么表示后一个名称与前一个名称相同。
设置此选项的同时也自动隐含了
Private=yes
的设置。
此选项与 systemd-nspawn 的 --network-veth-extra=
命令行选项相对应。
可以多次使用此选项以添加多个虚拟以太网连接。
此选项与 VirtualEthernet=
之间没有关联,两者是互相独立的选项。
此选项是特权指令(见前文)。
Interface=
¶设置添加到容器中的网络接口的名称,接受一个空格分隔的网络接口名称列表。
此选项与 systemd-nspawn 的
--network-interface=
命令行选项相对应。
设置此选项的同时也自动隐含了 Private=yes
的设置。
此选项是特权指令(见前文)。
MACVLAN=
, IPVLAN=
¶在容器中添加一个 MACLVAN 或 IPVLAN 接口。
接受一个空格分隔的、要被添加到 MACLVAN 或 IPVLAN 中的网络接口名称列表。
此二选项分别与 systemd-nspawn 的
--network-macvlan=
与
--network-ipvlan=
命令行选项相对应。
设置此二选项之一的同时也自动隐含了 Private=yes
的设置。
此选项是特权指令(见前文)。
Bridge=
¶在容器中添加一个网桥,选项的值就是网桥的名称。
此选项隐含的设置了 VirtualEthernet=yes
与
Private=yes
,
并且将创建的虚拟以太网的主机端连接到容器内的网桥上。
此选项与 systemd-nspawn 的
--network-bridge=
命令行选项相对应。
此选项是特权指令(见前文)。
Zone=
¶接受一个网络 zone 名称。此选项隐含的设置了 VirtualEthernet=yes
与
Private=yes
并且将创建的虚拟以太网的主机端连接到一个自动管理的网桥上,
而这个自动管理的网桥的名称就是此选项的值(网络 zone 名称)再加上
"vz-
" 前缀。此选项与 systemd-nspawn 的 --network-zone=
命令行选项相对应。
此选项是特权指令(见前文)。
Port=
¶将容器的一个特定 TCP 或 UDP 端口映射到主机的特定端口上。
此选项与 systemd-nspawn 的
--port=
命令行选项相对应。有关此选项接受的值的格式及含义,详见
systemd-nspawn(1)
手册。
此选项是特权指令(见前文)。