摘要:本文记录如何在RHEL8上实现无数据损地缩小/home分区并扩大/根分区的操作步骤。
背景:我把RHEL主要部署为server使用,在安装时没有细想,把/(根分区)选的很小,硬盘主要都分配给了自己的hom分区。结果使用中发现由于RHEL8 对/home路径有很多访问限制,只好把web和媒体内容都放在了/(根路径)下面的其他非/home路径来避开访问限制,就出现了根分区马上用完,而自己的/home分区很少用到的尴尬,所以又搜索网络并进行了不少操作才实现了缩小home分区,扩大根分区的目的。整理记录如下。
我的所有操作都是基于这个网页(How to shrink /home and add more space on CentOS7),加上了我自己的理解。虽然原答是针对Centos7, 仍然适用于RHEL8,只是要注意换一些名字。
现总结记录如下, 以下命令主要由root用户执行。
1. 准备工作
重要:进行此项操作前一定要记住备份数据,以防数据丢失!!!
上文里的解决方法是针对xfs系统,虽然RHEL8默认使用的是xfs系统,为安全起见,需要再次确认。使用如下命令可以看到确实是xfs系统,而且两个分区的名字分别都列在这里了,后续操作会使用到这些名字。
$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/rhel-root xfs -G -G -G 12% /
/dev/mapper/rhel-home xfs -G -M -G 2% /home
继续执行如下命令,查看一下当前LVM逻辑卷管理系统的一些信息:可以看到卷组名是rhel,里面包含两个逻辑卷home和root
[root@localhost home]# lvs -v
LV VG #Seg Attr LSize Maj Min KMaj KMin Pool Origin Data% Meta% Move Cpy%Sync Log Convert LV UUID LProfile
home rhel 1 -wi-ao---- ...g -1 -1 25 2 QEoLib
root rhel 1 -wi-ao---- ...g -1 -1 2 0 UFXYkG
[root@localhost home]# vgs -v
VG Attr Ext #PV #LV #SN VSize VFree VG UUID VProfile
rhel wz--n- 4.00m 1 3 0 ...g 0 Untc
[root@localhost home]# pvs -v
PV VG Fmt Attr PSize PFree DevSize PV UUID
/dev/sda2 rhel lvm2 a-- ...g 0 ...g 7tP
2. 确认完毕,开始磁盘分区调整操作
RHEL8 不支持缩小逻辑分区,只支持扩大逻辑分区,(这什么道理?担心数据丢失?),所以我们要进行的操作就是:
备份home分区,
删除home分区,
删除home逻辑卷,
创建一个小尺寸的新home逻辑卷,格式化分区并挂载新分区,
将root分区扩大,
恢复home分区的数据和权限
# 1. 备份 /home 路径到 /root下,因为稍后会删除整个/home 所在分区和逻辑卷
tar -czvf /root/home.tgz -C /home . # -C是跳转到目录
# 测试该备份文件是否完整
tar -tvf /root/home.tgz # 显示一堆文件信息供查看对比
# 2. 卸载home分区
umount /dev/mapper/centos-home
# 此时我遇到了umount: /home: target is busy. 参照原文,执行如下命令:
umount -l /dev/mapper/rhel-home
# 3. 删除home逻辑卷
lvremove /dev/mapper/rhel-home
# 此时我遇到了 Logical volume rhel/home contains a filesystem in use.这个错误,原文里提到的如下命令并不起作用:
#[root@localhost ~]# fuser -kuc /dev/vg_data/backup
#Specified filename /dev/vg_data/backup does not exist.
#我分析应该是因为我目前使用SSH远程登陆导致busy的缘故,所以退出SSH直接在物理机上尝试再次重复命令:
lvremove /dev/mapper/rhel-home
# 成功
# 4. 创建新逻辑卷,指定一个小的数值,格式化,并挂载该分区
lvcreate -L 40GB -n home rhel # 指定40G
mkfs.xfs /dev/rhel/home
mount /dev/mapper/rhel-home
# 5. 将上述操作后多余的自由空间扩充到root逻辑卷内
lvextend -r -l +100%FREE /dev/mapper/rhel-root
# 操作成功会显示空间变化信息
# 6. 恢复/home 内容
tar -xzvf /root/home.tgz -C /home
# 恢复/home内文件权限(SELinux相关)
restorecon -R -v /home
# 会提示一大堆Relabeling, 对所有文件和文件夹都进行relabeling操作
# 完成
原文里还提到了最后一点:
check /etc/fstab for any mapping of /home volume. IF it is using UUID you should update the UUID portion. (Since we created a new volume, UUID has changed)
检查/etc/fstab 文件里/home卷的挂载方式,如果是指定了UUID的方式加载,那么就要注意修改这个UUID,因为我们删掉了旧的home逻辑卷,创建了新的home逻辑卷,UUID发生了变化,如果不更新,启动时会因为加载错误的UUID而失败。
我看了下我的,使用的是卷标方式,所以无需更新这里:
sudo cat /etc/fstab
...
/dev/mapper/rhel-home /home xfs defaults
...