基于LVM扩展文件系统大小【转】


原理

传统的Linux会直接使用磁盘分区(Partition),而后在分区上创建文件系统,并挂载到一个指定目录(参考这篇文章)。而LVM(Logical Volume Manager) 技术基于底层的物理存储创建了一个抽象层,使得对存储设备的使用更加灵活。

Physical Volumes(简称PV)可对应分区的概念,多个PV可聚合成一个Volume Group(简称VG),一个VG又可包含多个Logical Volume(简称LV)。

图片来源于 RedHat 官方手册

假设如上图所示的3个PV的大小分别是60GiB, 40GiB, 20GiB,那么它们组合成的VG的大小就是120GiB,这个VG中的两个LV的大小则可以分别是70GiB和50GiB,或者80GiB和40GiB……

当需要扩充基于LVM的文件系统大小时,可增加一个物理磁盘(或使用现有磁盘中未分区的部分),进而增加一个PV,这时VG也会增大,此时对于上层的LV来说,就可直接扩展其大小。

借助"lsblk"命令,可一览这种层次关系。以笔者使用的CentOS7.7系统为例,16GiB的磁盘("/dev/sda")划分为了一个1GiB的boot分区("/dev/sda1")和一个15GiB的其他分区("/dev/sda2")。在这个15GiB的分区里,又包含13.4GiB的根文件系统LVM和1.6GiB的swap LVM。

这里,"centos"即是这个VG的名称(CentOS8里默认是"cl"),"tmeta"和"tdata"分别代表配置信息和裸数据。

LVM第一版出现在2.4内核,由Heinz Mauelshagen实现,而后在2.6内核中,演化成了基于device mapper机制实现的LVM2,所以在使用了LVM的系统中操作"df"命令时,会看到"/dev/mapper"的字样:

实战

当初从方便迁移的角度,笔者只给这台在VMware上创建的虚拟机分配了16GiB的磁盘空间,日常的使用当然是够的,但后来这台机器被用做面向多平台的代码编译,空间开始出现不足(只有13.4GiB可用),于是考虑扩容根文件系统。

需要注意的是,所有关于磁盘和文件系统的操作都存在data loss的可能,所以在进行接下来的操作之前,最好先给虚拟机打个快照。

在VMware上扩展存储空间是很方便的,动态地“编辑虚拟机设置”即可,现在把磁盘空间增大到32GiB。然后就是把新增的这部分磁盘空间加到"/dev/sda2"中,可以用这篇文章中介绍到的fdisk工具,而笔者更推荐使用可以直接扩展partition的"parted"工具。

为什么磁盘总大小是32GiB,这里却显示为34.4GB?因为前者是按1024算的,而后者是按1000算的(单位分别是"GiB"和"GB")。把"End"增加到20GB,即增加量为2.8GB(同样以1000计,如果以1024计则是2.6GiB)。

这时用"lsblk"已经可以看出"sda2"大小的变化了(比原来的15GiB多出了2.6GiB):

但是用"pvdisplay"看到的"sda2"对应的"PV Size"还是没有变化:

需要用"pvresize"命令将partition增加的容量“充值”到PV中:

PV的大小增加了,由于名为"centos"的VG包含了该PV,因此VG的大小也随之增加了2.6GiB。

不过这个VG包含3个LV,所以还需要选择将VG中扩出来的2.6GiB空间分给哪个LV,这里当然是给根文件系统所在的"/dev/centos/root"(可以使用"lvresize"或者"lvextend"命令):

可见,扩容的过程就是把从磁盘分来的空间一层一层往上传递,目前还差最后一步,就是扩展文件系统。对于ext家族的,使用"resize2fs"命令,如果是xfs文件系统,就用"xfs_growth"(其实在前面使用"lvresize"的时候再加一个"-r",也可以实现把文件系统一并扩展的效果)。

算一下,多出了(16-13.4)GiB,也就是2.6GiB。

彩蛋

命令行的配置方式看起来还是蛮繁琐的(其实精简下来也就3步啦),那试试用图形化的方式配置呢?说到图形化,自然还是首推前面文章安利过的cockpit,只需如图所示,点击两下就完成了。

不知道当你发现原来有如此轻松的方法时,还愿不愿意去慢慢梳理LVM的层次关系和内在逻辑,一步步地敲击命令实现,所以笔者把这种方法的介绍放在了最后。不过还是建议在使用的时候能够充分理解原理,吃透了才能更好的拿捏,再说也不是所有系统都安装了cockpit的嘛。

 

参考:

RedHat - Logical Volume Manager Administration

 

原创文章,转载请注明出处。