author: | zqh |
---|---|
date: | 2015-11-10 |
前提条件
- 支持硬件辅助虚拟化(Intel VT-x或AMD-V)的主机一台。
- 已经安装好centos/fedora/redhat操作系统,不需要图形界面支持。
- windows安装镜像,建议官方版本。
- virtio-win驱动
准备工作
- 检查cpu是否支持虚拟化
>>>>egrep '(vmx|svm)' /proc/cpuinfo
Note
grep vmx /proc/cpuinfo (INTEL芯片); grep svm /proc/cpuinfo (AMD芯片)
- 确保BIOS里开启VT
进入BIOS,选择Configuration选项
Intel Virtualization Technology [Enabled]
- 升级内核
- 查看内核版本
>>>>uname -r
Note
如果在2.6.20以下的linux版本,则必须升级内核;2.6以上版本也可升级以获得更好的虚拟化支持。
- 更新内核
>>>>yum update
- 重启
>>>>reboot
- 安装kvm
>>>>yum install kvm kmod-kvm kvm-qemu-img
- 加载kvm模块
>>>>modprobe kvm
intel: >>>>modprobe kvm-intel
amd: >>>>modprobe kvm-amd
>>>>lsmod |grep kvm
kvm_intel 159744 0
kvm 491520 1
- 安装kvm所需组件
>>>>yum install -y qemu-kvm libvirt
>>>>service libvirtd start
- 关闭NetworkManager服务
Tip
下面我们要创建桥接设备,因为NetworkManager并不能管理bridge的网络配置,反而它在后台运行则可能对网络设置有些干扰。
>>>>chkconfig NetworkManager off
>>>>service NetworkManager stop
7.安装桥接网络工具
>>>>yum install bridge-utils tunctl
Note
在Fedora / Centos系统中是tunctl,在Debian / Ubuntu系统中是uml-utilities
>>>>lsmod | grep tun
tun 28672 1
Note
没加载的话运行modprobe tun
>>>>ls -l /dev/net/tun
crw-rw-rw- 1 root root 10, 200 11月 10 11:39 /dev/net/tun
Note
检查/dev/net/tun的权限,需要让当前用户拥有可读可写的权限.
- 安装vnc-server
>>>>yum install vnc-server -y
Note
为kvm虚拟机提供对外监控接口,注意这里要关闭防火墙,以便在外部连接远程端口。(关闭防火墙不再赘述)
- 下载virtio驱动
Tip
VirtIO是I/O虚拟化的框架,比如说磁盘,如果不使用VirtIO,KVM需要模拟出一块儿IDE硬盘给虚拟机使用,每次使用的时候,都需要做一次翻译中转,效率下降很多,如果装了VirtIO驱动,就直接调用API接口来处理磁盘的各项请求,跟直接操作磁盘的效果差不多,性能提升很多,网卡也是这样。
Note
linux内核版本在2.6.25以上的,都集成了VirtIO的驱动,但windows需要额外安装。
下载列表如下:
Stable | virtio-win iso | https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso |
Stable | virtio-win x86 floppy | https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win_x86.vfd |
Stable | virtio-win amd64 floppy | https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win_amd64.vfd |
Latest | virtio-win iso | https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso |
Latest | virtio-win x86 floppy | https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win_x86.vfd |
我们下载稳定版的iso和vfd驱动即可。
安装虚拟机
Tip
我们使用网桥模式来启动虚拟机, 网桥(bridge)模式可以让客户机和宿主机共享一个物理网络设备连接网络, 客户机有自己的独立IP地址,可以直接连接与宿主机一模一样的网络, 客户机可以访问外部网络,外部网络也可以直接访问客户机(就像访问普通物理主机一样)。 即使宿主机只有一个网卡设备,使用bridge的方式也可知让多个客户机与宿主机共享网络设备,其使用非常方便,其应用也非常广泛。
- 创建一个网桥并配置网络
- 建立一个bridge,并将其绑定到一个可以正常工作的网络接口上,并让bridge成为连接本机与外部网络的接口。
>>>>brctl addbr br0 #添加br0这个bridge >>>>brctl addif br0 eth0 #将br0与eth0绑定起来 >>>>brctl stp br0 on #br0打开STP协议,STP是生成树协议(Spanning Tree Protocol),它主要是为了避免在建有bridge的以太网LAN中出现桥回路(bridge loop >>>>ifconfig br0 up >>>>brctl showbridge name bridge id STP enabled interfaces br0 8000.3cd92b61a78e yes em1
- 修改配置文件
>>>>vim /etc/sysconfig/network-scripts/ifcfg-em1
- BOOTPROTO修改为none,不使用协议启动
- 添加BRIDGE=br0
>>>>vim /etc/sysconfig/network-scripts/ifcfg-br0
修改后内容如下
DEVICE=br0 STP=yes TYPE=Bridge BOOTPROTO=none DEFROUTE=yes IPV4_FAILURE_FATAL=no NAME=br0 UUID=297796bf-1fd2-4eea-ae83-f677b6015482 ONBOOT=yes BRIDGING_OPTS=priority=32768 IPADDR=10.68.7.235 PREFIX=24 GATEWAY=10.68.7.190 DNS1=223.5.5.5
- 重启网络
>>>>service network restart
- 创建虚拟机的tap网卡
- 创建tap0
>>>>tunctl -b -t tap0 -u root
- 启动tap0
>>>>ifconfig tap0 up
Note
不要为该网卡配置地址
- 将tap0添加到br0
>>>>brctl addif br0 tap0
- 查看tap设备
>>>>ip addr show
- 创建qcow2格式的虚拟磁盘
>>>>qemu-img create -f qcow2 win2k8.qcow2 10G
- 以桥接方式启动虚拟机
>>>>qemu-kvm -name win2008r2 \
-smp 2 \
-m 2048 \
-cdrom /home/root/iso_bak/Windows_server_2008_r2_x64.iso \
-drive file=/home/root/iso_bak/virtio-win-0.1.110.iso,media=cdrom,index=1 \
-drive file=win2k8r2-2.raw,media=disk,index=1,if=virtio,format=raw \
-fda file:/home/root/iso_bak/virtio-win-1.1.16.vfd \
-boot order=dc,once=d \
-net nic,model=virtio \
-net tap,ifname=tap0,script=no,downscript=no \
-balloon virtio \
-daemonize \
-display vnc=:3
参数详解:
name:客户机名称
smp:客户机核心数
m:客户机内存大小
cdrom:光驱
drive file:定义一个硬盘设备:media-介质类型(disk/cdrom);index-同种设备的标识号;if-接口类型;format-文件格式
fda file:定义文件为软盘镜像
boot:启动项,x86架构里c标示硬盘,d标示光驱,n-p表示网络适配器,默认为硬盘设备。once只启动一次
net nic:创建一个网卡设备,model-网卡类型
net tap:使用宿主机的tap网络接口,ifname-接口名称,script和downscript分别为配置接口脚本和撤销接口脚本。
balloon:使用blloon驱动
deamonize:以守护进程运行
display:默认情况下,qemu使用sdl显示vga输出;vnc选项可以让qemu监听在VNC上,并将vga输出重定向至vnc会话,vnc后面可指定监听端口号,1代表5901,2代表5902,依次类推
- 可选步骤 通过脚本配置客户机网络
上面几步我们是通过手工创建tap设备关联网桥来实现配置客户机网络了,也可以通过脚本来自动配置
-net tap参数中的script和downscript为启动脚本和关闭脚本
- script
# cat /etc/qemu-ifup #!/bin/bash # bridge=br0 if [ -n "$1" ]; then ip link set $1 up sleep 1 brctl addif $bridge $1 [ $? -eq 0 ] && exit 0 || exit 1 else echo "Error: no interfacespecified." exit 1 fi
- downscript
# cat/etc/qemu-ifdown #!/bin/bash # bridge=br0 if [ -n "$1" ];then brctl delif $bridge $1 ip link set $1 down exit 0 else echo "Error: no interfacespecified." exit 1 fi赋给脚本执行权限
>>>>chmod +x /etc/qemu-ifup >>>>chmod +x /etc/qemu-ifdwon
- 本机安装
Tip
如果本机已经安装了图形界面,可以本机连接vnc相应端口打开监控界面,或者修改-display sdl参数直接使用sdl多媒体库界面操作。
- 本机连接vnc远程桌面的方式和同外部连接一样,详情见下一步。
- 使用sdl界面如下:
- qemu监视器的使用
- 使用sdl图形窗口模式打开qemu监视器
使用快捷键ctrl+alt+2即可打开Qemu监视器
使用快捷键ctrl+alt+1可返回客户机界面
Tip
可以尝试ctrl+alt+3打开串口监视,ctrl+alt+4打开并口监视,这里没有用到不再多说。
- 使用文本窗口模式打开qemu监视器
Note
使用文本模式启动客户机时须带上-nographic参数,并且去掉-daemonize参数。
使用快捷键ctrl+a -> c即可在qemu监视器和客户机交互命令行切换
- qemu监视器命令详解
help:显示帮助 info:显示一些虚拟机系统信息,如:info cpus,info tlb savevm,loadvm,delvm:保存、装载、删除虚拟机快照 commit:提交虚拟机修改部分 change:改变虚拟机配置如:change vncpassword device_add&device_del:实现动态添加和移除设备 usb_add&usb_del:添加和移除usb设备 migrate,migrate_cancel:迁移和取消迁移指令 cpu:设定默认CPU log&logfile:记录日志和将日志记录到日志文件中 sendkey:向虚拟机发送指令 system_powerdown:向客户端发送关闭电源通知 system_reset:重启虚拟机 system_wakeup:唤醒虚拟机 q or quit:退出qemu监视器,qemu进程会终止;
- 在外部连接vnc
使用安装了vnc viewer的机器连接虚拟机的vnc端口,这里使用TigerVNC Viewer。
- 连接vnc远程桌面
- vnc菜单
在此vnc客户端中可设置呼出菜单快捷键
快捷键菜单如下,可以用来向虚拟机发送组合快捷键等功能
- 开始安装
- 选择驱动
Note
这里要选择virtio的网卡和硬盘驱动
- 安装操作系统
- 安装完成,查看设备驱动
- 基本设置
- 修改分辨率
设置合适的分辨率
- 设置桌面显示图标
把常用的图标放桌面上,如:我的电脑。
- 禁用复杂密码策略
- 关闭防火墙
- 打开远程桌面
- 设置dhcp网络自动获取
- 安装balloon驱动
刚才启动虚拟机的参数中加了-balloon virtio,进入操作系统后还要安装balloon驱动。 驱动路径在驱动包的Balloon\2k8R2\amd64路径下。(对应操作系统版本以及x86/amd64)
Tip
通常来说,要改变客户机占用的宿主机内存,是要先关闭客户机,修改启动时的内存配置,然后重启客户机才能实现。而内存的ballooning(气球)技术可以在客户机运行时动态地调整它所占用的宿主机内存资源,而不需要关闭客户机。 Ballooning技术形象地在客户机占用的内存中引入气球(Balloon)的概念,气球中的内存是可以供宿主机使用的(但不能被客户机访问或使用),所以,当宿主机内存使用紧张,空余内存不多时,可以请求客户机回收利用已分配给客户机的部分内存,客户机就会释放其空闲的内存,此时若客户机空闲内存不足,可能还会回收部分使用中的内存,可能会换出部分内存到客户机的交换分区(swap)中,从而使得内存气球充气膨胀,从而让宿主机回收气球中的内存可用于其他进程(或其他客户机)。反之,当客户机中内存不足时,也可以让客户机的内存气球压缩,释放出内存气球中的部分内存,让客户机使用更多的内存。
- 安装openstack相关工具
- 激活系统
使用OEM10或KMS10激活工具激活操作系统
- 安装ssh server
cloudbase-init会创建用户的初始密码,如果不使用admin_pass元数据指定明文密码的话会默认使用随机密码(明文密码是openstack不推荐的方式),通过创建ssh密钥对可实现获取windows随机密码的功能。
- 安装cloudbase-init
- 设置用户账户,组和日志输出串口
- 勾选运行sysprep和运行完成后关闭计算机
Tip
cloudbase-init工具和openstack配合可实现修改主机名,设置网络,注入ssh key,注入密码,注入脚本以及自动扩展分区等功能。
Warning
cloudbase-init不支持winxp,win2k3系统。
winxp,win2k3实现自动扩展分区
winxp和win2k3系统实现自动扩展分区需要借助一个支持命令行参数的分区工具PA
- 编写自动分区脚本
@echo on
color 2f
mode con: cols=80 lines=25
@REM
@echo start extending...
@call C:\PA\PartAssist.exe /hd:0 /resize:0 /extend:auto /align /out:c:\partition.log
@REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /f /v auto_extend
@echo task complete!
- 导入自启动注册表脚本
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"auto_extend"="C:\\auto_extend.bat"
Note
这个功能实现思路,首先操作系统第一次启动的时候通过检查注册表自启项调用我们的自动分区脚本,脚本执行成功后删除注册表自启动项,从而以后再次启动不会重复执行脚本。
使用virt-manager制作操作系统镜像
virt-manager封装了qemu-kvm的操作,其使用方法和vm、virtualbox差不多,这里省略操作步骤。
Warning
使用virt-manager注意创建硬件设备的时候,硬盘和网卡的类型应该选virtio。