【虚拟化应用系列教程】KVM存储管理
【虚拟化应用系列教程】KVM存储管理
上一期教程:KVM网络管理
一、通过命令行添加磁盘
通过图形化界面添加
[root@lvm ~]# virt-manager
1.查看虚拟机所有磁盘
[root@lvm ~]# virsh domblklist vm01
目标 源
------------------------------------------------
hda /var/lib/libvirt/images/vm01.qcow2
hdb -
2.创建磁盘文件
qemu-img
是个很强大的工具,除了可以创建qcow2
格式的文件,还可以创建其他格式的磁盘文件,包含vmdk
、vhdx
、vdi
、raw
、qcow2
、qcow
、iscsi
、gluster
、dmg
等
[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
查看虚拟机内的磁盘
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
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
3.存储池类型
- 本地存储池
- 网络存储池
4.实验:KVM
虚拟机的在线迁移
关于虚拟机离线迁移教程:https://www.wsjj.top/archives/128
关于在线迁移online-migrate
硬性要求:存储必须是网络存储
规划
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
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 WangShengJJのblog!