[原创]KVM虚拟化实践记录
KVM虚拟机管理系统实现视频演示:http://v.youku.com/v_show/id_XMjg4MTczODU1Ng==.html
一、KVM简介
KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机),是一个开源的系统虚拟化模块,基于硬件的完全虚拟化,不过需要硬件支持(如Intel VT技术或者AMD V技术)。自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之一。
二、KVM安装配置
1、准备工作
1.1 关闭iptables防火墙
[root@localhost ~]# service iptables stop //停止iptables
1.2 CPU开通支持虚拟化
需要在BIOS中开启虚拟化,一般是默认开启的
2、安装kvm虚拟机
2.1 查看CPU是否支持kvm完全虚拟机
[root@localhost ~]# cat /proc/cpuinfo | grep 'vmx' //Intel CPU判断方法
[root@localhost ~]# cat /proc/cpuinfo | grep 'svm' //AMD CPU判断方法
根据对应的CPU型号进行选择判断方法,如果能出现信息 ,就说明CPU支持KVM完全虚拟机
2.2 安装kvm和其它虚拟化所需管理软件包
[root@localhost ~]# yum install -y kvm virt-* libvirts bridge-utils qemu-img
软件包名称介绍:
kvm:软件包中含有KVM内核模块,它在默认linux内核中提供kvm管理程序
libvirts:安装虚拟机管理工具,使用virsh等命令来管理和控制虚拟机
bridge-utils:设置网络网卡桥接
virt-*:创建、克隆虚拟机命令,使用qemu命令来创建磁盘等。
qemu-img:安装qemu组件,使用qemu命令来创建磁盘等。
2.3 加载kvm模块,查看kvm模块是否被加载
[root@localhost ~]# modprobe kvm-intel //加载kvm模块
[root@localhost ~]# lsmod | grep kvm //查看kvm模块是否被加载
2.4 重启确认kvm是否被加载
[root@localhost ~]# reboot //重启
[root@localhost ~]# lsmod | grep kvm //查看kvm模块是否被加载
2.5 查看已打开虚拟机列表
[root@localhost ~]# virsh list //查看虚拟机列表,如果有的话,就会显示出来
2.6 配置eth0、br0网卡
[eth0网卡]
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=74:D4:35:87:71:02
TYPE=Ethernet
UUID=723095b7-27d1-4f88-aa5f-5aa6b0472fbc
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
BRIDGE=br0
[br0网卡]
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=172.16.10.23
NETMASK=255.255.255.0
GATEWAY=172.16.10.254
DNS1=202.96.128.86
大家可以看着我的配置来进行修改,
2.7 查看目前所有的网桥接口
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.74d435877102 no eth0
virbr0 8000.5254005ce327 yes virbr0-nic
(如果eth0没有挂载br0上就要使用命令:#brctl addif br0 eth0 将其挂上去即可)
2.8 修改VNC服务器的配置文件
[root@localhost ~]# vim /etc/libvirt/qemu.conf
将 vnc_listen = "0.0.0.0" 前面的#号注释去掉 //在文件的第12行
2.9 重启libvirtd和messagebus服务
[root@localhost ~]# /etc/init.d/libvirtd restart //重启libvirtd服务
Stopping libvirtd daemon: [ OK ]
Starting libvirtd daemon: [ OK ]
(若出现重启libvirtd服务失败,libvirtd: relocation error: libvirtd: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference,则执行:yum -y upgrade device-mapper-libs之后重启libvirtd服务即可)
[root@localhost ~]# /etc/init.d/messagebus restart //重启messagebus服务
Stopping system message bus: [ OK ]
Starting system message bus: [ OK ]
3、在宿主主机上创建、安装kvm虚拟机
3.1 创建镜像文件目录和虚拟磁盘存放目录
[root@localhost ~]# mkdir /data/iso
[root@localhost ~]# mkdir -p /data/vm/
3.2 把Centos6.5和windows2003系统文件拷贝到iso目录下
这个可以通过ftp或者通过挂载,下载都行
(kvm服务的存储将磁盘配置成lvm来使用,可动态扩展使用,还可以创建快照备份容灾)
======================================================================================================
先创建磁盘:
(windows)#qemu-img create -f raw /data/vm_disk/migrate.img 4G
(linux)#qemu-img create -f qcow2 /data/vm_disk/migrate.img 6G
安装虚拟机:
(windows)#virt-install -n winxp01 -r 1024 -vcpus=1 -s 20 -c /data/iso/DG8FV-B9TKY-FRT9J-6CRCC-XPQ4G.iso --hvm --os-type=windows -f /data/vm/win/winxp_01.img --bridge=br0 --graphics vnc,listen=0.0.0.0,port=7789 --force --autostart
(linux)#virt-install -n openfiler -r 1024 -vcpus=2 -s 20 -c /data/iso/openfileresa-2.99.1-x86_64-disc1.iso --hvm --os-type=linux -f /data/vm/linux/openfiler.img --bridge=br0 --graphics vnc --force --autostart
[安装过程需要在KVM主机上开启vncserver服务,然后使用vnc客户端连接上去,在使用virt-viewer (id号)连接上虚拟机安装界面进行安装]
1.安装完毕后,要记的在虚拟机上安装acpid进程,以方便远程关闭机器
yum install acpid -y
chkconfig acpid on 345
service acpid start
2.等做完虚拟机的配置后,就需要对虚拟机做一个快照了。
快照的制作有两种方法,一种是直接在virsh 里面使用snapshot来制作。另外一种是使用qemu-img来创建快照
virsh snapshot-create-as winxp01
快照创建的很快,其实,就是生成了一个XML的配置文件,记录下当前的信息。
查看快照
virsh snapshot-list winxp01
名称
CreationTime 状态
------------------------------------------------------------
1330937069 2012-03-05 16:44:29 +0800 shutoff
查看快照的配置文件
virsh snapshot-current winxp01
那么,快照文件存在什么地方呢,在/var/lib/libvirt/qemu/snapshot目录下,有以虚拟机的域名为名称的文件夹,就在里面哪
使用qemu-img创建快照也很方便,这个镜像是直接对硬盘文件进行操作,硬盘文件的格式必须为qcow2格式的,记的貌似物理硬盘的格式为LVM才能创建快照,还是格式为LVM,qemu-img的格式不必为qcow2格式就能创建快照,还没整明白
qemu-img snapshot -c 2012-3-5 /kvm/images/winxp01
创建完毕后,查看一下
qemu-img snapshot -l /kvm/images/winxp01
Snapshot list:
ID TAG VMSIZE DATE VM CLOCK
1 1330937069 0 2012-03-0516:44:29 00:00:00.000
2 2012-3-5 0 2012-03-0516:51:39 00:00:00.000
可以看到有两个快照,ID=1为virsh创建的,ID=2为qemu-img创建的,这两个之间有什么关系,还没有想明白。
【注意要使用 KVM 的快照功能,虚拟机的硬盘一定要是 qcow2 格式,否则无法使用快照功能。】
===========================================================================================================
使用lvm安装虚拟机,制作镜像系统。然后创建快照来备份和快速复制启动虚拟机。
#vgrename /dev/kvm /dev/vg01
#lvcreate -L 8G -n ubuntu01 vg01
#virt-install -n openfilertest_01 -r 2048 -vcpus=1 -s 10 -c /data/iso/ubuntu.iso --hvm --os-type=linux -f /dev/vg01/ubuntu01 --bridge=br0 --graphics vnc --force --autostart &
#lvcreate -s -L 2G -n s_ubuntu01 /dev/vg01/ubuntu01
创建虚拟机快照之后,编写kvm启动的s_ubuntu01.xml文件指定source设备是s_ubuntu01,修改uuid,mac和name。然后
#virsh define s_ubuntu01.xml来启动虚拟机。
#virsh start s_ubuntu01
3.实现虚拟机动态迁移
配置两台KVM主机SSH免密钥登录,关闭防火墙。执行#virsh -c qemu+ssh://dest_ip/system list
成功表示可以做迁移了。执行下面命令进行迁移:#virsh migrate --verbose --live --persistent xp01 qemu+ssh://dest_ip/system
迁移进度完成之后就迁移好了,但是配置文件还没有,需要在目标主机上创建并定义迁移过来的虚拟机,操作如下:
#virsh dumpxml xp01 > /etc/libvirt/qemu/xp01.xml
#virsh define /etc/libvirt/qemu/xp01.xml
到此,完成迁移。
===========================================================================================================
安装vnc服务:
1.yum install tigervnc tigervnc-server
2.设置vnc周密码:
[root@www.linuxidc.com ~]# vncserver
You will require a password to access your desktops.
Password:<输入vnc登录密码>
Verify:<再次输入vnc登录密码>
3。 配置VNC:
为了防黑屏,需要修改一下/root/.vnc/xstartup。
注释下面两行
#xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" & [注意:若要使用vnc远程到字符界面进行操作则不要注释此行,并安装xterm工具即可。注意远程上去之后如果有界面不能操作则需要设置vnc客户端的键盘和鼠标的使用]
#twm &
然后再添加下面一行
gnome-session & //如果是ubuntu系统,配置这个生效的话需要安装gdm:apt-get install gdm
4.修改用户配置文件:/etc/sysconfig/vncservers,去掉下面这两行前的“#”,也就是说把这两行的注释给去掉。
VNCSERVERS="2:root"
VNCSERVERARGS[2]="-geometry 1024x768 -depth 32"
4.改变xstartup的权限:
chmod 777 /root/.vnc/xstartup
5、防火墙开端口,netstat -antpl查看可以发现有三个端口在监听。
5901 5801 6001
这三个端口:
默认的, vnc 服务监听3个TCP端口
RFB(Remote FrameBuffer)协议 默认端口 : 5900 显示器号
HTTP协议默认端口 : 5800 显示器号
X协议 默认端口 : 6000 显示器号
vncserver使用的显示器编号默认从1开始, 依次使用, 也可以参数指定端口号,我们只需要RFB协议就好了,所以,我们在防火墙中加5900到5903这几个。
#vi /etc/sysconfig/iptables 找到下面的语句:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
在这之后填加:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5900:5903 -j ACCEPT
#service iptables restart
# vncserver -kill :1 //kill进程
# vncserver :1 //重启进程
6.在windows中用vnc客户端登录测试。
7.配置vnc开机自启,在/etc/rc.local文件中添加: /etc/init.d/vncserver start & 即可。
===========================================================================================================
添加磁盘:
方式一:
qemu-img create -f qcow2 /data/vm_disk/vm_sda.img 1G
//新建的大小和指定参数的大小不一样,但是挂载的时候大小是对的。
cat > vm_sda.xml
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/data/vm_disk/vm_sda.img'/>
<target dev='hdf' bus='virtio' type='virtio'/>
</disk>
virsh attach-device ubuntu_01 vm_sda.xml
virsh detach-device ubuntu_01 vm_sda.xml
方式二:
virt-make-fs -F qcow2 -t ext4 -s 512M /data/vm/device/ /data/vm/device/vm_sda1.img
//新建的大小和指定参数的大小不一样,但是挂载的时候大小是对的。
cat > vm_sda1.xml
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/data/vm/device/vm_sda1.img'/>
<target dev='hde' bus='virtio' type='virtio'/>
</disk>
virsh attach-device ubuntu_01 vm_sda1.xml
virsh detach-device ubuntu_01 vm_sda1.xml
分区格式化:
fdisk -l
fdisk /dev/sda
n
1
w
mkfs.ext4 /dev/sda1
mount /dev/sda1 /data
===========================================================================================================
1.kvm虚拟机部署之后安装shellinabox服务用于web操作该虚拟机。
部署shellinabox:
1)yum install git openssl-devel pam-devel zlib-devel autoconf automake libtool
2)git clone https://github.com/shellinabox/shellinabox.git && cd shellinabox
3)autoreconf -i
4)./configure && make
5)make install
6)openssl genrsa -des3 -out my.key 1024
7)openssl req -new -key my.key -out my.csr
8)cp my.key my.key.org
9)openssl rsa -in my.key.org -out my.key
10)openssl x509 -req -days 3650 -in my.csr -signkey my.key -out my.crt
11)cat my.crt my.key > certificate.pem
12)/usr/local/shellinabox/bin/shellinaboxd -c /root -u root -b
/usr/local/shellinabox/bin/shellinaboxd --disable-ssl -c /root -u root -b(不使用https)
13)netstat -ntpl |grep 4200
14)ps -ef |grep shell
15)https://ip:4200 //(jhk/jhk123456)但是一直root登陆不上去,默认是不让root登陆的,只能其它用户登陆,然后再 su - 切换过去。
2.随机生成mac地址和uuid:
1)#MACADDR="52:54:$(dd if=/dev/urandom count=1 2>/dev/null | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4/')"; echo $MACADDR
2)#uuid=`/usr/bin/uuidgen`;echo $uuid
===========================================================================================================
virsh console vm01 //默认是不起作用的,需要配置一下内容.
1.echo "ttyS0" >> /etc/securetty
2.在etc/grub.conf中加入如下内容console=ttyS0
3.在/etc/inittab中加入
S0:12345:respawn:/sbin/agetty ttyS0 115200
4.reboot
5.virsh console vm01
kvm虚拟化windows操作系统鼠标有点不灵活等问题,在这里通过以下方式解决。在虚拟机的<devices>配置中增加:
# virsh edit wintest01
<input type=’tablet’ bus=’usb’/>
kvm使用vnc连接虚拟机:使用id号和port连接都试一下
如果vnc连接guest窗口一闪而过,那么在vnc viewer客户端软件中设置ColourLevel=rgb222即可。
===========================================================================================================
配置KVM主机tcp方式互相访问:
virsh -c qemu+tcp://server01/system
修改文件vim /etc/sysconfig/libvirtd,用来启用tcp的端口
LIBVIRTD_CONFIG=/etc/libvirt/libvirtd.conf
LIBVIRTD_ARGS="--listen"
修改文件vim /etc/libvirt/libvirtd.conf
listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
listen_addr = "0.0.0.0"
auth_tcp = "none"
重启libvirtd:
service libvirtd restart
防火墙开放16509端口。
python操作迁移:
import libvirt
import pprint
conn_01 = libvirt.open('qemu+tcp://userename@server01/system')
conn_02 = libvirt.open('qemu+tcp://userename@server02/system')
vm_domain = conn_01.lookupByNName('instance_name')
vm_domain.migrate(connm_02,True,'instance_name',None,0)
pprint.pprint(help(vm_domain.migrate))
===========================================================================================================
解决KVM虚拟机鼠标同步问题
kvm虚拟化windows操作系统鼠标有点不灵活等问题,在这里通过以下方式解决。在虚拟机的<devices>配置中增加:
# virsh edit wintest01
<input type='tablet' bus='usb'/>
===========================================================================================================
python迁移代码:
#!/usr/bin/python
import libvirt
import pprint
conn_01 = libvirt.open('qemu+tcp://vm01/system')
conn_02 = libvirt.open('qemu+tcp://vm02/system')
vm_domain = conn_01.lookupByName('s_migrate')
vm_domain.migrate(conn_02,True,'s_migrate',None,0)
pprint.pprint(help(vm_domain.migrate))
手动迁移步骤:
qemu-img create -f raw /data/vm_disk/migrate.img 4G
virt-install -n s_migrate -r 2048 -vcpus=1 -s 20 -c /iso/DG8FV-B9TKY-FRT9J-6CRCC-XPQ4G.iso --hvm --os-type=windows -f /data/vm_disk/s_migrate.img --bridge=br0 --graphics vnc --force --autostart &
迁移时报错:error: unable to connect to server at 'vm02:49152': Connection refused是因为ssh免密钥登录没有配置好。
直接迁移,没有配置文件和存储的迁移:
virsh migrate s_migrate --live qemu+tcp://vm01/system
virsh migrate s_migrate --live qemu+ssh://vm01/system
迁移时把存储一起迁移,需要目标主机先建立一样的路径和名称大小的磁盘文件:
virsh migrate --live --copy-storage-all --unsafe --persistent s_migrate qemu+ssh://vm02/system
virsh migrate --live --copy-storage-all --unsafe --persistent s_migrate qemu+tcp://vm02/system
直接迁移,没有配置文件和存储的迁移,需要目标主机先建立一样的路径和名称大小的磁盘文件:
virsh migrate --verbose --live --persistent s_migrate qemu+ssh://vm02/system
virsh migrate --verbose --live --persistent s_migrate qemu+tcp://vm02/system
===========================================================================================================
存储池和存储卷的管理
1.创建 KVM主机存储池
1).创建基于文件夹(目录)的存储池
virsh pool-define-as vmware_pool –type dir –target /virhost/vmware#定义存储池vmware_pool或
virsh pool-create-as –name vmware_pool –type dir –target /virhost/vmware
#创建存储池vmware_pool,类型为文件目录,/virhost/vmware,与pool-define-as结果一样
2).创建基于文件系统的存储池
virsh pool-define-as –name vmware_pool –type fs –source-dev/dev/vg_target/LogVol02 –source-format ext4 –target/virhost/vmware
或
virsh pool-create-as –name vmware_pool –type fs –source-dev/dev/vg_target/LogVol02 –source-format ext4 –target/virhost/vmware
3).查看存储池信息
virsh pool-info vmware_pool #查看存储域(池)
4).启动存储池
virsh pool-start vmware_pool #启动存储池
virsh pool-list
5)销毁存储域,取消存储池
virsh pool-destroy vmware_pool #销毁存储池
virsh pool-list –all
virsh pool-undefine vmware_pool #取消存储池的定义
virsh pool-list –all
2.创建了存储池后,就可以创建一个卷,这个卷是用来做虚拟机的硬盘
virsh vol-create-as –pool vmware_pool –name node6.img –capacity10G –allocation 1G –format qcow2#创建卷node6.img,所在存储池为vmware_pool,容量10G,初始分配1G,文件格式类型qcow2
virsh vol-info /virhost/vmware/node6.img #查看卷信息名称: node6.img类型:文件容量: 10.00 GB分配: 136.00 KB
3.在存储卷上安装虚拟主机
virt-install –connect qemu:///system -n node7 -r 512 -f /virhost/vmware/node7.img –vnc –os-type=linux–os-variant=rhel6 –vcpus=1 –network bridge=br0 -c /mnt/rhel-server-6.0-x86_64-dvd.iso