first commit

This commit is contained in:
2026-09-06 12:58:04 +08:00
commit 2477352d6f
10 changed files with 1393 additions and 0 deletions

213
README.md Normal file
View File

@@ -0,0 +1,213 @@
# 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://github.com/your-repo/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 # 主脚本
├── README.md # 项目说明文档
└── LinuxDiskAutoExpansion.iml
```
## 许可证
Apache 2.0 License