machinectl 中文手册

译者:金步国


版权声明

本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。

其他作品

本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:

联系方式

由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。


手册索引 · 指令索引systemd-241

名称

machinectl — 控制 systemd 虚拟机与容器注册管理器

大纲

machinectl [OPTIONS...] {COMMAND} [NAME...]

描述

machinectl 用于内省与控制 systemd(1) 的虚拟机与容器注册管理器 systemd-machined.service(8) 的状态。

machinectl 可以操作机器(machine)与镜像(image)。 "机器"(machine)这个词有如下几种含义:

  • 在宿主系统上运行的虚拟机(Virtual Machine)实例。 也就是运行在例如KVM之类虚拟化技术之上的操作系统实例。 虚拟机拥有自己独立运行的操作系统内核。

  • 在宿主系统上运行的容器(Container)实例。 也就是与宿主系统共享操作系统内核, 仅在容器自身专属的名字空间内运行用户空间程序。

  • 正处于运行状态的宿主系统自身。

机器的名称(NAME)需要遵守与 UNIX/DNS主机名(hostname) 相同的规则(详见后文)。

机器由磁盘或文件系统镜像实例化而来, 经常(但并不必然)直接将实例中的主机名(hostname)用作机器的名称。 "镜像"(image)这个词有如下几种含义:

  • 包含操作系统的目录树。 通常包含 /usr, /etc ... 这些顶层目录。

  • 包含操作系统的 btrfs 子卷。类似于一个包含操作系统的普通目录树。

  • 包含MBR或GPT分区表以及Linux文件系统的 二进制"raw"磁盘镜像文件。

  • 包含MBR或GPT分区表以及Linux文件系统的块设备。

  • 宿主系统自身的文件系统目录树。

选项(OPTIONS)

可以识别如下命令行选项:

-p, --property=

在显示机器或镜像的属性时, 仅显示在此选项中指定的属性。 如果未使用此选项,那么将显示所有属性。 选项值必须是一个例如 "Name" 这样的属性名。 可以多次使用此选项 以显示多个属性。

-a, --all

在显示机器或镜像的属性时, 强制显示所有属性, 无论这些属性是否已被设置。

在列出虚拟机或容器镜像时, 也显示以句点字符(".") 开头的镜像。

在删除虚拟机或容器镜像时,删除所有镜像(而不仅仅是隐藏的镜像)。

--value

在使用 show 命令显示属性时,仅显示属性的值, 而不显示属性的名称以及等号("=")。

-l, --full

在显示进程树的时候,不对超长行进行截断。

--kill-who=

kill 命令一起使用, 指定要杀死哪些进程。 leader 表示仅杀死领头的父进程。 all 表示杀死所有匹配的进程。 如果未指定此选项,那么相当于使用默认值 all

-s, --signal=

kill 命令一起使用, 表示向指定的进程发送什么信号。 必须设为一个众所周知的、例如 SIGTERM, SIGINT, SIGSTOP 这样的信号。如果未指定此选项,那么相当于使用默认的 SIGTERM 信号。

--uid=

shell 命令一起使用, 表示以哪个用户身份启动交互式 shell 会话。注意,如果在 shell 命令的参数中已经给出了一个用户,那么此选项将被忽略。如果没有以任何方式指定用户身份, 那么表示使用默认的 "root" 用户。注意,此选项并不适用于 login 命令(见后文)。

-E NAME=VALUE, --setenv=NAME=VALUE

shell 命令一起使用,向 shell 传递指定的环境变量。 其中, NAME 是变量名称,VALUE 是变量的值。 可以多次使用此选项以设置多个环境变量。 注意,此选项并不适用于 login 命令(见后文)。

--mkdir

bind 命令一起使用, 表示在实际执行绑定挂载动作之前,先创建目标挂载点文件或目录。 注意,虽然此选项的名称看上去只能创建目录,但是如果要挂载的对象是常规文件、设备节点、套接字、管道(FIFO), 此选项仍然能够创建要挂载的目标文件节点。

--read-only

bind 命令一起使用,表示创建只读绑定挂载点。

clone, import-raw, import-tar 命令一起使用, 表示创建一个只读的容器或虚拟机镜像。

-n, --lines=

status 命令一起使用, 表示显示多少行日志(从最近的一行日志算起)。 必须设为一个正整数。 默认值是 10 。

-o, --output=

status 命令一起使用, 控制日志的显示格式。 可用的格式参见 journalctl(1) 手册。 默认值是 "short" 。

--verify=

是否在下载容器或虚拟机镜像时 校验其有效性。 可设为 "no", "checksum", "signature" 之一。 "no" 表示不作任何校验; "checksum" 表示仅校验镜像文件的散列值; "signature" 表示不但校验镜像文件的散列值, 而且还要根据本地的可信公钥/证书校验校验镜像文件的签名。 强烈建议尽可能将此选项设为 "signature" 以获取最强的安全保护。 默认值为 "signature" 。

--force

在下载容器或虚拟机镜像时, 如果本地已经存在同名镜像, 那么强制使用新下载的镜像 覆盖本地的同名镜像。

--format=

export-tarexport-raw 命令一起使用, 指定结果文件的压缩格式。可设为 "uncompressed", "xz", "gzip", "bzip2" 之一。 默认值根据指定的镜像文件名称 自动猜测。

--max-addresses=

list-machines 命令一起使用, 限制每一个机器输出的最大IP地址数量(默认值是"1")。 设为 "all" 表示输出全部的IP地址。 如果 --max-addresses 的值小于实际的IP地址数, 那么将在最后一个IP地址后面显示 "..." 。 如果要为某个机器输出多个IP地址, 那么除第一个IP地址之外的其他每一个IP地址都会占有一个新行, 并且如果还有后继的IP地址要输出,那么还会带有一个 "," 后缀。

-q, --quiet

安静模式,也就是不显示额外的运行时信息。

-H, --host=

操作指定的远程主机。可以仅指定一个主机名(hostname), 也可以使用 "username@hostname" 格式。 hostname 后面还可以加上 SSH监听端口(以冒号":"分隔)与容器名(以正斜线"/"分隔), 也就是形如 "hostname:port/container" 的格式, 以表示直接连接到指定主机的指定容器内。 操作将通过SSH协议进行,以确保安全。 可以通过 machinectl -H HOST 命令列出远程主机上的所有容器名称。IPv6地址必须放在方括号([])内。

-M, --machine=

连接到指定的本地容器内的 systemd-machined.service(8) 服务, 并在指定的本地容器内执行操作。

--no-pager

不将程序的输出内容管道(pipe)给分页程序。

--no-legend

不输出列标题, 也就是不在输出列表的头部和尾部显示字段的名称。

--no-ask-password

在执行特权操作时不向用户索要密码。

-h, --help

显示简短的帮助信息并退出。

--version

显示简短的版本信息并退出。

命令(COMMAND)

可以识别的命令如下:

机器(Machine)命令

list

列出当前正在运行的虚拟机与容器。 如果要列出可以启动的机器镜像,那么应该使用 list-images 命令(见下文)。 注意,此命令默认不显示例如 ".host" 这样名称以句点开头的机器(可以使用 --all 选项来强制显示)。

status NAME

显示 当前正在运行的虚拟机与容器的状态信息, 并且在末尾部还会附上几条该机器最新的日志消息。 此命令仅用于输出人类易读的信息, 不要将其用于程序分析(应该使用 show 命令)。 注意, 显示的日志消息来自于虚拟机与容器管理器, 其中通常包含有机器的控制台输出, 且并不必然包含机器自身的日志内容。

show [NAME…]

如果未指定任何 NAME 参数,那么显示虚拟机与容器管理器自身的属性; 如果指定了至少一个 NAME 参数,那么显示指定的虚拟机与容器的各项属性(必须是已注册的机器)。 注意,默认不显示尚未设置的属性,但是可以通过使用 --all 选项强制显示所有属性。可以使用 --property= 选项限定仅显示指定的属性。 此命令仅用于输出易于程序分析的信息,如果想要输出人类易读的信息, 应该使用 status 命令。

start NAME

将指定的每个容器都作为一个系统服务启动(通过 systemd-nspawn(1) 工具)。这将会按照指定的机器名称对 systemd-nspawn@.service 进行实例化,然后再像 systemctl start 一样启动所得到的服务单元实例。 systemd-nspawn 将会按照指定的名称在 /var/lib/machines/ 等搜索目录(详见下文)中查找容器镜像并运行它。 可以使用下文的 list-images 命令列出可启动的容器镜像。

注意,因为 systemd-machined.service(8) 不但可以与 systemd-nspawn 通信, 还可以与多种不同的其他虚拟机与容器管理器通信, 所以,同样的, machinectl 的大部分命令 不但可以作用于 systemd-nspawn 管理器, 还可以作用于多种不同的其他虚拟机与容器管理器。 注意,使用此命令启动其他其他虚拟机与容器管理器的虚拟机与容器, 需要配合该管理器的专用工具。

如果想要在命令行上交互式启动一个容器, 并能够完全在容器的控制台上操作,那么必须直接使用 systemd-nspawn 命令。 可以使用 machinectl poweroff 命令关闭运行中的容器。

login [NAME]

在宿主机或指定的容器中 开启一个交互式的终端登录会话。 如果指定了 NAME 参数,那么表示连接到指定名称的容器; 如果未指定 NAME 参数或者其值为空字符串或者特殊值 ".host" (见后文), 那么表示连接到本地宿主机。 这将创建一个连接到宿主机或指定容器的终端(TTY), 并在其中启动 getty 程序。 注意, 此命令仅适用于将 systemd(1) 用作 init 进程的系统。

此命令将在指定的容器或宿主机上打开一个登录提示符, 并提示输入用户名与密码进行登录。 可以使用下文的 shell 命令、或者带有 --machine= 选项的 systemd-run(1) 命令直接运行一个单独的命令行 (可以在前台交互式运行 也可以在后台非交互式运行)。

shell [[USER@]NAME [PATH [ARGUMENTS…]]]

在宿主机或指定的容器中 以特定的用户身份运行一个指定的命令。 第一个参数表示连接到哪个机器: 如果指定了 NAME 参数,那么表示连接到指定名称的容器; 如果未指定 NAME 参数或者其值为空字符串或者特殊值".host"(见后文), 那么表示连接到本地宿主机。 这与 login 命令类似, 但不同之处在于此命令会立即运行 PATH 参数所指定的命令(若未指定则表示启动该用户的默认 shell , 若该用户没有默认 shell 则启动 /bin/sh 进程)。 USER 的默认值是 "root" 用户,但是可以通过 --uid= 选项或者明确设置 USER 的值来指定其他用户。 可以使用 --setenv= 选项来为被执行的进程设置环境变量。

注意,machinectl shell 并不传递被调用进程的退出状态。 不过 systemd-run 工具可以传递被调用进程的退出状态(见下文)。

如果不带任何参数的使用 shell 命令, 那么将会在本地宿主机上启动一个交互式 shell 会话(默认为 "root" 用户), 这与启动一个 su(1) 会话很类似,但是不同之处在于, 新启动的 shell 会话与原来的老 shell 会话是完全隔离的, 新老会话不共享任何进程与会话属性,新会话完全处于一个干净的状态, 新会话不带有老会话的任何痕迹。 新会话将会拥有全新的 utmp, login, audit, security and keyring session, ... 并且不会继承 任何老会话中的环境变量与资源限制等各种属性。

设置了 --machine= 选项的 systemd-run(1) 命令 可以用于代替 machinectl shell 命令, 前者具有下列优势:(1)允许非交互式操作;(2)可以更详细的对被调用单元进行底层配置; (3)可以传递被调用进程的运行时状态与退出状态。具体说来就是使用 systemd-run--wait 选项来传递被调用进程的退出状态; 使用 systemd-run--pty 选项来获得一个交互式 shell (与 machinectl shell 类似)。 在实践中,systemd-run 一般用于脚本。 需要注意的是,systemd-run 有可能比 machinectl shell 要求更高的权限。

enable NAME…, disable NAME

是否在宿主系统启动的同时 自动使用 systemd-nspawn(1) 将指定的容器作为系统服务来启动。也就是启用/禁用指定的容器所对应的 systemd-nspawn@.service 实例化单元。 这两个命令在效果上与 systemctl enable / systemctl disable 对服务单元的效果相同。

poweroff NAME

关闭指定的容器。 这将会向指定容器中的 init 进程发送 SIGRTMIN+4 信号, 遵守 systemd 规范的 init 进程将会干净的妥善关闭整个容器。 [提示] stoppoweroff 的别名。 注意,对于不遵守 systemd(1) 规范的 init 进程来说(例如 sysvinit),此命令是无效的。 下文的 terminate 命令可以强制立即关闭一个虚拟机或容器, 但是有可能会造成数据丢失。

reboot NAME

重启指定的容器。 这将会向指定容器中的 init 进程发送 SIGINT 信号, 大致上相当于向指定的容器发送 Ctrl+Alt+Del 组合键。 该命令兼容于 所有容器内的各种 init 进程。

terminate NAME

强制立即关闭指定的虚拟机或容器,这有可能会造成数据丢失。 此命令强制立即关闭虚拟机或容器的所有进程, 并立即回收指定机器的所有资源。 应该谨慎使用此命令, 建议尽可能使用 poweroff 命令 干净的关闭容器。

kill NAME

向指定的虚拟机或容器内的一个或多个 --kill-who= 进程发送 --signal= 信号。 注意,这里的进程是指在宿主机上看到的进程, 而不是在虚拟机或容器内看到的进程。

bind NAME SOURCE [TARGET]

将宿主机上的指定路径绑定挂载到指定容器内的指定路径上。NAME 是容器名, SOURCE 是宿主机上的源文件或目录的路径,TARGET 是容器内的目标文件或目录的路径。 如果省略后一个参数,那么表示容器内的目标路径与宿主机上的源路径相同。 如果使用了 --read-only 选项,那么表示以只读的方式绑定挂载。 如果使用了 --mkdir 选项,那么表示自动创建不存在的目标文件或目录。 注意,--mkdir 选项仅可用于 systemd-nspawn(1) 创建的容器,并且仅在未使用 --private-users 选项的情况下才有效。此命令支持绑定挂载 目录、普通文件、设备节点、AF_UNIX 套接字、 管道(FIFO)。

copy-to NAME SOURCE [TARGET]

将宿主机上的指定路径(文件或目录)复制到指定容器内的指定路径上。 NAME 是容器名, SOURCE 是宿主机上的某个路径(文件或目录), TARGET 是指定容器内的某个路径 (省略表示与 SOURCE 相同)。

如果宿主机与容器共享同一个用户名字空间, 那么文件与目录的UID/GID在复制后保持不变, 否则复制后的文件与目录的UID/GID将被统一设为"0"。

copy-from NAME SOURCE [TARGET]

将指定容器内的指定路径(文件或目录)复制到宿主机上的指定路径上。 NAME 是容器名, SOURCE 是指定容器内的某个路径(文件或目录), TARGET 是宿主机上的某个路径 (省略表示与 SOURCE 相同)。

如果宿主机与容器共享同一个用户名字空间, 那么文件与目录的UID/GID在复制后保持不变, 否则复制后的文件与目录的UID/GID将被统一设为"0"。

镜像(Image)命令

list-images

列出本地已安装的 虚拟机与容器镜像。 这将列出所有搜索目录(例如 /var/lib/machines/ 等,详见后文)中的磁盘镜像、容器根目录或子卷。 可以使用上文的 start 命令启动此命令列出的容器。 注意,除非使用了 --all 选项, 否则此命令不会显示名称以句点(".")开头的容器。 注意,名为 ".host" 的特殊镜像总是隐含存在的, 其含义是宿主机自身的镜像。

image-status [NAME…]

显示指定镜像(可以是虚拟机镜像也可以是容器镜像)或者镜像池自身的简洁状态信息。 如果未指定任何 NAME 参数,那么将显示镜像池自身的搜索目录、已用空间、剩余空间。 此命令仅用于输出人类易读的信息, 不要将其用于程序分析(应该使用下面的 show-image 命令)。

show-image [NAME…]

显示指定镜像(可以是虚拟机镜像也可以是容器镜像)或者镜像池自身的属性。 如果未指定任何 NAME 参数, 那么将显示镜像池自身的搜索目录、已用空间、剩余空间。 如果明确指定了至少一个 NAME 参数, 那么将显示指定虚拟机或容器的镜像属性。 注意,此命令默认不显示尚未设置的属性,但是可以通过使用 --all 选项强制显示所有属性。可以使用 --property= 选项限定仅显示指定的属性。 此命令仅用于输出易于程序分析的信息,如果想要输出人类易读的信息, 应该使用 image-status 命令。

clone FROMNAME TONAME

克隆一个虚拟机或容器镜像。 FROMNAME 表示克隆的源镜像名称,TONAME 表示新创建的克隆镜像名称。 注意,如果底层文件系统支持,那么基于单纯目录树的容器镜像将会优先克隆为 btrfs 子卷。 也就是说,如果底层文件系统支持写时复制(copy-on-write)技术, 那么在克隆时将会自动利用该技术。

注意,因为此命令并不会在克隆过程中修改例如 主机名(hostname), "machine ID" 之类的系统实例标识符, 所以克隆得到的副本镜像将会和源镜像拥有完全相同的系统标识, 在某些情况下, 可能需要手动的修改这些标识符。

如果和 --read-only 选项一起使用, 那么表示创建一个只读的克隆镜像。

rename OLDNAME NEWNAME

将名为 OLDNAME 的虚拟机或容器镜像 重命名为 NEWNAME

read-only NAME [BOOL]

设置/取消指定虚拟机或容器镜像的只读属性。 NAME 表示镜像的名称, 如果省略 BOOL 参数, 那么相当于设为 yes (设置只读标记)。

remove NAME

从镜像池中删除指定的虚拟机或容器镜像。 注意,不可以删除表示宿主机的、名为 ".host" 的特殊镜像。

set-limit [NAME] BYTES

为全部或指定的镜像(可以是虚拟机镜像也可以是容器镜像) 设置可占用的最大磁盘空间(以字节为单位)。 如果省略了 NAME 参数, 那么表示设置全部本地虚拟机与容器镜像总计能够占用的最大磁盘空间(以字节为单位)。 如果指定了 NAME 参数, 那么表示仅设置指定的虚拟机或容器镜像可占用的最大磁盘空间(以字节为单位)。 BYTES 参数用于设置最大磁盘空间的尺寸(以字节为单位,可以附加 K, M, G, T 后缀), 特殊值 "-" 表示取消大小限制。

注意,针对每个容器的磁盘空间限制仅支持 btrfs 文件系统。

clean

删除所有隐藏的虚拟机与容器镜像。也就是删除 /var/lib/machines 目录下所有名称以句点开头的镜像。 可以使用 machinectl list-images --all 命令列出所有镜像(包括隐藏的镜像)。

如果使用了 --all 选项,那么将会删除所有镜像(而不仅仅只是隐藏的镜像), 这相当于是彻底清空 /var/lib/machines 目录。

注意,例如 machinectl pull-tarmachinectl pull-raw 这样的命令,通常都会在克隆已下载镜像的可写入副本(用于常规目的)之前, 首先根据下载的镜像创建一个隐藏的、只读的、原封不动的镜像,以避免在多次使用下载镜像时再次重复下载。 machinectl clean 命令可以用于删除 出于此目的而创建的过时隐藏镜像。

镜像传输命令

pull-tar URL [NAME]

从指定的 URL 下载一个 .tar 格式的容器镜像, 并按照 NAME 名称将其存储在本地镜像池中。 URL 的类型必须是 "http://" 或 "https://" ,并且必须是一个 .tar, .tar.gz, .tar.xz, .tar.bz2 归档文件。如果省略了 NAME 参数, 那么镜像的名称将自动由归档文件的名称中提取 (也就是去掉上述后缀)。

除非明确使用了 --verify=no 选项, 否则将会自动校验下载的镜像文件。 校验操作可以是基于内联的签名文件(与镜像同名并以 .sha256 作为后缀), 也可以是基于分离的 SHA256SUMSSHA256SUMS.gpg 签名文件。 签名文件必须与镜像文件位于同一个 URL 的同一个目录中。 如果明确指定了 --verify=checksum , 那么表示仅基于 .sha256SHA256SUMS 文件校验镜像文件的 SHA256 散列值。 如果明确指定了 --verify=signature , 那么表示基于 .sha256SHA256SUMS.gpg 文件校验镜像文件的 SHA256 散列值。 注意,基于GPG的校验要求所使用的GPG公钥必须已经预先存在于 /usr/lib/systemd/import-pubring.gpg/etc/systemd/import-pubring.gpg 文件中。

容器镜像 将会被下载并保存到 /var/lib/machines/ 目录下的一个只读子卷上, 镜像文件的本地保存名称由 ".tar-" + "镜像的URL" + "HTTP etag" 组成, 随后,将从该子卷上创建一个名为 NAME 的可写快照。 这样就可以高效的根据同一个URL下载的镜像创建多个不同的容器实例, 而不必重复下载同一个镜像。 如果你想只创建只读镜像,而避免创建可写快照, 那么可以将 NAME 参数设为 "-" 。

注意,因为只读子卷的名称带有 .tar- 前缀,所以 list-images 命令必须配合 --all 选项才能显示出来。

注意,在此命令的执行过程中按 Ctrl+C 键并不会中断下载。 要想中断下载, 应该使用下文的 cancel-transfer 命令。

pull-raw URL [NAME]

从指定的 URL 下载一个 .raw 格式的容器或虚拟机磁盘镜像, 并按照 NAME 名称将其存储在本地镜像池中。 URL 的类型必须是 "http://" 或 "https://" ,并且必须是一个 .qcow2.raw 格式的磁盘镜像。 磁盘镜像可以是经过压缩的(也就是带有 .gz, .xz, .bz2 后缀)。 如果省略了 NAME 参数, 那么镜像的名称将自动由归档文件的名称中提取 (也就是去掉上述后缀)。

镜像文件的校验规则与上文的 pull-tar 命令完全相同。

如果下载的镜像是 .qcow2 格式, 那么将会被自动转化为 .raw 格式进行存储。

下载的镜像将会以只读 .raw 文件的方式存放在 /var/lib/machines/ 目录中, 镜像文件的本地保存名称由 ".raw-" + "镜像的URL" + "HTTP etag" 组成, 随后,将会自动创建一个名为 NAME 的本地可写入副本。 如果你只想保存只读镜像,而不想创建可写入副本, 那么可以将 NAME 参数设为 "-" 。

注意, 因为只读镜像的名称带有 .raw- 前缀,所以 list-images 命令必须配合 --all 选项才能显示出来。

注意,在此命令的执行过程中按 Ctrl+C 键并不会中断下载。 要想中断下载, 应该使用下文的 cancel-transfer 命令。

import-tar FILE [NAME], import-raw FILE [NAME]

FILE 文件导入一个 TAR/RAW 格式的虚拟机或容器镜像, 并按照 NAME 名称将其存储在本地镜像池(/var/lib/machines/)中。 对于 import-tar 命令来说, FILE 必须是一个 tar 归档文件(可以经过 xz, gzip, bzip2 压缩), 此文件将被释放到 /var/lib/machines 目录下一个名为 NAME 的子卷上。 对于 import-raw 命令来说, FILE 必须是一个 qcow2 或者 raw 磁盘镜像(可以经过 xz, gzip, bzip2 压缩), 此镜像将被释放为 /var/lib/machines 目录下一个名为 NAME.raw 的文件。 如果省略了 NAME 参数,那么其值将自动从 FILE 参数中获取。 如果将 FILE 设置为 "-" , 那么镜像的内容将从标准输入读取,此时必须明确设置 NAME 参数。

可选地,可以使用 --read-only 选项来创建一个只读的虚拟机或容器镜像。 注意,在导入镜像时,并不会对镜像进行密码验证。

与镜像的下载类似, 既可以使用 list-transfers 命令列出正在导入的镜像, 也可以使用 cancel-transfer 命令取消正在进行中的镜像导入操作。

import-fs DIRECTORY [NAME]

将本地目录 DIRECTORY 作为容器映像,导入本地镜像池(/var/lib/machines/)中。 所执行的操作与 import-tarimport-raw 类似, 不同之处仅在于 DIRECTORY 是一个镜像目录而非镜像文件。 如果系统支持,该命令会为新镜像创建 btrfs 快照或子卷。

export-tar NAME [FILE], export-raw NAME [FILE]

导出 名为 NAME 的虚拟机或容器的 TAR/RAW 镜像, 并将其保存为 FILE 文件。 如果 FILE 参数以 ".gz" 结尾,那么将在保存时使用 gzip 压缩。 类似的,以 ".xz" 结尾表示使用 xz 压缩、 以 ".bz2" 结尾表示使用 bzip2 压缩。 不以上述三种压缩格式结尾,则表示不作任何压缩。 省略 FILE 参数表示将镜像的内容输出到标准输出。 可以使用 --format= 选项明确设置压缩格式, 这在省略 FILE 参数时特别有用。

与镜像的下载和导入类似, 既可以使用 list-transfers 命令列出正在导出的镜像, 也可以使用 cancel-transfer 命令取消正在进行中的镜像导出操作。

注意,目前只有目录与子卷的镜像可以导出为 TAR 镜像, 并且目前只有 raw 格式的磁盘镜像可以导出为 RAW 镜像。

list-transfers

列出当前 正在传输(下载、导入、导出)的 虚拟机与容器镜像。

cancel-transfer ID

取消指定 ID 编号的 镜像传输(下载、导入、导出)操作。 可以使用上文的 list-transfers 命令列出当前正在传输的镜像所对应的 ID 号。

机器与镜像的名称(NAME)

机器与镜像的名称必须严格遵守特定的规范。 机器的名称首先必须是一个合格的主机名(hostname), 并且所能使用的字符范围比 DNS 与 UNIX/Linux 的语义更狭小。 具体说来就是, 机器的名称必须满足以下规则: (1)由句点连接的至少一个非空标签字符串组成; (2)句点不得出现在开头或末尾; (3)不得连续使用句点; (4)标签字符串中只能含有英文字母、阿拉伯数字、连字符(-)、下划线(_); (5)总长度不得超过64个字符。

宿主系统自身用一个名为 ".host" 的特殊机器表示。 这主要是为了便于在宿主系统上执行某些操作或对宿主系统自身进行检查。 注意,machinectl list 命令必须配合 --all 选项才能显示该机器。

镜像的名称就不需要遵守那么多苛刻的要求了, 只要是可以作为文件名使用的 UTF-8 字符串即可: (1)不可以包含正斜杠;(2)不可以是单句点(.)或双句点(..);(3)不可以包含控制字符; 但是考虑到许多命令会自动根据给定机器名称去搜索对应的镜像, 所以还是强烈建议镜像的名称同样要 遵守与机器的名称一样的苛刻要求。

宿主系统自身的镜像用一个名为 ".host" 的特殊镜像表示, 这正好与上文提及的名为 ".host" 的特殊机器相对应。 注意,machinectl list-images 命令必须配合 --all 选项才能显示该镜像。

文件与目录

机器镜像优先存储在 /var/lib/machines/ 目录中, 但是也会在 /usr/local/lib/machines//usr/lib/machines/ 目录中搜索镜像, 出于兼容性原因,还会在 /var/lib/container/ 中搜索镜像。 注意,存储在 /usr 下的镜像总是被视为只读镜像(总是以只读方式使用)。 可将其他位置的镜像软连接至 /var/lib/machines/ 目录中, 以便于利用 machinectl 工具进行管理。

注意,对镜像的某些操作仅在 btrfs 文件系统上才能支持(或者才能更有效、或者才能保证原子性)。

如下三种格式的磁盘镜像能够被 systemd-nspawn(1)machinectl 识别:

  • 一个被视为容器根目录的普通目录树, 其中包含了容器名字空间内的所有文件与目录。

  • btrfs 文件系统子卷。 它与前面所说的普通目录非常类似, 不过额外带有 一些能够提高例如克隆或磁盘限额性能的特性。

  • "Raw"格式的磁盘镜像,也就是一个包含 GPT 或 MBR 分区表的原始二进制磁盘镜像。 此种类型的镜像其实就是一个以 ".raw" 为后缀的普通文件。

参见 systemd-nspawn(1) 手册以了解更多有关镜像格式的说明,特别是对于 --directory=--image= 选项的说明。

例子

例 1. 下载一个 Ubuntu 镜像并在其中启动一个 shell

# machinectl pull-tar https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-root.tar.xz
# systemd-nspawn -M xenial-server-cloudimg-amd64-root

这将下载一个 .tar 镜像并对其进行校验,然后使用 systemd-nspawn(1) 在该容器内启动一个 shell 。


例 2. 下载一个 Fedora 镜像、为 root 用户设置密码、 最后将此容器作为一个系统服务运行

# machinectl pull-raw --verify=no https://dl.fedoraproject.org/pub/fedora/linux/releases/27/CloudImages/x86_64/images/Fedora-Cloud-Base-27-1.6.x86_64.raw.xz
# systemd-nspawn -M Fedora-Cloud-Base-27-1.6.x86_64
# passwd
# exit
# machinectl start Fedora-Cloud-Base-27-1.6.x86_64
# machinectl login Fedora-Cloud-Base-27-1.6.x86_64

这将下载一个 .raw 镜像(但是并不对其进行校验), 首先在其中启动一个 shell 并在设置好 root 用户的密码之后退出, 然后再将此容器作为一个系统服务运行, 最后再在容器中启动登录提示符以等待用户登录。


例 3. 将一个容器镜像导出为一个 tar 归档文件

# machinectl export-tar fedora myfedora.tar.xz

将名为 "fedora" 的容器导出为一个经过 xz 压缩的 myfedora.tar.xz 归档文件, 并将其保存在当前目录中。


例 4. 创建一个新的 shell 会话

# machinectl shell --uid=lennart

在本地宿主机上为 "lennart" 用户创建一个新的 shell 会话。 此命令与 su(1) 命令有一点类似。


退出状态

返回值为 0 表示成功, 非零返回值表示失败代码。

环境变量

$SYSTEMD_PAGER

指定分页程序。仅在未指定 --no-pager 选项时有意义。 此变量会覆盖 $PAGER 的值。如果 $SYSTEMD_PAGER$PAGER 都未设置, 那么将会依次尝试如下常见的分页程序: less(1), more(1), 如果最终仍未找到分页程序,那么将不使用分页。 将此变量设为空字符串或 "cat" 等价于使用 --no-pager 选项。

$SYSTEMD_LESS

用于覆盖默认传递给 less 程序的命令行选项("FRSXMK")。

如果 $SYSTEMD_LESS 的值不含 "K" , 并且使用 less 作为分页程序,那么 Ctrl+C 信号将会被忽略。 这将允许 less 自己处理 Ctrl+C 信号。

$SYSTEMD_LESSCHARSET

用于覆盖默认传递给 less 程序的字符集。 (如果终端兼容 UTF-8 ,那么默认值是 "utf-8" )

参见

systemd(1), systemd-machined.service(8), systemd-nspawn(1), systemd.special(7), tar(1), xz(1), gzip(1), bzip2(1)