KVM-管理虚拟存储(二)
管理虚拟存储(二)
五.管理虚拟存储
5.1 虚拟磁盘概述
5.1.1 虚拟化项目中存储的注意事项
- 存储的性能几乎总是虚拟化的瓶颈
- 通过多个硬盘驱动以分布磁盘I/O来实现存储解决方案
- 考虑部署集中化的SAN/NFS来实现高可用性和实时迁移
5.1.2 KVM存储模式
基于文件系统的存储
- dir:Filesystem Directory 虚拟文件系统目录
- fs:Pre-Formatted Block Device
- netfs:Network Exported Directory
基于设备的存储
- Disk:Physical Disk Device
- Iscsi:iSCSI Target
- logical:LVM Volume Group
5.1.3 虚拟磁盘类型
固定 Fixed
- 在配置时,指定磁盘大小
- 不管在虚拟磁盘上实际存储多少数据,都将占用相同大小主机磁盘空间
动态 Dynamic
- 增长到最大容量,但是只根据需求使用更多的空间
差异 Differencing
- 因为创建是差异磁盘,所以只保存变更的数据
- 例如,将操作系统安装在父盘,然后创建差异化磁盘来执行进一步配置
5.1.4 KVM支持的虚拟磁盘类型
- raw
这并非是一种真正的磁盘格式,而是代表虚拟机所使用的原始镜像
它并不存储元数据,因此可以作为保证虚拟机兼容性的候选方案。然而,也正因为它不存储元数据,因此不能自持某些高级特性,比如快照和压缩等。
格式简单,容易转换为其他的格式。需要文件系统的支持才能支持sparse file- cow:copy-on-write格式,昙花一现
- qcow:QEMU早期的copy-on-write格式,过渡性方案
- qcow2
按需进行分配磁盘空间,不管文件系统是否支持
支持快照
支持zlib的磁盘压缩
支持AES的加密- vmdk(Virtual Machine Disk)
VMware环境当中默认使用的磁盘格式- vhd \ vhdx(Virtual Hard Disk)
微软默认采用的文件格式- vdi(VirtualBox)
- 可以通过qemu-img --help查看支持的格式
[root@KVM ~]# qemu-img --help | grep Supported
Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug
5.2 使用qemu-img管理虚拟磁盘
5.2.1 qemu-img概述
qemu-img 是一个功能强制磁盘镜像管理工具
qemu-img --help 包括以下功能
- check 检查完整性
- create 创建镜像
- commit 提交更改
- compare 比较
- convert 转换
- info 获得信息
- map 映射
- snapshot 快照管理
- rebase 在已有的镜像的基础上创建新的镜像
- resize 调整大小
- amend 修订镜像格式选项
5.2.2 创建虚拟磁盘
[root@KVM ~]# qemu-img | grep create #创建磁盘的命令格式
create [-q] [-f fmt] [-o options] filename [size]
contain only zeros for qemu-img to create a sparse image during
'-n' skips the target volume creation (useful if the volume is created
'snapshot' is the name of the snapshot to create, apply or delete
'-c' creates a snapshot
[root@KVM ~]# qemu-img create t1.img 1g #只输入磁盘名和大小创建
Formatting 't1.img', fmt=raw size=1073741824 #默认的磁盘格式fmt=raw
[root@KVM ~]# qemu-img info t1.img #查看虚拟磁盘的信息
image: t1.img #文件名称
file format: raw #文件格式
virtual size: 1.0G (1073741824 bytes)
disk size: 0 #虚拟磁盘大小
[root@KVM ~]# ll -h t1.img #磁盘空间尺寸是0????
-rw-r--r--. 1 root root 1.0G 12月 30 14:49 t1.img #ll查看磁盘是1G没错
[root@KVM ~]# du -sh t1.img #但我们用du查看一下,发现磁盘真实空间的占用还真是0
0 t1.img
根据以上测试,我们发现默认情况下qemu-img创建的磁盘文件的类型是动态的(Dynamic 空洞)会根据真实存放数据的大小进行动态扩容直到磁盘空间设定值的大小。
#假如我们想看一下各种磁盘格式所附带的-o option都有什么,我们可以这么做
[root@KVM ~]# qemu-img create -f raw -o ? #raw格式磁盘只有一个尺寸大小选项
Supported options:
size Virtual disk size
[root@KVM ~]# qemu-img create -f qcow2 -o? #qcow2则有很多选项
Supported options:
size Virtual disk size
compat Compatibility level (0.10 or 1.1)
backing_file File name of a base image #用于指定后端镜像文件
backing_fmt Image format of the base image #设置后端镜像的镜像格式
encryption Encrypt the image #用于设置加密
cluster_size qcow2 cluster size #设置镜像中的簇大小,取值在512到2M之间,默认值64K
preallocation Preallocation mode (allowed values: off, metadata, falloc, full) #设置镜像文件空间的预分配模式
lazy_refcounts Postpone refcount updates
利用dd命令模拟创建一个没有空洞的文件
[root@KVM ~]# dd if=/dev/zero of=flat1.img bs=1024k count=1000
记录了1000+0 的读入
记录了1000+0 的写出
1048576000字节(1.0 GB)已复制,32.3206 秒,32.4 MB/秒
[root@KVM ~]# qemu-img info flat1.img
image: flat1.img
file format: raw
virtual size: 1.0G (1048576000 bytes)
disk size: 1.0G #磁盘占用也是1G,没有空洞
#ext4文件格式是支持空洞文件的创建的,例如dd命令我们也可以实现空洞文件的创建
[root@KVM ~]# dd if=/dev/zero of=flat2.img bs=1024k count=0 seek=1024
记录了0+0 的读入
记录了0+0 的写出
0字节(0 B)已复制,0.00039378 秒,0.0 kB/秒
[root@KVM ~]# qemu-img info flat2.img
image: flat2.img
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 0 #实际磁盘占用0
空洞文件被复制以后,那么还是空洞文件吗?
[root@KVM ~]# du -sh flat*
1000M flat1.img
0 flat2.img
[root@KVM ~]# cp flat1.img flat1a.img
[root@KVM ~]# cp flat2.img flat2a.img
[root@KVM ~]# du -sh flat*
1000M flat1a.img #非空洞文件复制后还是非空洞
1000M flat1.img
0 flat2a.img #空洞文件复制后还是空洞文件
0 flat2.img
#利用--sparse=always将非空洞文件复制成空洞文件
[root@KVM ~]# du -sh flat*
1000M flat1a.img
1000M flat1.img
0 flat2a.img
0 flat2.img
[root@KVM ~]# cp flat1.img flat1b.img --sparse=always
[root@KVM ~]# du -sh flat*
1000M flat1a.img
0 flat1b.img #加了参数的cp复制出来的是空洞文件
1000M flat1.img
0 flat2a.img
0 flat2.img
#利用--sparse=never将空洞文件复制成非空洞文件
[root@KVM ~]# du -sh flat*
1000M flat1a.img
0 flat1b.img
1000M flat1.img
0 flat2a.img
0 flat2.img
[root@KVM ~]# cp flat2.img flat2b.img --sparse=never
[root@KVM ~]# du -sh flat*
1000M flat1a.img
0 flat1b.img
1000M flat1.img
0 flat2a.img
1.0G flat2b.img #加了参数的cp复制出来的是非空洞文件
0 flat2.img
5.2.3 检查虚拟磁盘
[root@KVM vm]# pwd
/vm
[root@KVM vm]# du -sh ce*
1.1G centos6.5.qcow2
[root@KVM vm]# qemu-img info centos6.5.qcow2
image: centos6.5.qcow2
file format: qcow2 #文件格式
virtual size: 8.0G (8589934592 bytes) #虚拟磁盘尺寸大小
disk size: 1.1G #磁盘真实占用大小
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
[root@KVM vm]# qemu-img check centos6.5.qcow2
No errors were found on the image. #检查结果没有错误
131072/131072 = 100.00% allocated, 0.00% fragmented, 0.00% compressed clusters
Image end offset: 8591507456
5.2.4 预分配磁盘策略(qcow2)
- off :缺省策略,即不使用预分配策略
- metadata :分配元数据(metadata),预分配后的虚拟磁盘仍然属于稀疏映像类型(空洞文件)
- full :分配所有磁盘空间并置零,预分配后的虚拟磁盘属于非稀疏映像类型
- falloc :分配文件的块并标示它们的状态为未初始化,相对full模式来说,创建虚拟磁盘的速度要快很多。
[root@KVM vm]# qemu-img create -f qcow2 test2.qcow2 -o ?
Supported options:
size Virtual disk size
compat Compatibility level (0.10 or 1.1)
backing_file File name of a base image
backing_fmt Image format of the base image
encryption Encrypt the image
cluster_size qcow2 cluster size
preallocation Preallocation mode (allowed values: off, metadata, falloc, full) #预分配策略
lazy_refcounts Postpone refcount updates
#preallocation=off创建磁盘
[root@KVM vm]# qemu-img create -f qcow2 test1.qcow2 1g -o preallocation=off
Formatting 'test1.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 preallocation='off' lazy_refcounts=off
[root@KVM vm]# qemu-img info test1.qcow2
image: test1.qcow2
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 196K #我们发现磁盘实际占用196K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
#preallocation=metadata创建磁盘
[root@KVM vm]# qemu-img create -f qcow2 test2.qcow2 1g -o preallocation=metadata
Formatting 'test2.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 preallocation='metadata' lazy_refcounts=off
[root@KVM vm]# qemu-img info test2.qcow2
image: test2.qcow2
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 516K #我们发现磁盘的实际占用变成了516K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
#preallocation=falloc创建磁盘
[root@KVM vm]# qemu-img create -f qcow2 test3.qcow2 1g -o preallocation=falloc
Formatting 'test3.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 preallocation='falloc' lazy_refcounts=off
[root@KVM vm]# qemu-img info test3.qcow2
image: test3.qcow2
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 1.0G #我们发现磁盘真实占用也是1G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
#preallocation=full创建磁盘
[root@KVM vm]# qemu-img create -f qcow2 test4.qcow2 1g -o preallocation=full
Formatting 'test4.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 preallocation='full' lazy_refcounts=off
[root@KVM vm]# qemu-img info test4.qcow2
image: test4.qcow2
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 1.0G #我们发现falloc和full创建的磁盘的真实占用都是1G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
#四种预分配策略进行对比
[root@KVM vm]# ll -h test*
-rw-r--r--. 1 root root 193K 12月 30 17:10 test1.qcow2
-rw-r--r--. 1 root root 1.1G 12月 30 18:04 test2.qcow2
-rw-r--r--. 1 root root 1.1G 12月 30 18:05 test3.qcow2
-rw-r--r--. 1 root root 1.1G 12月 30 18:08 test4.qcow2
[root@KVM vm]# du -sh test*
196K test1.qcow2
516K test2.qcow2
1.1G test3.qcow2
1.1G test4.qcow2
通过对比我们发现预分配策略里,off和metadata预分配策略都属于空洞文件,而falloc和full属于非空洞文件。
5.2.5 后备差异虚拟磁盘
- 存储与基础镜像(父)磁盘的变化
基础镜像(父)磁盘不会改变
差异磁盘隔离变化
多个差异磁盘可以使用相同的基础镜像(父)磁盘- 优点:标准化基础镜像,节省空间
- 缺点:增加了开销,较差的性能
#创建父磁盘并安装父Centos6.5操作系统
[root@KVM vm]# qemu-img create -f qcow2 Base_CentOS6.5.qcow2
qemu-img: Base_CentOS6.5.qcow2: Image creation needs a size parameter
[root@KVM vm]# qemu-img create -f qcow2 Base_CentOS6.5.qcow2 10G
Formatting 'Base_CentOS6.5.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off
[root@KVM vm]# virt-install --name=Base_CentOS7 --disk path=/vm/Base_CentOS6.5.qcow2 --vcpu=1 --ram=1024 --cdrom=/iso/CentOS-6.5-x86_64-bin-DVD1.iso --network network=default --graphics vnc,listen=0.0.0.0 --os-type=linux --os-variant=rhel6
[root@KVM ~]# virsh list
Id 名称 状态
----------------------------------------------------
3 centos6.5 running
6 vm1 running
8 Base_CentOS7 running
#创建OA后备差异虚拟磁盘,OA子系统盘
[root@KVM ~]# qemu-img create -f qcow2 \
> -o backing_file=Base_CentOS6.5.qcow2 \ #指定父盘
> OA-disk0.qcow2 #子盘名称
Formatting 'OA-disk0.qcow2', fmt=qcow2 size=10737418240 backing_file='Base_CentOS6.5.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off
[root@KVM vm]# qemu-img info OA-disk0.qcow2
image: OA-disk0.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
backing file: Base_CentOS6.5.qcow2 #父盘名称
Format specific information:
compat: 1.1
lazy refcounts: false
#创建ERP,HR,CRM子系统盘
[root@KVM vm]# qemu-img create -f qcow2 -o backing_file=Base_CentOS6.5.qcow2 ERP-disk0.qcow2Formatting 'ERP-disk0.qcow2', fmt=qcow2 size=10737418240 backing_file='Base_CentOS6.5.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off
[root@KVM vm]# qemu-img create -f qcow2 -o backing_file=Base_CentOS6.5.qcow2 HR-disk0.qcow2
Formatting 'HR-disk0.qcow2', fmt=qcow2 size=10737418240 backing_file='Base_CentOS6.5.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off
[root@KVM vm]# qemu-img create -f qcow2 -o backing_file=Base_CentOS6.5.qcow2 CRM-disk0.qcow2Formatting 'CRM-disk0.qcow2', fmt=qcow2 size=10737418240 backing_file='Base_CentOS6.5.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off
[root@KVM vm]# ll -h *-disk0.qcow2
-rw-r--r--. 1 root root 193K 12月 30 21:29 CRM-disk0.qcow2
-rw-r--r--. 1 root root 193K 12月 30 21:28 ERP-disk0.qcow2
-rw-r--r--. 1 root root 193K 12月 30 21:29 HR-disk0.qcow2
-rw-r--r--. 1 root root 193K 12月 30 21:27 OA-disk0.qcow2
#创建四种子系统虚拟机
[root@KVM vm]# virt-install --import \
> --name=oa \
> --vcpus=1 --ram=512 \
> --disk path=/vm/OA-disk0.qcow2 \
> --network network=default \
> --graphics vnc,listen=0.0.0.0 \
> --os-variant=rhel6 \
> --os-type=linux
开始安装......
创建域......
##中间省略....
域创建完成。
[root@KVM vm]# virt-install --import --name=erp --vcpus=1 --ram=512 --disk path=/vm/ERP-disk0.qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --os-variant=rhel6 --os-type=linux
开始安装......
创建域......
##中间省略....
域创建完成。
[root@KVM vm]# virt-install --import --name=hr --vcpus=1 --ram=512 --disk path=/vm/HR-disk0.qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --os-variant=rhel6 --os-type=linux
开始安装......
创建域......
##中间省略....
域创建完成。
[root@KVM vm]# virt-install --import --name=crm --vcpus=1 --ram=512 --disk path=/vm/CRM-disk0.qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --os-variant=rhel6 --os-type=linux
开始安装......
创建域......
##中间省略....
域创建完成。
[root@KVM vm]# virsh list --all
Id 名称 状态
----------------------------------------------------
3 centos6.5 running
6 vm1 running
8 Base_CentOS7 running
9 oa running #子系统创建完毕
10 erp running #子系统创建完毕
11 hr running #子系统创建完毕
12 crm running #子系统创建完毕
父子系统的方式,其实就是克隆的方式,我们如果要通过命令来实现就是如此操作。
如果在图形界面下,类似的方式如下图
5.2.6 虚拟磁盘格式转换(虚拟机迁移案例)
#语法格式
[root@KVM vm]# qemu-img --help | grep convert
convert [-c] [-p] [-q] [-n] [-f fmt] [-t cache] [-T src_cache] [-O output_fmt] [-o options] [-s snapshot_name] [-S sparse_size] filename [filename2 [...]] output_filename
案例:不同格式虚拟机的迁移
(1)我们在VMware Workstation虚拟机中找一个关闭状态的虚拟机进行导出
(2)先将.vmdk虚拟磁盘文件拷入到KVM虚拟机中
[root@KVM vm]# ll -h *.vmdk
-rw-r--r--. 1 root root 924M 12月 31 20:56 LNMP-disk1.vmdk
[root@KVM vm]# qemu-img info LNMP-disk1.vmdk
image: LNMP-disk1.vmdk
file format: vmdk
virtual size: 20G (21474836480 bytes)
disk size: 923M
cluster_size: 65536
Format specific information:
cid: 3915664802
parent cid: 4294967295
create type: streamOptimized
extents:
[0]:
compressed: true
virtual size: 21474836480
filename: LNMP-disk1.vmdk
cluster size: 65536
format:
(3)然后进行磁盘文件的格式转换
[root@KVM vm]# du -sh LNMP-disk1.vmdk
924M LNMP-disk1.vmdk
[root@KVM vm]# qemu-img convert -O qcow2 LNMP-disk1.vmdk LNMP-disk1.qcow2
[root@KVM vm]# du -sh LNMP*
2.5G LNMP-disk1.qcow2
924M LNMP-disk1.vmdk
(4)然后根据虚拟磁盘迁移前的VMware配置,导入到新的KVM虚拟机
- 1个vcpu
- 1GB内存
- 两个网卡(桥接+NAT)
- 磁盘类型:scsi
- VNC显示卡
- OS类型为RHEL6
#导入新的KVM虚拟机
[root@KVM vm]# virt-install --import --name=LNMP --vcpus=1 --ram=1024 --disk bus=scsi,path=/vm/LNMP-disk1.qcow2 --network type=bridge,source=virbr0 --network network=default --graphics vnc,listen=0.0.0.0 --os-type=linux --os-variant=rhel6 --noautoconsole
开始安装......
域创建完成。
[root@KVM vm]# virsh list
Id 名称 状态
----------------------------------------------------
13 LNMP running
5.2.7 调整虚拟磁盘大小
语法格式
[root@KVM vm]# qemu-img --help | grep resize
resize [-q] filename [+ | -]size
- 操作之前,一定要做好数据备份
- 增加文件大小后,需要在客户机中使用fdisk,parted等分区工具进行相应操作才能真正让客户机使用到增加后的镜像空间。
- 缩小镜像之前,要在客户机中保证里面的文件系统有空余空间,否则会数据丢失
- qcow2不支持缩小镜像的操作
#实操
[root@KVM vm]# qemu-img info LNMP-disk1.qcow2
image: LNMP-disk1.qcow2
file format: qcow2
virtual size: 20G (21474836480 bytes) #磁盘原始尺寸
disk size: 2.4G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
[root@KVM vm]# qemu-img resize LNMP-disk1.qcow2 +10G #增加10G尺寸
Image resized.
[root@KVM vm]# qemu-img info LNMP-disk1.qcow2
image: LNMP-disk1.qcow2
file format: qcow2
virtual size: 30G (32212254720 bytes) #扩大了10G
disk size: 2.4G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
5.3快照管理
5.3.1 快照/检查点概述
磁盘快照
- 对磁盘数据进行快照
- 主要用于虚拟机备份等场合
内存快照
- 对虚拟机的内存/设备信息进行保存
- 该机制同时用于休眠恢复,迁移等场景
- 主要使用virsh save(qemu migrate to file)实现,只能对运行的虚拟机进行
检查点快照
- 同时保存虚拟机的磁盘快照和内存快照
- 用于将虚拟机恢复到某个时间点
- 可以保证数据的一致性
5.3.2 磁盘快照分类
按快照信息保存分为:
- 内置快照:快照数据和base磁盘数据放在一个qcow2文件中
- 外置快照:快照数据单独的qcow2文件存放
按虚拟机状态可以分为:
- 关机态快照:数据可以保持一致性
- 运行态快照:数据无法保持一致性,类似与系统crash后的磁盘数据。使用是可能需要fsck等操作。
按磁盘数量可以分为:
- 单盘:单盘快照不涉及原子性
- 多盘:涉及原子性。主要分两个方面:1,是所有盘快照点相同 2,所有盘要么都快照成功,要么都快照失败。主要依赖于qemu的transaction实现
5.3.3 管理磁盘快照
语法格式:
[root@KVM vm]# qemu-img --help | grep snapshot
snapshot [-q] [-l | -a snapshot | -c snapshot | -d snapshot] filename
Parameters to snapshot subcommand:
'snapshot' is the name of the snapshot to create, apply or delete
'-a' applies a snapshot (revert disk to saved state) #快照回滚
'-c' creates a snapshot #创建快照
'-d' deletes a snapshot #删除快照
'-l' lists all snapshots in the given image #显示快照列表
快照管理之磁盘快照实操:
#创建磁盘快照
[root@KVM vm]# qemu-img snapshot -l /vm/Base_CentOS6.5.qcow2
[root@KVM vm]# qemu-img snapshot -c s1 /vm/Base_CentOS6.5.qcow2 #创建磁盘快照
[root@KVM vm]# qemu-img snapshot -l /vm/Base_CentOS6.5.qcow2
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
1 s1 0 2018-05-06 13:33:16 00:00:00.000
#关闭虚拟机回滚磁盘快照
#在虚拟机里删除一个文件然后进行磁盘回滚
[root@KVM vm]# qemu-img snapshot -a s1 /vm/Base_CentOS6.5.qcow2
需要注意的是,进行磁盘快照回滚时需要关闭虚拟机,回滚后,我们发现数据已经恢复
qemu-img方式的磁盘快照只能支持原生态的qcow2格式,不支持从raw格式转换而来的qcow2不然会出现问题。
5.4 存储池
5.4.1 存储池的基础概念
Libvirt可以以存储池的形式对存储进行统一管理,简化操作
对于虚拟机操作来说,存储池和卷并不是必须的
支持以下存储池
- dir:Filesystem Directory
- disk:Physical Disk Device
- fs:Pre-Formatted Block Device
- gluster:Gluster FileSystem
- iscsi:iSCSI Target
- logical:LVM Volume Group
- mpath:Multipath Device Enumerator
- netfs:Network Export Directory
- rbd:RADOS Block Device/Ceph
- scsi:SCSI Host Adapter
- sheepdog:Sheepdog Filesystem
[root@KVM ~]# cd /etc/libvirt/storage/
[root@KVM storage]# ll
总用量 12
drwxr-xr-x. 2 root root 54 12月 29 13:27 autostart
-rw-------. 1 root root 538 12月 28 17:38 default.xml #对应存储池的xml文件
-rw-------. 1 root root 511 12月 28 21:35 iso.xml #对应存储池的xml文件
-rw-------. 1 root root 508 12月 29 13:27 vm.xml #对应存储池的xml文件
[root@KVM storage]# cat iso.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 iso #警告这是一个自动文件若需要编辑请用virsh pool-edit iso
or other application using the libvirt API.
-->
<pool type='dir'> #池类型
<name>iso</name> #池名称
<uuid>bfcd14e0-d6b2-448d-8b29-bbfa5b5e97d0</uuid>
<capacity unit='bytes'>0</capacity>
<allocation unit='bytes'>0</allocation>
<available unit='bytes'>0</available>
<source>
</source>
<target>
<path>/iso</path> #源是在/iso这个目录里
</target>
</pool>
#我们发现在/etc/libvirt/storage/路径下还有一个目录autostart
[root@KVM storage]# ll autostart/
总用量 0
lrwxrwxrwx. 1 root root 32 12月 28 17:38 default.xml -> /etc/libvirt/storage/default.xml
lrwxrwxrwx. 1 root root 28 12月 28 21:35 iso.xml -> /etc/libvirt/storage/iso.xml
lrwxrwxrwx. 1 root root 27 12月 29 13:27 vm.xml -> /etc/libvirt/storage/vm.xml
#如果我们用virsh pool-edit iso来打开iso.xml文件的话,会是如下内容
[root@KVM storage]# virsh pool-edit iso
<pool type='dir'>
<name>iso</name>
<uuid>bfcd14e0-d6b2-448d-8b29-bbfa5b5e97d0</uuid>
<capacity unit='bytes'>18238930944</capacity> #内容出现了变化
<allocation unit='bytes'>13504528384</allocation> #内容出现了变化
<available unit='bytes'>4734402560</available> #内容出现了变化
<source>
</source>
<target>
<path>/iso</path>
<permissions>
<mode>0755</mode>
<owner>0</owner>
<group>0</group>
<label>unconfined_u:object_r:default_t:s0</label>
</permissions>
</target>
</pool>
virsh中的存储池相关命令
virsh中的存储卷相关命令
5.4.2 显示池与卷的信息
#pool-list 帮助
[root@KVM storage]# virsh pool-list --help
NAME
pool-list - 列出池
SYNOPSIS
pool-list [--inactive] [--all] [--transient] [--persistent] [--autostart] [--no-autostart] [--type <string>] [--details] [--uuid] [--name]
DESCRIPTION
返回池列表
OPTIONS
--inactive 列出不活跃的池
--all 不活跃和活跃的池
--transient 列出临时池
--persistent 列出持久池
--autostart 列出启用 autostart 的池
--no-autostart 列出禁用 autostart 的池
--type <string> 只列出指定类型的池(如果支持)
--details 为池显示扩展的详情
--uuid list UUID of active pools only
--name list name of active pools only
#查看所有的存储池
[root@KVM storage]# virsh pool-list
名称 状态 自动开始
-------------------------------------------
default 活动 是
iso 活动 是
vm 活动 是
#查看某个存储池的详细信息
[root@KVM storage]# virsh pool-info vm
名称: vm
UUID: b1a25def-9ecf-46d7-93d7-2c59c5594e5c
状态: running #存储池状态
持久: 是 #是否是永久性存储池
自动启动: 是 #是否随系统开机启动
容量: 16.99 GiB #总容量大小
分配: 12.58 GiB #已经分配容量
可用: 4.41 GiB #可用容量
#查看某个存储池中的所有存储卷
[root@KVM storage]# virsh vol-list vm
名称 路径
------------------------------------------------------------------------------
Base_CentOS6.5.qcow2 /vm/Base_CentOS6.5.qcow2
centos6.5.qcow2 /vm/centos6.5.qcow2
CRM-disk0.qcow2 /vm/CRM-disk0.qcow2
ERP-disk0.qcow2 /vm/ERP-disk0.qcow2
HR-disk0.qcow2 /vm/HR-disk0.qcow2
OA-disk0.qcow2 /vm/OA-disk0.qcow2
test1.qcow2 /vm/test1.qcow2
test2.qcow2 /vm/test2.qcow2
test3.qcow2 /vm/test3.qcow2
test4.qcow2 /vm/test4.qcow2
yangwenbo.qcow2 /vm/yangwenbo.qcow2
5.4.3 基于目录的存储池
准备目录
- 设置目录权限
# chown root:root /guest_images/
# chmod 700 /guest_images
- 通过virt-manager创建
- 通过virsh创建
# virsh pool-define-as guest_images dir --target "/guest_images2"
存储池实操:
#创建存储池目录
[root@KVM ~]# mkdir /guest_images
[root@KVM ~]# chown root:root /guest_images
[root@KVM ~]# chmod 700 /guest_images/
(1)通过virt-manager创建存储池
#用命令查看存储池状态
[root@KVM ~]# virsh pool-list
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images_dir 活动 是 #创建完毕
iso 活动 是
vm 活动 是
#查看新创建的存储池的配置文件
[root@KVM ~]# cat /etc/libvirt/storage/guest_images_dir.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 guest_images_dir
or other application using the libvirt API.
-->
<pool type='dir'>
<name>guest_images_dir</name>
<uuid>36a61077-c4db-40fe-8745-34e49d48506d</uuid>
<capacity unit='bytes'>0</capacity>
<allocation unit='bytes'>0</allocation>
<available unit='bytes'>0</available>
<source>
</source>
<target>
<path>/guest_images</path>
</target>
</pool>
通过virt-manager删除存储池
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images_dir 不活动 否
iso 活动 是
vm 活动 是
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
iso 活动 是
vm 活动 是
[root@KVM ~]# ls /etc/libvirt/storage/
autostart default.xml iso.xml vm.xml
(2)通过virsh创建一个自定义存储池
#定义一个存储池
[root@KVM ~]# virsh pool-define --help
NAME
pool-define - define an inactive persistent storage pool or modify an existing persistent one from an XML file
SYNOPSIS
pool-define <file> #如果直接去定义存储池参数比较多,我们可以选择直接通过存储池的配置文件去定义存储池
DESCRIPTION
Define or modify a persistent storage pool.
OPTIONS
[--file] <string> 包含 XML 池描述的文件
[root@KVM ~]# virsh pool-define-as guest_images dir --target "/guest_images2" #guest_images存储池名字,target目标路径
定义池 guest_images
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images 不活跃 否 #新定义的存储池并没有启动
iso 活动 是
vm 活动 是
[root@KVM ~]# virsh pool-start guest_images
错误:启动池 guest_images 失败
错误:cannot open directory '/guest_images2': 没有那个文件或目录
#我们不要用手动去创建存储池目录,因为可能会有权限问题。
#创建一个定义好的存储池的存储目录
[root@KVM ~]# virsh pool-build guest_images
构建池 guest_images
[root@KVM ~]# ll -d /gue*
drwx------. 2 root root 6 1月 1 17:01 /guest_images
drwx--x--x. 2 root root 6 1月 1 17:07 /guest_images2
[root@KVM ~]# virsh pool-start guest_images #启动存储池
池 guest_images 已启动
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images 活动 否 #存储池处于启动状态
iso 活动 是
vm 活动 是
[root@KVM ~]# virsh pool-autostart guest_images #标记存储池自动启动
池 guest_images 标记为自动启动
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images 活动 是
iso 活动 是
vm 活动 是
删除自定义的存储池
[root@KVM ~]# virsh pool-destroy guest_images #停止存储池的活动
销毁池 guest_images
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images 不活跃 是
iso 活动 是
vm 活动 是
[root@KVM ~]# virsh pool-delete guest_images #删除存储池目录
池 guest_images 被删除
[root@KVM ~]# ll -d /gue* #存储池的存储目录已经被删除了
drwx------. 2 root root 6 1月 1 17:01 /guest_images
[root@KVM ~]# virsh pool-info guest_images #但存储池配置文件还在
名称: guest_images
UUID: e850074b-232a-457f-b7dd-06dd45a72410
状态: 不活跃
持久: 是
自动启动: 是
[root@KVM ~]# ll /etc/libvirt/storage/
总用量 16
drwxr-xr-x. 2 root root 78 1月 1 17:08 autostart
-rw-------. 1 root root 538 12月 28 17:38 default.xml
-rw-------. 1 root root 539 1月 1 17:04 guest_images.xml #在这里
-rw-------. 1 root root 511 12月 28 21:35 iso.xml
-rw-------. 1 root root 508 12月 29 13:27 vm.xml
[root@KVM ~]# virsh pool-undefine guest_images #清除存储池配置文件
池 guest_images 已经被取消定义
[root@KVM ~]# ll /etc/libvirt/storage/ #已经没了
总用量 12
drwxr-xr-x. 2 root root 54 1月 1 17:17 autostart
-rw-------. 1 root root 538 12月 28 17:38 default.xml
-rw-------. 1 root root 511 12月 28 21:35 iso.xml
-rw-------. 1 root root 508 12月 29 13:27 vm.xml
[root@KVM ~]# virsh pool-info guest_images #配置文件已经没了
错误:获得池 'guest_images' 失败
错误:未找到存储池: 没有与名称 'guest_images' 匹配的存储池
5.4.4 基于分区的存储池
- libvirtd会自动mount分区
- 准备分区并创建文件系统
# fdisk /dev/sdc
# mkfs.ext4 /dev/sdc1
创建:
- Source Path:块设备名
- Target Path:mount到的目录名
# virsh pool-define-as guest_images_fs fs --source-dev "/dev/sdc1" --target "/guest_images2"
操作准备
给虚拟机再加入一块磁盘,分区并进行格式化来继续我们的实验
#将新磁盘sdc分两个分区,并进行格式化。
[root@KVM ~]# ll /dev/sdc*
brw-rw----. 1 root disk 8, 32 1月 4 08:37 /dev/sdc
[root@KVM ~]# mkfs.ext4 /dev/sdc #磁盘格式化
[root@KVM ~]# fdisk /dev/sdc
#以下省略若干。。。
[root@KVM ~]# ll /dev/sdc*
brw-rw----. 1 root disk 8, 32 1月 4 09:02 /dev/sdc
brw-rw----. 1 root disk 8, 33 1月 4 09:02 /dev/sdc1
brw-rw----. 1 root disk 8, 34 1月 4 09:02 /dev/sdc2
[root@KVM /]# mkfs.ext4 /dev/sdc1 #使用前把磁盘格式化一下
[root@KVM ~]# rm -rf /guest_images/ #清除旧存储池存放目录
(1)通过virt-manager创建一个基于分区的存储池
#验证创建的存储池
[root@KVM /]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images_fs 活动 是 #有了并处于活动状态
[root@KVM /]# virsh pool-info guest_images_fs
名称: guest_images_fs
UUID: 542f3884-b320-4da5-84f3-7a85e9af8e50
状态: running
持久: 是
自动启动: 是
容量: 19.56 GiB
分配: 44.02 MiB
可用: 19.52 GiB
[root@KVM /]# ll -d /guest_images/
drwxr-xr-x. 3 root root 4096 1月 5 16:17 /guest_images/
[root@KVM /]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos_kvm-root 17G 3.9G 14G 23% /
devtmpfs 898M 0 898M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 11M 900M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 1014M 201M 814M 20% /boot
tmpfs 182M 44K 182M 1% /run/user/0
/dev/sr0 4.2G 4.2G 0 100% /run/media/root/CentOS 7 x86_64
/dev/sdc1 20G 45M 19G 1% /guest_images #磁盘/dev/sdc1被自动挂载了
[root@KVM /]# cat /etc/libvirt/storage/guest_images_fs.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 guest_images_fs
or other application using the libvirt API.
-->
<pool type='fs'> #磁盘类型为fs
<name>guest_images_fs</name>
<uuid>542f3884-b320-4da5-84f3-7a85e9af8e50</uuid>
<capacity unit='bytes'>0</capacity>
<allocation unit='bytes'>0</allocation>
<available unit='bytes'>0</available>
<source>
<device path='/dev/sdc1'/> #源磁盘路径
<format type='auto'/>
</source>
<target>
<path>/guest_images</path> #目标目录路径
</target>
</pool>
[root@KVM /]# mount | grep sdc1 #查看mount挂载的信息
/dev/sdc1 on /guest_images type ext4 (rw,relatime,seclabel,data=ordered)
[root@KVM /]# reboot #重启检查一下是否可以自动挂载
[root@KVM ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos_kvm-root 17G 3.9G 14G 23% /
devtmpfs 898M 0 898M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 11M 900M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup #成功
/dev/sda1 1014M 201M 814M 20% /boot
/dev/sdc1 20G 45M 19G 1% /guest_images
tmpfs 182M 32K 182M 1% /run/user/0
/dev/sr0 4.2G 4.2G 0 100% /run/media/root/CentOS 7 x86_64
这里我们成功后,然后我们清理掉guest_images_fs存储池信息,继续实验
(2)通过virsh命令创建一个基于分区的存储池
[root@KVM ~]# virsh pool-define-as guest_images_fs fs --source-dev "/dev/sdc1" --target "/guest_images2"
定义池 guest_images_fs
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images_fs 不活跃 否 #新定义的存储池未启动
[root@KVM ~]# ll -d /gue* #没有目标挂载目录
drwxr-xr-x. 2 root root 6 1月 5 16:14 /guest_images
[root@KVM ~]# virsh pool-build guest_images_fs #创建存储池存储目录
构建池 guest_images_fs
[root@KVM ~]# ll -d /guest*
drwxr-xr-x. 2 root root 6 1月 5 16:14 /guest_images
drwx--x--x. 2 root root 6 1月 5 18:50 /guest_images2 #存在了
[root@KVM ~]# virsh pool-start guest_images_fs #启动存储池
池 guest_images_fs 已启动
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images_fs 活动 否 #启动成功
[root@KVM ~]# virsh pool-autostart guest_images_fs #标记存储池开机自启动
池 guest_images_fs 标记为自动启动
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images_fs 活动 是
[root@KVM ~]# mount | grep /dev/sdc1 #已经自动挂载
/dev/sdc1 on /guest_images2 type ext4 (rw,relatime,seclabel,data=ordered)
5.4.5 基于LVM的存储池
基于LVM的存储池要求使用全部磁盘分区
创建时存储池,有两种方法
- 使用现有的VG
- 创建新的VG
创建新的VG
- Target Path:新的卷组名
- Source Path:存储设备的位置
- Build Pool:会创建新的VG
创建
# virsh pool-define-as guest_images_lvm3 logical \ --source-dev=/dev/sdc --source-name=libvirt_lvm \ --target=/dev/libvirt_vg
(1)以手动的方式创建VG并通过virt-manager创建基于lvm的存储池
#fdisk分出一个全部容量的分区
[root@KVM ~]# mkfs.ext4 /dev/sdc #磁盘格式化
[root@KVM ~]# fdisk /dev/sdc
#以下省略若干。。。
[root@KVM ~]# ll /dev/sdc*
brw-rw----. 1 root disk 8, 32 1月 5 19:14 /dev/sdc
brw-rw----. 1 root disk 8, 33 1月 5 19:14 /dev/sdc1 #这就是我们实验用的分区
#创建一个卷组
[root@KVM ~]# pvcreate /dev/sdc1
Physical volume "/dev/sdc1" successfully created.
[root@KVM ~]# vgcreate guest_images_lvm /dev/sdc1
Volume group "guest_images_lvm" successfully created
#验证存储池创建状态
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images_lvm 活动 是
[root@KVM ~]# cat /etc/libvirt/storage/guest_images_lvm.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 guest_images_lvm
or other application using the libvirt API.
-->
<pool type='logical'>
<name>guest_images_lvm</name>
<uuid>5a11064e-2e9b-47d2-aa1d-10896f25bdd5</uuid>
<capacity unit='bytes'>0</capacity>
<allocation unit='bytes'>0</allocation>
<available unit='bytes'>0</available>
<source>
<name>guest_images_lvm</name>
<format type='lvm2'/>
</source>
<target>
<path>/dev/guest_images_lvm</path>
</target>
</pool>
图形界面创建成功
(2)通过virt-manager创建vg并创建LVM存储池
先清除之前创建的存储池
#清除之前的vg卷组
[root@KVM ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos_kvm 1 2 0 wz--n- <19.00g 0
guest_images_lvm 1 0 0 wz--n- <40.00g <40.00g
vmvg 1 1 0 wz--n- <30.00g 0
[root@KVM ~]# vgremove guest_images_lvm
Volume group "guest_images_lvm" successfully removed
[root@KVM ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos_kvm 1 2 0 wz--n- <19.00g 0
vmvg 1 1 0 wz--n- <30.00g 0
#清除之前的pv状态
[root@KVM ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos_kvm lvm2 a-- <19.00g 0
/dev/sdb1 vmvg lvm2 a-- <30.00g 0
/dev/sdc1 lvm2 --- <40.00g <40.00g
[root@KVM ~]# pvremove /dev/sdc1
Labels on physical volume "/dev/sdc1" successfully wiped.
[root@KVM ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos_kvm lvm2 a-- <19.00g 0
/dev/sdb1 vmvg lvm2 a-- <30.00g 0
#通过fdisk清除/dev/sdc1的磁盘分区,不要通过mkfs.ext4方式来清除/dev/sdc1,不然图形软件无法自动pv化磁盘
[root@KVM ~]# ll /dev/sdc*
brw-rw----. 1 root disk 8, 32 1月 5 19:33 /dev/sdc
#验证存储池创建状态
[root@KVM ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos_kvm 1 2 0 wz--n- <19.00g 0
guest_images_lvm2 1 0 0 wz--n- <40.00g <40.00g
vmvg 1 1 0 wz--n- <30.00g 0
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images_lvm2 活动 是
[root@KVM ~]# cat /etc/libvirt/storage/guest_images_lvm2.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 guest_images_lvm2
or other application using the libvirt API.
-->
<pool type='logical'>
<name>guest_images_lvm2</name>
<uuid>a66a085c-d017-409d-8925-4f508956e2b0</uuid>
<capacity unit='bytes'>0</capacity>
<allocation unit='bytes'>0</allocation>
<available unit='bytes'>0</available>
<source>
<device path='/dev/sdc'/>
<name>guest_images_lvm2</name>
<format type='lvm2'/>
</source>
<target>
<path>/dev/guest_images_lvm2</path>
</target>
</pool>
(3)通过virsh命令创建vg并创建基于LVM的存储池
#清除之前创建的存储池并抹除vg痕迹
[root@KVM ~]# vgs
VG #PV #LV #SN Attr VSize VFree
cl 1 2 0 wz--n- 19.00g 0
guest_images_lvm2 1 0 0 wz--n- 20.00g 20.00g
vmvg 1 1 0 wz--n- 40.00g 0
[root@KVM ~]# vgremove guest_images_lvm2
Volume group "guest_images_lvm2" successfully removed
[root@KVM ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 cl lvm2 a-- 19.00g 0
/dev/sdb1 vmvg lvm2 a-- 40.00g 0
/dev/sdc lvm2 --- 20.00g 20.00g
[root@KVM ~]# pvremove /dev/sdc
Labels on physical volume "/dev/sdc" successfully wiped.
#virsh命令创建vg并创建基于LVM的存储池
[root@KVM ~]# virsh pool-define-as guest_images_lvm3 logical --source-dev=/dev/sdc --source-name=libvirt_lvm --target=/dev/libvirt_vg
定义池 guest_images_lvm3
[root@KVM ~]# vgs #我们发现virsh命令没有自动创建vg
VG #PV #LV #SN Attr VSize VFree
centos_kvm 1 2 0 wz--n- <19.00g 0
[root@KVM ~]# pvs #我们发现virsh命令没有自动创建pv
PV VG Fmt Attr PSize PFree
/dev/sda2 centos_kvm lvm2 a-- <19.00g 0
#virsh命令创建卷组libvirt_lvm
[root@KVM ~]# virsh pool-build guest_images_lvm3
构建池 guest_images_lvm3
[root@KVM ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos_kvm lvm2 a-- <19.00g 0
/dev/sdc libvirt_lvm lvm2 a-- <40.00g <40.00g
[root@KVM ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos_kvm 1 2 0 wz--n- <19.00g 0
libvirt_lvm 1 0 0 wz--n- <40.00g <40.00g
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
guest_images_lvm3 不活跃 否
[root@KVM ~]# virsh pool-start guest_images_lvm3
池 guest_images_lvm3 已启动
[root@KVM ~]# virsh pool-autostart guest_images_lvm3
池 guest_images_lvm3 标记为自动启动
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
guest_images_lvm3 活动 是
5.4.6 基于NFS的存储池
# virsh pool-define-as --name nfstrial2 --type netfs --source-host 192.168.200.26 --source-path /nfsshare --target /nfstrial2
环境准备
- 在一台KVM虚拟机中创建NFS共享存储文件系统
- 创建基于NFS共享存储的存储池
第一步:在一台虚拟机中yum安装nfs服务端
#这是一台NAT链接的虚拟机,yum安装nfs
[root@KVM ~]# yum -y install rpcbind nfs-utils
[root@KVM ~]# rpm -qa rpcbind nfs-utils
nfs-utils-1.3.0-0.61.el7.x86_64
rpcbind-0.2.0-47.el7.x86_64
[root@KVM ~]# mkdir /nfs1
[root@KVM ~]# mkdir /nfsshare
[root@KVM ~]# useradd nfsnobody
[root@KVM ~]# chown nfsnobody.nfsnobody /nfsshare
[root@KVM ~]# cat /etc/exports #因为虚拟机是NAT模式,若要宿主机能够挂载需要开通两个网段权限
/nfsshare 192.168.122.0/24(rw,sync) 192.168.200.0/24(rw,sync)
#启动rpc与nfs
[root@KVM ~]# systemctl restart rpcbind.service
[root@KVM ~]# systemctl start nfs.service
第二步:virt-manager创建基于NFS的存储池
#在宿主机中测试共享目录
[root@KVM ~]# df -h | grep nfsshare #已经自动挂载
192.168.200.26:/nfsshare 17G 3.9G 14G 23% /nfs1
[root@KVM ~]# mount | grep nfsshare #已经自动挂载
192.168.200.26:/nfsshare on /nfs1 type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.200.26,local_lock=none,addr=192.168.200.26)
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images_lvm3 活动 是
nfs1 活动 是
[root@KVM ~]# cat /etc/libvirt/storage/nfs1.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 nfs1
or other application using the libvirt API.
-->
<pool type='netfs'> #类型为网络文件系统network file system
<name>nfs1</name>
<uuid>c056492d-178a-42e1-9b8d-7302db333352</uuid>
<capacity unit='bytes'>0</capacity>
<allocation unit='bytes'>0</allocation>
<available unit='bytes'>0</available>
<source>
<host name='192.168.200.26'/> #源共享主机IP
<dir path='/nfsshare'/> #源共享主机目录
<format type='auto'/>
</source>
<target>
<path>/nfs1</path> #目标挂载目录
</target>
</pool>
5.5 存储卷
5.5.1 存储卷概述
存储池被分割为存储卷(Storage Volume)
存储卷
- 文件
- 块设备(如物理分区,LVM逻辑卷等)
- libvirt管理的其他类型存储的抽象
[root@KVM ~]# virsh help volume
Storage Volume (help keyword 'volume'):
vol-clone 克隆卷。
vol-create-as 从一组变量中创建卷
vol-create 从一个 XML 文件创建一个卷
vol-create-from 生成卷,使用另一个卷作为输入。
vol-delete 删除卷
vol-download 将卷内容下载到文件中
vol-dumpxml XML 中的卷信息
vol-info 存储卷信息
vol-key 为给定密钥或者路径返回卷密钥
vol-list 列出卷
vol-name 为给定密钥或者路径返回卷名
vol-path 为给定密钥或者路径返回卷路径
vol-pool 为给定密钥或者路径返回存储池
vol-resize 创新定义卷大小
vol-upload 将文件内容上传到卷中
vol-wipe 擦除卷
5.5.2 存储卷管理
- 创建
- 克隆
- 删除
(1) 演示:存储卷的创建
[root@KVM ~]# virsh vol-create-as --help
NAME
vol-create-as - 从一组变量中创建卷
SYNOPSIS
vol-create-as <pool> <name> <capacity> [--allocation <string>] [--format <string>] [--backing-vol <string>] [--backing-vol-format <string>] [--prealloc-metadata] [--print-xml]
DESCRIPTION
创建一个卷。
OPTIONS
[--pool] <string> 卷名称
[--name] <string> 卷的名称
[--capacity] <string> 卷大小,以整数计(默认为字节)
--allocation <string> 初始化分配大小,以整数计(默认为 KiB)
--format <string> 文件格式类型:raw、bochs、qcow、qcow2、qed、vmdk
--backing-vol <string> 提取快照时的后端卷
--backing-vol-format <string> 提取快照时的后端卷格式
--prealloc-metadata 预先分配的元数据(用于 qcow2 而不是整个分配)
--print-xml 打印 XML 文档,但不能定义/创建
1)基于目录的存储池中的存储卷管理
#查看所有的存储池
[root@KVM /]# virsh pool-list
名称 状态 自动开始
-------------------------------------------
default 活动 是
ios 活动 是
nfs1 活动 是
VM 活动 是 #目标存储池
#查看VM存储的xml文档
[root@KVM /]# virsh pool-dumpxml VM
<pool type='dir'> #基于目录的存储池
<name>VM</name>
<uuid>8567eb78-049e-42cb-b1ca-8f832e4995e5</uuid>
<capacity unit='bytes'>31568334848</capacity>
<allocation unit='bytes'>1207033856</allocation>
<available unit='bytes'>30361300992</available>
<source>
</source>
<target>
<path>/VM</path> #存储池位置
<permissions>
<mode>0755</mode>
<owner>0</owner>
<group>0</group>
<label>system_u:object_r:unlabeled_t:s0</label>
</permissions>
</target>
</pool>
#查看VM存储池的所有存储卷
[root@KVM /]# virsh vol-list VM
名称 路径
------------------------------------------------------------------------------
centos6.5-2.qcow2 /VM/centos6.5-2.qcow2
#向VM存储池里创建一个存储卷
[root@KVM /]# virsh vol-create-as VM test1.qcow2 1G --format qcow2
创建卷 test1.qcow2
#查看test1.qcow2的卷信息的两种方式
[root@KVM /]# virsh vol-info /VM/test1.qcow2
名称: test1.qcow2
类型: 文件
容量: 1.00 GiB
分配: 196.00 KiB
[root@KVM /]# virsh vol-info test1.qcow2 --pool VM
名称: test1.qcow2
类型: 文件
容量: 1.00 GiB
分配: 196.00 KiB
2)基于LVM的存储池中的存储卷管理
#定义一个基于LVM的存储池
[root@KVM /]# ll /dev/sdc*
brw-rw----. 1 root disk 8, 32 1月 10 22:46 /dev/sdc
[root@KVM /]# virsh pool-define-as guest_images_lvm logical --source-dev=/dev/sdc --target=/dev/vg_libvirt
定义池 guest_images_lvm
#构建LVM存储池(如果构建失败,可手动pvcreate -y /dev/sdc后再执行)
[root@KVM /]# pvcreate -y /dev/sdc
Wiping ext4 signature on /dev/sdc.
Physical volume "/dev/sdc" successfully created.
[root@KVM /]# virsh pool-build guest_images_lvm
构建池 guest_images_lvm
#启动基于LVM的存储池
[root@KVM /]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images_lvm 不活跃 否
iso 活动 是
nfs1 活动 是
VM 活动 是
[root@KVM /]# virsh pool-start guest_images_lvm
池 guest_images_lvm 已启动
[root@KVM /]# virsh pool-autostart guest_images_lvm
池 guest_images_lvm 标记为自动启动
[root@KVM /]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
guest_images_lvm 活动 是
iso 活动 是
nfs1 活动 是
VM 活动 是
#向LVM存储池中创建一个存储卷
[root@KVM /]# virsh vol-create-as guest_images_lvm lvvoll 1G
创建卷 lvvoll
[root@KVM /]# virsh vol-create-as guest_images_lvm lvvol2 2G
创建卷 lvvol2
[root@KVM /]# virsh vol-create-as guest_images_lvm lvvol3 3G
创建卷 lvvol3
[root@KVM /]# virsh vol-list guest_images_lvm
名称 路径
------------------------------------------------------------------------------
lvvol2 /dev/guest_images_lvm/lvvol2
lvvol3 /dev/guest_images_lvm/lvvol3
lvvoll /dev/guest_images_lvm/lvvoll
(2) 演示:存储卷的克隆
[root@KVM /]# virsh vol-clone --help
NAME
vol-clone - 克隆卷。
SYNOPSIS
vol-clone <vol> <newname> [--pool <string>] [--prealloc-metadata] [--reflink]
DESCRIPTION
Clone an existing volume within the parent pool.
OPTIONS
[--vol] <string> 卷名称、密钥或者路径
[--newname] <string> 克隆名称
--pool <string> 池名或 uuid
--prealloc-metadata 预先分配的元数据(用于 qcow2 而不是整个分配)
--reflink use btrfs COW lightweight copy
#克隆基于目录的存储池中的存储卷test1.qcow2
[root@KVM /]# virsh vol-clone test1.qcow2 test2.qcow2 --pool VM
使用 test2.qcow2 克隆的卷 test1.qcow2
[root@KVM /]# virsh vol-list VM
名称 路径
------------------------------------------------------------------------------
centos6.5-2.qcow2 /VM/centos6.5-2.qcow2
test1.qcow2 /VM/test1.qcow2
test2.qcow2 /VM/test2.qcow2 #克隆后的盘
[root@KVM /]# virsh vol-info /VM/test2.qcow2
名称: test2.qcow2
类型: 文件
容量: 1.00 GiB
分配: 196.00 KiB
#克隆基于LVM的存储池中的存储卷
[root@KVM /]# virsh vol-clone lvvoll lvvol4 --pool guest_images_lvm
使用 lvvol4 克隆的卷 lvvoll
[root@KVM /]# virsh vol-list guest_images_lvm
名称 路径
------------------------------------------------------------------------------
lvvol2 /dev/guest_images_lvm/lvvol2
lvvol3 /dev/guest_images_lvm/lvvol3
lvvol4 /dev/guest_images_lvm/lvvol4 #克隆后的卷
lvvoll /dev/guest_images_lvm/lvvoll
[root@KVM /]# virsh vol-info /dev/guest_images_lvm/lvvol4
名称: lvvol4
类型: 块
容量: 1.00 GiB
分配: 1.00 GiB
(3) 演示:存储卷的删除
#查看命令帮助
[root@KVM ~]# virsh vol-delete --help
NAME
vol-delete - 删除卷
SYNOPSIS
vol-delete <vol> [--pool <string>] [--delete-snapshots]
DESCRIPTION
删除一个给定的卷。
OPTIONS
[--vol] <string> 卷名称、密钥或者路径
--pool <string> 池名或 uuid
--delete-snapshots delete snapshots associated with volume (must be supported by storage driver)
#删除基于LVM存储池中的存储卷
[root@KVM ~]# virsh vol-delete lvvol4 guest_images_lvm
卷 lvvol4 被删除
[root@KVM ~]# virsh vol-delete lvvol3 guest_images_lvm
卷 lvvol3 被删除
[root@KVM ~]# virsh vol-delete lvvol2 guest_images_lvm
卷 lvvol2 被删除
[root@KVM ~]# virsh vol-delete lvvoll guest_images_lvm
卷 lvvoll 被删除
[root@KVM ~]# virsh vol-list guest_images_lvm
名称 路径
------------------------------------------------------------------------------
#删除基于LVM的存储池
[root@KVM ~]# virsh pool-destroy guest_images_lvm
销毁池 guest_images_lvm
[root@KVM ~]# virsh pool-undefine guest_images_lvm
池 guest_images_lvm 已经被取消定义
[root@KVM ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
ios 活动 是
nfs1 活动 是
VM 活动 是
#删除基于目录的存储池中的存储卷
[root@KVM ~]# virsh vol-delete /VM/test2.qcow2
卷 /VM/test2.qcow2 被删除
5.5.3 向虚拟机添加卷
- 通过virt-manager添加新设备 :通过图形管理程序添加新设备
- attach-device :通过XML添加新的设备
- attach-disk :通过参数添加新的磁盘设备
(1)通过virt-manager添加新设备
假如我们想要向一个虚拟机中添加一块虚拟磁盘
点开一个虚拟机,运行状态的也可以
选择硬件添加
添加虚拟磁盘
进入运行中的虚拟机的交互界面
(2)通过XML文件添加新的设备
#创建一个disk类型的xml文档
[root@KVM ~]# vim /tmp/disks.xml
[root@KVM ~]# cat /tmp/disks.xml
<disk type='file' device='disk'> #文件类型
<driver name='qemu' type='qcow2' cache='none'/> #磁盘类型
<source file='/VM/test1.qcow2'/> #虚拟卷位置
<target dev='vdb'/> #虚拟卷挂载名称
</disk>
#查看virsh domblklist命令的帮助
[root@KVM ~]# virsh domblklist --help
NAME
domblklist - 列出所有域块
SYNOPSIS
domblklist <domain> [--inactive] [--details]
DESCRIPTION
获取域块设备小结
OPTIONS
[--domain] <string> domain name, id or uuid
--inactive 获取不活跃而不是运行的配置
--details type 和 device 值的附加显示
#查看虚拟机的磁盘挂载情况
[root@KVM ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
4 centos6.5 running #一个正在运行的虚拟机
- centos6.5-2 关闭
[root@KVM ~]# virsh domblklist centos6.5 #查看虚拟机的磁盘设备挂载情况
目标 源
------------------------------------------------
vda /var/lib/libvirt/images/centos6.5.qcow2
hda -
#将磁盘类型的xml文档加入到虚拟机
[root@KVM ~]# virsh attach-device --help #查看命令帮助
NAME
attach-device - 从一个XML文件附加装置
SYNOPSIS
attach-device <domain> <file> [--persistent] [--config] [--live] [--current]
DESCRIPTION
从一个XML文件附加装置.
OPTIONS
[--domain] <string> domain name, id or uuid
[--file] <string> XML 文件
--persistent 让实时更改持久
--config 影响下一次引导
--live 影响运行的域
--current 影响当前域
[root@KVM ~]# virsh attach-device centos6.5 /tmp/disks.xml --persistent #将xml文件添加进虚拟机
成功附加设备
[root@KVM ~]# virsh domblklist centos6.5
目标 源
------------------------------------------------
vda /var/lib/libvirt/images/centos6.5.qcow2
vdb /VM/test1.qcow2
hda -
通过virt-manager查看磁盘已经添加成功,如下图:
(3)通过参数添加新的磁盘设备
#克隆一个存储卷
[root@KVM ~]# virsh vol-clone test1.qcow2 test2.qcow2 --pool VM
使用 test2.qcow2 克隆的卷 test1.qcow2
[root@KVM ~]# ll /VM/test2.qcow2
-rw-------. 1 qemu qemu 1245184 1月 11 00:17 /VM/test2.qcow2
#挂载一个存储卷到虚拟机
[root@KVM VM]# virsh attach-disk centos6.5 --source=/VM/test2.qcow2 --target=vdc
成功附加磁盘
[root@KVM VM]# virsh domblklist centos6.5
目标 源
------------------------------------------------
vda /var/lib/libvirt/images/centos6.5.qcow2
vdb /VM/test1.qcow2
vdc /VM/test2.qcow2
hda -