跳到主要内容

Podman-remote 客户端在 Windows 上使用 QEMU VM

::: warning 对于在 Windows 上运行 Podman,请参照Podman for Windows指南,该指南使用了推荐的 Podman 管理 Linux 后端的方法。对于 Mac,请参阅Podman 安装说明。本指南涵盖了 Podman 与自定义 Linux VM 的高级用法。 :::

介绍

这是一个使用 QEMU VM 的实验性设置,用于在已经支持的 Podman-remote 客户端上运行 Podman。在 Windows 上运行 Podman 的官方支持和推荐方法是使用 Podman machine

前提条件

  • Windows 10 Build 18362 或更高版本(Build 19044/Version 21H2 或更高版本推荐)
  • 在机器上安装了 SSH 客户端功能
  • 机器上应启用 Hyper-V 加速
  • 将使用目录 C:\qemu-remote\ 来存储所需资源
  • 端口 57561 用于通过回环接口进行 SSH 通信

获取和安装

QEMU

QEMU下载 (7.2.0 minimal)

然后从Fedora CoreOS下载适用于 QEMU 的 (FCOS) 镜像

您需要 .xz 格式的解压缩工具,如 xz 本身或 7-zip。使用它来将 .qcow2 镜像解压到 C:\qemu-remote\fedora-coreos-37.20221127.2.0-qemu.x86_64.qcow2

如果使用 xz,命令行(当从同一目录运行时)将是

xz -d fedora-coreos-37.20221127.2.0-qemu.x86_64.qcow2.xz

Podman

下载并安装适用于 Windows 的 Podman 最新发布版。Podman 发布版可以从官方的Podman GitHub发布页面获得:

Podman 旧版本

当使用 Podman 的旧版本(4.3.x 及更早版本)时,如果安装目录中缺少 gvproxy.exe,可以从官方发布页面 获取它。 您需要 0.5.0 或更高版本的发布。下载 gvproxy-windows.exe 并将其复制到 Podman 安装目录(或添加到 PATH 环境变量的任何其他位置),并将二进制文件重命名为 gvproxy.exe

SSH

生成带有空密码短语的 ssh 密钥

ssh-keygen -t ed25519 -f C:\qemu-remote\remote

FCOS 的 Ignition

创建名为 C:\qemu-remote\remote.ign 的 Ignition 文件,内容为:

{
"ignition": { "version": "3.2.0" },
"storage": {
"files": [
{
"filesystem": "root",
"path": "/etc/ssh/ssh_host_ed25519_key",
"mode": 420,
"contents": {
"source": "data:,$(cat C:\\qemu-remote\\remote.pub | base64)"
}
},
{
"filesystem": "root",
"path": "/etc/ssh/ssh_host_ed25519_key.pub",
"mode": 420,
"contents": {
"source": "data:,$(cat C:\\qemu-remote\\remote.pub)"
}
}
]
},
"systemd": {
"units": [
{
"name": "sshd.service",
"enabled": true
}
]
},
"networkd": {
"units": [
{
"name": "00-ens33.network",
"contents": "[Match]\nName=ens33\n\n[Network]\nAddress=192.168.122.100/24\nGateway=192.168.122.1\nDHCP=no"
}
]
},
"passwd": {
"users": [
{
"name": "core",
"sshAuthorizedKeys": [
"$(cat C:\\qemu-remote\\remote.pub)"
]
}
]
}
}

请确保将 192.168.122.100/24 替换为您网络设置中适当的 IP 地址和子网掩码。

QEMU 命令行

您可以使用以下命令行启动虚拟机:

qemu-system-x86_64.exe -machine q35,accel=hvf -cpu host -m 2048 -smp 2,sockets=1,cores=2,threads=1 -bios none -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:56 -netdev user,id=net0,hostfwd=tcp::57561-:22 -drive if=none,id=hd0,file=C:\qemu-remote\fedora-coreos-37.20221127.2.0-qemu.x86_64.qcow2,format=qcow2 -device virtio-blk-pci,drive=hd0 -device virtio-serial-pci -chardev socket,id=charserial0,path=C:\qemu-remote\serial.sock,server=no -device virtserialport,bus=virtio-serial0.0,nr=0,chardev=charserial0,id=serialport0,name=org.qemu.guest_agent.0 -fw_cfg name=opt/com.redhat.coreos/config,file=C:\qemu-remote\remote.ign

在 Ignition 配置中,SSH 的 IP 地址设置为 192.168.122.100。您可以使用您创建的私钥通过 SSH 连接到虚拟机:

ssh -i C:\qemu-remote\remote -p 57561 core@localhost

首次连接时,SSH 主机密钥对于您的客户端来说是未知的,因此您可能会收到一个安全警告,询问您是否信任主机并希望继续连接。确认并接受后,您应该能够登录到虚拟机。请确保您的防火墙或网络设置允许通过端口 57561 进行连接。

如果您使用的是 Windows 下的 OpenSSH 客户端,您可能需要确保 C:\qemu-remote\remote 私钥文件的权限设置正确,以便 OpenSSH 可以读取它。您还可以尝试使用 PuTTY 或其他 SSH 客户端进行连接,这些客户端通常有自己的私钥格式和导入方法。

启动过程

gvproxy

在启动 QEMU 虚拟机之前,需要首先运行 gvproxy 以准备好环境。使用以下命令运行它:

gvproxy.exe -listen-qemu unix://C:/qemu-remote/vlan_remote.sock -pid-file C:\qemu-remote\proxy.pid -ssh-port 57561 -forward-sock C:\qemu-remote\podman.sock -forward-dest /run/user/501/podman/podman.sock -forward-user core -forward-identity C:\qemu-remote\remote

QEMU

使用以下命令启动 QEMU(下面的配置使用了 4 个 CPU 和 8 GB RAM,但可以根据实际情况进行调整):

qemu-system-x86_64w.exe -m 8192 -smp 4 -fw_cfg name=opt/com.coreos/config,file=C:\qemu-remote\remote.ign -netdev stream,id=vlan,server=off,addr.type=unix,addr.path=C:\qemu-remote\vlan_remote.sock -device virtio-net-pci,netdev=vlan,mac=5a:94:ef:e4:0c:ee -device virtio-serial -chardev socket,path=C:\qemu-remote\ready.sock,server=on,wait=off,id=apodman-machine-default_ready -device virtserialport,chardev=apodman-machine-default_ready,name=org.fedoraproject.port.0 -pidfile C:\qemu-remote\vm.pid -machine q35,accel=whpx:tcg -cpu max,vmx=off,monitor=off -drive if=virtio,file=C:\qemu-remote\fedora-coreos-37.20221127.2.0-qemu.x86_64.qcow2

首次启动额外步骤

观察 QEMU 加载过程,并等待 SSH 密钥被分配到虚拟机的消息。接下来,在第一次通过 SSH 连接之前,需要将虚拟机添加到已知主机列表中。 我们在这里使用 127.0.0.1 而不是 localhost 来强制使用 IPv4。

ssh-keyscan -p 57561 127.0.0.1 >> %USERPROFILE%\.ssh\known_hosts

请确保在执行上述命令时,ssh-keyscan 工具已经安装在您的系统上,并且 %USERPROFILE%\.ssh\ 目录存在,否则您需要创建它。如果 SSH 密钥扫描命令成功执行,虚拟机的公钥将被添加到 known_hosts 文件中,这样在后续的 SSH 连接过程中,您就不会再收到未知主机的安全警告。

添加新的 Podman 连接

创建一个名为 "qemuremote" 的连接:

podman system connection add --identity C:\qemu-remote\remote -p 57561 qemuremote ssh://core@127.0.0.1

可选步骤

为了简化操作/测试,可以将其设置为默认连接:

podman system connection default qemuremote

使用 Podman

选择活动连接为 "qemuremote"(如果已设置为默认,则无需此步骤)。

运行一些基本的网络工作负载:

podman run -d --rm -p 8080:80 nginx

测试它是否工作:

curl -v http://localhost:8080

关闭虚拟机

Podman machine 的内置机制不适用于自定义机器。因此,需要通过 SSH 优雅地关闭它:

ssh -i C:\qemu-remote\remote -p 57561 core@127.0.0.1

然后执行

sudo poweroff

关闭 SSH 会话后,QEMU 进程应该会自行退出。如果需要手动停止 QEMU,可以杀死其进程(使用之前保存的 PID 文件中的 PID)。

清理和移除

如果您想完全清理并移除这个 QEMU 实例,您需要先关闭它(如上所述),然后删除所有相关的文件,如虚拟机磁盘映像、PID 文件、套接字文件等。

del C:\qemu-remote\vm.pid
del C:\qemu-remote\vlan_remote.sock
del C:\qemu-remote\ready.sock
del C:\qemu-remote\podman.sock
del C:\qemu-remote\proxy.pid
del C:\qemu-remote\remote.ign
del C:\qemu-remote\remote

此外,您可能还想删除虚拟机磁盘映像文件,以便完全清理环境:

del C:\qemu-remote\fedora-coreos-37.20221127.2.0-qemu.x86_64.qcow2

请注意,执行这些删除操作之前,请确保您不再需要这些文件,并且已经关闭了所有相关的进程。在 Linux 系统中,您可能还需要使用 rm 命令而不是 del

最后,不要忘记从 known_hosts 文件中删除虚拟机的条目,如果您将来不打算再连接它:

notepad %USERPROFILE%\.ssh\known_hosts

打开 known_hosts 文件后,找到与虚拟机 IP 地址相关的条目并删除它。保存并关闭文件。

请注意,Windows 系统上的文件路径和命令可能与 Linux 系统有所不同,因此请根据您实际使用的操作系统和环境调整上述命令和路径。