Linux系统LVM磁盘分区扩展

LVM是什么?

LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现,目前最新版本为:稳定版1.0.5,开发版 1.1.0-rc2,以及LVM2开发版。Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。随着Linux的逻辑卷管理功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方便地调整各个分区大小。

LVM的工作原理其实很简单,它就是通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取,而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。比如说我增加一个物理硬盘,这个时候上层的服务是感觉不到的,因为呈现给上层服务的是以逻辑卷的方式。

LVM最大的特点就是可以对磁盘进行动态管理。因为逻辑卷的大小是可以动态调整的,而且不会丢失现有的数据。如果我们新增加了硬盘,其也不会改变现有上层的逻辑卷。作为一个动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性。

关系图如下:(图片转自网络博客,博客地址:http://www.cnblogs.com/mchina/p/linux-centos-logical-volume-manager-lvm.html

Linux系统LVM磁盘分区扩展

基本的逻辑卷管理概念:

  • PV(Physical Volume)- 物理卷

    物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘,也可以是raid设备。

  • VG(Volumne Group)- 卷组

    卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组。

  • LV(Logical Volume)- 逻辑卷
    -
    逻辑卷建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个卷组。

下面以我在实际工作中遇到的两个问题为例:

问题一:

  • 环境:Cent OS 6.4 minimal,物理磁盘:1TB
  • LVM version: 2.02.100(2)-RHEL6
  • 问题描述:系统安装时由于采用系统默认的分区策略(lv_root即根目录/容量为50GB,lv_home即/home目录容量为剩余的九百多GB), 后期在使用过程中发现根目录/容量不够用,但/home目录存在较多剩余空间,仅占用不到10GB的空间。
  • 解决方法:由于磁盘分区采用了LVM,可动态管理磁盘分区,因此我的解决方法是缩减lv_home逻辑分区容量,缩减后的分区容量扩充至lv_root逻辑分区;

问题二:

  • 环境:Cent OS 6.4 minimal,VMware vSphere ESXi虚拟磁盘:20GB
  • LVM version: 2.02.100(2)-RHEL6
  • 问题描述:在VMware ESXi环境下,系统磁盘空间为20GB,后期使用过程中发现系统磁盘空间不够用(lv_root占用接近90%),需要扩充磁盘空间。
  • 解决方法:因在虚拟环境下添加硬盘比较方便,因此我的解决办法是首先给虚拟机添加一块容量为80GB的硬盘;然后将新添加的硬盘分区后扩充至lv_root逻辑分区;
    因本人在解决问题过程中并未留下详细截图,故将解决问题的步骤及自己写的脚本等分享出来,不足之处还请谅解;
    问题一解决步骤:
    因我这里好几台机器都存在相同的问题,故为了省事写了个脚本一劳永逸;

    #!/bin/sh

    #Program:

    # This program will adjust LVM partition, so please be cautions before you run it.

    #

    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:~/bin

    export PATH

    lv_root="/dev/vg_venus/lv_root"

    lv_home="/dev/vg_venus/lv_home"

    # 验证lv_home及lv_root是否存在

    test -e $lv_home && echo "lv_home exists" || echo "lv_home not found"

    test -e $lv_root && echo "lv_root exists" || echo "lv_root not found"

    # 首先缩减 lv_home

    # 卸载lv_root

    umount $lv_home

    echo "umount lv_home filesystem finished."

    # 检查磁盘

    e2fsck -f $lv_home

    sleep 20s

    echo "check lv_home filesystem finished."

    # 缩减文件系统

    resize2fs $lv_home 260G

    sleep 20s

    echo "resize lvm_home filesystem finished."

    # 缩减lv_home

    lvreduce $lv_home -L 260G

    sleep 30s

    echo "lvreduce for lv_home finished."

    # 挂载lv_home

    mount $lv_home /home

    echo "mount lv_home filesystem finished."

    # 扩充 lv_root

    lvextend -L +300G $lv_root

    sleep 10s

    echo "lvextend for lv_root finished."

    # 扩容文件系统

    resize2fs $lv_root

    sleep 600s

    # 验证文件系统

    df -hl

    echo "All tasks finished."`

执行完该脚本后,我遇到的问题解决了;

问题二解决步骤:

  1. 虚拟机设置->添加一块硬盘;

  2. fdisk对新加的硬盘进行分区(主分区及扩展分区最多为4个);

  3. 分区格式化(mkfs);

  4. 创建PV:pvcreate 相关命令:pvs pvdisplay;

  5. 扩展VG:vgextend 相关命令:vgs vgdisplay;

  6. 扩展LV:lvextend 相关命令:lvs lvdisplay;

  7. 扩充文件系统:resize2fs 检查磁盘命令:e2fsck;

  8. df -hl #验证扩容成功

具体参数可参考help帮助,不在这里一一列出,例如:lvm help

除此之外,还调整了lv_swap逻辑分区大小,即swap分区;

若涉及调整swap分区,调整步骤如下:

  1. 扩展lv_swap:lvextend

  2. swapoff #关闭swap分区

  3. mkswap #设置swap分区

  4. swapon #启动swap分区

  5. free -m #验证swap分区扩容成功

以上是自己再工作中遇到的实际问题,并最终通过LVM解决了,不足之处还请指出,谢谢!

转载于:https://www.cnblogs.com/jollyjogger/p/lvm_study.html