KVM虚拟化

简介:

    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命令管理安装虚拟机

wKioL1Vi9g7gzQQ8AAGMFbdDB6w633.jpg

二、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克隆

wKioL1VkIXairOMdAAGb96CaRqM356.jpg

四.快照

            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来迁移

wKiom1VlcCagSt3uAAFbuidNNnQ281.jpg

wKioL1VlcbfyToDdAAGtRi25O2c638.jpg

wKioL1VlcbfRXhFeAAGTFUHvxbU107.jpg

wKiom1VlcCeymIOuAAGbjUqM6hM349.jpg

wKioL1VlcbjQQGnoAAHXDUDc8xs866.jpg

wKiom1VlcCjBYBZ9AAERKPtJN8k854.jpg

目标虚拟主机上查看

#

# 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

你可能感兴趣的:(kvm,虚拟化)