1b8f8e1e59b02c5cfc6b2aea93926eb0770de056
Linux 根目录自动扩容脚本
一键自动将 Linux 服务器根目录 (/) 扩容至磁盘最大可用空间,全程无需人工干预。
功能特性
- 自动识别磁盘架构 — 智能检测 LVM / 非 LVM 分区方案,自动选择对应扩容策略
- 广泛系统兼容 — 适配 Debian、Ubuntu、CentOS、RHEL、Fedora、AlmaLinux、Rocky Linux、openSUSE 等主流发行版
- 多文件系统支持 — 支持 ext2/ext3/ext4、XFS、btrfs 文件系统的在线扩容
- 自动安装依赖 — 自动检测并安装
growpart、xfsprogs等必要工具 - 模拟运行模式 — 支持
--dry-run参数,只检测不执行,安全预览扩容计划 - 完整日志记录 — 全程操作日志写入
/var/log/disk_auto_expand.log,便于审计追溯 - 无人值守 — 全自动执行,适用于云服务器初始化、批量运维等场景
系统要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Linux(Debian / Ubuntu / CentOS / RHEL / Fedora / AlmaLinux / Rocky / openSUSE 等) |
| 权限 | root(需使用 sudo 运行) |
| 文件系统 | ext2 / ext3 / ext4 / XFS / btrfs |
| 磁盘架构 | 标准分区 或 LVM(自动识别) |
| 前提条件 | 磁盘上存在未分配的可用空间 |
快速开始
下载并运行
# 下载脚本到服务器
git clone https://github.com/your-repo/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 (根目录 /) │
└─────────────────────────────────────────────┘
扩容步骤:
growpart— 扩展分区表,使分区占满整个磁盘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 (根目录 /) │ │
│ └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────┘
扩容步骤:
growpart— 扩展 PV 所在分区(如分区未占满磁盘)pvresize— 将物理卷扩展至分区最大lvextend -l +100%FREE— 将 VG 全部剩余空间分配给根 LVresize2fs/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% /
示例 2:LVM 架构(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% /
示例 3:CentOS 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: 是否安全?会不会丢数据?
脚本使用的 growpart、lvextend、resize2fs、xfs_growfs 均为 Linux 官方标准工具,支持在线无损扩容。建议首次使用时先通过 --dry-run 模式确认扩容计划。
Q: 支持 NVMe 磁盘吗?
支持。脚本通过 lsblk 自动识别设备名,兼容 /dev/sda、/dev/vda、/dev/nvme0n1 等各类磁盘命名格式。
项目结构
LinuxDiskAutoExpansion/
├── src/
│ └── main.sh # 主脚本
├── README.md # 项目说明文档
└── LinuxDiskAutoExpansion.iml
许可证
Apache 2.0 License
Description
本脚本用于自动将 Linux 服务器根目录 (
/) 扩容至磁盘最大可用空间。脚本会自动识别服务器的磁盘架构(LVM 或标准分区),并根据实际架构选择对应的扩容策略,全程无需人工干预。
Languages
Shell
100%