热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

在libvirt上如何使用LVM逻辑卷存储设备

引言libvirt是一组可与Linux上多种虚拟机交互的管理工具集。它支持的虚拟机有KVM/QEMU、Xen、LXC、OpenVZ、virtualBox、vmwareESX/GSX、Hyper-V等。为了使虚拟机获得更强大的后端存储能力,libvirt提供了对各种存储介质的支持,包括本地文件系统,网络
引言

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 将存储管理分为两个方面:存储卷 (volume) 和存储池 (pool)。

存储卷是一种可以分配给虚拟机使用的存储设备。在虚拟机中与一个挂载点对应,而物理上可以是一个虚拟机磁盘文件或一个真实的磁盘分区。

存储池是一种可以从中生成存储卷的存储资源,后端可以支持以下存储介质:

目录池:以主机的一个目录作为存储池,这个目录中包含文件的类型可以为各种虚拟机磁盘文件、镜像文件等。

本地文件系统池:使用主机已经格式化好的块设备作为存储池,支持的文件系统类型包括 ext2,ext3,vfat 等。

网络文件系统池:使用远端网络文件系统服务器的导出目录作为存储池。默认为 NFS 网络文件系统。

逻辑卷池:使用已经创建好的 LVM 卷组,或者提供一系列生成卷组的源设备,libvirt 会在其上创建卷组,生成存储池。

磁盘卷池:使用磁盘作为存储池。

iSCSI 卷池:使用 iSCSI 设备作为存储池。

SCSI 卷池:使用 SCSI 设备作为存储池。

多路设备池:使用多路设备作为存储池。

Libvirt 中存储对象的状态转换

Libvirt 中的三类存储对象:存储池、存储卷、设备的状态转换关系如图 1 所示。

图 1.libvirt 中存储对象状态转换图 图 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 文件
 
 lvm_pool
 
 
 
 
 
 /lvm_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

推荐阅读
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
author-avatar
多米音乐_34324431
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有