检查CPU是否支持硬件虚拟化

$ egrep '(vmx|svm)' --color=always /proc/cpuinfo

安装依赖

# yum install kvm libvirt qemu-kvm

启动libvirt守护进程

# /etc/init.d/libvirtd start

检查virsh是否能正常连接kvm

# virsh -c qemu:///system list

如果没有输出错误信息,则代表安装成功了

设置桥接

为了能使建立的虚拟机能从外部连接,需要配置一个网桥

先安装所需的包

# yum install brigde-utils tunctl

编辑配置文件

/etc/sysconfig/network-script目录下建立ifcfg-br0文件,输入以下内容

DEVICE="br0"
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=none
IPADDR=192.168.0.100
PREFIX=24
GATEWAY=192.168.0.1
DNS1=8.8.8.8
DNS2=8.8.4.4
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System br0"

注意,IPADDR, PREFIX, GATEWAY, DNS1, DNS2这几个值需要从物理网卡的配置(如eth0)中拷贝过来

修改物理网卡配置(例如/etc/sysconfig/network-script/ifcfg-eth0)如下

DEVICE="eth0"
#BOOTPROTO=none
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE="Ethernet"
UUID="73cb0b12-1f42-49b0-ad69-731e888276ff"
HWADDR=00:1E:90:F3:F0:02
#IPADDR=192.168.0.100
#PREFIX=24
#GATEWAY=192.168.0.1
#DNS1=8.8.8.8
#DNS2=8.8.4.4
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
BRIDGE=br0

因为IPADDR, PREFIX, GATEWAY, DNS1, DNS2这几个值已经拷贝到br0的配置里了,所以需要在这注释掉

然后重启network

# /etc/init.d/network restart

修复桥接问题

在上一步中,重启network的时候总是报错

eth0: Connection activation failed: Master connection not found or invalid
br0:Conncetion activation failed: Failed to determine connection’s virtual interface name

经过Google之后确认,是因为Centos中的NetworkManager捣乱所致,所以需要关闭它,使用手动的network来配置网络

# chkconfig NetworkManager off
# chkconfig –levels 35 network on
# /etc/init.d/NetworkManager stop
# /etc/init.d/network restart

为了避免性能以及安全性问题,需要关闭netfilter机制

# cat >> /etc/sysctl.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
EOF
# sysctl -p /etc/sysctl.conf

或者配置iptables允许网桥上的转发

# iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
# service iptables save
# service iptables restart

最后重启libvirt守护进程

# service libvirtd reload

安装虚拟机

接下来需要安装以及配置一个虚拟机

首先,需要安装virt-install

# yum install python-virtinst

然后使用预先配置好的磁盘image或者从iso镜像中安装一个系统

从预先配置好的磁盘image中快速启动一个虚拟机

这里下载预先配置好的磁盘image,保存到/var/lib/libvirt/images下,比如centos6.3-gold-master.img

调整磁盘image的大小

# qemu-img create -f qcow2 centos6.3-gold-resized-20G.img 20G
# virt-resize \
--expand /dev/vda2 \
--LV-expand /dev/vg_main/lv_root centos6.3-gold-master.img centos6.3-gold-resized-20G.img

安装虚拟机

# virt-install \
--name centos6.3-gold-resized-20G \
--vcpus=2 \
--ram=1024 \
--os-type=linux \
--os-variant=rhel6 \
--disk path=/var/lib/libvirt/images/centos6.3-gold-resized-20G.img \
--import

修正启动问题

  1. 编辑域XML

    virsh edit centos6.3-gold-resized-20G

    在打开的xml文档中将挂接的磁盘image里的 替换成

  2. 或者在使用virt-install时,指定好bus类型

    virt-install –connect qemu:///system –ram 1024 -n rhel_64 -r 2048 –os-type=linux –os-variant=rhel5 –disk path=/root/RHEL-Server-5.8-64-virtio.qcow2,device=disk,bus=virtio,format=qcow2 –vcpus=2 –vnc –noautoconsole –import

从ISO镜像中安装一个系统

先下载一个ISO镜像,比如CentOS-6.4-x86_64-netinstall.iso

创建一个磁盘image

# qemu-img create -f qcow2 /tmp/centos-6.4.qcow2 10G

安装虚拟机

# virt-install --virt-type kvm --name centos-6.4 --ram 1024 \
--disk /tmp/centos-6.4.qcow2,format=qcow2 \
--network network=default \
--graphics vnc,listen=0.0.0.0 --noautoconsole \
--os-type=linux --os-variant=rhel6 \
--extra-args="console=tty0 console=ttyS0,115200n8 serial" \
--location=/data/isos/CentOS-6.4-x86_64-netinstall.iso

通过控制台或者vnc进行普通安装过程

安装完成后,移除CDROM

# virsh attach-disk --type cdrom --mode readonly centos-6.4 "" hdc
# virsh destroy centos-6.4
# virsh start centos-6.4

为了能通过外部关闭虚拟机,需要安装acpi服务

# yum install acpid
# chkconfig acpid on

参考

http://www.howtoforge.com/virtualization-with-kvm-on-a-centos-6.4-server
https://catn.com/projects/centos-images/
http://docs.openstack.org/image-guide/content/centos-image.html
http://docs.openstack.org/image-guide/content/virt-install.html
https://help.ubuntu.com/community/KVM/Managing
http://serverfault.com/questions/475015/guest-system-managed-by-libvirt-doesnt-start-after-successful-installation
http://wiki.libvirt.org/page/After_import_a_guest_from_an_existing_disk_image_using_virt-install,_the_guest_starting_stalls_with_%22No_boot_device%22