0x01 前言

我发现运行在服务器伤的虚拟机通过windows更新程序更新后的windows7会出现蓝屏现象,我猜测应该是某些更新包导致系统与KVM不兼容,以至于出现蓝屏且不能恢复的后果。

我还没有仔细地探索其中的原因,但我的服务器已经有2个月没升级系统啦,所以通过命令 yum update 升级,升级过程很快且无错误。然而更新完成后却出现了问题…

0x02 问题点

我一直都通过以下命令在我服务器上安装windows7系统:

virt-install --name win7 \ #虚拟机名称
--memory 8192 \ #分配的内存
--vcpus sockets=1,cores=8,threads=1 \ #分配的CPU资源
--cdrom=/usr/local/kvm/iso/win7.iso \ #windows7 系统镜像路径
--disk path=/usr/local/kvm/images/win7.img,size=100,bus=sata \ #虚拟磁盘路径
--network bridge=br0,model=virtio \ #网络类型与网卡类型
--os-type windows --os-variant win7 \ #声明系统类型
--noautoconsole --accelerate --hvm \ #windows不需要使用console、启用全虚拟

--graphics vnc,password=[your password here],listen=0.0.0.0,port=[your VNC prot here] \ 
#VNC信息

--cpu host-passthrough --arch x86_64 #CPU穿透与架构

可是升级宿主系统后,通过以上命令安装windows7能正常启动却不能进入安装界面。

安装进程停留在“starting windows”,如图:

https://ngx.hk
KVM 安装 windows7 停在 starting windows。点击放大。

0x03 解决办法

通过Google也无法寻找到有效地解决办法,只能通过serverfault找到一个相关的问题。Ilias El Matani在这个问题的回答如下:

It's a (known) bug.

Workaround: Change the display from 'default' to 'cirrus'. You can find this setting under hardware > display.

Kind regards, Ilias el Matani

由此可见,这是一个(已知的)BUG,需要将显示硬件从default改为cirrus。我的安装命令并没有声明需要使用的显示硬件,所以KVM选用缺省的硬件。可是我查了相关信息,default就是cirrus。

支持的显示硬件模式从libvirt.org的摘录如下:

The video element is the container for describing video devices. For backwards compatibility, if no video is set but there is a graphics in domain xml, then libvirt will add a default video according to the guest type.

For a guest of type "kvm", the default video is: type with value "cirrus", vram with value "16384" and heads with value "1". By default, the first video device in domain xml is the primary one, but the optional attribute primary (since 1.0.2) with value 'yes' can be used to mark the primary in cases of multiple video device. The non-primary must be type of "qxl".

The model element has a mandatory type attribute which takes the value "vga", "cirrus", "vmvga", "xen", "vbox", "qxl" (since 0.8.6) or "virtio" (since 1.3.0) depending on the hypervisor features available.

上面说了,如果在虚拟机的xml里没设置video的情况下,要是有graphics的设置信息,libvirt会自动添加默认的video配置信息。在KVM下,默认的video硬件就是cirrus。

因为我需要VNC来操作Windows,所以在配置命令里有关于VNC的配置信息,但为什么显示却不正常呢?会不会是windows的驱动问题?,这个问题让我再找找原因。

为了解决这个问题,只需要在安装命令添加一下这一行来声明显示硬件即可:

--video cirrus #配置虚拟机视频硬件。

完整的安装命令如下:

virt-install –name win7 –memory 8192 –vcpus sockets=1,cores=8,threads=1 –cdrom=/usr/local/kvm/iso/win7.iso –disk path=/usr/local/kvm/images/win7.img,size=100,bus=sata –network bridge=br0,model=virtio –os-type windows –os-variant win7 –noautoconsole –accelerate –hvm –graphics vnc,password=[your password here],listen=0.0.0.0,port=[your VNC prot here] –cpu host-passthrough –arch x86_64 –video cirrus 

virt-install --name win7 \
--memory 8192 \
--vcpus sockets=1,cores=8,threads=1 \
--disk device=cdrom,path=/usr/local/kvm/iso/win7.iso \
--disk device=cdrom,path=/usr/share/virtio-win/virtio-win.iso \
--disk path=/usr/local/kvm/images/win7.img,size=100,bus=virtio \
--network bridge=br0,model=virtio \
--os-type windows \
--os-variant win7 \
--accelerate \
--hvm \
--graphics vnc,password=[Your VNC Password Here],listen=0.0.0.0,port=[Your VNC Port Here] \
--cpu host-passthrough \
--video cirrus

#更新:2016年6月7日

0x04 安装成功

KVM windows7 系统属性
KVM windows7 系统属性
KVM windows7 网络
KVM windows7 网络

0x05 相关资料以及引用的信息

  1. serverfault相关问题
  2. libvirt关于显示硬件的说明