简介:
kvm全称Kernel-based Virtual Machine, 其实kvm只是一个内核模块,提供虚拟cpu和内存管理的模块,至于其它的设备是由qemu模拟的,如网卡,显卡,磁盘等。后来redhat联合IBM以及Linux社区创造了libvirt,模拟的设备性能要比qemu的好很多,并提供了一系列的管理工具和api,整个集成了kvm虚拟化的解决方案。Linux(redhat系)装载kvm模块后,摇身一变成为了VM Monitor,也称为Hypervisor,部署使用简单,需要硬件支持虚拟化。
作用:
提高物理服务器的资源利用率。(较少在硬件上的投入)
可以批量部署
实现实时快照技术
支持克隆技术
可以实现虚拟机的离线迁移与动态迁移。(提高IT部署的灵活性)
可以资源的动态调整。传统IT架构的资源全都是固定的,无法动态的分配。
一、部署虚拟机
1)检测硬件是否支持虚拟化
#egrep '(vmx|svm)' --color=auto /proc/cpuinfo
#modprobe kvm
# modprobe kvm_intel || modprobe kvm_amd
#lsmod | grep kvm
kvm_intel 53484 3
kvm 316506 1 kvm_intel
如果含有vmx或者svm字样,则表示支持cpu虚拟化,Intel是vmx,AMD是svm,如果装载不成功,则需要在bios中开启
2)安装程序支持
#yum groupinstall "Virtualization" "Virtualization Client" "Virtualization Platform"
#/etc/init.d/libvirtd start
#chkconfig libvirtd on
3)配置网络桥接网卡
#virsh iface-bridge eth0 br0
## brctl show
bridge namebridge idSTP enabledinterfaces
br08000.5254008f22d4yeseth0
4)部署安装虚拟机guestos
#mkdir -p /kvm/{isos,vms}
5)建立磁盘文件,如果使用的是raw格式就不需要了,kvm虚拟机默认使用raw格式的镜像格式,性能最好,速度最快,它的缺点就是不支持一些新的功能,如支持快照镜像,zlib磁盘压缩,AES加密等。这里使用qcow2格式
#qemu-img create -f qcow2 /kvm/vms/centos6-test1.img 8G
6)建立虚拟机,下面通过几种方式建立虚拟机
########### 使用使用iso来安装 ###########
# virt-install \
--name=centos6 \
--os-variant=RHEL6 \
--ram=512 \
--vcpus=1 \
--disk path=/kvm/vms/centos6-test1.img,format=qcow2,size=8,bus=virtio \
--accelerate \
--cdrom /kvm/isos/CentOS6.iso \
--vnc --vncport=5910 \
--vnclisten=0.0.0.0 \
keymap=en_us \
--network bridge=br0,model=virtio \
--noautoconsole
########### 使用使用nat模式网络###########
# virt-install \
--name=centos6 \
--os-variant=RHEL6 \
--ram=512 \
--vcpus=1 \
--disk path=/kvm/vms/centos6-test1.img,format=qcow2,size=8,bus=virtio \
--accelerate \
--cdrom /data/iso/CentOS6.iso \
--vnc --vncport=5910 \
--vnclisten=0.0.0.0 \
keymap=en_us \
--network network=default,model=virtio \
--noautoconsole
######### 从http中启动,使用ks安装 #########
# virt-install \
--name=centos6 \
--os-variant=RHEL6 \
--ram=4096 \
--vcpus=4 \
--virt-type kvm \
--disk path=/kvm/vms/centos6-test1.img,format=qcow2,size=8,bus=virtio \
--accelerate \
--location http://192.168.130.4/centos63 \
--extra-args "linux ip=192.168.73.22 netmask=255.255.255.224 gateway=192.168.73.1 ks=http://192.168.130.4/ks/xen63.ks"\
--vnc --vncport=5910 \
--vnclisten=0.0.0.0 \
--network bridge=br0,model=virtio \
--force \
--noautoconsole
########## 从http安装,使用ks, 双网卡, 启用console ########
# virt-install \
--name=centos6 \
--os-variant=RHEL6 \
--ram=4096 \
--vcpus=4 \
--virt-type kvm \
--disk path=/kvm/vms/centos6-test1.img,format=qcow2,size=8,bus=virtio \
--accelerate \
--location http://111.205.130.4/centos63 \
--extra-args "linux ip=59.151.73.22 netmask=255.255.255.224 gateway=59.151.73.1 ks=http://111.205.130.4/ks/xen63.ks console=ttyS0 serial"
--vnc --vncport=5910 --vnclisten=0.0.0.0 \
--network bridge=br0,model=virtio \
--network bridge=br1,model=virtio \
--force \
--noautoconsole
########## 安装windows ########
# virt-install \
--name=win7-test \
--os-variant=win7 \
--ram=4096 \
--vcpus=4 \
--disk path=/kvm/vms/centos6-test1.img,size=100 \
--accelerate \
--cdrom=/kvm/isos/win7.iso
--vnc --vncport=5910 --vnclisten=0.0.0.0 \
--network bridge=br0 \
--force \
--noautoconsole
## 不能使用virtio,因为默认windows没有virtio的硬盘和网卡驱动
参数说明:
--name指定虚拟机名称
--ram分配内存大小。
--vcpus分配CPU核心数,最大与实体机CPU核心数相同
--disk指定虚拟机镜像,size指定分配大小单位为G。
--network网络类型,此处用的是默认,一般用的应该是bridge桥接。可以指定两次也就是两块网卡
--accelerate加速
--cdrom指定安装镜像iso
--location 从ftp,http,nfs启动
keymap=en_us 键盘布局方式,避免操作时键盘错乱,不能正常操控
--vnc启用VNC远程管理
--vncport指定VNC监控端口,默认端口为5900,端口不能重复,可以通过在虚拟化主机上通过netstat/ss查看。
--vnclisten指定VNC绑定IP,默认绑定127.0.0.1,这里改为0.0.0.0,这样可以通过"VNC Viewer" 连接虚拟机,格式'虚拟化主机IP:vncliten端口',通过客户端方式连接时会出现闪退,配置:options--Expert--ColorLevel--full即可
--os-type=linux,windows
--extra-args指定额外的安装参数
--os-variant= [win7 vista winxp win2k8 rhel6 rhel5]
--force 如果有yes或者no的交互式,自动yes
还可以通过virt-manager命令管理安装虚拟机
二、virsh常见命令
1、直接键入virsh进入交互式模式,支持补全
#virsh
Welcome to virsh, the virtualization interactive terminal.
Type: 'help' for help with commands
'quit' to quit
virsh # list --all
2. virsh list [--all] 查看虚拟机状态
3. virsh start instanceName 虚拟机开机
4. virsh shutdown instanceName 虚拟机关机
需要Linux母体机电源管理
service acpid start
5. virsh destroy instanceName 强制关机
6. virsh create /etc/libvirt/qemu/wintest01.xml 通过以前的配置文件创建虚拟机
7. virsh autostart instanceName 配置自启动
8. virsh dumpxml wintest01 > /etc/libvirt/qemu/wintest02.xml 导出配置文件
9. virsh undefine wintest01 删除虚拟机配置文件,不会真的删除虚拟机 ,需要彻底删除需把虚拟映像删除
10. mv /etc/libvirt/qemu/wintest02.xml /etc/libvirt/qemu/wintest01.xml
virsh define /etc/libvirt/qemu/wintest01.xml
重新定义虚拟机
11. virsh edit wintest01 编辑虚拟机配置文件
12. virsh suspend wintest01 挂起虚拟机
13. virsh resume wintest01 恢复挂起虚拟机
三、虚拟机克隆
I. 1.使用virt-clone命令克隆虚拟机
#virt-clone -n centostest01 -f /kvm/vms/centos6-test01.img -o centos6
Cloning centos6-test1.img 62% [=============================================== ] 25 MB/s | 1.8 GB 00:45 ETA
-n NEW_NAME,--name=NEW_NAME
克隆出的虚拟机名字
-f NEW_DISKFILE, --file=NEW_DISKFILE
硬盘映像存放位置
-o ORIGINAL_GUEST, --original=ORIGINAL_GUEST
被克隆的虚拟机,状态必须为关闭或者暂停
2.修改centostest01配置文件
#virsh edit centostest01
graphics type='vnc' port='5914' autoport='no' listen='0.0.0.0' keymap='en-us'>
<listen type='address' address='0.0.0.0'/>
#virsh define /etc/libvirt/qemu/centostest01.xml
3.启动虚拟机
#virsh start centostest01
#netstat -nlpt | awk '$NF~/kvm/'
tcp 0 0 0.0.0.0:5914 0.0.0.0:* LISTEN 12535/qemu-kvm
4.克隆出来的虚拟机会保持原虚拟机的网络配置,所以要修改MAC地址,防止冲突
1.通过virt-manager命令或者VNC Viewer客户端连接centostest01
2.修改MAC地址,把系统生成的网络设备地址改到原网卡配置文件中,然后修改/etc/udev/rules.d/70-persistent-net.rules
3.重启虚拟机
II. 使用virt-manager克隆
四.快照
kvm虚拟机默认使用raw格式的镜像格式,性能最好,速度最快,它的缺点就是不支持一些新的功能,如支持镜像,zlib磁盘压缩,AES加密等。 要使用镜像功能,磁盘格式必须为qcow2。
1.查看磁盘格式
#qemu-img info /kvm/vms/test01.img
image: /kvm/vms/test01.img
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 2.9G
cluster_size: 65536
2.如果不是qcow2格式,需要关机转换磁盘格式,如果是请跳过
#qemu-img convert -f raw -O qcow2 raw磁盘 qcow2磁盘63-119.22.img
3.在启动虚拟机情况下建立快照
# virsh snapshot-create test01
4.快照位置
# ls /var/lib/libvirt/qemu/snapshot/test01/
1432633791.xml 1432634028.xml
5.查看快照
#virsh snapshot-list test01
Name Creation Time State
------------------------------------------------------------
1432633791 2015-05-26 17:49:51 +0800 running
1432634028 2015-05-26 17:53:48 +0800 running
6.恢复快照
#virsh snapshot-revert test01 1432633791
7.删除快照
#virsh snapshot-delete test01 1432633791
#virsh snapshot-list test01
Name Creation Time State
------------------------------------------------------------
1432634028 2015-05-26 17:53:48 +0800 running
#qemu-img info /kvm/vms/test01.img
image: /kvm/vms/test01.img
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 3.5G
cluster_size: 65536
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
2 1432634028 280M 2015-05-26 17:53:48 03:45:43.643
五.添加网卡
线上服务器是双网卡,一个走内网,一个走外网,我们也需要虚拟机这么来工作,但是初始安装虚拟机的时候没有指定两个网卡,这样需要我们来添加一个网卡了,比如说我们已经将br1桥接到em2了,如果不会见刚开始br0桥接em1
1). 通过virt-manager来添加
简单说一下 选中虚拟机 -- Open -- Details �C AddHardware 选择网卡模式,mac不要重复,确定即可
2). 通过命令来添加
Ⅰ. 使用virsh attach-interface命令为虚拟机添加网卡
# virsh attach-interface test01 --type bridge --source br1 --model virtio
Ⅱ. 导入配置文件并覆盖原来的虚拟机配置文件, 因为attach-interface添加后,只是在虚拟机中生效了,配置文件并没有改变
#virsh dumpxml test01 > /etc/libvirt/qemu/test01.xml
#virsh define /etc/libvirt/qemu/test01.xml
Ⅲ. 修改GuestOS中网卡配置文件,为另一个网卡配置IP
#cd /etc/sysconfig/network-scripts
修改网卡配置文件
Ⅳ. 重启网卡
六.硬盘扩容
原来的/kvm目录随着使用,空间渐渐满了,这时候我们就需要给/kvm的挂载分区扩容了,有两种情况 1. 该分区是lvm格式 2. 不是lvm格式,且不是扩展分区
1). 分区是lvm格式 这种很简单,添加一块磁盘,lvm扩容
virt-manager添加方式和添加网卡一样,不再赘述,下面是使用命令来添加
Ⅰ. 建立磁盘,并附加到虚拟机中
# qemu-img create -f raw 10G.img 10G
# virsh attach-disk test01 /kvm/kvm/10G.img vdb
说明:
test01 虚拟机的名称
/kvm/vms/10G.img 附加的磁盘
vdb 添加为哪个磁盘, 也就是在guestos中的名字
Ⅱ. 导出并覆盖原来的配置文件,和网卡一样,attach后只是在虚拟机中生效
# virsh dumpxml test01 > /etc/libvert/qemu/test01.xml
Ⅲ. 使用lvm在线扩容,详见 http://www.cnblogs.com/cmsd/p/3964118.html
2). 分区不是lvm格式,该分区不是扩展分区, 需要关机离线扩展
Ⅰ. 新建一个磁盘,大于原来的容量,比如原来是40G,你想对某个分区扩容20G那么
# qemu-img create -f qcow2 60G.img 60G
Ⅱ. 备份原来的磁盘,以防三长两短
# cp test01.img test01.img.bak
Ⅲ. 查看原来的磁盘决定扩容哪一个分区
# virt-filesystems --partitions --long -a test01.img
# virt-df test01.img
Ⅳ. 扩容GuestOS的sda2
# virt-resize --expand /dev/sda2 test01.img 60G.img
说明:
/dev/sda2 扩容guestos的/dev/sda2
test01.img 原来的磁盘文件
60G 第一步建立的更大的磁盘文件
Ⅴ. 使用新磁盘启动
# mv 60G.img test01.img
# virsh start test01
virt-resize其实就是将原来磁盘中的文件复制到新的文件中,讲想要扩大的分区扩大了
七.动态迁移
用过vSphere 或者 xenserver的都知道动态迁移,最大程度上减少宕机时间 , 比如将正在运行在A上的虚拟机不关机迁移到B上,会将原来虚拟机的内存,CPU状态等迁移到新的主机上,动态迁移需要一些条件
1. 该虚拟机使用共享存储,在两台主机上的位置一样 比如 A,B都将主机C的 /kvm/vms 挂载到了自己的/kvm/vms中,A,B对nfs可读可写,或者用moosefs做文件服务器,挂在到虚拟化主机。虚拟机在共享存储中,映像位置不统一会迁移失败,目标主机环境要和源主机一直,包括网卡配置等。
2. 目标主机最好与源主机型号一样,或者CPU支持的指令集更多
3. 目标主机CPU,内存充足
4. 能通过root用户ssh连接到目的主机上
5. hostname和ip解析一致, 迁移是通过hostname的,修改/etc/hosts,可以ping通对方的Hostname,为了方便迁移也可以建立主机ssh互信
1)在目标主机上挂载和源虚拟主机位置一样的文件系统,并添加主机名和ip到/etc/hosts,建立主机互信
1.1)使用virt-manager来迁移
目标虚拟主机上查看
#
# virsh list --all
Id 名称 状态
----------------------------------------------------
4 centos6b running
1.2)使用migrate命令动态迁移
# virsh migrate centos6b --live qemu+ssh://192.168.1.154:22/system --unsafe
centos6b 迁移的vm
--live 在线模式
qemu+ssh ssh的方式
--unsafe 强制迁移,忽略错误
本博客根据老广老师的博客学习整理,播客出处http://laoguang.blog.51cto.com/6013350/1551379