# 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(自动识别) | | 前提条件 | 磁盘上存在未分配的可用空间 | ## 快速开始 ### 下载并运行 ```bash # 下载脚本到服务器 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 ``` ### 一键执行(适用于已上传脚本的场景) ```bash 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。 ```bash $ 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。 ```bash $ 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。 ```bash $ 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 信息(如适用) - 扩容前后磁盘状态对比 - 每一步操作的命令输出 ```bash # 查看扩容日志 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 # 主脚本 ├── debug/ │ └── logs/ # 调试日志 │ ├── ubuntu.log │ └── centos.log ├── README.md # 项目说明文档 ├── USAGE.md # 详细使用文档 └── LinuxDiskAutoExpansion.iml ``` ## 许可证 Apache 2.0 License