安装 Windows 7 到 KVM 主机上

通过 virt-manager GUI 创建一个 20GB 的 qcow2 格式的 Win7 OS Disk , 另外创建一个 20GB 的 qcow2 格式 (cache=none)的 Data Disk,后面可以格式化为 D 盘,系统里面当然是 NTFS 文件系统。
把 某 WinPE 的 8GB U盘,挂上,设置引导顺序为 U 盘先, 启动 机器,就和正常物理机一样 Ghost Win 7 ,然后安装 电脑管家,漏洞检测,安全更新,设置 Admin 密码,创建自己的用户账号,设置为管理员。

开启 Remote Desktop 服务(有三个相关的),确认一下 Windows 防火墙允许 Remote Desktop 的入站规则

RDP 默认不提供重启机器的功能, 需要手工敲 shutdown /r /t 0 可以重启机器。
按照以上设置, 直接做 Live Migration 也是杠杠的,大概会丢 40 个包,如果是 Linux 的机器, 只会丢 10-15个包。

本来以为 Win7 Guest 是要安装 libvirt 的guest 驱动的, 网络上确实有驱动,但是这个小的 iso 挂接到 windows 虚拟机里面,打开来是 windows 2008/R2 的驱动,也不知道怎么安装,反正挂接的 qcow2 磁盘映像只能用 IDE 接口,其他 SATA, SCSI,VirtIO 都不能用。

至于显示驱动,也没有看到特别的,好像一台 Dell 20 寸, 全屏支持到 1600×1200 也算可以了。

主板详情
芯片组 英特尔 440FX – 82441FX PMC [Natoma]


显卡详情
显卡名称 标准 VGA 图形适配器
显卡厂商 Red Hat, Inc.
驱动版本 6.1.7600.16385

CPU详情
CPU厂商 GenuineIntel
CPU (英特尔)Intel Xeon E312xx (Sandy Bridge, IBRS update)
CPU核心数 2
CPU默认频率 2492 MHz
CPU当前频率 2492 MHz
CPU序列号 xxxxxxxxxxxx
数据宽度 64bit
指令集 MMX,SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,EM64T
扩展版本 Ext.Family 0 Ext.Model 2

扩充 C: 盘:

# virsh blockresize vm-win7-01 /opt/nfspool/vm-win7-01.qcow2 30G
启动 Windows 虚拟机,运行磁盘管理 diskmgmt.msc 选择扩展卷,就可以了!

作为开发人员, 必安装的 Cygwin(apt-cyg), , 微信开发者工具 ,其他PHP/Nginx/Python 都可以通过 apt-cyg 安装。
一个标准 Windows 操作系统模版需要安装的基本软件,除了 Chrome, WeChat 以外,还有以下截屏里的软件:
7zip, Xmind, Foxit, Git, VSC, TIM, Notepad++, 另外 Free Download Manager 也是必装, 另外 还可以安装 SysinternalsSuite (里面有个 psgetsid 是可以读取机器的 SID的) 可以解压到 c:\tools 下,把 C:\tools 添加到路径, 运行 c:\tools\procexp64.exe 在 Options 菜单下,选择 “Replace Task Manager”
当然还要安装好办公室内的默认打印机
Bonjour Browser 是查看局域网内 Bonjour 服务的工具,也可以下载安装一下。

Windows Guest 会遇到重启后时钟默认使用 UTC ,要通过 virsh edit 设置
<clock offset=’localtime’>
clock的offset属性有”utc”,”localtime”,”timezone”,”variable”四个可选项。
如果guest OS是Linux系统,应该选用”utc”,guest OS在启动时便会向host同步一次utc时间,然后根据/etc/localtime中设置的时区,来计算系统时间。如果guest OS是windows系统,则应该选用”localtime”,guest OS在启动时向host同步一次系统时间。


另外如果时钟不同步,解决的办法是 boot.ini 添加 /use pmtimer 选项, 但是 Windows 7 没有 boot.ini 文件。参考红帽子的文章

在 Windows 7 虚拟机里执行:(*BCD= Boot Configuration Data )
$ bcdedit /set {default} USEPLATFORMCLOCK on
The operation completed successfully.
把系统时间同步成北京时间后,重启即可。

另外, 在 KVM Host 上执行
# virsh dumpxml win7_vm_domain_name |grep timer
留意 track=’guest’ 选项

<timer name='rtc' tickpolicy='catchup' track='guest'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>

Win7 安装 Guest 驱动 virtio-win , Ubntu 上没有搜索到相关的直接的驱动下载,但是 RHEL Fedora 都有提到。 Fedora 那个页面上直接下载 300M 左右的 iso 也可以。我们把 iso 放到 Ubuntu 上的 nfspool 文件夹里。 让已经安装好操作系统的 Win7 VM 在命令行里挂接 iso 文件, 有点小困难。 最后还是 virsh edit vm-win7 来添加驱动的。 基本上就是添加一个光驱类型如下:

然后修改 其他非操作系统启动盘的 dev=”hdb” 修改为 “vdb”,bus=”ide” 修改为 bus=”virtio”, 注意, 这个只是修改非系统的硬盘(假定你有这样的盘,如果没有的话,可以添加一个小的例如只有 1GB 的盘,只是为了后面让操作系统识别 virtio 的磁盘),然后把网卡的驱动也从 e1000 修改为 virtio。
Win7 Guest 启动后,就能找到新的 PCI/网卡 ,原先的D盘不能识别,更新驱动,找到 挂接在 CDROM 上的驱动,例如(E:\),全盘含子目录搜索驱动,更新完驱动后,就可以看到原先的第二硬盘也识别了。 查看网卡, 可以看到网卡支持速度变成了 “100Gbps”,简直飞起,驱动变成了 Red Hat VirtIO。接下来当然是关机,继续修改 XML , 把第一块操作系统硬盘的驱动也从 ide 修改为 virtio,操作系统就可以正常启动了。 根据说明,这个 Win7 虚机简直获得了物理机的性能。

关于 Machine Security ID (SID) , 微软官方博客有一篇不错的解释

对于 Windows 7, 我们要使用 The Windows® Automated Installation Kit (AIK) for Windows® 7 来用 sysprep 准备 Win7 的模板,否则直接克隆的 Win7 虚拟机会有一样的 SID,有很大的安全隐患。
这部分的文档,微软已经有描述,实际上十分简单。我们有了第一个通过 U盘或者光盘安装好的 Windows 7 并打好补丁,安装好了各种需要的应用和用户,直接运行文档里的 Step 2 的第4点, c:\windows\system32\sysprep\sysprep.exe /oobe /generalize /shutdown ,大概 5-10分钟之后,模板虚拟机自动关机,我们就得到了一个需要初始化的模板机器可以克隆了。如果没有设置 Answer File, 我们只要拿着这个 sysprep 之后的 qcow2 虚拟机文件,Host 上运行 virsh vol-clone,然后 virsh define 一个虚拟机用这个克隆以后的虚拟机映像,启动新的虚拟机,启动以后,只要回答几个简单的问题,就得到了一个有新的 SID 的 Windows 7 虚拟机。

在我写完这篇文档的时候,发现6年多前有人就回答了这些问题。 🙁

所以 KVM 自带的 virt-sysprep 工具,只能也只会去 配置非 Windows 的系统,也可以理解了。 因为只有 Windows 的系统,自带了 sysprep 工具,只要一个安装好的 OS,运行一次 sysprep 就成为一个模板(原先的网络配置都会去掉),以后就一直 clone 这个模板即可,克隆出来的机器,经过简单设置后,具有新的 SID。
而 对 Linux 而言,任何虚拟机映像都可以成为模板,而且可以随时 clone,只要运行一下 virt-sysprep 即可。

在 Linux 上跑 Windows 7 的梦想终于实现了, 原先一机多屏,仍旧可以通过 RDP 实现,在 Windows 上 RDP 去远程的 Windows 机器, 用 mstsc /multimon 命令, 在 Linux 上有一个 freerdp 的工具, xfreerdp /multimon 也一样可以实现,一机多屏,当全屏幕多屏运行 Windows 时,别人不会知道你的Windows 原来是运行在 Linux 上。除非你按 Ctrl-Alt-Enter 退出全屏。

作者: 甬洁网络

--移动互联网&物联网技术提供商