Monday, July 14, 2008

KVM guest 连接 USB 设备临时解决办法

默认的 kvm guest 启动并未模拟 usb, 模拟 usb,需要启动时加上 -usb 参数,qemu 为 guest模拟一个 8 port 的 Intel SB82371 UHCI USB 控制器。

kvm -hda /path/to/your/kvm/image/hda.qcow2

在使用 USB 之前,需要找出 USB 的设备 ID,如:

$lsusb
Bus 007 Device 002: ID 05ac:8502 Apple Computer, Inc.

输出中的 05ac:8502,分别为 <VendorID>:<ProductID>

启动 guest 系统后, CTRL + ALT + 2 转到 Monitor ,手工加载 usb 设备(用上面的输出替换):

#usb_add host:<VendorID>:<ProductID>
Could not open /proc/bus/usb/devices

回到 host 系统发现 /proc/bus/usb/devices 文件不存在,google 后发现相关的 Ubuntu BUG report。Ubuntu 等发行版早将 /proc/bus/usb/devices deprecated 一年之久,hardy 已经完全转向 /dev/bus/usb/devices,相比较 proc 获得有更灵活的权限控制、安全性更高。Ubuntu bug report 中给出了 workaround。

编辑 '/etc/init.d/mountdevsubfs.sh' 取消 40 行后的相应注视:

 # Magic to make /proc/bus/usb work
  #
  mkdir -p /dev/bus/usb/.usbfs
  domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644
  ln -s .usbfs/devices /dev/bus/usb/devices
  mount --rbind /dev/bus/usb /proc/bus/usb

执行这个脚本。

$ sudo /etc/init.d/mountdevsubfs.sh start

用此法成功加在招行 USB key,可以进入专业版,实际实验查帐等操作正常,转帐验证时候失败。

Labels: ,

Saturday, July 12, 2008

手工配置 Ubuntu hardy KVM 网络

Ubuntu hardy 中安装 KVM 速记中网络配置采用 KVM 默认方式,此法简单易用。

用户网络

使用情形

  • 最简易的从虚拟机访问宿主,Internet,和其它本地网络资源
  • 你不需要从一个 guest 访问另外一个 guest
  • 你不追求最高性能

警告:用户网络不支持部分网络特性如 ICMPP,影响一些程序(如 ping) 无法完全正常工作。

前置需求

  • 你需要 kvm 启动并运行
  • 非 root 用户运行需要拥有 /dev/kvm rw 权限
  • 如果你需要访问 Internet 或本地网络,你的宿主系统必须可以访问 Internet 和本地网络

解决方案

以参数 "-net nic -net user" 运行 kvm , 例如:

kvm -hda /path/to/hda.img -net nic -net user

注意

  • IP地址由qemu 自带的 DHCP 服务自动分配
  • 如果你在一个宿主上运行多 guest 系统,你无法为每个 guest 指定不同的 MAC 地址
  • 你仍可访问一个指定的端口,你可以使用 "redir" 选项(译者按:启动 kvm 时)

公共网桥

警告: 下面的方法,不适用于大部分的无限驱动,因为他们不支持 bridging 功能。

使用案例

  • 你不想指定 IP 地址到你的虚拟机器并且使它们可以从本地网络访问
  • 希望性能于虚拟机无关

前置需求

  • kvm 已启动并运行
  • 非 root 用户运行需要拥有 /dev/kvm rw 权限

停止当前网络接口

sudo /etc/init.d/networking restart

编辑 /etc/network/interfaces 设置 bridge 接口,注释或替换原配置为(修改为对应你网络的配置):

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.0.10
        network 192.168.0.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
        bridge_ports eth0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off

或使用 DHCP(对 laptop 比较有用,但不能使用无线,囧)

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off

这将用来创建虚拟接口 br0

重启网络

sudo /etc/init.d/networking restart

手工或用下面的脚本创建 MAC 地址

#!/bin/bash
# generate a random mac address for the qemu nic
# shell script borrowed from user pheldens @ qemu forum
echo $(echo -n DE:AD:BE:EF ; for i in `seq 1 2` ;
do echo -n `echo ":$RANDOM$RANDOM" | cut -n -c -3` ;done)

注:原脚本用的环境为 /bin/sh,ubuntu 上出错,所以这里我替换为 /bin/bash

用生成的 MAC 地址替换下面的 $macaddress 启动 KVM

kvm -hda /path/to/hda.img -net nic,macaddr=$macaddress -net tap

现在可以 ping 通本地网络了,:-)

Labels: ,

Tuesday, July 08, 2008

重新调整 qemu 镜像文件大小一法

qemu 的镜像文件格式 raw, qcow2 采用了文件系统的打孔技术,镜像文件实际大小同实际写入的数据扇节相关。因为担心硬盘空间不足,之前创建的镜像文件仅为 2G,现在看来完全没有必要,尝试重新调整到 10G。

qemu 没有提供调整硬盘镜像文件的工具,google "qemu disk resize" 说法各异。我的 guest 文件系统为 NTFS,按照此法调整成功,记录一下:

转换为 raw 格式

$qemu-img convert hda.qcow2 -O raw hda.raw

增大raw镜像文件到 10G

$dd if=/dev/zero of=hda.raw seek=10 obs=1GB count=0

修正 NTFS BPB

$hexedit hda.raw

转到 7E00: 7E00
替换 7E1A 的 80 为 FF
保存退出:Ctrl-x --> y

gparted livecd 启动 guest 重新调整 NTFS 分区大小

$kvm -hda hda.raw -cdrom gparted-livecd-0.3.4-11.iso -boot d

重启 windows,windows 将进入自检

 
$qemu hda system.raw

重新转换为 qcow2 格式

$qemu-img convert hda.raw -O qcow2 hda.qcow2

Labels: ,

Monday, July 07, 2008

Ubuntu hardy 中安装 KVM 速记

kvm hit the road

介绍

KVM(Kernel-based Virtual Machine) 是 X86 平台上基于 linux kernel 的全虚拟化技术,通过 Intel-VTAMD-V 技术实现全虚拟化。Linux kernel 自 2.6.20 已经包含了 KVM,各大发行版也陆续提供支持。

准备工作

本文以 Ubuntu hardy 为例记录安装过程。

系统环境

OS: Ubuntu hardy 8.04 64bit
Kernel: 2.6.24-19-generic SMP x86_64 GNU/Linux
Hardware: Macbook Pro 3rd(Santa rose), Intel(R) Core(TM)2 Duo CPU     T7500  @ 2.20GHz

检查 CPU

KVM 需要 CPU 支持原生虚拟以得到最佳性能,官方文档称当 CPU 不支持原生虚拟时,将自动回退到 qemu 模拟方式。Ubuntu 中如果系统不支持原生虚拟,KVM 将拒绝启动,检查 CPU 是否支持原生虚拟:

$egrep '(vmx|svm)' /proc/cpuinfo

有输出即说明 CPU 支持原生虚拟。

安装 KVM

$sudo aptitude install kvm

安装 guest 系统

#mkdir -p /media/work/kvm/
#qemu-img create -f qcow2 /media/work/kvm/hda.qcow2 10G
#kvm -hda /media/work/kvm/hda.qcow2 -m 256 -vnc :0 -daemonize -cdrom /media/ENT/iso/Windows.XP.Professional.VLK.CN.SP2.full.iso -boot d
  • qcow2 是 qemu 支持的硬盘镜像格式之一,支持 snapshots 以及 AES 加密,zlib 压缩,其它格式可以参考 man qemu-img
  • ext3、NTFS 文件系统支持打孔,只有实际写入的扇区才会占用存储空间
  • KVM 启动参数指定 guest 内存为 256M,以 CDROM 启动

kvm 以 daemon 方式运行,通过 vnc 访问:

$xvncviewer localhost:5900

Windows 安装完成后,关闭系统kvm 进程会自动关闭。如需重启:

#kvm -hda /media/work/kvm/hda.qcow2 -m 256 -vnc :0 -daemonize

系统同样可以通过 VNC 来访问。

网络

默认启动 kvm 或者参数 kvm -net nic -net user 将创建一个 10.0.2.0/24 的网络:

         QEMU VLAN      <------>  Firewall/DHCP server <-----> Internet
                           |          (10.0.2.2)
                           |
                           ---->  DNS server (10.0.2.3)
                           |
                           ---->  SMB server (10.0.2.4)

guest 系统从 10.0.2.15 开始依次分配 IP 地址,VNC 登入 Windows,系统已通过 DHCP 分配到 10.0.2.15 IP地址,Windows 系统此时已经可以正常访问网络。如果不需要提供外部服务的话,默认的网络方式已经可以,非常简便。

links

Labels: ,