systemd.nspawn 中文手册
名称
systemd.nspawn — 容器配置
大纲
/etc/systemd/nspawn/
machine
.nspawn
/run/systemd/nspawn/
machine
.nspawn
/var/lib/machines/
machine
.nspawn
描述
容器配置文件(后缀名必须是.nspawn
)用于封装本地容器的运行时配置。systemd-nspawn(1)将会在启动一个容器时,搜索并读取对应的容器配置文件。容器配置文件的名称必须与其定义的本地容器的名称保持一致。这些配置文件并非必须,仅在某个容器的执行环境确实与默认配置不一致的时候,才有可能需要专门使用一个特定的配置文件。因为容器配置文件中的各项配置大多可以直接在 systemd-nspawn 命令行上指定,所以仅在确实需要将某个容器的特殊配置持久保存起来的时候,才必须专门使用一个特定的配置文件。容器配置文件的语法与XDGDesktop 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] 小节选项
可以在容器配置文件中包含 "[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] 小节选项
可以在容器配置文件中包含 "[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] 小节选项
可以在容器配置文件中包含 "[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) 手册。此选项是特权指令(见前文)。