这一次历时接近一天的CentOS 8扩容翻车和修复事件,终于让我对之前一直觉得深奥而不愿接触的Linux LVM(Logical Volume Management
,逻辑卷管理)分区管理机制有了基本而全面的认识,算是又填上了Linux基本操作在存储管理方面的一个大坑。
LVM采用了一种三层的整体结构,自底向上依次是Physival Volume
物理卷、Volume Group
(物理)卷组、Logical Volume
逻辑卷。其中物理卷对应传统意义上,在诸如Windows上磁盘管理,或者Linux上GParted中为分区分配的物理空间;卷组和RAID 0十分相似,即在逻辑地址空间中将某些指定的物理卷“融合”起来,形成逻辑意义上的“磁盘”;逻辑卷则和物理卷相似,只不过其是在一个卷组内进行分区空间的指派,最后一个分区对应的就是一个逻辑卷,对逻辑卷进行分区格式化,初始化文件系统就可以使用(当然,前提是系统支持且识别这种LVM分区布局)。
用一个十分有意思的方法来解释就是,物理硬盘加上LVM,会形成一个“螺旋上升”的结构:
物理磁盘(硬盘)->
物理分区(物理卷)->
逻辑磁盘(卷组)->
逻辑分区(逻辑卷)
这决定了建立一个可用的LVM逻辑卷,需要依次进行物理卷、卷组和逻辑卷的创建三个步骤。
可以看到,即使加了LVM,仍然没有逃脱磁盘需要先分区后使用的本质。但是LVM的一个优势在于,上层系统所使用的是“逻辑卷”,而不是“物理卷”,也就是说,此时的上层系统不知道底层的物理数据分布的同时,还可以正常使用(当然,Linux内核是知道数据的物理分布的,毕竟LVM需要在此处实现)。这意味着,LVM可以实现跨磁盘的分区创建和管理;也可以实现分区本身在磁介质上的非连续存储。对于个人用户来说,可能算不上有意义的功能;但是对于企业用户来说,对于可能大到一块磁盘都装不下的单文件来说,这是一种解决方案。换个角度来说,LVM方案能做到的不仅仅是实现一种无RAID情况下超大文件存储的可能,还可以起到简化mount
操作的作用。将一组完成同一业务功能的磁盘建立为LVM逻辑卷,可以极大地简化分区挂载/卸在脚本的复杂度,并且增加指令的可读性。
在Linux的LVM实现中,划分了三个指令簇,分别对应LVM三个层次的操作,如下表所示。
功能 |
PV管理命令 |
VG管理命令 |
LV管理命令 |
s 摘要 |
pvs |
vgs |
lvs |
scan 扫描 |
pvscan |
vgscan |
lvscan |
create 创建 |
pvcreate |
vgcreate |
lvcreate |
display 显示 |
pvdisplay |
vgdisplay |
lvdisplay |
remove 移除 |
pvremove |
vgremove |
lvremove |
extend 扩展 |
- |
vgextend |
lvextend |
reduce 压缩 |
- |
vgreduce |
lvreduce |
在某些场景下(比如dracut
中),这些指令不会单独存在,需要添加lvm
前缀,将指令作为参数使用,如lvm pvscan
。
在对LVM有了初步的认识之后,进行这次修改的流程介绍:删除LVM卷组内的swap
分区,将多出来的空间分配给同一卷组内的系统根分区root
。
步骤依次如下:
-
删除cl
卷组中的swap
分区:由于swap
分区本身就属于缓存的性质,无需进行数据的保存。
lvremove /dev/cl/swap
- (建议先保存数据)扩容根分区:
有两种方式可以选择,区别在于手动或者自动对于文件系统的大小调整。在本示例中,删除swap
分区释放的空间为2GiB。
手动:
lvresize -L +2G /dev/cl/root
xfs_growfs /dev/cl/root
自动:
lvresize --resizefs -L +2G /dev/cl/root
需要注意的一点是,xfs只支持分区扩容(ext4支持分区压缩)。如果想要分区压缩的话,只能手动备份数据,重建分区再恢复数据。
这个操作平凡无奇,网上也能找到不少教程,重点是完成操作准备重启开机的时候,问题来了:
[ OK ] Reached target initrd root device.
一看到这个,就知道大事不妙,一定是磁盘配置出了问题。果不其然,等待数分钟后,dracut
开头的命令行带着日志文件出现在了我的屏幕上。
仔细阅读日志文件,发现其中提到了“swap
分区找不到”的相关消息,而swap
分区又是我手动操作进行的删除操作,看来是有哪里的配置残留没有清理干净。折腾了半天dracut
重建之后,发现无济于事,后来突然想起来可能与内核参数有关,遂修改/etc/sysconfig/grub
文件,将其中与swap
分区有关的参数全部删除,重新生成配置文件后,重启。
然后与预期一样的是,系统启动过程恢复了正常。其中有一点很奇怪的地方是,可能是由于我手动重建initramfs镜像的原因,并无法使用升级后的内核启动,而只能使用与安装盘版本一致的初始内核启动成功。于是出现了偷懒的新内核修复方法:
dnf reinstall kernel*-4.18.0-193.14.2.el8_2
后面的版本信息根据自己的需要进行更改,上方示例中的版本信息是文章撰写时的最新内核信息,可能随着时间推移发生改变。
参考:https://www.cnblogs.com/diantong/p/10554831.html