LVM是什么

LVM全称是逻辑盘卷管理 (Logical Volume Manager),是Linux系统对磁盘分区管理一种机制。相对于一般的磁盘分区而言LVM是建立在硬盘和分区物理层 之上的一个逻辑层,通过逻辑分区来提高磁盘的利用率。

简单来说,就是将多个物理卷(PV)组成一个逻辑卷组(VG),然后在它上面划分一些逻辑卷(LV),用来安装系统文件。下面这个图十分清晰的描述了它们的对应关系。

LVM的优势

普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,就没有好的解决方案了。但是如果是用的LVM逻辑卷,这时我们只需要添加新的硬盘,然后把新的硬盘分区加入逻辑卷组,就可以动态扩容逻辑卷了,都不需要停机,十分方便。

添加硬盘和分区

  • 查看硬盘详情,可以看到/dev/sdb就是新加的一块100G硬盘,原来的系统盘只有30G

    [root@zabbix-server ~]# fdisk -l
    
    磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):4096 字节 / 1048576 字节
    
    
    磁盘 /dev/sda:32.2 GB, 32212254720 字节,62914560 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):4096 字节 / 1048576 字节
    磁盘标签类型:dos
    磁盘标识符:0x000af8d1
    
       设备 Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048     2099199     1048576   83  Linux
    /dev/sda2         2099200    62914559    30407680   8e  Linux LVM
    
    磁盘 /dev/mapper/cl-root:27.9 GB, 27913093120 字节,54517760 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):4096 字节 / 1048576 字节
    
    
    磁盘 /dev/mapper/cl-swap:3221 MB, 3221225472 字节,6291456 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):4096 字节 / 1048576 字节
    
  • 给新加硬盘分区,fdisk /dev/sdb

    [root@zabbix-server ~]# fdisk /dev/sdb
    欢迎使用 fdisk (util-linux 2.23.2)。
    
    更改将停留在内存中,直到您决定将更改写入磁盘。
    使用写入命令前请三思。
    
    Device does not contain a recognized partition table
    使用磁盘标识符 0xc1e124db 创建新的 DOS 磁盘标签。
    
    命令(输入 m 获取帮助):n
    Partition type:
       p   primary (0 primary, 0 extended, 4 free)
       e   extended
    Select (default p): p
    分区号 (1-4,默认 1):
    起始 扇区 (2048-209715199,默认为 2048):
    将使用默认值 2048
    Last 扇区, +扇区 or +size{K,M,G} (2048-209715199,默认为 209715199):
    将使用默认值 209715199
    分区 1 已设置为 Linux 类型,大小设为 100 GiB
    
  • 将新建分区类型更改为8e,LVM

    命令(输入 m 获取帮助):t
    已选择分区 1
    Hex 代码(输入 L 列出所有代码):8e
    已将分区“Linux”的类型更改为“Linux LVM”
    
  • 查看分区结果并同步磁盘

    命令(输入 m 获取帮助):p
    
    磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):4096 字节 / 1048576 字节
    磁盘标签类型:dos
    磁盘标识符:0xc1e124db
    
       设备 Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048   209715199   104856576   8e  Linux LVM
    
    命令(输入 m 获取帮助):w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    正在同步磁盘。
    

扩容根目录

  • 查看本机原有PV,pvdisplay

    [root@zabbix-server ~]# pvdisplay
      --- Physical volume ---
      PV Name               /dev/sda2
      VG Name               cl
      PV Size               29.00 GiB / not usable 3.00 MiB
      Allocatable           yes (but full)
      PE Size               4.00 MiB
      Total PE              7423
      Free PE               0
      Allocated PE          7423
      PV UUID               5N60ck-vfDK-akra-iySw-gEqw-Pewj-ZCqXCl
      ```
    
  • 将新的硬盘分区创建为物理卷,pvcreate /dev/sdb1

    [root@zabbix-server ~]# pvcreate /dev/sdb1
      Physical volume "/dev/sdb1" successfully created.
    [root@zabbix-server ~]# pvdisplay
      --- Physical volume ---
      PV Name               /dev/sda2
      VG Name               cl
      PV Size               29.00 GiB / not usable 3.00 MiB
      Allocatable           yes (but full)
      PE Size               4.00 MiB
      Total PE              7423
      Free PE               0
      Allocated PE          7423
      PV UUID               5N60ck-vfDK-akra-iySw-gEqw-Pewj-ZCqXCl
    
      "/dev/sdb1" is a new physical volume of "100.00 GiB"
      --- NEW Physical volume ---
      PV Name               /dev/sdb1
      VG Name
      PV Size               100.00 GiB
      Allocatable           NO
      PE Size               0
      Total PE              0
      Free PE               0
      Allocated PE          0
      PV UUID               gCcdZP-Bbfp-oe8F-gK0I-NOYH-Frf8-UdjT1r
    
  • 将新建物理卷加入逻辑卷组,vgextend cl /dev/sdb1

    [root@zabbix-server ~]# vgextend cl /dev/sdb1
      Volume group "cl" successfully extended
    [root@zabbix-server ~]# vgdisplay
      --- Volume group ---
      VG Name               cl
      System ID
      Format                lvm2
      Metadata Areas        2
      Metadata Sequence No  4
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                2
      Open LV               2
      Max PV                0
      Cur PV                2
      Act PV                2
      VG Size               128.99 GiB
      PE Size               4.00 MiB
      Total PE              33022
      Alloc PE / Size       7423 / 29.00 GiB
      Free  PE / Size       25599 / 100.00 GiB
      VG UUID               vZqaWW-Lf6Y-7cXH-dLhM-QB0g-KFE3-tEjAxP
    
  • 查看本机所有逻辑卷,lvdisplay

    [root@zabbix-server ~]# lvdisplay
      --- Logical volume ---
      LV Path                /dev/cl/swap
      LV Name                swap
      VG Name                cl
      LV UUID                mIFpVU-1VnR-6I1v-6pMj-BQVO-z7Fv-kK6ubj
      LV Write Access        read/write
      LV Creation host, time localhost.localdomain, 2017-06-06 11:59:26 +0800
      LV Status              available
      # open                 2
      LV Size                3.00 GiB
      Current LE             768
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     8192
      Block device           253:1
    
      --- Logical volume ---
      LV Path                /dev/cl/root
      LV Name                root
      VG Name                cl
      LV UUID                YI9Mw7-NGwC-am50-IR0K-C8Pp-oozQ-EwhIiS
      LV Write Access        read/write
      LV Creation host, time localhost.localdomain, 2017-06-06 11:59:27 +0800
      LV Status              available
      # open                 1
      LV Size                26.00 GiB
      Current LE             6655
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     8192
      Block device           253:0
      ```
    
  • 给根目录逻辑卷增加99G,注意增加100G会失败,lvextend -L +99G /dev/cl/root

    [root@zabbix-server ~]# lvextend -L +99G /dev/cl/root
      Size of logical volume cl/root changed from 26.00 GiB (6655 extents) to 125.00 GiB (32000 extents).
      Logical volume cl/root successfully resized.
    [root@zabbix-server ~]# lvdisplay
      --- Logical volume ---
      LV Path                /dev/cl/swap
      LV Name                swap
      VG Name                cl
      LV UUID                mIFpVU-1VnR-6I1v-6pMj-BQVO-z7Fv-kK6ubj
      LV Write Access        read/write
      LV Creation host, time localhost.localdomain, 2017-06-06 11:59:26 +0800
      LV Status              available
      # open                 2
      LV Size                3.00 GiB
      Current LE             768
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     8192
      Block device           253:1
    
      --- Logical volume ---
      LV Path                /dev/cl/root
      LV Name                root
      VG Name                cl
      LV UUID                YI9Mw7-NGwC-am50-IR0K-C8Pp-oozQ-EwhIiS
      LV Write Access        read/write
      LV Creation host, time localhost.localdomain, 2017-06-06 11:59:27 +0800
      LV Status              available
      # open                 1
      LV Size                125.00 GiB
      Current LE             32000
      Segments               2
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     8192
      Block device           253:0
    
  • 扩展文件系统的尺寸,其实就是应用修改,xfs_growfs /dev/cl/root

    [root@zabbix-server ~]# xfs_growfs /dev/cl/root
    meta-data=/dev/mapper/cl-root    isize=512    agcount=16, agsize=425920 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0 spinodes=0
    data     =                       bsize=4096   blocks=6814720, imaxpct=25
             =                       sunit=1      swidth=256 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal               bsize=4096   blocks=3327, version=2
             =                       sectsz=512   sunit=1 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    data blocks changed from 6814720 to 32768000
    [root@zabbix-server ~]# df -h
    文件系统             容量  已用  可用 已用% 挂载点
    /dev/mapper/cl-root  125G  4.6G  121G    4% /
    devtmpfs             3.9G     0  3.9G    0% /dev
    tmpfs                3.9G     0  3.9G    0% /dev/shm
    tmpfs                3.9G  8.4M  3.9G    1% /run
    tmpfs                3.9G     0  3.9G    0% /sys/fs/cgroup
    /dev/sda1           1022M  183M  840M   18% /boot
    tmpfs                783M     0  783M    0% /run/user/0
    

    可以看到**/目录已经从25G扩容到了125G**了,实现了动态扩容。