KVM的存储选项有多种,包括虚拟磁盘文件、基于文件系统的存储和基于设备的存储。
后端
1、KVM的存储性能解析对比服务器
一、虚拟磁盘文件网络
当系统建立KVM虚拟机的时候,默认使用虚拟磁盘文件做为后端存储。安装后,虚拟机认为在使用真实的磁盘,但实际上看到的是用于模拟硬盘的虚拟磁盘文件。这一额外的文件系统层会下降系统速度。dom
固然,基于磁盘镜像的虚拟磁盘并不是全无益处,磁盘文件系统能够很轻松地用于其它的KVM虚拟化宿主机。可是若是您但愿优化KVM虚拟化性能,最好考虑其它的存储方式。ssh
二、基于文件系统的KVM存储ide
在安装KVM宿主机时,可选文件系统为dir(directory)或fs(formatted block storage)做为初始KVM存储格式。默认选项为dir,用户指定本地文件系统中的一个目录用于建立磁盘镜像文件。性能
fs选项能够容许用户指定某个格式化文件系统的名称,把它做为专用的磁盘镜像文件存储。两种KVM存储选项之间最主要的区别在于:fs文件系统不须要挂载到某个特定的分区。优化
两种选项所指定的文件系统,均可以是本地文件系统或位于SAN上某个物理宿主机上的网络文件系统。后者具有必定的优点,由于SAN能够很轻易地实现多个主机同时访问,而本地磁盘或文件系统则没法实现。ui
还有一种基于文件的磁盘存储方式是netfs,用户能够指定一个网络文件系统的名称,如Samba.用这种方式做为KVM存储很方便,由于这样很容易访问到位于其它服务器上的文件系统,同时用户也能够经过多台宿主机访问磁盘文件。spa
全部的这些基于文件的KVM存储方式都有一个缺点:文件系统固有缺陷。由于虚拟机的磁盘文件不能直接读取或写入KVM存储设备,而是写入宿主机OS之上的文件系统。这也就意味着在访问和写入文件时中间增长了额外一层,这一般会下降性能。因此,若是您但愿寻找KVM虚拟化性能最优方案,最好考虑基于设备的存储。
三、基于设备的KVM存储
另一种KVM存储的方式就是使用基于设备的方式。共支持四种不一样的物理存储:磁盘、iSCSI、SCSI和lvm逻辑盘。磁盘方式指直接读写硬盘设备。iSCSI和SCSI方式可选,取决于用户采起SCSI或iSCSI地址把磁盘设备链接。这种KVM存储方式的优点在于,磁盘的名称是固定的,而不须要取决于宿主机OS搜索到磁盘设备的顺序。
这种链接磁盘的方式也有缺点:灵活性不足。虚拟磁盘的大小很难改变,并且基于设备的KVM存储不支持快照。
若是要优化KVM存储的灵活性,可使用LVM(Logical Volume Manager)。LVM的优点在于可使用快照,而快照并非KVM虚拟化自带的功能。
LVM能够把全部存储放到一个卷组里,从而轻松建立一个逻辑卷。该卷组是物理磁盘设备的一个抽象,因此若是超出可用磁盘空间最大值,还能够向卷组中添加新的设备,从而极大简化了增长存储空间的过程,增长的空间在逻辑卷中直接可使用。使用LVM使得磁盘空间分配更加灵活,并且增长和删除存储也更为容易。
最后,LVM不管是在单宿主机或多宿主机环境中均可以很好工做。在多宿主机环境中,您能够在SAN上建立逻辑卷。若是使用Cluster LVM,能够很容易的配置成多个主机同时访问某个逻辑卷。
2、KVM存储池管理
为简化KVM存储管理的目的,能够建立存储池。在宿主机上建立存储池,能够简化KVM存储设备的管理。采用存储池的方式还能够实现对提早预留的存储空间的分配。这种策略对于大型应用环境颇有效,存储管理员和建立虚拟机的管理常常不是同一我的。这样,在建立首台虚拟机以前先完成KVM存储池的建立是很好的方法。
一、存储池的基本概念
存储池是一个由libvirt管理的文件、目录或存储设备,提供给虚拟机使用。存储池被分为存储卷,这些存储卷保存虚拟镜像或链接到虚拟机做为附加存储。libvirt经过存储池的形式对存储进行统一管理、简化操做。对于虚拟机操做来讲,存储池和卷并非必需的。支持如下类型存储池:
二、virsh中和存储池相关的命令
pool-autostart 自动启动某个池
pool-build 创建池
pool-create-as 从一组变量中建立一个池
pool-create 从一个 XML 文件中建立一个池
pool-define-as 在一组变量中定义池
pool-define 在一个XML文件中定义(但不启动)一个池或修改已有池
pool-delete 删除池
pool-destroy 销毁(删除)池
pool-dumpxml 将池信息保存到XML文档中
pool-edit 为存储池编辑 XML 配置
pool-info 查看存储池信息
pool-list 列出池
pool-name 将池 UUID 转换为池名称
pool-refresh 刷新池
pool-start 启动一个(之前定义的)非活跃的池
pool-undefine 取消定义一个不活跃的池
pool-uuid 把一个池名称转换为池 UUID
三、建立基于目录的存储池(dir:Filesystem Directory)
virsh pool-define-as test dir --target /kvm/test
virsh pool-build test
virsh pool-start test
virsh pool-autostart test
四、建立基于分区的存储池(fs:Pre-Formatted Block Device)
Libvirtd会自动挂载mount分区
(1)准备分区并建立文件系统
fdisk /dev/sdc
mkfs.xfs /dev/sdc1
(2)建立:
virsh pool-define-as test fs --source-dev /dev/sdc1 --target /kvm/test
virsh pool-build test
virsh pool-start test
virsh pool-autostart test
五、建立基于磁盘的存储池(disk:Physical Disk Device)
virsh pool-define-as test disk --source-dev /dev/sdc --source-format gpt --target /dev
virsh pool-define test
virsh pool-start test
virsh pool-autostart test
六、建立基于LVM的存储池(logical:LVM Volume Group)
基于LVM的存储池要求使用所有磁盘分区
建立存储池时,首先准备一个vg,vg中不须要建立lv
virsh pool-define-as kvmvg logical --source-name kvmvg --target /dev/kvmvg
七、建立基于iSCSI的存储池(iscsi:iSCSI Target)
virsh pool-define-as storage01 iscsi --source-host 192.168.2.20 \ //存储服务器的地址
> --source-dev iqn.2017-10.com.cloud.www:storage001 \ //target目标
> --target /dev/disk/by-path
virsh pool-start storage01
virsh pool-autostart storage01
八、基于NFS的存储池(netfs:Network Export Directory)
[root@kvm001 ~]# virsh pool-define-as --name kvmnfs --type netfs \
> --source-host 192.168.2.20 \
> --source-path /nfsshare \
> --target /nfstest //须要提早建立目录
3、KVM存储池管理
一、virsh中和存储池相关的命令
vol-clone 克隆卷。
vol-create-as 从一组变量中建立卷
vol-create 从一个 XML 文件建立一个卷
vol-create-from 生成卷,使用另外一个卷做为输入。
vol-delete 删除卷
vol-download 将卷内容下载到文件中
vol-dumpxml 保存卷信息到XML文档中
vol-info 查看存储卷信息
vol-key 根据卷名或路径返回卷的key
vol-list 列出卷
vol-name 根据给定卷key或者路径返回卷名
vol-path 根据卷名或key返回卷路径
vol-pool 为给定密钥或者路径返回存储池
vol-resize 从新定义卷大小
vol-upload 将文件内容上传到卷中
vol-wipe 擦除卷
2、在存储池中建立一个qcow2格式的卷
virsh vol-create-as vm test.qcow2 1G --format qcow2
3、向vm2虚拟机添加test卷
用法:attach-disk <domain> <source> <target>
virsh attach-disk vm2 /kvm/vfs/test.qcow2 /kvm/vfs --cache none