Files
LinuxDiskAutoExpansion/README.md
2026-09-15 21:12:26 +08:00

219 lines
8.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`,便于审计追溯
- **无人值守** — 全自动执行,适用于云服务器初始化、批量运维等场景
## 系统要求
| 项目 | 要求 |
|------|------|
| 操作系统 | LinuxDebian / 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% /
```
### 示例 2LVM 架构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% /
```
### 示例 3CentOS 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