zoukankan      html  css  js  c++  java
  • 深入学习KVM

    深入学习KVM

    一、环境准备

    主机名 IP 操作系统 内存 硬盘
    kvm01 10.0.0.11 centos7 4G 50G

    优化:kvm01在安装系统的时候,不要使用自动分区,自动分区使用的LVM分区,在使用kvm的时候,特别卡!

    • 关闭selinux关
    [root@kvm02 ~]# grep 'SELINUX=disabled' /etc/selinux/config
    SELINUX=disabled
    
    • 闭firewalld
    [root@kvm02 ~]# systemctl stop firewalld
    [root@kvm02 ~]# systemctl disable firewalld
    [root@kvm02 ~]# systemctl status firewalld
    

    安装kvm管理工具

    安装:
    yum install libvirt virt-install qemu-kvm -y
    介绍:
    libvirt服务:管理kvm虚拟机的生命周期
    virt-install工具:创建安装虚拟机
    qemu-kvm工具:使用qemu-img为虚拟机提供硬盘
    

    Linux上几种虚拟化软件

    • qemu 软件纯模拟全虚拟化软件,特别慢!
    • xen 性能特别好,需要使用专门修改之后的内核,兼容性差。
    • KVM 需要cpu支持虚拟化,基于内核,不需要使用专门的内核,兼容行好,性能较好。

    安装kvm虚拟机准备条件

    在window上安装TightVNC
    tightvnc官网:http://www.tightvnc.com
    
    vnc是一个跨平台的远程桌面软件,待会安装kvm虚拟机系统的时候使用
    
    启动libvirtd服务
    systemctl start libvirtd.service
    systemctl status libvirtd.service
    

    安装虚拟机

    建议虚拟机内存不要低于1024M,否则安装系统特别慢!
    
    virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos2.raw,format=raw,size=10 --cdrom /opt/CentOS-7.5-x86_64-DVD-1804.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
    

    二、虚拟机的日常管理

    日常管理一:

    • 列表list
    • 开机start
    • 关机shutdown
    • 拔电源关机destroy

    常用命令:

    virsh list --all
    virsh destroy centos7
    virsh shutdown centos7
    virsh start centos7
    

    日常管理二:

    • 导出配置dumpxml
    • 删除undefine
    • 推荐:先destroy,在undefine
    • 导入配置define
    • 修改配置edit
    • 重命名domrename (注意:低版本不支持)
    实例:
    virsh dumpxml centos7 >centos7.xml
    cat centos7.xml 
    [root@kvm02 opt]# virsh define centos7.xml (备份的配置文件)
    [root@kvm02 opt]# virsh list --all
    mv centos2.raw centos7.raw
    virsh edit centos7
    virsh start centos7
    virsh list --all
    [root@kvm02 opt]# virsh domrename centos7 web01
    Domain successfully renamed
    [root@kvm02 opt]# virsh list --all
    [root@kvm02 /]# virsh suspend web01
    [root@kvm02 /]# virsh resume web01
    [root@kvm02 /]# virsh vncdisplay web01
    :0
    [root@kvm02 /]# virsh autostart web01
    域 web01标记为自动开始
    [root@kvm02 /]# virsh autostart --disable web01
    

    三、kvm虚拟机console登陆

    1:常规情况下,安装完 KVM 之后,可能都会通过 VNC 连接到 KVM 虚拟机里面去修改 IP 等信息。但是一旦虚拟机比较多的话,打开过多的端口会造成安全问题。

    2:很多时候,我们是通过跳板机连接的宿主机,你的window和kvm宿主机没有直达的路由,这时候vnc都用不了,如何快速进入到 KVM 虚拟机里面去排查问题呢?

    在centos7的kvm虚拟机中执行:
    grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
    
    reboot重启生效
    使用console登录:
    [root@kvm02 /]# virsh console web01
    连接到域 web01
    换码符为 ^]
    

    四、kvm虚拟磁盘格式转换和快照管理

    kvm虚拟机两种常用的格式

    • raw:裸格式,占用空间比较大,不适合远程传输,不支持快照功能,性能较好
    • qcow2:cow(copy on write)占用空间小,适合传输,支持快照,性能比raw差一点点
    qemu-img create test.raw 10G
    qemu-img info test.raw
    qemu-img create -f qcow2 test.qcow2 5G
    qemu-img info test.qcow2
    qemu-img resize test.qcow2 +10G
    qemu-img info test.qcow2 
    修改磁盘格式:
    qemu-img convert -f raw -O qcow2 test.raw test1.qcow2
    [root@kvm02 opt]# qemu-img info test1.qcow2 
    案例1:
    将现有的虚拟机的磁盘格式由raw转换为qcow2,并测试运行
    qemu-img convert -f raw -O qcow2 centos7.raw web01.qcow2
    virsh edit web01
    修改磁盘的配置文件
    virsh start web01
    

    快照管理:

    创建快照
    virsh snapshot-create centos7
    查看快照
    virsh snapshot-list centos7
    还原快照
    virsh snapshot-revert centos7 --snapshotname 1516574134
    删除快照
    virsh snapshot-delete centos7 --snapshotname 1516636570
    实例:
    虚拟机上创建文件:测试恢复快照后文件消失
    dd if=/dev/zero of=/tmp/test.raw bs=100M count=1
    
    virsh snapshot-create web01
    virsh snapshot-list web01 
    virsh snapshot-revert web01 --snapshotname 1586618763
    virsh snapshot-list web01 
    virsh snapshot-delete web01 --snapshotname 1586618763
    virsh snapshot-list web01 
    

    五、kvm虚拟机的克隆

    完整克隆

    实现方法:
    	virt-clone -o web01 --auto-clone
    	virsh dumpxml web01 >web01.xml
        virsh dumpxml web01-clone >web01-clone.xml
        vimdiff web01.xml web01-clone.xml 
        对比克隆前后的配置文件差异
        virsh domrename web01-clone web03
        对克隆机器重命名
        virsh list --all
        virsh edit web03
    
    链接克隆
    	实现方法:
    	shell脚本
    

    完整克隆:(手工克隆)

    1:克隆虚拟磁盘文件
    cp centos7.qcow2 web03.qcow2
    2:生成新的虚拟机配置文件
    name修改
    uuid删掉
    disk路径/opt/web03.qcow2
    mac地址删除
    3:测试启动
    virsh define  web01.xml
    实例:
    cp web01.qcow2 web04.qcow2
    vim web01.xml
    virsh define web01.xml (virsh dumpxml web01 >web01.xml)
    virsh list --all
    virsh start web04
    

    链接克隆

    链接克隆实战:
    基于原磁盘克隆磁盘:
    qemu-img create -f qcow2 -b cetnos7.qcow2 web02.qcow2
    创建克隆机器:(区别:--boot hd)
    virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web02 --memory 1024 --vcpus 1 --disk /opt/web02.qcow2,format=qcow2,size=10 --boot hd --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
    
    案例:
    [root@kvm02 opt]# qemu-img create -f qcow2 -b web01.qcow2 web02.qcow2
    [root@kvm02 opt]# qemu-img info web02.qcow2 
    [root@kvm02 opt]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web02 --memory 1024 --vcpus 1 --disk /opt/web02.qcow2,format=qcow2,size=10 --boot hd --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
    [root@kvm02 opt]# virsh list --all
    [root@kvm02 opt]# virsh vncdisplay web02
    
    

    六、kvm虚拟机的桥接网络

    我们运行虚拟机的目的是,在虚拟机中运行我们的业务,现在业务所需要的服务都已经运行了,可是除了在宿主机上能访问,其他人都访问不了!!!

    创建桥接网络
    1:virsh iface-bridge eth0 br0
    如果命令创建失败,可以手工进行创建:
    [root@kvm02 opt]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    ONBOOT=yes
    BRIDGE="br0"(注意点)
    [root@kvm02 opt]# cat /etc/sysconfig/network-scripts/ifcfg-br0
    DEVICE="br0"
    ONBOOT="yes"
    TYPE="Bridge"(注意点)
    BOOTPROTO="none"
    IPADDR="10.0.0.12"
    NETMASK="255.255.255.0"
    GATEWAY="10.0.0.254"
    IPV6INIT="yes"
    IPV6_AUTOCONF="yes"
    DHCPV6C="no"
    STP="on"
    DELAY="0"
    [root@kvm02 opt]# 
    基于桥接网络创建虚拟机(区别:--network bridge=br0)
    2:virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web04 --memory 1024 --vcpus 1 --disk /opt/web04.qcow2,format=qcow2,size=10 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
    
    
    将已有的虚机修改为桥接网络
    1:virsh edit web02
        <interface type='bridge'>
          <mac address='52:54:00:55:aa:fa'/>
          <source bridge='br0’/>
    2:修改虚拟机ip地址
    /etc/sysconfig/network-scripts/ifcfg-eth0
    

    kvm NAT模式网络原理图

    kvm 桥接网络原理图

    七、kvm虚拟机的热添加技术

    热添加技术就是不停机的情况下,在线热添加硬盘,内存,cpu,网卡等设备,热添加技术一般都是在虚拟机资源不够了,又不能停机的情况下使用的,热添加技术是虚拟机相对于物理机的一个很大的优势,它让资源分配变得更灵活!

    热添加种类有:

    • 1.热添加硬盘
    • 2.热添加网卡
    • 3.热添加cpu
    • 4.热添加内存

    热添加硬盘

    [root@kvm02 opt]# qemu-img create -f qcow2 web02-add.qcow2 10G
    [root@kvm02 opt]# virsh attach-disk web02 /opt/web02-add.qcow2 vdb --live --cache=none --subdriver=qcow2
    成功附加磁盘
    虚拟机上配置:
    fdisk /dev/vdb
    mkfs.xfs /dev/vdb1
    mount /dev/vdb1 /mnt
    df -h
    磁盘扩容案例:
    虚拟机配置:
    umount /mnt
    宿主机配置:
    [root@kvm02 opt]# virsh --help | grep disk
        attach-disk                    附加磁盘设备
        detach-disk                    分离磁盘设备
    [root@kvm02 opt]# virsh detach-disk web02 vdb
    成功分离磁盘
    [root@kvm02 opt]# qemu-img resize web02-add.qcow2 +5G
    Image resized.
    [root@kvm02 opt]# qemu-img info web02-add.qcow2 
    [root@kvm02 opt]# virsh attach-disk web02 /opt/web02-add.qcow2 vdb --live --cache=none --subdriver=qcow2
    成功附加磁盘
    虚拟机配置:
    fdisk /dev/vdb
    d(删除重新配置)
    mkfs.xfs /dev/vdb1
    partprobe /dev/vdb
    xfs_growfs /mnt(ext 格式的需要resize2fs /mnt)
    mount /dev/vdb /mnt
    df -h
    

    热添加网卡

    添加网卡
    virsh attach-interface web02 --type bridge  --model  virtio --source br0
    

    热添加CPU

    安装参数:
    virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web02 --memory 1024 --vcpus 1,maxvcpus=4 --disk /opt/web02.qcow2,format=qcow2,size=10 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
    
    热添加cpu
    virsh setvcpus web02 --count=2
    
    

    热添加内存:

    安装参数
    virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web02 --memory 512,maxmemory=2048 --vcpus=1,maxvcpus=2 --disk /opt/web02.qcow2,format=qcow2,size=10 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0  --noautoconsole
    
    热添加内存
    virsh setmem web02 1G
    

    八、kvm虚拟机的热迁移

    热迁移:

    相比KVM虚拟机冷迁移中需要拷贝虚拟机虚拟磁盘文件,kvm虚拟机热迁移无需拷贝虚拟磁盘文件,但是需要迁移到的宿主机之间需要有相同的目录结构虚拟机磁盘文件,也就是共享存储,这次通过大家熟悉的nfs来实现,当然也可以采用Glusterfs等分布式文件系统来实现。

    上一节我们学习了在线热添加技术,就很容易理解了。假设我初级只有一台16G内存的物理机,为了充分利用资源,我可能运行了8台2G内存的虚拟机,然后访问量增加,虚拟机的2G内存不够用了,需要扩容,扩容之前我们就需要先迁移一部分虚拟机到其他宿主机上了,有的业务特别核心,暂停的时间不能太长,这时候就要用到我们的热迁移了。

    热迁移过程:

    假设我们有2台宿主机kvm01和kvm02,在kvm01上挂起虚拟机vm01,发送vm的虚拟机配置文件和运行时内存中的数据到kvm02, 接受完毕,kvm02恢复vm01,热迁移完成。

    热迁移环境准备:

    主机名 ip 内存 网络 软件需求 虚拟化
    kvm01 10.0.0.11 2G 创建br0桥接网卡 kvm和nfs 开启虚拟化
    kvm02 10.0.0.12 2G 创建br0桥接网卡 kvm和nfs 开启虚拟化
    nfs01 10.0.0.31 1G nfs

    热迁移步骤

    (一):在kvm01和kvm02上安装kvm和nfs,配置桥接网卡

    yum install libvirt* virt-* qemu-kvm* nfs-utils openssh-askpass -y
    
    systemctl start libvirtd.service
    
    virsh iface-bridge eth0 br0
    

    (二):在nfs01上安装配置nfs

    yum install nfs-utils -y
    
    mkdir /data
    
    vim /etc/exports
    
    /data 10.0.0.0/24(rw,async,no_root_squash,no_all_squash)
    
    systemctl restart rpcbind
    
    systemctl restart nfs
    

    (三):kvm01和kvm02挂载共享目录/opt

    mount -t nfs 10.0.0.31:/data /opt
    

    (四):安装一台基于桥接模式的虚拟机

    virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web04 --memory 512,maxmemory=2048 --vcpus 1 --disk /data/web04.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
    (这里利用之前保存下来的硬盘,virsh edis web04,将已有的硬盘名称配置到配置文件中)
    热迁移的命令:
    virsh migrate --live --verbose web04 qemu+ssh://10.0.0.12/system --unsafe
    将宿主机10.0.0.11上的kvm虚拟机web04迁移到10.0.0.12
    

    (五):在kvm01上安装图形界面、vnc服务端和virt-manager

    yum groups install "GNOME Desktop" -y
    
    yum install tigervnc-server.x86_64 -y
    
    yum install virt-manager -y
    

    六:启动vnc服务端

    vncserver :1 启动5901端口的vnc服务端
    
    vncserver -kill :1 关闭5901端口的vnc服务端
    

    七:使用vnc连接宿主机,使用virt-manager进行迁移

    这时候会提醒输入密码,就是之前第6步的时候设置的vnc连接密码

    ![1587143636550](

    连接成功。

    在迁移的过程中,使用ping虚拟机的ip,发现只丢了一个包 。

  • 相关阅读:
    Codeforces Round #630 (Div. 2)A~E题解
    2020cug新生赛 An easy problem
    tensorflow.python.framework.errors.NotFoundError: <exception str() failed>错误解决
    将博客搬至CSDN
    2018年北京大学软件工程学科夏令营上机考试
    程序设计题目中的输入输出
    2018北大计算机学科夏令营机试题目
    Pyhton全栈的知识点(5)
    Python全栈的知识点(4)
    Python全栈的知识点(3)
  • 原文地址:https://www.cnblogs.com/cuiyongchao007/p/12723705.html
Copyright © 2011-2022 走看看