Files
2026-09-06 18:27:30 +08:00

495 lines
13 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 根目录自动扩容脚本
## 目录
- [1. 概述](#1-概述)
- [2. 环境准备](#2-环境准备)
- [3. 安装与部署](#3-安装与部署)
- [4. 基本使用](#4-基本使用)
- [5. 运行模式详解](#5-运行模式详解)
- [6. 执行流程详解](#6-执行流程详解)
- [7. 各发行版使用示例](#7-各发行版使用示例)
- [8. LVM 架构详解](#8-lvm-架构详解)
- [9. 标准分区架构详解](#9-标准分区架构详解)
- [10. 日志说明](#10-日志说明)
- [11. 故障排查](#11-故障排查)
- [12. 注意事项](#12-注意事项)
---
## 1. 概述
本脚本用于自动将 Linux 服务器根目录 (`/`) 扩容至磁盘最大可用空间。脚本会自动识别服务器的磁盘架构LVM 或标准分区),并根据实际架构选择对应的扩容策略,全程无需人工干预。
**核心能力:**
- 自动识别 LVM / 非 LVM 磁盘架构
- 自动识别文件系统类型ext4 / XFS / btrfs
- 自动安装缺失的依赖工具
- 将磁盘上所有未分配空间分配给根目录
- 支持在线扩容,无需重启服务器
- 支持模拟运行,预览扩容计划
---
## 2. 环境准备
### 2.1 前提条件
在运行脚本之前,请确认以下条件:
1. **磁盘已扩容** — 如果是云服务器如阿里云、腾讯云、AWS 等),需要先在云平台控制台将磁盘容量扩大。例如将 `/dev/sda` 从 50GB 扩大到 100GB。
2. **存在未分配空间** — 磁盘上必须有尚未分配给分区的可用空间。可以通过以下命令检查:
```bash
# 查看磁盘分区情况
lsblk
df -hT /
```
如果 `lsblk` 显示的磁盘总大小大于根分区大小,说明有未分配空间。
3. **root 权限** — 脚本需要 root 权限运行。
### 2.2 检查当前磁盘状态
```bash
# 查看根目录使用情况和文件系统类型
df -hT /
# 查看所有磁盘和分区
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
# 查看磁盘详细信息(需 root
sudo fdisk -l
```
**判断是否有可扩容空间的示例:**
```
# lsblk 输出示例
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 29G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 20G 0 lvm /
```
上例中,`sda` 总共 50GB`sda3` 只用了 29GBVG 中有约 10GB 未分配空间,可以扩容。
---
## 3. 安装与部署
### 3.1 获取脚本
**方式一Git 克隆(推荐)**
```bash
git clone https://git.opensource-studio.info/database-mysql/LinuxDiskAutoExpansion.git
cd LinuxDiskAutoExpansion
```
**方式二:直接上传**
将 `src/main.sh` 上传到服务器任意目录。
```bash
# 使用 scp 上传
scp src/main.sh user@server:/tmp/
```
**方式三:直接下载**
```bash
wget -O /tmp/main.sh https://git.opensource-studio.info/database-mysql/LinuxDiskAutoExpansion/src/commit/8bce42bc846f6404052c64a6511a29e1b1bc7d95/src/main.sh
```
### 3.2 设置执行权限(可选)
```bash
chmod +x main.sh
```
> 注意:即使不设置执行权限,也可以通过 `bash main.sh` 方式运行。
---
## 4. 基本使用
### 4.1 命令格式
```bash
sudo bash main.sh [选项]
```
### 4.2 可用选项
| 选项 | 缩写 | 说明 |
|------|------|------|
| `--dry-run` | 无 | 模拟运行模式,仅检测环境并输出扩容计划,不实际执行任何修改 |
| `--help` | `-h` | 显示帮助信息并退出 |
### 4.3 推荐操作流程
```bash
# 第一步:模拟运行,查看扩容计划
sudo bash main.sh --dry-run
# 第二步:确认计划无误后,正式执行
sudo bash main.sh
# 第三步:验证扩容结果
df -hT /
```
---
## 5. 运行模式详解
### 5.1 模拟运行模式(--dry-run
模拟运行模式会执行除实际扩容以外的所有检测步骤,输出将要执行的操作命令,但不会修改任何磁盘数据。
```bash
$ sudo bash main.sh --dry-run
========================================================
Linux 根目录自动扩容脚本
适配 Debian / Ubuntu / CentOS 等
========================================================
[2026-09-06 10:00:01] [INFO] 检查并安装必要依赖...
[2026-09-06 10:00:01] [INFO] 检测到包管理器: apt
[2026-09-06 10:00:02] [INFO] 获取根分区信息...
[2026-09-06 10:00:02] [INFO] 根目录所在设备: /dev/mapper/ubuntu--vg-ubuntu--lv
[2026-09-06 10:00:02] [INFO] 根目录文件系统: ext4
[2026-09-06 10:00:02] [INFO] 检测到 LVM 架构
[2026-09-06 10:00:03] [INFO] 根目录所在卷组 (VG): ubuntu-vg
[2026-09-06 10:00:03] [INFO] 可用于扩容的空间: 29G
[2026-09-06 10:00:03] [INFO] ========== 开始 LVM 模式扩容 ==========
[2026-09-06 10:00:03] [INFO] [模拟] 将执行: lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
[2026-09-06 10:00:03] [INFO] [模拟] 将执行文件系统扩容: ext4 on /dev/mapper/ubuntu--vg-ubuntu--lv
```
**适用场景:**
- 首次使用脚本,了解扩容逻辑
- 生产环境变更前,确认扩容计划
- 排查问题时,收集磁盘环境信息
### 5.2 正式执行模式
不带任何参数直接运行,脚本将自动完成全部扩容操作。
```bash
sudo bash main.sh
```
---
## 6. 执行流程详解
脚本按以下步骤顺序执行:
### 步骤 1权限检查
检查是否以 root 用户运行。非 root 用户将报错退出。
```
[ERROR] 此脚本需要 root 权限运行,请使用 sudo bash main.sh
```
### 步骤 2依赖检查与安装
自动检测以下工具是否已安装,缺失时自动安装:
| 工具 | 用途 | 对应软件包 |
|------|------|-----------|
| `growpart` | 扩展磁盘分区 | `cloud-guest-utils`Debian/Ubuntu<br>`cloud-utils-growpart`CentOS/RHEL |
| `xfs_growfs` | 扩展 XFS 文件系统 | `xfsprogs` |
| `lsblk` | 查看磁盘信息 | `util-linux` |
### 步骤 3获取根分区信息
通过 `findmnt` 获取根目录所在设备和文件系统类型。
### 步骤 4LVM 检测
通过多重检测机制判断是否使用 LVM
- 检查设备路径是否为 `/dev/mapper/*` 或 `/dev/dm-*`
- 通过 `lvs` 命令验证是否为 LVM 逻辑卷
- 通过 `lsblk` 的 TYPE 字段二次确认
### 步骤 5打印当前磁盘状态
输出磁盘分区表、文件系统使用情况、LVM 信息(如适用),便于对比扩容前后变化。
### 步骤 6检查可扩容空间
- **LVM 模式**:检查 VG 剩余空间;若不足,自动尝试扩展 PV
- **标准分区模式**:检查分区后是否有未分配扇区
### 步骤 7执行扩容
根据检测到的架构自动执行对应的扩容命令。
### 步骤 8验证结果
扩容完成后自动输出磁盘状态,与步骤 5 的输出对比即可确认扩容是否成功。
---
## 7. 各发行版使用示例
### 7.1 Ubuntu 20.04 / 22.04 / 24.04LVM + ext4
```bash
# 查看当前状态
df -hT /
# Filesystem Type Size Used Avail Use% Mounted on
# /dev/mapper/ubuntu--vg-ubuntu--lv ext4 20G 3.1G 16G 17% /
# 执行扩容
sudo bash main.sh
# 验证结果
df -hT /
# Filesystem Type Size Used Avail Use% Mounted on
# /dev/mapper/ubuntu--vg-ubuntu--lv ext4 49G 3.1G 44G 7% /
```
### 7.2 Debian 11 / 12标准分区 + ext4
```bash
# 查看当前状态
df -hT /
# Filesystem Type Size Used Avail Use% Mounted on
# /dev/vda1 ext4 20G 2.4G 16G 13% /
# 执行扩容
sudo bash main.sh
# 验证结果
df -hT /
# Filesystem Type Size Used Avail Use% Mounted on
# /dev/vda1 ext4 99G 2.4G 92G 3% /
```
### 7.3 CentOS 7 / 8 / StreamLVM + XFS
```bash
# 查看当前状态
df -hT /
# Filesystem Type Size Used Avail Use% Mounted on
# /dev/mapper/centos-root xfs 20G 1.8G 19G 9% /
# 先安装依赖(如果无法联网可跳过,脚本会自动处理)
# sudo yum install -y cloud-utils-growpart
# 执行扩容
sudo bash main.sh
# 验证结果
df -hT /
# Filesystem Type Size Used Avail Use% Mounted on
# /dev/mapper/centos-root xfs 49G 1.8G 48G 4% /
```
### 7.4 AlmaLinux / Rocky LinuxLVM + XFS
与 CentOS 使用方式完全一致:
```bash
sudo bash main.sh
```
### 7.5 openSUSE / SLES
```bash
sudo bash main.sh
```
脚本会自动使用 `zypper` 安装依赖。
---
## 8. LVM 架构详解
### 8.1 识别 LVM 架构
以下特征表明服务器使用了 LVM
- 根设备路径包含 `/dev/mapper/`,如 `/dev/mapper/ubuntu--vg-ubuntu--lv`
- `lsblk` 中 TYPE 列显示 `lvm`
- `df` 输出中的 Filesystem 为 mapper 设备
### 8.2 LVM 扩容流程
```
磁盘空间不足时的完整扩容链路:
1. growpart /dev/sda 3 ← 扩展 sda3 分区占满磁盘
2. pvresize /dev/sda3 ← 扩展物理卷
3. lvextend -l +100%FREE ← 扩展逻辑卷
4. resize2fs / xfs_growfs ← 扩展文件系统
```
### 8.3 LVM 术语说明
| 术语 | 缩写 | 说明 |
|------|------|------|
| 物理卷 | PV | 实际的磁盘分区或整块磁盘 |
| 卷组 | VG | 由一个或多个 PV 组成的存储池 |
| 逻辑卷 | LV | 从 VG 中划分出来的"虚拟分区",格式化后挂载使用 |
---
## 9. 标准分区架构详解
### 9.1 识别标准分区
以下特征表明根目录使用标准分区(非 LVM
- 根设备路径为 `/dev/sda1`、`/dev/vda1`、`/dev/nvme0n1p1` 等
- `lsblk` 中 TYPE 列显示 `part`
### 9.2 标准分区扩容流程
```
1. growpart /dev/sda 1 ← 扩展 sda1 分区占满磁盘
2. resize2fs /dev/sda1 ← 扩展 ext4 文件系统
或 xfs_growfs / ← 扩展 XFS 文件系统
```
---
## 10. 日志说明
### 10.1 日志位置
```
/var/log/disk_auto_expand.log
```
### 10.2 日志内容
日志包含以下信息:
- 时间戳
- 日志级别INFO / WARN / ERROR
- 磁盘环境检测结果
- LVM 信息PV / VG / LV
- 扩容前后磁盘状态
- 执行命令的输出
### 10.3 查看日志
```bash
# 查看完整日志
cat /var/log/disk_auto_expand.log
# 查看最近的日志
tail -50 /var/log/disk_auto_expand.log
# 搜索错误信息
grep "ERROR" /var/log/disk_auto_expand.log
```
---
## 11. 故障排查
### 11.1 常见错误与解决方案
**错误:`此脚本需要 root 权限运行`**
原因:未使用 sudo 运行。
解决:
```bash
sudo bash main.sh
```
**错误:`磁盘没有足够的未分配空间进行扩容`**
原因:磁盘分区已占满全部空间,没有剩余空间可供分配。
解决:
1. 如果是云服务器,先在控制台扩大磁盘容量
2. 确认磁盘扩容后,重新运行脚本
**错误:`卷组没有足够的可用空间进行扩容`**
原因LVM 场景下VG 中可用空间不足 100MB。
解决:
1. 检查 PV 是否已占满磁盘:`pvs` 和 `lsblk` 对比
2. 如果 PV 未占满磁盘,脚本会自动尝试扩展
3. 如果 PV 已占满但 VG 仍无空间,说明空间已被其他 LV 占用
**错误:`无法识别包管理器,请手动安装`**
原因:使用了非主流发行版,脚本无法自动安装依赖。
解决:手动安装所需工具:
```bash
# Debian/Ubuntu
apt-get install -y cloud-guest-utils xfsprogs
# CentOS/RHEL
yum install -y cloud-utils-growpart xfsprogs
```
**警告:`growpart 执行失败,可能分区已是最大`**
说明:分区已经占满磁盘,这通常是正常情况。脚本会继续尝试后续步骤。
### 11.2 手动检查扩容是否成功
```bash
# 查看根目录大小
df -hT /
# 查看分区表
lsblk
# 查看 LVM 状态(如使用 LVM
sudo pvs
sudo vgs
sudo lvs
```
---
## 12. 注意事项
### 12.1 安全建议
1. **首次使用请先 `--dry-run`** — 确认扩容计划无误后再正式执行
2. **重要数据请提前备份** — 虽然扩容操作是无损的,但生产环境建议做好备份
3. **检查日志** — 扩容完成后检查日志确认没有错误
### 12.2 限制说明
1. **仅支持扩容,不支持缩容** — 脚本仅将空间分配给根目录,不涉及缩小操作
2. **仅扩容根目录** — 脚本只处理 `/` 根目录的扩容,不涉及其他挂载点
3. **需要网络** — 首次运行可能需要联网安装依赖工具
4. **不支持加密分区** — 如果根分区使用了 LUKS 加密,脚本暂不支持
### 12.3 云平台扩容前置步骤
在运行脚本之前,需要先在云平台控制台扩大磁盘容量:
| 云平台 | 操作路径 |
|--------|---------|
| 阿里云 | ECS 控制台 → 实例 → 云盘 → 扩容 |
| 腾讯云 | CVM 控制台 → 实例 → 云硬盘 → 扩容 |
| 华为云 | ECS 控制台 → 云硬盘 → 扩容 |
| AWS | EC2 → Volumes → Modify Volume |
| Azure | Virtual Machines → Disks → Resize |
磁盘扩容完成后,运行本脚本即可完成操作系统层面的扩容。