Cheug's Blog

当前位置:网站首页 / Linux / 正文

Linux LVM 实战:系统盘扩容与 /var /home /opt 目录独立迁移指南

2026-01-28 / Linux / 9 次围观 / 0 次吐槽 /

1. 背景描述

在生产环境中,随着业务运行,系统盘(根目录 /)往往会因为日志、应用数据增长而空间告急。最佳实践是将变动频繁的目录(如 /var/opt/home)从根目录剥离,挂载到独立的 LVM 逻辑卷上。

本次实战目标:

  • 操作系统:EulerOS (基于 CentOS)

  • Swap: 扩容至 64G

  • Root (/): 扩容至 100G

  • New /home: 分配 200G

  • New /var: 分配 50G

  • New /opt: 分配 20G

⚠️ 风险警告

  1. 数据无价:涉及磁盘分区和文件系统操作,请务必在操作前对重要数据进行快照或备份。

  2. 谨慎操作 /var/var 目录包含系统运行时的关键文件,迁移过程中需尽量停止业务服务。


2. 准备阶段:识别磁盘与创建分区

首先查看当前磁盘挂载情况:

lsblk
df -Th
假设新加的空间在 /dev/sda 上(例如云硬盘扩容后),我们需要先创建新分区纳管这部分空间。

假设新加的空间在 /dev/sda 上(例如云硬盘扩容后),我们需要先创建新分区纳管这部分空间。

# 1. 创建新分区
fdisk /dev/sda
# 交互步骤:
# n (新建) -> p (主分区) -> 回车 (默认号) -> 回车 (默认起始) -> 回车 (默认结束)
# t (修改类型) -> 8e (LVM)
# w (保存退出)

# 2. 刷新分区表(如果提示重启,可先尝试此命令)
partprobe

3. LVM 扩容基础:物理卷与卷组

将新分区加入现有的 LVM 卷组(VG)。

# 1. 创建物理卷 (PV)
# 假设新分区为 /dev/sda5
pvcreate /dev/sda5

# 2. 查看当前卷组名称
vgs
# 假设卷组名为 bigcloud-vg

# 3. 扩容卷组
vgextend bigcloud-vg /dev/sda5

4. 调整现有逻辑卷 (Root & Swap)

4.1 扩容 Swap (至 64G)

Swap 无法在线扩容,必须先关闭。

# 关闭 Swap
swapoff -a

# 扩展逻辑卷 (L 表示指定具体大小)
lvextend -L 64G /dev/bigcloud-vg/swap

# 重新格式化 (扩容后必须重做 mkswap)
mkswap /dev/bigcloud-vg/swap

# 重新挂载
swapon -a

4.2 扩容 Root (至 100G)

根分区支持在线扩容,关键在于扩展后刷新文件系统

# 1. 扩展逻辑卷
lvextend -L 100G /dev/bigcloud-vg/root

# 2. 刷新文件系统 (重点!)
# 先确认文件系统类型:
df -T /

# 如果是 XFS (CentOS 7+, EulerOS):
xfs_growfs /

# 如果是 EXT4:
resize2fs /dev/bigcloud-vg/root

5. 新建分区与数据迁移 (关键步骤)

我们需要将 /opt, /home, /var 的数据迁移到新分区。以 /opt 为例,其他同理。

5.1 创建逻辑卷并格式化

# 创建 LV
lvcreate -L 20G -n opt bigcloud-vg
lvcreate -L 200G -n home bigcloud-vg
lvcreate -L 50G -n var bigcloud-vg

# 格式化 (推荐 XFS,如果是 ext4 请换成 mkfs.ext4)
mkfs.xfs /dev/bigcloud-vg/opt
mkfs.xfs /dev/bigcloud-vg/home
mkfs.xfs /dev/bigcloud-vg/var

5.2 数据同步 (以 /opt 为例)

核心思路:挂载新盘到临时目录 -> 同步数据 -> 挂载新盘到正式目录。

# 1. 临时挂载
mkdir /mnt/new_opt
mount /dev/bigcloud-vg/opt /mnt/new_opt

# 2. 同步数据 (使用 rsync 保持权限和属性)
rsync -av /opt/ /mnt/new_opt/

# 3. 卸载临时挂载
umount /mnt/new_opt
# 确认数据无误后,清空原目录
# rm -rf /opt/*


# 4. 正式挂载
mount /dev/bigcloud-vg/opt /opt

注意:对 /var 进行迁移时,建议进入单用户模式或停止 Docker、Database、Rsyslog 等服务,防止数据不一致。


6. 进阶技巧:如何清理被挂载点“隐藏”的旧数据

当你把新硬盘挂载到 /var 后,原根目录下 /var 的旧数据依然占用着磁盘空间,但直接用 rm 删除会报错或误删新数据。

解决方法:Bind Mount (绑定挂载)

# 1. 将根目录绑定挂载到一个临时点
mkdir /mnt/old_root
mount --bind / /mnt/old_root

# 2. 此时 /mnt/old_root/var 就是被隐藏的旧数据
# 确认无误后清理
rm -rf /mnt/old_root/var/*

# 3. 如果遇到 "device or resource busy" (如 rpc_pipefs)
# 直接忽略即可,那是内存虚拟文件系统,不占硬盘空间。

# 4. 卸载
umount /mnt/old_root
rmdir /mnt/old_root

7. 最后一步:配置自动挂载

修改 /etc/fstab 确保重启后挂载生效。

vim /etc/fstab

添加如下内容:

/dev/mapper/bigcloud--vg-opt   /opt   xfs  defaults  0 0
/dev/mapper/bigcloud--vg-home  /home  xfs  defaults  0 0
/dev/mapper/bigcloud--vg-var   /var   xfs  defaults  0 0

验证配置:

mount -a
# 如果没有报错,说明配置正确

8. 总结

通过 LVM 我们可以灵活地管理 Linux 磁盘空间。本次操作难点在于文件系统的刷新xfs_growfs)以及使用 Bind Mount 技术安全清理被遮盖的旧数据


Powered By Cheug's Blog

Copyright Cheug Rights Reserved.