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 系统有所不同,因此请根据您实际使用的操作系统和环境调整上述命令和路径。