Files
LinuxDiskAutoExpansion/README.md
2026-09-06 13:17:57 +08:00

8.0 KiB
Raw Blame History

Linux 根目录自动扩容脚本

一键自动将 Linux 服务器根目录 (/) 扩容至磁盘最大可用空间,全程无需人工干预。

功能特性

  • 自动识别磁盘架构 — 智能检测 LVM / 非 LVM 分区方案,自动选择对应扩容策略
  • 广泛系统兼容 — 适配 Debian、Ubuntu、CentOS、RHEL、Fedora、AlmaLinux、Rocky Linux、openSUSE 等主流发行版
  • 多文件系统支持 — 支持 ext2/ext3/ext4、XFS、btrfs 文件系统的在线扩容
  • 自动安装依赖 — 自动检测并安装 growpartxfsprogs 等必要工具
  • 模拟运行模式 — 支持 --dry-run 参数,只检测不执行,安全预览扩容计划
  • 完整日志记录 — 全程操作日志写入 /var/log/disk_auto_expand.log,便于审计追溯
  • 无人值守 — 全自动执行,适用于云服务器初始化、批量运维等场景

系统要求

项目 要求
操作系统 LinuxDebian / Ubuntu / CentOS / RHEL / Fedora / AlmaLinux / Rocky / openSUSE 等)
权限 root需使用 sudo 运行)
文件系统 ext2 / ext3 / ext4 / XFS / btrfs
磁盘架构 标准分区 或 LVM自动识别
前提条件 磁盘上存在未分配的可用空间

快速开始

下载并运行

# 下载脚本到服务器
git clone https://git.opensource-studio.info/database-mysql/LinuxDiskAutoExpansion.git
cd LinuxDiskAutoExpansion

# 模拟运行(推荐先执行,确认扩容计划无误)
sudo bash src/main.sh --dry-run

# 确认无误后,正式执行扩容
sudo bash src/main.sh

一键执行(适用于已上传脚本的场景)

sudo bash main.sh

参数说明

参数 说明
--dry-run 模拟运行模式,仅检测磁盘环境并输出扩容计划,不实际执行任何修改操作
-h / --help 显示帮助信息

工作原理

执行流程

权限检查 → 安装依赖 → 获取根分区信息 → 检测 LVM → 打印磁盘状态 → 检查可用空间 → 执行扩容 → 验证结果

非 LVM 模式(标准分区)

适用场景:根目录直接在磁盘分区上(如 /dev/sda1/dev/vda1)。

磁盘: /dev/sda  50GB
┌────────────────────┬─────────────────────────┐
│  /dev/sda1  20GB   │     未分配 30GB          │
│  (根目录 /)        │                         │
└────────────────────┴─────────────────────────┘
                          ↓ 扩容后
┌─────────────────────────────────────────────┐
│           /dev/sda1  50GB (根目录 /)         │
└─────────────────────────────────────────────┘

扩容步骤:

  1. growpart — 扩展分区表,使分区占满整个磁盘
  2. resize2fs / xfs_growfs / btrfs filesystem resize — 扩展文件系统

LVM 模式

适用场景:根目录位于 LVM 逻辑卷上(如 /dev/mapper/ubuntu--vg-ubuntu--lv)。

磁盘: /dev/sda  50GB
┌─────────────────────────────────────────────┐
│  /dev/sda3  30GB (PV)                       │
│  ┌──────────────────────┬──────────────────┐ │
│  │  LV root  20GB       │  VG Free  10GB   │ │
│  │  (根目录 /)          │  (未分配)         │ │
│  └──────────────────────┴──────────────────┘ │
└─────────────────────────────────────────────┘
                          ↓ 扩容后
┌─────────────────────────────────────────────┐
│  /dev/sda3  50GB (PV → 扩展后)              │
│  ┌─────────────────────────────────────────┐ │
│  │        LV root  50GB (根目录 /)          │ │
│  └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────┘

扩容步骤:

  1. growpart — 扩展 PV 所在分区(如分区未占满磁盘)
  2. pvresize — 将物理卷扩展至分区最大
  3. lvextend -l +100%FREE — 将 VG 全部剩余空间分配给根 LV
  4. resize2fs / xfs_growfs / btrfs filesystem resize — 扩展文件系统

适配场景示例

示例 1云服务器标准分区

云服务器 /dev/vda 共 100GB根分区 /dev/vda1 仅分配 20GB。

$ df -hT /
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/vda1      ext4   20G  3.2G   16G  18% /

$ sudo bash src/main.sh

# 扩容后
$ df -hT /
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/vda1      ext4   99G  3.2G   92G   4% /

示例 2LVM 架构Ubuntu 默认安装)

Ubuntu 默认使用 LVM/dev/sda 共 50GB根逻辑卷仅 20GB。

$ df -hT /
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4   20G  2.8G   16G  16% /

$ sudo bash src/main.sh

# 扩容后
$ df -hT /
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4   49G  2.8G   44G   6% /

示例 3CentOS LVM + XFS

CentOS 7/8 默认使用 XFS 文件系统 + LVM。

$ df -hT /
Filesystem               Type  Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  xfs    20G  1.9G   19G  10% /

$ sudo bash src/main.sh

# 扩容后
$ df -hT /
Filesystem               Type  Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  xfs    49G  1.9G   48G   4% /

日志

所有操作日志记录在 /var/log/disk_auto_expand.log,包括:

  • 磁盘环境检测结果
  • LVM 信息(如适用)
  • 扩容前后磁盘状态对比
  • 每一步操作的命令输出
# 查看扩容日志
cat /var/log/disk_auto_expand.log

常见问题

Q: 提示"磁盘没有足够的未分配空间"

脚本检测到磁盘分区已占满,没有剩余空间。需要先通过云平台或虚拟化面板扩大磁盘容量(如从 50GB 扩容到 100GB然后再运行此脚本。

Q: 提示"卷组没有足够的可用空间"

LVM 场景下VG 的可用空间不足。脚本会先尝试扩展 PV 占满磁盘。如果 PV 已占满磁盘但 VG 仍然没有空间,说明 VG 中空间已被其他 LV 占用。

Q: 是否支持在线扩容?

支持。所有操作均在系统运行时完成,无需重启或卸载文件系统。

Q: 是否安全?会不会丢数据?

脚本使用的 growpartlvextendresize2fsxfs_growfs 均为 Linux 官方标准工具,支持在线无损扩容。建议首次使用时先通过 --dry-run 模式确认扩容计划。

Q: 支持 NVMe 磁盘吗?

支持。脚本通过 lsblk 自动识别设备名,兼容 /dev/sda/dev/vda/dev/nvme0n1 等各类磁盘命名格式。

项目结构

LinuxDiskAutoExpansion/
├── src/
│   └── main.sh              # 主脚本
├── debug/
│   └── logs/                # 调试日志
│       ├── ubuntu.log
│       └── centos.log
├── README.md                 # 项目说明文档
├── USAGE.md                  # 详细使用文档
└── LinuxDiskAutoExpansion.iml

许可证

Apache 2.0 License