df -hT # 看 / 使用率
lsblk -f /dev/mapper/centos-home # 关键:FSTYPE 是啥?
ext4 → 直接看方案 A
xfs → 跳转方案 B
rsynC++ -aXS /home/ /var/backups/home-$(date +%F)/ | ||
umount /home | lsof /home 杀进程 | |
e2fsck -f /dev/mapper/centos-home resize2fs -p /dev/mapper/centos-home 2G lvreduce -L 2G /dev/mapper/centos-home | ||
-r 自动 resize2fs | ||
mount /home && rsync -aXS /var/backups/home-*/ /home/ |
XFS 不支持在线缩容,只能“重建法”:
rsync -aXS /home/ /var/backups/home-$(date +%F)/ | ||
umount /home lvremove -f /dev/mapper/centos-home | ||
lvcreate -L 2G -n home centos | ||
mkfs.xfs /dev/centos/home | ||
mount /dev/centos/home /home rsync -aXS /var/backups/home-*/ /home/ | ||
lvextend -r -l +100%FREE /dev/mapper/centos-root |
保存为 home2root.sh
,chmod +x
后直接跑:
#!/bin/bash
set-e
VG=centos
HOME_MAPPER=/dev/mapper/${VG}-home
ROOT_MAPPER=/dev/mapper/${VG}-root
BAK=/var/backups/home-$(date +%F)
# 0. 判断文件系统类型
FSTYPE=$(lsblk -no FSTYPE "$HOME_MAPPER")
[[ "$FSTYPE"=~ ^(ext4|xfs)$ ]] || { echo"未知文件系统:$FSTYPE"; exit1; }
# 1. 备份
mkdir-p /var/backups
rsync -aXS /home/ "$BAK"/
# 2. 卸载
umount /home || { lsof /home; exit1; }
# 3. 缩容逻辑
if [[ "$FSTYPE"=="ext4" ]]; then
e2fsck -f"$HOME_MAPPER"
resize2fs -p"$HOME_MAPPER" 2G
lvreduce -L 2G "$HOME_MAPPER"
else
lvremove -f"$HOME_MAPPER"
lvcreate -L 2G -n home "$VG"
mkfs.xfs "/dev/$VG/home"
mount "/dev/$VG/home" /home
fi
# 4. 恢复数据
rsync -aXS"$BAK"/ /home/
# 5. 把剩余空间给根
lvextend -r-l+100%FREE "$ROOT_MAPPER"
# 6. 验证
df -h | grep-E'Filesystem|/$|/home$'
报错 原因 一键救援 e2fsck: Bad magic number
把 XFS 当 ext4 转方案 B resize2fs: device busy
/home 没卸载干净 lsof /home && kill
xfs_growfs: not mounted
忘记 -r
xfs_growfs /
把本文甩进收藏夹,下次根目录爆红,先 lsblk -f
看文件系统,再对号入座。