在 Proxmox VE 上准备一台“看不出是虚拟机”的 Windows 虚拟机
2026-07-24
安装搭建
00

目录

在 Proxmox VE 上准备一台“看不出是虚拟机”的 Windows 虚拟机
1. 先确认环境
2. 创建虚拟机并抹掉虚拟化特征
3. 每一项在“隐藏什么”
4. 源码层面反检测(qemu 11 重编译,双保险)
4.1 自己基于 qemu 11 重编译打补丁(实测)
4.2 剩下的“无解”项与注意事项
5. 装系统后怎么验证“藏好了”
6. 把 P100 显卡接进来(vGPU)
7. 排错速查
小结
参考资料

在 Proxmox VE 上准备一台“看不出是虚拟机”的 Windows 虚拟机

经验分享:本文记录在 PVE 上创建一台 Windows 虚拟机、并在装系统之前就把虚拟化特征尽量抹掉的做法。用途是做“绕过虚拟机环境检测”的测试(软件/样本是否会因为运行在虚拟机里而拒绝工作或被改变行为)。

环境是刚装好的 PVE 9.2.2,宿主机是 AMD 平台、插了一张 Tesla P100。当前盒子实际状态:为了开 P100 的 vGPU,内核已从出厂的 7.0.2-6-pve 降到 6.14.11-4-pve;qemu 已换成自编译反检测版 pve-qemu-kvm 11.0.2-2(底层 qemu 11.0.2,已把开源项目的 sed 补丁打完重编,见第 4 节)。显卡怎么接见另一篇 pve-vgpu-p100-setup.md

本文的“升级版检测策略”参考了开源项目 pve-anti-detection-main(作者 李晓流 & 大大帅666,基于 zhaodice/proxmox-ve-anti-detection),下面会说明哪些能直接用、哪些因版本对不上暂时不能照搬。

1. 先确认环境

连上 PVE 后,先摸清楚几个会影响配置的点:

bash
# PVE 版本与内核 pveversion uname -a # 存储(确认磁盘放哪) pvesm status # CPU 厂商(决定后面 IOMMU 参数用 amd_iommu 还是 intel_iommu) grep -m1 vendor_id /proc/cpuinfo # 是否已有虚拟机 qm list

本机实际信息:

  • PVE: pve-manager/9.2.2,内核 6.14.11-4-pve(为 vGPU 降过),qemu 现已替换成自编译反检测版 pve-qemu-kvm 11.0.2-2(官方原版 11.0.0-3,meta 里 creation-qemu=11.0.0 是集群迁移兼容值,不影响实际运行版本)
  • 存储: local-lvm(lvmthin,薄池约 141G 物理可用)和 local(dir)
  • 宿主机真实硬盘(注意都不是“整”容量): nvme0n1 238.5G(SK hynix BC711 256GB 系统盘)、nvme1n1 1.9T(三星 PM9A1 2TB,完全空闲、没进任何卷组)—— 所以“标准 500G/1T”的假设不成立,虚拟机磁盘容量要对着真实盘来定
  • CPU 厂商: AuthenticAMD(AMD 平台 → IOMMU 用 amd_iommu=on
  • 已有虚拟机:无(本文从零创建 VMID 9000)

踩坑记录:PVE 9 的 qm create--scsihw 的可选值是 lsi / lsi53c810 / virtio-scsi-pci / virtio-scsi-single / megasas / pvscsi没有 lsi53c895a,要用 lsi。另外 --smbios1 的字段值不允许空格、小数点和连字符(正则限制),所以 Dell Inc. 要写成 DellInc、版本号用 A00 这种形式;带空格/逗号的厂商名(如 ASUSTeK COMPUTER INC.、带逗号的 Advanced Micro Devices, Inc.)只能放到 --args-smbios 里,不能进 smbios1

2. 创建虚拟机并抹掉虚拟化特征

“绕过虚拟机环境检测”要同时处理几类特征,下面一次性把能提前做掉的都做掉(装系统之前即可配置):

bash
# 创建虚拟机(VMID 9000,名称用普通工作站风格) qm create 9000 \ --name Workstation \ --bios seabios \ --machine pc-q35-9.2 \ --ostype win11 \ --cores 8 --sockets 1 --memory 16384 \ --scsihw lsi \ --ide0 local-lvm:238 \ --net0 e1000=3C:52:82:1A:2B:3C,bridge=vmbr0 \ --vga std --balloon 0 --onboot 0 # TPM 2.0(swtpm,Windows 11 安装会检查) qm set 9000 --tpmstate0 local-lvm:1 # 系统信息 type1(smbios1,PVE 不允许空格/点/连字符,用无空格写法) qm set 9000 --smbios1 "uuid=4c4c4544-0048-4410-8038-b4c04f365a31,manufacturer=ASUS,product=PRIMEB550MA,version=RevX0x,serial=SystemSerialNumber,sku=SKU,family=PRIME" # 升级版隐藏参数 + 手工注入完整 SMBIOS(见第 4 节解释) qm set 9000 --args "-cpu host,hypervisor=off,vmware-cpuid-freq=false,enforce=false,host-phys-bits=true -smbios type=0,vendor=\"American Megatrends International LLC.\",version=\"1.0.0\",date=\"02/21/2023\",release=5.19 -smbios type=2,manufacturer=\"ASUSTeK COMPUTER INC.\",product=\"PRIME B550M-A\",version=\"Rev X.0x\",serial=\"System Serial Number\",asset=\"Asset-1234567890\",location=\"Slot1\" -smbios type=3,manufacturer=\"ASUSTeK COMPUTER INC.\",version=\"1.0\",serial=\"Chassis Serial\",asset=\"Chassis Asset\",sku=\"SKU\" -smbios type=4,sock_pfx=\"AM4\",manufacturer=\"Advanced Micro Devices Inc\",version=\"AMD Ryzen 9 5900X 12-Core Processor\",max-speed=3700,current-speed=3700,serial=\"To Be Filled By O.E.M.\",asset=\"To Be Filled By O.E.M.\",part=\"To Be Filled By O.E.M.\" -smbios type=17,loc_pfx=\"ChannelA-DIMM1\",manufacturer=\"Kingston\",speed=3200,serial=\"KF432C16BBK2\",part=\"KF432C16BBK2/16\",bank=\"BANK 0\",asset=\"9876543210\" -smbios type=8,internal_reference=\"CPU FAN\",external_reference=\"Not Specified\",connector_type=0xFF,port_type=0xFF -smbios type=8,internal_reference=\"J3C1 - GMCH FAN\",external_reference=\"Not Specified\",connector_type=0xFF,port_type=0xFF" # RTC 本地时区(真实物理机 RTC 是本地时区,避免 UTC 破绽) qm set 9000 --localtime 1 # 关闭显式 NUMA(单路单节点更像家用机) qm set 9000 --numa 0 # 真实厂牌 MAC(避开 Proxmox BC:24:11 OUI 与 virtio) qm set 9000 --net0 e1000=D8:FC:93:56:1D:C7,bridge=vmbr0 # 全局 MAC 前缀改真实厂牌(仅影响新建 VM 的自动 MAC,不碰已有 VM) # 在 /etc/pve/datacenter.cfg 末尾加一行: mac-prefix: d8:fc:93 # 把系统盘型号/序列号伪造成真实硬盘(容量 238G ≈ 真实 256GB 盘在系统里显示的 238.5G,非整容量更真) # 关键坑:PVE 9 的 sata/scsi/nvme 总线都不允许改 model,只有 ide 总线允许, # 所以系统盘特意走 ide0(qemu 的 IDE 控制器是 Intel PIIX,真机也常见,不是干净破绽)。 qm set 9000 --ide0 "local-lvm:vm-9000-disk-0,size=238G,model=Samsung_SSD_980_PRO_250GB,serial=S3Y7NX0M812345,wwn=0x5002538e41234567" # 启动顺序(分隔符是分号 ;,不是逗号;分号在 shell 里要引号包住) qm set 9000 --boot order="ide0;net0"

创建完成后,配置文件 /etc/pve/qemu-server/9000.conf 关键内容如下:

ini
args: -cpu host,hypervisor=off,vmware-cpuid-freq=false,enforce=false,host-phys-bits=true -smbios type=0,vendor="American Megatrends International LLC.",version="1.0.0",date="02/21/2023",release=5.19 -smbios type=2,manufacturer="ASUSTeK COMPUTER INC.",product="PRIME B550M-A",version="Rev X.0x",serial="System Serial Number",asset="Asset-1234567890",location="Slot1" -smbios type=3,manufacturer="ASUSTeK COMPUTER INC.",version="1.0",serial="Chassis Serial",asset="Chassis Asset",sku="SKU" -smbios type=4,sock_pfx="AM4",manufacturer="Advanced Micro Devices Inc",version="AMD Ryzen 9 5900X 12-Core Processor",max-speed=3700,current-speed=3700,serial="To Be Filled By O.E.M.",asset="To Be Filled By O.E.M.",part="To Be Filled By O.E.M." -smbios type=17,loc_pfx="ChannelA-DIMM1",manufacturer="Kingston",speed=3200,serial="KF432C16BBK2",part="KF432C16BBK2/16",bank="BANK 0",asset="9876543210" -smbios type=8,internal_reference="CPU FAN",external_reference="Not Specified",connector_type=0xFF,port_type=0xFF -smbios type=8,internal_reference="J3C1 - GMCH FAN",external_reference="Not Specified",connector_type=0xFF,port_type=0xFF balloon: 0 bios: seabios boot: order=ide0;net0 localtime: 1 machine: pc-q35-9.2 memory: 16384 net0: e1000=D8:FC:93:56:1D:C7,bridge=vmbr0 numa: 0 ostype: win11 ide0: local-lvm:vm-9000-disk-0,model=Samsung_SSD_980_PRO_250GB,serial=S3Y7NX0M812345,size=238G,wwn=0x5002538e41234567 scsihw: lsi smbios1: uuid=4c4c4544-0048-4410-8038-b4c04f365a31,manufacturer=ASUS,product=PRIMEB550MA,version=RevX0x,serial=SystemSerialNumber,sku=SKU,family=PRIME sockets: 1 tpmstate0: local-lvm:vm-9000-disk-1,size=4M vga: std

3. 每一项在“隐藏什么”

配置项默认会暴露的特征这里怎么处理
args: -cpu host,hypervisor=off,...CPUID 里 hypervisor 标志位置 1(KVM/QEMU 一眼被识破)hypervisor=off 清掉该标志位;host-phys-bits=true 让客户机物理地址位数=宿主机(避免 “guest phys-bits < host” 这类检测);vmware-cpuid-freq=false + enforce=false 减少 vm-exit 带来的时序痕迹
-smbios type=0/2/3/4/8/17BIOS/主板/机箱/CPU/内存/端口 全是空的或带 QEMU 字样,al-khaser/pafish 查的 Win32_FanWin32_PhysicalMemoryWin32_PortConnectorCIM_* 传感器 全空手工注入一套一致的整机信息(华硕 PRIME B550M 主板 + AMD Ryzen + 金士顿内存),喂饱上面那些 WMI 项。与 AMD 主机一致:CPUID 报 AMD,SMBIOS 也报 AMD,避免高级工具比对冲突
smbios1 (type1)系统信息带 QEMU / PVE / Proxmox 字样伪造成华硕整机(无空格写法,因 PVE 正则限制)
net0 e1000 + 真实 MAC默认网卡是 virtio 且 MAC 前缀是 Proxmox 的 BC:24:11换成 e1000(Intel 82545EM,Windows 自带驱动),MAC 用真实厂牌前缀 D8:FC:93:...;并改了全局 mac-prefix
ide0(系统盘)默认磁盘型号 QEMU HARDDISK、容量常是整 200G(强特征)PVE 9 只有 ide 总线允许改 model,故系统盘走 ide0,型号伪造成 Samsung_SSD_980_PRO_250GB、自定义 serial/wwn;容量用 238G(真实 256GB 盘在系统里显示约 238.5G,非整更真)。IDE 控制器是 Intel PIIX,真机也常见,不是干净破绽
vga std默认 vmware/qxl 虚拟显卡用标准 VGA,避免暴露 VMware/QXL
balloon 0virtio-balloon 内存气球设备是典型 VM 痕迹关闭内存气球
localtime 1虚拟机 RTC 默认 UTC,真实物理机是本地时区设成本地时区
numa 0多 NUMA 节点容易暴露服务器/虚拟特征单路单节点
tpmstate0无 TPM → Windows 11 装不上挂 swtpm 提供 TPM 2.0(同时让系统更“真实”)
machine pc-q35-9.2默认 i440fx 是 1996 年的老芯片组用 q35(ICH9 级别),更像现代主板

4. 源码层面反检测(qemu 11 重编译,双保险)

第 2、3 节的配置级做法(CPU 隐藏参数、手工 SMBIOS、localtime/numa/MAC 前缀)和版本无关,即使不重编译也能过绝大多数检测。下面这步是从源码层面把 qemu 里的虚拟化字符串彻底抹掉,作为“双保险”。

开源项目 pve-anti-detection-main(作者 李晓流 & 大大帅666,基于 zhaodice/proxmox-ve-anti-detection)把反检测做到了源码层面:它给 PVE 自带的 pve-qemu-kvm 打补丁、并替换 pve-edk2-firmware-ovmf,从根上抹掉这些特征:

  • 把 qemu 里所有 "QEMU" 字符串替换成 "ASUS"(设备厂商、显示器 EDID、USB、SCSI 控制器等);
  • ACPI 的 OEM ID 从 BOCHS/BXPC 改成 INTEL/PC8086,fw_cfg 签名 QEMU CFGASUU CFG0x51454d55204346470x4155535520434647),KVMKVMKVM 的 CPUID hypervisor 签名改成 GenuineIntel
  • 禁用 vmgenid(直接让生成函数提前 return,去掉一个 VM 痕迹);
  • 删除调试用 AML_DBG 方法),并屏蔽 fw_cfg 节点;
  • SMBIOS 的 bios 特性位、电压、外频、缓存句柄、CPU family、内存类型/位宽/电压等字段全部改成真实机器的值。

项目给的是 qemu 9.x 补丁包 + OVMF 4.2023.08,和本机 qemu 11 不对版;但脚本里那批 sed 补丁是针对字符串的,绝大多数在 qemu 11 源码里依然能命中,所以完全可以在本机基于 qemu 11 重编译一个带补丁的 pve-qemu-kvm这台盒子已经这么做了(见 4.1),VM 9000 在新 qemu 下能正常开机。

4.1 自己基于 qemu 11 重编译打补丁(实测)

前置:盒子是 vGPU 实验机,重编译有风险——但用户确认“挂了可以重装系统”。装完务必 apt-mark hold,并记住回退命令(见 4.1.5)。

4.1.1 拉源码(避开被墙的 git:// 与无源码的二进制仓库)

Proxmox 官方只发二进制包、不提供 apt-get sourcegit://git.proxmox.com 在国内常被墙。直接用 GitHub 镜像:

bash
# 克隆打包仓库(PVE 的 deb 构建骨架) git clone https://github.com/proxmox/pve-qemu.git cd pve-qemu # 子模块 qemu 的官方地址被墙,重定向到 github 镜像(qemu 11.0.2) git config submodule.qemu.url https://github.com/proxmox/qemu.git git submodule update --init --recursive

4.1.2 打 sed 补丁

把项目里的 sedPatch-pve-qemu-kvm7-8-anti-dection.sh 拷进 qemu/ 子模块根目录(它默认就在 qemu 源码树里跑),改名为 sedPatch.sh 后执行:

bash
cp /root/pve-anti-detection-main/sedPatch-pve-qemu-kvm7-8-anti-dection.sh qemu/sedPatch.sh cd qemu bash sedPatch.sh

命中情况(qemu 11 实测):

补丁目标结果
ACPI OEM BOCHSINTELBXPCPC8086include/hw/acpi/aml-build.h命中
fw_cfg 签名 0x51454d55204346470x4155535520434647hw/nvram/fw_cfg.c命中
CPUID KVMKVMKVMGenuineInteltarget/i386/kvm/kvm.c命中
"QEMU"ASUS 设备名(pc_q35/pc_piix/ide 等)命中
vmgenid / acpi-build 注入 return;//do this once命中(注释,编译后剥离,效果是函数提前返回)
SMBIOS 字段(hw/smbios/smbios.c 电压/缓存句柄/内存类型等)命中
个别老设备 sed(ads7846.ctsc2005.croms/seabios/*.dslqemu 11 已移除文件,sed 报 No such file,无害跳过

关键项(ACPI OEM、fw_cfg、KVMKVMKVM、SMBIOS 字段、vmgenid 禁用)全部命中;非关键设备名 sed 静默跳过不影响——那些设备 VM 9000 根本没接(用 ide/e1000/标准 VGA)。

4.1.3 解决 Ceph/RBD 构建冲突(本机不用 Ceph)

本机装了 ceph 库(19.2.3-pve4),librbd-dev 与已装版本冲突,且盒子不接 RBD 块设备。两处关掉:

bash
# 去掉构建依赖里的 librbd-dev sed -i '/librbd-dev/d' debian/control # 构建参数关掉 rbd(注意:不要写带反斜杠的写法,容易 unterminated) sed -i "s/--enable-rbd/--disable-rbd/" debian/rules

4.1.4 编译 + 打包

bash
# 补齐可能缺的构建依赖 apt-get install -y check libfuse3-dev libpng-dev python3-venv python3-wheel # meson 子项目(含 Rust crate,如 bilge 等)需联网拉取: # 在 qemu 目录下执行 meson subprojects download(crates.io 偶尔 reset,失败重跑即可) # 后台编译打包(32 核约 15–30 分钟) nohup make deb > /root/pve-qemu-build/build.log 2>&1 & tail -f /root/pve-qemu-build/build.log # 看 [NNNN/3672] Compiling ... 进度

产物在仓库根目录: pve-qemu-kvm_11.0.2-2_amd64.deb(约 31M)和对应的 -dbgsym 包(可不装)。

装之前先验证补丁真的进了二进制(强烈建议,避免白装):

bash
mkdir /tmp/qcheck && dpkg-deb -x pve-qemu-kvm_11.0.2-2_amd64.deb /tmp/qcheck BIN=/tmp/qcheck/usr/bin/qemu-system-x86_64 echo "patched (应 >0):"; for s in GenuineIntel "INTEL " PC8086 ASUS; do echo "$s -> $(strings $BIN|grep -cF "$s")"; done echo "leak (应 =0):"; for s in KVMKVMKVM BXPC "BOCHS "; do echo "$s -> $(strings $BIN|grep -cF "$s")"; done $BIN --version # 应显示 pve-qemu-kvm_11.0.2-2

KVMKVMKVM/BXPC/BOCHS 全为 0、GenuineIntel/INTEL/PC8086/ASUS 均 >0 即说明补丁生效。(QEMU CFG/ASUU CFG 在二进制里是小端存放,strings 查不到,属正常。)

4.1.5 安装 + 锁定 + 回退

bash
# 安装(会升级掉官方 11.0.0-3) dpkg -i pve-qemu-kvm_11.0.2-2_amd64.deb # 锁定版本,防止 apt upgrade 把补丁覆盖回官方版 apt-mark hold pve-qemu-kvm

回退(万一新 qemu 让虚拟机起不来):

bash
apt-mark unhold pve-qemu-kvm apt-get install --reinstall pve-qemu-kvm # 恢复官方版

OVMF 补丁包(可选,本机未装):项目还给了 pve-edk2-firmware-ovmf_4.2023.08-4..._anti_detection.deb,作用是从 UEFI 固件层抹掉 OVMF/EFI 字样。但它会把 OVMF 整体降级,影响宿主机上所有用 UEFI 启动的虚拟机,而 VM 9000 用的是 bios: seabios,根本不走 OVMF,所以本机没有装这个包。只有当你要建一台 UEFI 启动的反检测 Windows 虚拟机时,才需要它(同样记得 apt-mark hold pve-edk2-firmware-ovmf 并备好回退)。

4.1.6 验证生效

装好后 qm start 9000,确认进程是 /usr/bin/kvm(即补丁后的 qemu-system-x86_64 软链),且 cmdline 含 hypervisor=off、各 -smbios(ASUS/AMD)、model=Samsung_SSD_980_PRO_250GBstrings /usr/bin/qemu-system-x86_64KVMKVMKVM 为 0。最终“是否真的藏住”仍要在 Windows 里用 4.2 提到的 pafish64/al-khaser 实测。

4.2 剩下的“无解”项与注意事项

项目实测里剩下两项“无解”检测(真实物理机也过不了,不用纠结)

  • LDT location(al-khaser 的 Local Descriptor Table 检查):作者试了好几台真机也是 BAD
  • ThermalZoneInfo(WMI 温度传感器性能计数器):真机也没有,要写一堆 ACPI 才可能有。

还有一类时序攻击(RDTSC 强制 vm-exit / cpuid 计时差异):项目说需要打内核补丁(定制内核或 kvm 内核模块)。这对当前盒子是额外风险,先不做;前面那套配置已经能过绝大多数游戏/样本的反虚拟机检查。

项目还特别强调一点,和我们这台 VM 的现状正好契合:从第一次装系统开始就要用反检测环境。一旦用原版(官方)qemu/OVMF 装过系统,注册表里就会留下 QEMU 硬盘/光驱字符串,删都删不掉。我们这台 VM 还没装系统,从干净状态开始就行。

补充几条项目里提到的“过检测”经验:

  • 装系统前的准备:建议把 MAC 地址前缀先改成真实厂牌(数据中心 → 选项 → MAC 地址前缀,我们已设 d8:fc:93);系统盘用 SATA/IDE、容量至少 128G(我们用了 238G),避开 50G/80G 这种“太假”的容量;避开一切 scsi/virtio 设备(硬盘、光驱、网卡),用 e1000 + IDE/SATA;内存用 4096/8192/16384(4G/8G/16G)这种真实档位。
  • 推荐检测工具(金标准)pafish64.exeal-khaser(项目 tools/ 目录里带了这两个以及一份“目前过不了的检测说明”)。装完系统拿这两个跑一遍,比 systeminfo 严格得多。
  • Hyper-V 检测的 VDRVROOT 全局对象:不是真破绽(真实机也有,叫“Microsoft 虚拟驱动器枚举器”),看着不舒服就在设备管理器里卸载该设备,这一项就过。
  • Windows 是否正版(Genuine):激活一下就过。

5. 装系统后怎么验证“藏好了”

进 Windows 后,用下面几样确认虚拟化特征是否消失:

powershell
# 看 hypervisor 是否被识别 systeminfo | findstr /i "hyper-v" # 看 CPU 厂商与型号(应是真实 AMD,不应出现 KVM/QEMU) Get-WmiObject Win32_Processor | Select-Object Name,Manufacturer # 看系统厂商/型号(应是我们伪造的 ASUS / PRIMEB550MA) Get-WmiObject Win32_ComputerSystem | Select-Object Manufacturer,Model Get-WmiObject Win32_BIOS | Select-Object Manufacturer,SerialNumber,Version # 看内存(应出现 Kingston、速度 3200,而不是空) Get-WmiObject Win32_PhysicalMemory | Select-Object Manufacturer,PartNumber,Speed # 看端口连接器(应出现我们注入的 CPU FAN 等,而不是空) Get-WmiObject Win32_PortConnector | Select-Object Name,ExternalReference # 看磁盘型号(应是 Samsung_SSD_980_PRO_250GB,不是 QEMU HARDDISK) Get-WmiObject Win32_DiskDrive | Select-Object Model,SerialNumber

更严格的验证用第 4 节提到的 pafish64.exe / al-khaser:检查 CPUID 0x40000000 厂商标识、是否加载 VBox/VMware 驱动、MAC OUI、磁盘型号、SMBIOS 各型是否齐全。如果 systeminfo 里不再出现 “A hypervisor has been detected…” 之类提示,说明 hypervisor=off 已生效。

6. 把 P100 显卡接进来(vGPU)

虚拟机本身先不装系统,显卡先留好位置。接法见另一篇 pve-vgpu-p100-setup.md:等宿主机 vGPU 配好后,用 mdevctl 创建一个 P100 的 vGPU 实例,再 qm set 9000 --hostpci0 <mdev> 或图形界面添加“PCI Device(MDev 类型)”。

本机已经接好:

bash
qm set 9000 -hostpci0 0000:01:00.0,mdev=nvidia-86 # nvidia-86 = GRID P100-8Q / 8G

qm start 9000 时 PVE 自动用 mdevctl 建好实例挂上 vfio-pci;qm stop 时自动回收,无需手管。

显卡接进来后,vga std 可以改成 none(显示走直通的 P100),但装系统阶段先保持 vga std 方便看安装界面。装好 Windows 后,在 guest 里安装与宿主机同大版本的 GRID 客户驱动(本机宿主是 535 分支,guest 也装 535 分支),设备管理器里会看到 Tesla P100nvidia-smi 也能识别这张 vGPU。

7. 排错速查

现象原因处理
qm createscsihw ... does not have a value in the enumeration用了不存在的值 lsi53c895a改成 lsi
smbios1: invalid format字段值里有空格/小数点/连字符去掉(如 Dell Inc.DellIncPRIME-B550M-APRIMEB550MA);带空格/逗号的厂商名只能放进 --args-smbios
qm set ... --boot order=boot.legacy: value does not match the regex pattern启动顺序分隔符用了逗号分号 ;(不是逗号),且分号在 shell 里是命令分隔符,必须引号包住,例如 --boot order="ide0;net0"
磁盘型号想改却报 property is not defined in schema只有 ide 总线允许 model系统盘走 ide0 才能把 QEMU HARDDISK 伪造成真实型号
qm set 的 size 想设小数(如 238.5G)被忽略size 不接受小数用整数 GiB(如 238G ≈ 真实 256GB 盘的 238.5G)
--args 里的 -smbios 值带逗号让 qemu 启动失败qemu 把逗号当字段分隔符去掉逗号(如 Advanced Micro Devices, Inc.Advanced Micro Devices Inc);空格和连字符没问题
--args-smbios type=9designation 在 qemu 11 不被接受qemu 11 无此参数去掉 type=9(Win32_PortConnector 已由 type=8 覆盖)
薄池超分配告警(lvs 里虚拟盘 238G > 薄池 ~141G)薄分配正常只要实际写入不超薄池物理量(~141G)就无事;要扩容把闲置 2TB 盘 pvcreate+vgextend pve+lvextend 薄池
Windows 安装时找不到硬盘系统盘不在 IDE/ATA确认是 ide0(Windows 自带 atapi/pciide 驱动),不要放 scsi0(除非加载 LSI 驱动)
装 Windows 11 卡在“本电脑不满足要求”TPM/安全启动检查已挂 swtpm;仍不过就 Shift+F10 注入 LabConfig 注册表跳过
进系统后 systeminfo 仍提示检测到 hypervisorhypervisor=off 未生效确认已写进 conf,且虚拟机是完全关机再开机(不是重启)后生效
想从源码层抹特征(ASUS 字符串、禁用 vmgenid、ACPI OEM 等)需重编译 qemu我们已基于 qemu 11 重编译并安装补丁版 pve-qemu-kvm 11.0.2-2(见第 4.1 节),已 apt-mark hold 防覆盖,回退见 4.1.5。OVMF 补丁包全局降级、影响所有 UEFI VM,VM 9000 用 SeaBIOS 故未装,仅 UEFI 反检测 VM 才考虑

小结

一台“看不出是虚拟机”的 Windows VM,由两层构成:配置层(第 2、3 节,hypervisor=off + 一致的华硕/AMD SMBIOS + 伪硬盘型号 + 真实厂牌 MAC + 标准 VGA + 关 balloon/localtime/numa)对付绝大多数检测工具;源码层(第 4 节,基于 qemu 11 重编译 pve-qemu-kvm 11.0.2-2)把 QEMU/KVMKVMKVM/BOCHS/BXPC 等字符串从根上抹掉,作为双保险。两者都从第一次装系统前就生效,避免注册表里留下 QEMU 痕迹。显卡走 P100 的原生 vGPU(mdev=nvidia-86 / P100-8Q),guest 装同版本 GRID 客户驱动即可看到 Tesla P100。

参考资料

ai协作,人工编辑

本文作者:张老板

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!