RHEL 8 无损调整磁盘/home和/分区大小

摘要:本文记录如何在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        
...