👁 9

podman 里跑了 48 天的 Windows 11 删盘实录

创建 2026-08-04 · 删除 2026-09-22 · 存活 48 天

先说结论:它不是双系统,也不是 VirtualBox 里点出来的虚拟机,而是一台用 podman 跑起来的 Windows 11。它在这台机器上活了 48 天,最后被我一刀删了——但删之前,账面得算清楚,因为它和「正经虚拟机」的差别,全在管理面上,而不是性能上。

一、它到底是什么

三件套,缺一个都不好用:

  • 底座ghcr.io/dockur/windows:latest——487MB 镜像拉下来就能开机,KVM in container;
  • 门面/opt/winapps(Fmstrat 的 WinApps launcher),把 Windows 程序通过 RDP 投射成「像本地窗口一样」用;
  • 身份:容器名 WinApps,系统 Windows 11(VERSION=11),用户名 lion

为什么要在 Linux 上套一层 Windows?原因很现实:很多刷机 / 串口 / 设备工具只有 Windows 版(比如爱思助手 i4Tools),而干活的环境全在 Linux。这台虚拟机创建时还直通了一个 USB 设备(usb-host,vendorid=0xa466,productid=0x1a86,一个 USB 串口 dongle),摆明了就是为设备折腾准备的。

二、当初是怎么把它装起来的

整个安装过程比装一台 VirtualBox 还省事——因为「装系统」这一步是它自己干的。

1. 前提:Linux 宿主 + KVM + podman

能读到 /dev/kvm 就行(x86 小主机或 ARM 盒子都能跑),容器引擎 podman / docker 二选一。先确认:

ls -l /dev/kvm && podman --version

2. 拉镜像(487MB)

podman pull ghcr.io/dockur/windows:latest

3. 一条命令起容器:配置全在环境变量里

注意这条命令的形态——内存、CPU、磁盘、系统版本、账号密码、USB 直通,全是 -e 参数。这一点后面讲「和虚拟机的差别」时会重点说:容器方案的「虚拟机设置面板」,其实就是一个一个环境变量。(密码已脱敏)

podman run -d --name WinApps 
  --device /dev/kvm 
  -v winapps_data:/storage 
  -v /opt/winapps-shared:/shared 
  -v /opt/winapps-oem:/oem 
  -v /opt/win7.iso:/custom.iso 
  -p 127.0.0.1:3389:3389 -p 127.0.0.1:8006:8006 
  -e RAM_SIZE=3G -e CPU_CORES=4 -e DISK_SIZE=64G 
  -e VERSION=11 -e USERNAME=lion -e PASSWORD='********' 
  -e ARGUMENTS='-device usb-host,vendorid=0xa466,productid=0x1a86' 
  ghcr.io/dockur/windows:latest

4. 首次开机 = 自动装机,不用点「下一步」

容器一起来,它自己就把 Windows 装进去了:没有安装向导要点,也不用挂 ISO 手动下一步下一步。想盯进度就打开浏览器看它的屏幕——http://127.0.0.1:8006,容器内置的 Web 看屏,走浏览器,不占桌面。系统装完自己会把 RDP 配好。

5. 装完从 RDP 进去

127.0.0.1:3389,账号 lion,密码就是上面那个。RDP 只绑本机回环、不对外暴露——这点比不少人自己搭的「裸奔 RDP」靠谱得多。

6. OEM 目录:开机就自动打注册表

/oem 这个挂载点是这套方案最好用的地方:里面放 .reg / .bat / .exe,装系统阶段它会自动导入、自动执行(我放的是 Container.reg + install.bat,用来开 RDP 和铺无缝窗口那套环境)。相当于「装完就是我要的配置」,不用再远程连进去一顿点。

7. 门面 WinApps:Windows 程序当本地窗口用

launcher 装在 /opt/winapps,原理就是「用 FreeRDP 把 Windows 里的某个 exe 拉到 Linux 桌面上显示」,所以它只认 RDP,压根不关心底下是 KVM、VirtualBox 还是容器——这也是我能在 podman 上用它、而不必去配 libvirt 的原因。

8. 共享目录

/opt/winapps-shared 挂进容器是 /shared,174M 的沉淀文件:ISO、驱动、刷机包来回倒,不用开 SMB 也不用开 FTP。

三、磁盘账本:一台「轻量」虚拟机的真实体重

部件占用
数据卷 winapps_data(C 盘本体)28G
/opt/win7.iso 安装镜像12G
容器镜像 dockur/windows487M
/opt/winapps + launcher + shared~270M
合计约 40G

根分区总共才 231G,这 40G 占了近两成。这里有个容易忽略的点:容器方案的磁盘账是「卷 + 镜像 + ISO」三份一起算的,不像传统虚拟机只有一个 vdi / qcow2 文件那么直观——DISK_SIZE=64G 写的是 C 盘虚标容量,实际落盘 28G(qcow2 按需分配),但那个 12G 的 ISO 是实实在在躺在 /opt 里的。

四、和「正经虚拟机」到底差在哪

先把最容易误解的一点说清楚:它底下就是 QEMU/KVM 硬件虚拟化,跟 libvirt + virt-manager 那套是同一个引擎,不是「容器模拟 Windows」。所以「性能差多少」这个问题不用太纠结——同一台机器上,CPU 性能跟原生 KVM 虚拟机基本是一个量级,真正让步的是磁盘 I/O(多了一层容器卷,在 eMMC 这类盘上更明显)。

差别全在管理面:传统虚拟机把配置写进 XML / vbox 文件,给你一个图形面板;容器化方案把配置写进环境变量,管理入口就是 podman 命令。

对比项VirtualBox / VMware(桌面型)KVM + libvirt(服务器型)podman + dockur(容器型)
装系统图形向导自己点,ISO 手动挂图形 / 命令行装机一条 run 命令,无人值守自动装
管理入口GUI 面板 / VBoxManagevirt-manager / virshpodman ps/start/stop,配置 = 环境变量
看屏虚拟机窗口SPICE / VNC 窗口浏览器 8006 看屏 + RDP
网络桥接 / NAT / HostOnly 三种网卡桥接 / NAT,virtio 网卡端口映射(-p),要桥接得自己配网络
USB 直通设置面板点两下,能热插拔SPICE 重定向 / vfio写 QEMU 参数进 ARGUMENTS,容器还得能看到设备
快照 / 回滚快照树,随时回滚qcow2 内部 / 外部快照没有内置快照,只能手工复制 qcow2 / 整卷备份
改硬件配置面板里改完点确定virsh edit / 热插拔改环境变量 → 重建容器(卷保留)
备份 / 迁移导出 OVA / 拷虚拟磁盘拷 qcow2 + XML 定义tar 整个 volume 带走,换机器一条 run 复活
内存占用可动态分配可动态分配RAM_SIZE 固定占住,写多少扣多少
开机自启宿主服务拉起libvirtd + autostart–restart 策略 / Quadlet,跟容器一套
和宿主的关系独立「外来户」独立系统服务天生和 compose / 镜像仓库 / 自启策略一套

列完表,说说体感最强的四条:

  1. 没有快照,胆子就小了——VirtualBox 里最爽的「先拍个快照,装崩了回滚」在这套里没有对应功能。要在里面试可疑的驱动 / 工具,得先手动把 qcow2 或整个卷复制一份,麻烦且占空间。
  2. 改配置 = 重建容器——想从 3G 内存加到 6G、想加个端口、想换 ISO,都不是「面板里改一下」,而是改 -e 参数把容器重建(卷留着,系统不用重装)。顺带一提:DISK_SIZE 只能加不能减。
  3. 看屏在浏览器里——没有「虚拟机窗口」这一个概念,要么浏览器开 8006 看,要么 RDP 连进去,要么用 WinApps 把单个程序当本地窗口拉出来。习惯了 VirtualBox 那种点击式操作的人,会觉得少了个「总控台」。
  4. 它和宿主是一家人——备份就是 tar 卷、迁移就是卷搬走、自启就是 --restart、升级系统就是 podman pull。对已经在用 podman 管一堆服务的人来说,这比再引入一套 libvirt 顺手得多。

那到底怎么选?一句话:桌面上偶尔跑个 Windows 软件、还要拖拽文件,VirtualBox / WSL2 最省心;服务器上长期跑、要快照、要 GPU 直通、要正经管理,KVM + libvirt 更合适;要「一条命令起、跟容器一起管、看屏靠浏览器、装机不用管」,dockur 这类容器方案就是最优解。反过来——想随手回滚、想频繁改硬件配置、操作全靠 GUI 记忆,那别选容器方案。

五、这 48 天踩到的坑(上车前想清楚)

  1. 没快照 = 不敢乱装东西。对策:动手前 cp 一份虚拟磁盘(或干脆只在内网环境里折腾它)。
  2. 环境变量一改就得重建容器。对策:卷名别记错,重建前 podman volume ls 核对一遍。
  3. USB 直通靠 QEMU 参数。拔插设备要重启容器才认,而且宿主要把对应 USB 设备放行给容器,不然参数写了也没用。
  4. 端口只绑 127.0.0.1 是对的,别图省事改 0.0.0.0RDP 暴露到公网,被爆破只是时间问题。
  5. 「全自动装机」不等于完全不用管。首次要下 ISO、装系统、打补丁,这段时间别断电,也别顺手加 --rm——装到一半容器没了,就得从头再来。
  6. 磁盘账要会算。卷 + ISO + 镜像三份叠加,小盘 / eMMC 机器上它就是第一个把根分区撑爆的东西——本文这个「删盘实录」就是这么来的。

六、为什么删

  1. 根分区 99% 告警,只剩 2.3G,隔壁 oec-jpbox / GWRT 构建随时会写盘;
  2. 容器已退出 6 周MountCount=0,近一个半月没开过机;
  3. 可再生:镜像重拉 487M,配置就是上面那条命令,唯一不可再生的是卷里数据——而它躺了 6 周没人惦记。

删的只是 C 盘卷 + 容器。/opt/win7.isowinapps-shared、launcher 源码都留着,哪天想复活,ISO 和共享文件还在,一条命令就回来。

podman stop WinApps && podman rm WinApps
podman volume rm winapps_data
# /var/lib/containers: -28G

⚠️ podman volume rm 是把卷整个删掉:里面的系统盘、下载过的驱动、装在 C 盘的所有东西一起没。删之前先 podman volume inspect 看一眼挂载点,进去翻一遍确认没有要留的文件,再动手。

七、一句话总结

虚拟机和薅来的 ISO 一样,装的时候觉得「迟早有用」,删的时候才发现「咱俩早没关系了」。40G,拿去给构建任务续命,不亏。

相关阅读:Podman 和 Docker 的不同之处 · Podman / Docker 里的容器更换源 · eMMC 备份与还原 · 给 Podman 配 IPv6

文中容器配置来自删除前的 podman inspect 记录;VERSION / RAM_SIZE / DISK_SIZE / ARGUMENTS 环境变量、/oem 目录、8006 看屏与 3389 RDP 为 dockur/windows 的通用用法,WinApps 部分来自 Fmstrat/winapps 项目,对比部分为同类方案通用差异,具体以各自官方文档为准。