我遇到了一个奇怪的问题,我无法弄清楚。我有一台Windows 7虚拟机,原本是物理机,不久前降级为VM。我曾经用它启动
qemu-system-x86_64 --enable-kvm -vga std -m 4G -smp cores=4 /path/to/image
它确实改变了我的硬件信息,足以触发任何 Windows 激活。我最近开始使用 libvirt 和 virt-manager。一切都很顺利,直到我开始导入这台 Windows 机器。当我最终启动它时,它触发了 Windows 激活的废话。
我截取了报告的硬件规格 (msinfo32) 的屏幕截图,关闭,然后使用没有问题的命令重新启动,并比较了报告的硬件。一切看起来都一样。所以我开始研究 WMIC,看看是否可以获得更详细的信息。我唯一注意到的是两次启动时 cpu ProcessorID 字段是不同的。我尝试使用 来对我的配置进行各种调整(主要是 cpu 参数(match='exact'、mode='host-model'、mode='host-passthrough' 等))virsh edit machinename
,但无济于事。
使用 ps,我可以看到 libvirt 正在运行以下命令(为了便于阅读,分成多行):
qemu-system-x86_64 -enable-kvm -name win7 -S \
-machine pc-i440fx-trusty,accel=kvm,usb=off -m 4096 \
-realtime mlock=off -smp 4,sockets=4,cores=1,threads=1 \
-uuid 71ca9116-a4a1-b799-dab5-01a483bce024 \
-no-user-config -nodefaults \
-chardev socket,id=charmonitor,path=/var /lib/libvirt/qemu/win7.monitor,server,nowait \
-mon chardev=charmonitor,id=monitor,mode=control \
-rtc base=utc -no-shutdown -boot strict=on \
-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
-drive file=/media/paul/VirtualMachines/win7.vmdk,if=none,id=drive-ide0-0-0,format=vmdk \
-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \
-netdev tap,fd=25,id=hostnet0 \
-device \
rtl8139, \
netdev=hostnet0, \
id=net0, \
mac=52:54:00:bf:2c:b2,bus=pci.0, \
addr=0x3 -chardev pty,id=charserial0 \
-device isa-serial,chardev=charserial0,id=serial0 \
-device usb-tablet,id=input0 -vnc 127.0.0.1:0 \
-device VGA,id=video0,bus=pci.0,addr=0x2 \
-device intel-hda,id=sound0,bus=pci.0,addr=0x4 \
-device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5
这是我的配置文件:http://pastebin.com/0e2Mf4RE
我仍然可以用简单的命令启动,没有问题。 libvirt qemu 命令必须更改了有关我的硬件向来宾计算机报告的方式的某些内容。我注意到参数看起来像是在设置 mac 地址和硬盘驱动器 uuid,但这应该不重要。我非常确定 Windows 硬件锁定主要基于主板和/或 CPU 的组合。
有谁知道为什么会发生这种情况以及如何解决它?
更新
我尝试直接运行 libvirt 上面运行的 qemu 命令,删除参数直到它启动,然后直到 Windows 显示它已激活。看来是-uuid
造成问题的原因。我不确定为什么。我认为 uuid 参数只是用于安全配置文件(在我的例子中是 AppArmor),但它似乎也更改了来宾上的一些硬件标识符?
成功启动后,我wmic csproduct get uuid
在 Windows 中运行,复制它,然后关闭。然后我做了以下事情:
virsh dumpxml win7 > win7.xml
virsh undefine win7
[Edited win7.xml -> changed uuid to match the one I copied]
virsh define win7.xml
我打开 virt-manager 并启动。有效!貌似uuid设置了主板序列号?有趣的是,我的是一串 0(显然,很多主板不报告 uuid),所以它并不是真正独特的,这使得整个冒险变得非常愚蠢。
我没有将其作为答案发布,因为我不确定为什么这会起作用(我只是乱七八糟直到它起作用并且我在上面做出假设)。也许对这个主题更了解的人可以发布更好的答案?