在 libvirt 上存储设备管理总结
http://www.ibm.com/developerworks/cn/linux/l-cn-libvirt-lvm/index.html引言libvirt 是一组可与 Linux 上多种虚拟机交互的管理工具集。它支持的虚拟机有 KVM/QEMU、Xen、LXC、OpenVZ、virtual Box、vmware ESX/GSX、Hyper-V 等。为了使虚拟机获得更强大
使用virsh工具添加Local磁盘
dd if=/dev/zero of=./virtimage1.img bs=1M count=50
virsh attach-disk test1 --persistent --source /var/crash/xx/vm/extent_disk.qcow2 --target vdb
在线添加磁盘这个任务,如果使用图形化工具,比如virt-manager,那是相当简单,鼠标点击几下就成了。今天自我挑战了一下,看看使用virsh命令行工具如何完成这一任务。
virsh支持attach-disk和attach-device两个相关子命令,貌似attach-disk是添加磁盘的专用工具,但我研究了 半天,没研究明白。而attach-device更通用一些,使用xml文件作为输入,灵活而强大。作为输入的xml文件格式与libvirt中VM的配 置文件格式一样,下面是一个实例:
1,创建磁盘:
qemu-img create -f qcow2 /data/vm/huge.img 500G
2,编写一个xml文件(disk.xml):
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none'/>
<source file='/data/vm/huge.img'/>
<target dev='vdb' bus='virtio'/>
</disk>
3,添加磁盘:
virsh attach-device --persistent vm-name disk.xml
然后登陆到vm系统中,就可以使用fdisk命令看到新的磁盘了。
删除这个磁盘也很简单,只需要将attach-device修改为detach-device即可:
virsh detach-device --persistent vm-name disk.xml
参考文档:
http://serverfault.com/a/457259
添加SCSI controller:
Let’s create a simple XML configuration file for our new SCSI controller:
1
2
|
# cat /var/tmp/mars-scsi-controller.xml
<
controller
type
=
'scsi'
model
=
'virtio-scsi'
/
>
|
And add it to our guest configuration:
1
|
# virsh attach-device --config mars /var/tmp/mars-scsi-controller.xml
|
利用SCSI controller使用host卷组
用卷组建立pool:
pool-create-as --name cloudvg --type logical --source-dev /dev/sda2 --target /dev/cloudvg
在池中建立逻辑卷vol:
vol-create-as --pool cloudvg --name lv_testxx --capacity 3G
将卷分配给虚拟机:
attach-disk --domain test4 --source /dev/cloudvg/lv_testxx --target sdc
利用SCSI controller使用file disk
I first used my new best friend fallocate
to fast-allocate the required image:
1
|
# fallocate -l 20480M /var/lib/libvirt/images/mars-dev-sda.img
|
Next, I created the appropriate XML configuration for the new disk device:
1
2
3
4
5
6
|
# cat /var/tmp/mars-dev-sda.xml
<disktype='file'device='disk'>
<drivername='qemu'type='raw'cache='none'/>
<sourcefile='/var/lib/libvirt/images/mars-dev-sda.img'/>
<targetdev='sda'/>
</disk>
|
Trying to attach this device via virsh
yielded the following unpleasantness:
# virsh attach-device --config mars /var/tmp/mars-dev-sda.xml
Deviceattachedsuccessfully
|
And on the guest, fdisk
proves it’s there:
1
2
3
4
5
6
7
8
|
# fdisk -l /dev/sda
Disk/dev/sda:21.5GB,21474836480bytes
64heads,32sectors/track,20480cylinders
Units=cylindersof2048*512=1048576bytes
Sectorsize(logical/physical):512bytes/512bytes
I/Osize(minimum/optimal):512bytes/512bytes
Diskidentifier:0x00000000
|
在 libvirt 上使用 LVM 存储设备
http://www.ibm.com/developerworks/cn/linux/l-cn-libvirt-lvm/index.html
引言
libvirt 是一组可与 Linux 上多种虚拟机交互的管理工具集。它支持的虚拟机有 KVM/QEMU、Xen、LXC、OpenVZ、virtual Box、vmware ESX/GSX、Hyper-V 等。为了使虚拟机获得更强大的后端存储能力,libvirt 提供了对各种存储介质的支持,包括本地文件系统,网络文件系统,iSCSI,LVM 等多种后端存储系统。LVM(Linux 卷管理)系统是如今 Linux 服务器广泛使用的存储设备。本文阐述的方法适用于 KVM/QEMU 虚拟机,主要涉及在 libvirt 中使用 LVM 存储设备的方法,使用基于 libvirt 的命令行虚拟机管理工具 virsh。
libvirt 中的存储管理独立于虚拟机管理。也就是存储池和存储卷的操作独立于虚拟机的操作存在,因此进行存储管理时,不需要有虚拟机的存在,可以当虚拟机需要存储资源时再进行分配,非常灵活。
libvirt 支持后端存储的类型
为了将不同的后端存储设备以统一的接口供虚拟机使用,libvirt 将存储管理分为两个方面:存储卷 (volume) 和存储池 (pool)。
存储卷是一种可以分配给虚拟机使用的存储设备。在虚拟机中与一个挂载点对应,而物理上可以是一个虚拟机磁盘文件或一个真实的磁盘分区。
存储池是一种可以从中生成存储卷的存储资源,后端可以支持以下存储介质:
- 目录池:以主机的一个目录作为存储池,这个目录中包含文件的类型可以为各种虚拟机磁盘文件、镜像文件等。
- 本地文件系统池:使用主机已经格式化好的块设备作为存储池,支持的文件系统类型包括 ext2,ext3,vfat 等。
- 网络文件系统池:使用远端网络文件系统服务器的导出目录作为存储池。默认为 NFS 网络文件系统。
- 逻辑卷池:使用已经创建好的 LVM 卷组,或者提供一系列生成卷组的源设备,libvirt 会在其上创建卷组,生成存储池。
- 磁盘卷池:使用磁盘作为存储池。
- iSCSI 卷池:使用 iSCSI 设备作为存储池。
- SCSI 卷池:使用 SCSI 设备作为存储池。
- 多路设备池:使用多路设备作为存储池。
Libvirt 中存储对象的状态转换
Libvirt 中的三类存储对象:存储池、存储卷、设备的状态转换关系如图 1 所示。
图 1.libvirt 中存储对象状态转换图
存储卷从存储池中划分出来,存储卷分配给虚拟机成为可用的存储设备。存储池在 libvirt 中分配的 id 标志着它成为 libvirt 可管理的对象,生成卷组 vg(volume group) 就有了可划分存储卷的存储池,状态为活跃 (active) 状态才可以执行划分存储卷的操作。
libvirt 使用逻辑卷池的准备
重新配置和编译
由于 libvirt 默认编译不支持 LVM,因此需要重新编译 libvirt 方可使用。使用 --with-storage-lvm 选项重新配置 libvirt 源码并重新编译 libvirt:
清单 1. 重新编译 libvirt
$./autogen.sh --with-storage-lvm – system $make
准备生成卷组的物理磁盘
在 host 中使用 fdisk 工具将物理卷格式化为 Linux LVM 格式(ID 为 8e)。生成的物理卷应为以下格式:
清单 2. 物理卷格式
$sudo fdisk -l /dev/sdc1 1 478 963616+ 8e Linux LVM /dev/sdc2 479 957 965664 8e Linux LVM
准备生成存储池的 xml 文件
将 xml 文件放在主机目录 /etc/libvirt/storage 下。以下给出 xml 文件的例子:
清单 3. 生成存储池的 xml 文件
<pool type="logical"> <name>lvm_pool</name> <source> <device path="/dev/sdc1"/> <device path="/dev/sdc2"/> </source> <target> <path>/lvm_pool</path> </target> </pool>
pool 的类型为 logical 表示使用的存储池类型为 LVM,源路径为在 host 中物理卷所在的路径,目的路径为 host 机中生成存储池的目标映射路径,后续生成的逻辑卷将在 host 的该目录下。
建立 libvirt 存储池
首次建立存储池
先由之前的 xml 文件定义一个存储池,若 libvirtd 启动之前 xml 文件已在 /etc/libvirt/storage 目录下,则 libvirtd 启动之后会自动定义存储池,可省去此步。
清单 4. 定义存储池
$virsh pool-define /etc/libvirt/storage/lvm_pool.xml
完成后就会在 libvirt 中定义一个不活跃的存储池,但这个池对应的卷组还未被初始化。可以看到生成的池状态为不活跃的:
清单 5. 查看卷组的状态
$virsh pool-list – all 名称 状态 自动开始 ----------------------------------------- default 活动 yes directory_pool 活动 yes lvm_pool 不活跃 no
建立存储池将生成存储池对应的卷组。
清单 6. 建立存储池
$virsh pool-build lvm_pool
此步完成后, host 上就生成了一个名为 lvm_pool 的卷组。
清单 7. 查看 host 上生成的卷组
$sudo vgdisplay --- Volume group --- VG Name lvm_pool System ID Format lvm2
以下命令在需要使用存储池时让存储池处于活跃状态
清单 8. 开始存储池
$virsh pool-start lvm_pool
创建存储池
创建存储池的操作相当于 pool-define 操作和 pool-start 操作的组合,也就是说,创建操作适用于卷组已经生成但还没有在 libvirt 中被管理起来的情况。
清单 9. 创建存储池
$virsh pool-create /etc/libvirt/storage/lvm_pool.xml
清单 10. 完成创建后的状态
$virsh pool-list 名称 状态 自动开始 ----------------------------------------- default 活动 yes directory_pool 活动 yes lvm_pool 活动 no
从存储池中分配卷
存储池为活跃的且已经生成了对应的卷组时,便可从存储池中划分逻辑卷供后续使用。
清单 11. 创建卷
$virsh vol-create-as --pool lvm_pool --name vol3 --capacity 30M
其中 --pool 指定分配逻辑卷所属存储池(卷组),name 指定逻辑卷名称,capacity 指定分配的卷大小。
清单 12. 查看存储池中的卷组
virsh # vol-list pic_pool2 名称 路径 ----------------------------------------- vol1 /dev/lvm_pool/vol1 vol2 /dev/lvm_pool2/vol2 vol3 /dev/lvm_pool2/vol3
在虚拟机中使用卷
清单 13. 将卷分配给虚拟机
$virsh attach-disk – domain dom1 – -source /dev/pic_pool2/vol1 – -target sda
其中 domain 选项指定逻辑卷要附加的虚拟机,source 选项指定逻辑卷在主机的路径,target 指定在虚拟机中的设备名。
这一步完成之后,重启虚拟机就可以在虚拟机中看到 /dev/sda 设备。在虚拟机中这个 /dev/sda 是一个裸设备,只需要进一步分区格式化就可以挂载使用了。
清单 14. 查看卷分配是否成功
$virsh domblklist dom1 Target Source ------------------------------------------------ vda /var/lib/libvirt/images/redhat2.img hdc - sda /dev/pic_pool2/vol3
清单 15. 将卷从虚拟机上分离
virsh # detach-disk – -domain dom1 --target sda
这时在虚拟机上就看不到 /dev/sda 设备了,逻辑卷已从虚拟机中成功分离。
删除存储池中的卷
卷被删除之后,卷所对应的存储空间即被归还到存储池内。
清单 16. 删除存储池中的卷
virsh # vol-delete vol3 --pool pic_pool2 卷 vol3 被删除
存储池的停用、删除和取消定义
停用存储池
存储池停止使用之后,它上面的所有存储卷的状态都变得不可用,即使用它的虚拟机都看不见这个设备。也不能从这个存储池中创建新卷。
清单 17. 停用存储池
virsh # pool-destroy pic_pool2 销毁池 pic_pool2
删除存储池
彻底删除一个存储池后,libvirt 就不再管理这个存储池所对应的所有资源,存储池在 host 机中对应的卷组也被删除。
清单 18. 删除存储池
virsh # pool-delete pic_pool2 池 pic_pool2 被删除
取消存储池定义
即使删除了存储池,它仍然在 libvirt 存储驱动中占有一定的资源,可以看到这个池。
清单 19. 删除存储池后的状态
$virsh pool-list – all 名称 状态 自动开始 ----------------------------------------- default 活动 yes directory_pool 活动 yes lvm_pool 不活跃 no
使用 pool-undefine 取消存储池的定义后,存储池所占用的资源完全被释放,存储驱动器中查看不到该存储池的存在了。
清单 20. 取消存储池定义
$virsh pool-undefine lvm_pool
更多推荐
所有评论(0)