【虚拟化应用系列教程】KVM存储管理

上一期教程:KVM网络管理

一、通过命令行添加磁盘

通过图形化界面添加

[root@lvm ~]# virt-manager

kvm20

kvm21

1.查看虚拟机所有磁盘

[root@lvm ~]# virsh domblklist vm01
目标     源
------------------------------------------------
hda        /var/lib/libvirt/images/vm01.qcow2
hdb        -

2.创建磁盘文件

qemu-img是个很强大的工具,除了可以创建qcow2格式的文件,还可以创建其他格式的磁盘文件,包含vmdkvhdxvdirawqcow2qcowiscsiglusterdmg

[root@lvm ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/disk01.qcow2 5G
  • -f虚拟磁盘格式

3.添加磁盘

[root@lvm ~]# virsh attach-disk vm01 --source /var/lib/libvirt/images/disk01.qcow2 --target vdc --cache writeback --subdriver qcow2 --persistent 
成功附加磁盘
  • --source虚拟磁盘文件位置
  • --targer磁盘名
  • --cache writeback/writethrough指定硬盘缓存工作模式
    • writeback回写
      • 当磁盘缓存空间不足时,才会将所有数据写入硬盘
    • writethrough通写
      • 磁盘缓存接收数据,立刻会写入磁盘
  • --subdriver虚拟磁盘格式
  • --persistent立即并永久生效
[root@lvm ~]# virsh domblklist vm01
目标     源
------------------------------------------------
hda        /var/lib/libvirt/images/vm01.qcow2
hdb        -
vdc        /var/lib/libvirt/images/disk01.qcow2

查看虚拟机内的磁盘

kvm22

4.删除磁盘

[root@lvm ~]# virsh detach-disk vm01 vdc --persistent 
成功分离磁盘
[root@lvm ~]# virsh domblklist vm01
目标     源
------------------------------------------------
hda        /var/lib/libvirt/images/vm01.qcow2
hdb        -

二、磁盘镜像文件

1.磁盘镜像文件格式

  • raw
    • 一次性分配所有空间
  • qcow2
    • 稀疏格式
    • 快照、压缩、加密
    • 后端镜像/差量镜像
    • 快速创建虚拟机

2.创建磁盘文件

[root@lvm ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/disk02.qcow2 5G

Formatting '/var/lib/libvirt/images/disk02.qcow2', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off

3.查看磁盘文件详细信息

[root@lvm ~]# qemu-img info /var/lib/libvirt/images/disk02.qcow2
image: /var/lib/libvirt/images/disk02.qcow2
file format: qcow2
virtual size: 5.0G (5368709120 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

4.创建差量镜像

用于快速部署虚拟机,源文件可以用作模板

[root@lvm ~]# qemu-img create -f qcow2 -b /var/lib/libvirt/images/disk02.qcow2 /kvm/data/disk02_backup.qcow2

Formatting '/kvm/data/disk02_backup.qcow2', fmt=qcow2 size=5368709120 backing_file='/var/lib/libvirt/images/disk02.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off
  • -f指定格式
  • -b原文件 目的文件
[root@lvm ~]# ls /kvm/data/
disk02_backup.qcow2

报错解决

qemu-img: /home/student/vm01.qcow2: Could not open backing file: Could not open '/var/lib/libvirt/images/vm01.qcow2': No such file or directory

如果你遇到了这样的报错,那么很抱歉,原模板文件(差异镜像)已经被您删除了,唯一的解决方法是重新再部署一个虚拟机,作为模板文件(差异镜像)

5.快速创建虚拟机

A.创建差量镜像

[root@lvm ~]# qemu-img create -f qcow2 -b /var/lib/libvirt/images/disk02.qcow2 /kvm/data/disk02_backup.qcow2

B.准备虚拟机配置文件

[root@lvm ~]# cp /etc/libvirt/qemu/vm01.xml /etc/libvirt/qemu/vm02.xml
修改虚拟机配置文件

大概需要修改虚拟机的名字、UUID、MAC地址、磁盘文件、VNC端口
关于UUID可以使用uuidgen命令随机生成一个

[root@lvm ~]# vim /etc/libvirt/qemu/vm02.xml
#配置文件并不完整,仅展示修改的部分
<domain type='kvm'>
  <name>vm02</name>
  <uuid>bc78a88e-a0a1-47c2-9531-1d5852209ace</uuid>
<source file='/kvm/data/vm02.qcow2'/>
<mac address='52:54:00:5f:e5:05'/>	#MAC地址前三位不用修改
<graphics type='vnc' port='5920' autoport='no' listen='0.0.0.0' keymap='en-us'>	#可以是精确的端口号,也可以是-1随机端口

C.创建虚拟机

[root@lvm ~]# virsh define /etc/libvirt/qemu/vm02.xml
定义域 vm02(从 /etc/libvirt/qemu/vm02.xml)
[root@lvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 5     vm01                           running
 -     vm02                           关闭

D.测试虚拟机是否正常

[root@lvm ~]# virsh start vm02
域 vm02 已开始
[root@lvm ~]# vncviewer 127.0.0.1:5920

kvm23

6.利用脚本批量创建虚拟机

大概步骤:
1.准备模板磁盘镜像(差量镜像)
2.准备虚拟机模板配置文件
3.批量加入到域中

A.准备差量镜像

vm01.qcow2是我已经提前装好的虚拟机磁盘文件

[root@lvm ~]# mkdir -p /kvm/template
[root@lvm ~]# cp /var/lib/libvirt/images/vm01.qcow2 /kvm/template/vm_base.qcow2

B.准备虚拟机配置文件模板

[root@lvm ~]# cp /etc/libvirt/qemu/vm01.xml /kvm/template/vm_base.xml
修改配置文件内容(便于脚本编写)
[root@lvm ~]# vim /kvm/template/vm_base.xml
#仅展示修改的地方
<domain type='kvm'>
  <name>vm_base</name>
<source file='/var/lib/libvirt/images/vm_base.qcow2'/>
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0' keymap='en-us'>	#VNC开启自动随机端口

C.编写脚本

[root@lvm ~]# vim /opt/kvm.sh
#脚本仅供参考
#! /bin/bash

menu() {
cat << eof
==========虚拟机管理脚本==========
1.批量创建虚拟机
2.删除所有虚拟机
3.创建单个的虚拟机
4.删除单个虚拟机
5.退出脚本
eof
}

#创建多个虚拟机
createVM() {
    read -p "请输入你想要创建的虚拟机数量:" number
for num in $(seq $number); do
    kvm_disk_file=/kvm/template/vm_base.qcow2
    #复制虚拟机配置文件
    qemu-img create -f qcow2 -b ${kvm_disk_file} /var/lib/libvirt/images/vm${num}_Centos79.qcow2 &> /dev/null
    cp -r /kvm/template/vm_base.xml /etc/libvirt/qemu/vm${num}_Centos79.xml
    #修改虚拟机配置文件
    mac1=$(grep "<mac address" /etc/libvirt/qemu/vm${num}_Centos79.xml | awk -v FS="'" '{print $2}' | awk -F: '{print $1":"$2":"$3":"}')
    mac2=$(openssl rand -hex 10 | sed -r 's/(..)(..)(..).*/\1:\2:\3/')
    mac_address=${mac1}${mac2}
    sed -ri "s|vm_base|vm${num}_Centos79|g" /etc/libvirt/qemu/vm${num}_Centos79.xml
    sed -ri "/uuid/c \  <uuid>$(uuidgen)</uuid>" /etc/libvirt/qemu/vm${num}_Centos79.xml
    sed -ri "/<mac/c \      <mac address='${mac_address}'/>" /etc/libvirt/qemu/vm${num}_Centos79.xml
    #创建虚拟机
    virsh define /etc/libvirt/qemu/vm${num}_Centos79.xml &> /dev/null
    #把虚拟机加入开启启动项并且开机
    virsh autostart vm${num}_Centos79
    virsh start vm${num}_Centos79
    #列出当前系统虚拟机
    virsh list --all
done
}

#删除所有虚拟机
deleteVM() {
    echo "已列出当前系统所有虚拟机"
    virsh list --all
    echo "正在执行删除所有虚拟机"
    for i in $(virsh list --all | awk '/vm/{print $2}'); do
    virsh destroy $i &> /dev/null
    virsh undefine $i &> /dev/null
    done
    rm -rf /var/lib/libvirt/images/* &> /dev/null
    echo "已列出当前系统所有虚拟机"
    virsh list --all
}

#创建单个虚拟机
createoneVM() {
    read -p "请输入你想要创建的虚拟机名称:" name
    kvm_disk_file=/kvm/template/vm_base.qcow2
    #复制虚拟机配置文件
    qemu-img create -f qcow2 -b ${kvm_disk_file} /var/lib/libvirt/images/$name.qcow2 &> /dev/null
    cp -r /kvm/template/vm_base.xml /etc/libvirt/qemu/$name.xml
    #修改虚拟机配置文件
    mac1=$(grep "<mac address" /etc/libvirt/qemu/$name.xml | awk -v FS="'" '{print $2}' | awk -F: '{print $1":"$2":"$3":"}')
    mac2=$(openssl rand -hex 10 | sed -r 's/(..)(..)(..).*/\1:\2:\3/')
    mac_address=${mac1}${mac2}
    sed -ri "s|vm_base|${name}|g" /etc/libvirt/qemu/$name.xml
    sed -ri "/uuid/c \  <uuid>$(uuidgen)</uuid>" /etc/libvirt/qemu/$name.xml
    sed -ri "/<mac/c \      <mac address='${mac_address}'/>" /etc/libvirt/qemu/$name.xml
    #创建虚拟机
    virsh define /etc/libvirt/qemu/$name.xml &> /dev/null
    #把虚拟机加入开启启动项并且开机
    virsh autostart $name
    virsh start $name
    #列出当前系统虚拟机
    virsh list --all
}

#删除单个虚拟机
deleteoneVM() {
    echo "已列出当前系统所有虚拟机"
    virsh list --all
    read -p "请输入你要删除的虚拟机名字:" choice
    virsh destroy $choice &> /dev/null
    virsh undefine $choice &> /dev/null
    rm -rf /var/lib/libvirt/images/$choice.qcow2 &> /dev/null
    echo "$choice删除成功"
    echo "已列出当前系统剩余虚拟机"
    virsh list --all
}

while true; do
    menu
    read -p "请选择选项:" choose
    case $choose in
        1)
            createVM
            ;;
        2)
            deleteVM
            ;;
        3)
            createoneVM
            ;;
        4)
            deleteoneVM
            ;;
        5)
            echo "用户选择退出"
            exit 0
            ;;
        *)
            echo "选择有误,请重新选择"
            continue
            ;;
    esac

done

D.给予执行权限

[root@lvm ~]# chmod a+x /opt/kvm.sh

E.执行脚本

[root@lvm ~]# bash /opt/kvm.sh
或
[root@lvm ~]# ./opt/kvm.sh

三、存储池

作用:用于存储磁盘镜像文件的位置

1.查看所有存储池

[root@lvm ~]# virsh pool-list --all
 名称               状态     自动开始
-------------------------------------------
 default              活动     是       
 img                  活动     是

查看存储池详细信息

[root@lvm ~]# virsh pool-dumpxml default
<pool type='dir'>
  <name>default</name>
  <uuid>65ae9c3d-2d2d-4dab-b704-9e1cb33bf995</uuid>
  <capacity unit='bytes'>104647094272</capacity>
  <allocation unit='bytes'>17794945024</allocation>
  <available unit='bytes'>86852149248</available>
  <source>
  </source>
  <target>
    <path>/var/lib/libvirt/images</path>
    <permissions>
      <mode>0711</mode>
      <owner>0</owner>
      <group>0</group>
      <label>system_u:object_r:virt_image_t:s0</label>
    </permissions>
  </target>
</pool>

存储池配置文件

配置文件存放路径:/etc/libvirt/storage/

[root@lvm ~]# cat /etc/libvirt/storage/default.xml

<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh pool-edit default
or other application using the libvirt API.
-->

<pool type='dir'>
  <name>default</name>
  <uuid>65ae9c3d-2d2d-4dab-b704-9e1cb33bf995</uuid>
  <capacity unit='bytes'>0</capacity>
  <allocation unit='bytes'>0</allocation>
  <available unit='bytes'>0</available>
  <source>
  </source>
  <target>
    <path>/var/lib/libvirt/images</path>
  </target>
</pool>

2.创建存储池

图形化创建

[root@lvm ~]# mkdir -p /kvm/data
[root@lvm ~]# virt-manager

kvm24

kvm25

kvm26

kvm27

kvm28

3.存储池类型

  • 本地存储池
  • 网络存储池

4.实验:KVM虚拟机的在线迁移

关于虚拟机离线迁移教程:https://www.wsjj.top/archives/128

关于在线迁移online-migrate

硬性要求:存储必须是网络存储

kvm29

规划

IP地址 主机名 软件
192.168.140.10 kvm.linux.com KVM
192.168.140.11 kvm1.linux.com KVM
192.168.140.12 nfs.linux.com NFS

配置NFS服务器

关于NFS搭建教程:https://www.wsjj.top/archives/62

[root@nfs_server ~]# yum install -y nfs-server rpcbind nfs-utils
[root@nfs_server ~]# mkdir /kvmdata
[root@nfs_server ~]# chmod o+w /kvmdata
[root@nfs_server ~]# cat /etc/exports
/kvmdata	192.168.43.10(rw,no_root_squash) 192.168.43.11(rw,no_root_squash)

[root@nfs_server ~]# systemctl start nfs-server
[root@nfs_server ~]# systemctl enable nfs-server

[root@nfs_server ~]# showmount -e localhost
Export list for localhost:
/kvmdata 192.168.43.11,192.168.43.10

建议在2台KVM服务器上以相同的目录创建存储池

创建虚拟机,将磁盘镜像文件保存到NFS服务器共享的目录

添加主机名解析

在线迁移依靠SSH服务

迁移虚拟机

# virsh migrate 被迁移的虚拟机名 ‐‐live qemu+ssh://服务器地址/system_file ‐‐unsafe