跳到主要内容

初始化 Podman 虚拟机

介绍

podman-machine-init 是 Podman 工具集中的一个命令,用于初始化 Podman 虚拟机。该命令在 MacOS 和 Windows 平台上特别有用,因为这些平台上的 Podman 需要一个虚拟机来运行 Linux 容器。通过 podman-machine-init 命令,用户可以创建和配置这些虚拟机,以便在它们上运行和管理容器。

基本用法

初始化默认的 Podman 虚拟机,并从互联网拉取所需的内容:

podman-machine init

带有选项的用法

指定虚拟机名称

用户可以为虚拟机指定一个特定的名称:

podman-machine init myvm

在这个例子中,虚拟机的名称将被设置为 myvm

设置为 rootful 模式

默认情况下,Podman 以 rootless 模式运行,这意味着它不需要 root 权限。但是,如果需要,用户可以通过 --rootful 选项将虚拟机设置为 rootful 模式:

podman-machine init --rootful

设置磁盘大小

用户可以指定虚拟机的磁盘大小:

podman-machine init --disk-size 50

这里,虚拟机的磁盘大小被设置为 50GB。

设置内存大小

为虚拟机指定内存大小:

podman-machine init --memory=1024 myvm

在这个例子中,名为 myvm 的虚拟机将被分配 1024MB(即 1GB)的内存。

挂载主机目录

用户还可以将主机上的目录挂载到虚拟机中:

podman-machine init -v /Users:/mnt/Users

这个命令将主机的 /Users 目录挂载到虚拟机的 /mnt/Users 目录下。

USB 设备直通

对于支持 QEMU 的虚拟机,用户可以通过 --usb 选项启用 USB 设备直通:

podman-machine init --usb vendor=13d3,product=5406

这个命令将通过指定的厂商 ID 和产品 ID 启用 USB 设备直通。

同样地,用户也可以通过指定总线号和设备号来启用 USB 设备直通:

podman-machine init --usb bus=1,devnum=3

查看帮助信息

要查看 podman-machine-init 命令的完整选项列表和详细信息,可以使用 --help 选项:

podman-machine init --help

注意事项

  • 在初始化虚拟机之前,请确保已经安装了 Podman 并配置好了所有必要的依赖项。
  • 根据不同的平台和网络条件,虚拟机的初始化可能需要一些时间,因为需要从互联网下载镜像和组件。
  • 对于高级用户,可能还需要配置虚拟机的其他参数,如网络设置、CPU 核心数等。这些参数可以通过其他 Podman 命令或虚拟机管理工具进行配置。

初始化一个新的虚拟机,用于运行Podman容器。

Podman 在非 Linux 平台上(如 MacOS 和 Windows)运行容器需要依赖一个虚拟机环境,因为容器是 Linux 原生的,不能直接在非 Linux 系统上运行。podman machine 命令集用于管理这些虚拟机。

podman machine init 命令用于初始化一个新的虚拟机。如果没有指定机器名称,新机器将使用默认名称 podman-machine-default

在初始化过程中,SSH 密钥将自动生成以便访问虚拟机,并配置连接到虚拟机内的 root 用户和普通用户的连接。

默认情况下,虚拟机将使用 Fedora CoreOS 作为操作系统。虽然 Fedora CoreOS 会定期发布更新,但 Podman machine 默认不会启用自动更新功能。

若要检查是否有可用的系统更新,可以使用以下命令通过 SSH 进入虚拟机并执行检查:

podman machine ssh 'sudo rpm-ostree status'

如果发现有更新可用,并且您希望进行更新,可以执行类似下面的命令(注意:这可能需要一些时间,并且在更新过程中可能需要重启虚拟机):

podman machine ssh 'sudo rpm-ostree upgrade'

更新完成后,建议重新启动虚拟机以确保所有变更生效:

podman machine stop
podman machine start

请注意,更新 Podman 机器中的操作系统可能会导致主机上的 Podman 版本与虚拟机中的版本不匹配。执行 podman --version 和通过 podman machine ssh podman --version 可以分别查看主机和虚拟机中的 Podman 版本。虽然轻微的版本差异可能不会造成问题,但建议尽量保持版本一致,以避免潜在的不兼容问题。

有关更新和高级配置的更多信息,请参阅 Fedora CoreOS 的文档,其中涉及自动更新更新策略

Fedora CoreOS 的升级每 14 天发布一次,并会自动检测和安装。升级期间虚拟机会重启。

如需了解更多关于更新和高级配置的信息,请参阅 Fedora CoreOS 的文档,特别是关于自动更新更新策略的部分。这些文档提供了关于如何配置和管理 Fedora CoreOS 系统更新的详细指南。

选项

选项描述
--cpus=numberCPU 数量。
--disk-size=number虚拟机磁盘大小(GiB)。
--help打印使用说明。
--ignition-pathIgnition 文件的完整路径。
如果提供了 Ignition 文件,该文件将被复制到用户的 CONF_DIR 中并重命名。此外,不会生成任何 SSH 密钥,也不会建立任何系统连接。假定用户手动或以其他方式处理了这些操作。
--image虚拟机镜像的完整注册表、路径或 URL。
注册表目标必须采用 docker://registry/repo/image:version 的形式。
--memory, -m=number内存大小(MiB)。注意:1024MiB = 1GiB。
--now初始化后立即启动虚拟机。
--rootful该机器是否偏好 rootful(true)或 rootless(false)容器执行。此选项决定了在没有现有远程连接配置时的默认远程连接。
如果可用,API 转发将遵循此设置。
security_model=[model]指定 9p 安全模型(见下文)。9p 安全模型决定了 9p 文件系统在将某些文件系统操作实际存储在主机上之前如何进行转换。在 MacOS 上,为了允许符号链接正常工作,默认的安全模型是 nonemapped-xattr 的值表示 9p 将符号链接和一些文件属性作为主机上的扩展属性存储。这适用于主机和客户端不需要在共享文件系统上相互操作的情况,但在实际共享访问时存在限制;特别是,主机上的符号链接在客户端上不可用,反之亦然。如果需要互操作性,则选择 none。但请注意,客户端无法执行运行虚拟机的用户无法执行的操作,例如创建由另一个用户拥有的文件。对于只读卷,使用 none 几乎肯定是最佳选择。示例:-v "$HOME/git:$HOME/git:ro,security_model=none"。默认的卷挂载在 containers.conf 中定义。除非进行更改,否则默认值为 $HOME:$HOME
--volume-driver用于从主机挂载卷的驱动程序,例如 virtfs

这些选项允许用户自定义虚拟机的配置,如 CPU 数量、内存大小、磁盘大小等。其中,Ignition 文件是一个配置文件,用于在 Fedora CoreOS 启动时执行一次性设置。--image 选项允许用户指定一个自定义的虚拟机镜像。--now 选项可以确保在初始化后立即启动虚拟机。最后,--rootful 选项决定了容器执行的权限级别。

选项描述
--timezone设置机器和容器的时区。有效值可以是 local 或一个时区字符串,如 America/Chicago。默认值为 local,表示使用机器主机的时区。在 WSL(Windows Subsystem for Linux)中,此选项无效,WSL 会自动将时区设置为与主机 Windows 操作系统相同的时区。
--usb=bus=number,devnum=numbervendor=hexadecimal,product=hexadecimal通过 USB 直通将主机上的 USB 设备分配给虚拟机。此选项仅适用于 QEMU 机器。为了成功分配设备,该设备需要在用户组中具有适当的权限。使用总线和设备编号可以精确指定设备,但这些值可能会因重新启动或设备移除而改变。如果指定了供应商和产品 ID,则会分配第一个匹配的设备。
--user-mode-networking此选项通常用于配置用户模式网络,允许虚拟机使用主机网络堆栈中的网络接口。具体细节和配置可能因 Podman 的版本和配置而异。
--username用于在远程虚拟机中执行命令的用户名。默认值取决于虚拟机使用的操作系统镜像。对于基于 Fedora Core OS (FCOS) 的镜像,默认值为 core;对于基于 Fedora 的镜像(尤其是在 Windows 主机上),默认值为 user。此选项应匹配虚拟机镜像中预设的用户名。
--volume, -v=source:target[:options]从主机上的源目录挂载卷到虚拟机中的目标目录。可以指定额外的选项,如 ro(只读)或 rw(读写,默认值),来控制挂载的访问权限。多个选项可以使用逗号分隔。

示例

初始化默认的 Podman 机器,从互联网拉取内容。

podman machine init

为指定名称的 Podman 机器初始化,从互联网拉取内容。

podman machine init myvm

初始化默认的 Podman 机器,从互联网拉取内容,并默认使用 rootful 模式。默认是 rootless 模式。

podman machine init --rootful

初始化默认的 Podman 机器,覆盖其磁盘大小设置,从互联网拉取内容。

podman machine init --disk-size 50

初始化指定名称的 Podman 机器,覆盖其内存大小,从互联网拉取内容。

podman machine init --memory=1024 myvm

初始化默认的 Podman 机器,将主机目录 /Users 挂载到虚拟机中的 /mnt/Users

podman machine init -v /Users:/mnt/Users

初始化默认的 Podman 机器,并指定 USB 直通选项以传递 USB 设备。仅适用于 QEMU 机器。

podman machine init --usb vendor=13d3,product=5406
```

初始化默认的 Podman 机器,并指定 USB 直通选项以传递 USB 设备。仅适用于 QEMU 机器。

```bash
podman machine init --usb bus=1,devnum=3
```

## 另请参阅

**[podman(1)](podman.1.md)**, **[podman-machine(1)](podman-machine.1.md)**

## 更新历史

- 20213 月,最初由 [Ashley Cui](mailto:acui@redhat.com) 整理。