219 lines
8.0 KiB
Markdown
219 lines
8.0 KiB
Markdown
# 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
|