Linux服务器磁盘扩容的完整指南
摘要:在云控制台把磁盘从 100G 扩到 500G,登录服务器执行 df -h 却发现容量纹丝不动——这是运维新人最常踩的坑。本文用"三层模型"讲清楚磁盘扩容的本质,覆盖云盘在线扩容、LVM 扩容、新增数据盘、>2TB GPT 分区、Swap 扩容五大场景,给出可直接复制的命令、验证清单与故障排查表。
关键词:Linux 磁盘扩容、growpart、resize2fs、xfs_growfs、LVM、pvresize、lvextend、云服务器扩容
一、先建立正确认知:磁盘容量有三层
云厂商控制台点了"扩容成功",只是完成了第一层。容量是否真正可用,取决于三层是否全部同步:
┌─────────────────────────────────────────────┐
│ 第 1 层:块设备(云盘/物理盘) │ 控制台扩容 → lsblk 看磁盘大小
├─────────────────────────────────────────────┤
│ 第 2 层:分区表(MBR / GPT) │ growpart → lsblk 看分区大小
├─────────────────────────────────────────────┤
│ 第 3 层:文件系统(ext4 / xfs) │ resize2fs /
│ │ xfs_growfs → df -h 看可用空间
└─────────────────────────────────────────────┘
(若用了 LVM,中间还夹着 PV → VG → LV 三层)
核心结论:扩容必须自下而上逐层进行,漏掉任何一层,df -h 都不会变。
记住这几条排查口诀:
| 现象 | 说明哪一层没做 | 该执行的命令 |
|---|---|---|
| 磁盘 500G,分区还是 100G | 第 2 层(分区表) | growpart |
分区 500G,df -h 还是 100G | 第 3 层(文件系统) | resize2fs / xfs_growfs |
| 分区扩了,LVM 没变 | PV 层 | pvresize |
vgs 有 VFree,LV 没变 | LV 层 | lvextend |
| LV 变大了,挂载点没变 | 文件系统层 | resize2fs / xfs_growfs |
二、动手前的三件事(必做)
1. 打快照 / 备份
扩容涉及修改分区表,风险不高但一旦选错设备就是灾难。生产环境必须先打云盘快照,这是唯一可靠的回退手段。
# 阿里云/腾讯云/华为云控制台 → 云硬盘 → 创建快照 # 也可以备份关键配置 cp /etc/fstab /etc/fstab.bak.$(date +%F)
2. 摸清现状:一眼看清自己属于哪种场景
# 看块设备与分区(磁盘 vs 分区大小对比) lsblk -o NAME,PATH,SIZE,TYPE,FSTYPE,MOUNTPOINTS # 看挂载点容量与文件系统类型 df -hT # 看某个挂载点的精确信息 findmnt -no SOURCE,FSTYPE,TARGET / # 是否用了 LVM sudo pvs; sudo vgs; sudo lvs # 看分区表类型(GPT 还是 MBR) sudo parted -l
如何判断自己走哪条路:
| lsblk 输出特征 | 场景 | 跳转章节 |
|---|---|---|
/dev/vda1 直接挂在 / | 普通分区,无 LVM | 第三章 |
出现 vg-、lv-、/dev/mapper/* | LVM | 第四章 |
| 需要把扩容部分做成独立新分区 | 新增分区挂载 | 第五章 |
| 磁盘 > 2TB,或 MBR 需转 GPT | GPT 分区 | 第五章 |
3. 确认文件系统类型(决定最后一条命令)
df -T # 看 Type 列 # 或 sudo file -sL /dev/vda1
最常见的低级错误:XFS 上跑 resize2fs。
resize2fs 只管 ext2/3/4,XFS 必须用 xfs_growfs,且参数传的是挂载点而不是设备名。经验值:Ubuntu/Debian 默认 ext4,CentOS/RHEL/Rocky/Alma 默认 XFS。
三、场景一:云盘直接扩容(无 LVM,最常见)
适用:阿里云 ECS、腾讯云 CVM/轻量、华为云、AWS、Azure 等,控制台把系统盘或数据盘扩容后。
步骤 1:控制台扩容 + 让内核识别新容量
在控制台 完成扩容后,登录服务器确认内核是否已看到新容量:
lsblk # NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # vda 252:0 0 500G 0 disk # └─vda1 252:1 0 100G 0 part / ← 磁盘 500G,分区 100G,说明要扩分区
如果磁盘仍显示旧大小,触发重新扫描:
# SCSI / virtio 盘 echo 1 | sudo tee /sys/class/block/vda/device/rescan # NVMe 盘(AWS、部分新实例) sudo nvme ns-rescan /dev/nvme0 # 通用:重读分区表 sudo partprobe /dev/vda # 以上都不行,在云控制台卸载后重挂,或重启(部分系统盘必须重启)
步骤 2:安装 growpart
# Ubuntu / Debian sudo apt update && sudo apt install -y cloud-guest-utils # CentOS 7 / RHEL 7 sudo yum install -y cloud-utils-growpart # Rocky / Alma / CentOS Stream / Fedora sudo dnf install -y cloud-utils-growpart
步骤 3:扩展分区
# 语法:growpart <整块磁盘> <分区号>,中间是空格!这是最容易写错的地方 sudo growpart /dev/vda 1 # ✅ 正确 # sudo growpart /dev/vda1 # ❌ 错误,不要连着写 # NVMe 盘示例 sudo growpart /dev/nvme0n1 1 # 建议先做预演(-N 只模拟不执行) sudo growpart -N /dev/vda 1
验证分区已变大:
lsblk # └─vda1 252:1 0 500G 0 part / ← 分区已跟上磁盘
步骤 4:扩展文件系统
ext4:(参数是设备名,可在线扩容,无需卸载)
sudo resize2fs /dev/vda1
XFS:(参数是挂载点,且必须处于挂载状态)
sudo xfs_growfs / # 扩容根目录 sudo xfs_growfs /data # 扩容挂在 /data 的数据盘
步骤 5:验证
df -hT # Filesystem Type Size Used Avail Use% Mounted on # /dev/vda1 ext4 492G 98G 370G 21% /
若分区已经扩过、只是忘记扩文件系统,直接执行步骤 4 即可,不需要重复 growpart。
四、场景二:LVM 扩容(推荐架构,最灵活)
LVM 的完整链路是:磁盘 → 分区 → PV → VG → LV → 文件系统。扩容器时必须逐层打通。
4.1 情况 A:原有磁盘变大(云盘扩容 + LVM)
# 1. 扩分区(PV 在分区上时需要;PV 直接建在整盘上则跳过) sudo growpart /dev/sda 3 # 2. 告诉 LVM:PV 变大了(关键一步,LVM 有自己的元数据,不会自动感知) sudo pvresize /dev/sda3 # 3. 确认 VG 出现空闲空间 sudo vgs # 看 VFree 列 # 4. 扩展 LV 并同时扩展文件系统(-r 会自动调用 resize2fs 或 xfs_growfs) sudo lvextend -r -l +100%FREE /dev/ubuntu-vg/ubuntu-lv # 或者手动分步执行(便于排查) sudo lvextend -L +20G /dev/ubuntu-vg/ubuntu-lv # 固定增加 20G sudo resize2fs /dev/ubuntu-vg/ubuntu-lv # ext4 # sudo xfs_growfs /data # XFS(用挂载点)
PV 直接建在整块盘上(pvs 显示 /dev/sdb 而非 /dev/sdb1)时,不需要 growpart,直接:
echo 1 | sudo tee /sys/class/block/sdb/device/rescan sudo pvresize /dev/sdb sudo lvextend -r -l +100%FREE /dev/vg_data/lv_data
4.2 情况 B:新增一块磁盘加入 VG(推荐做法)
# 0. 虚拟机热添加磁盘后,扫描 SCSI 总线找到新盘 for h in /sys/class/scsi_host/host*; do echo "- - -" > "$h/scan"; done lsblk # 确认新盘,如 /dev/sdb # 1. 创建物理卷 sudo pvcreate /dev/sdb # 2. 加入卷组 sudo vgextend vg_data /dev/sdb # 3. 扩展逻辑卷 + 文件系统 sudo lvextend -r -l +100%FREE /dev/vg_data/lv_data # 4. 验证 df -hT /data sudo vgs; sudo lvs
4.3+100%FREE要不要用?
- 单盘根卷:放心用,简单直接。
- 一个 VG 里有多个 LV:不要把空闲空间一次性吃光,留一部分给快照和应急扩容:
sudo lvextend -r -L +50G /dev/vg_data/lv_data # 按需定量追加
LVM 快照需要 VG 里有空闲 PE,把 VFree 压到 0 会导致无法创建快照。
五、场景三:新增数据盘 / 大于 2TB 的 GPT 分区
5.1 为什么要 GPT
MBR 分区表单盘最大仅支持 2TB。超过 2TB 必须使用 GPT,且 MBR 转 GPT 有风险,务必先备份(云厂商通常建议:新建一块 GPT 数据盘,再把数据拷过去,而不是原地转换)。
5.2 初始化并挂载新盘(GPT + ext4)
# 1. 建立 GPT 分区表并划分一个占满全盘的分区 sudo parted -s /dev/vdb mklabel gpt sudo parted -s /dev/vdb mkpart primary 0% 100% # 2. 查看结果 lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS # 3. 格式化(二选一) sudo mkfs.ext4 /dev/vdb1 # ext4 # sudo mkfs.xfs /dev/vdb1 # XFS,需安装 xfsprogs # 4. 挂载 sudo mkdir -p /data sudo mount /dev/vdb1 /data # 5. 配置开机自动挂载 —— 务必用 UUID,不要用 /dev/vdb1 UUID=$(sudo blkid -s UUID -o value /dev/vdb1) echo "UUID=$UUID /data ext4 defaults,nofail 0 2" | sudo tee -a /etc/fstab # 6. 测试 fstab 是否写对(这步能救命) sudo mount -a && echo "fstab OK"
5.3 常见分区工具选择
| 工具 | 适用场景 | 说明 |
|---|---|---|
growpart | 把最后一个分区扩展到磁盘末尾 | 最简单安全,首选 |
parted resizepart | 需要精确控制分区结束位置 | 支持 GPT 与大盘 |
fdisk | 查看分区、小盘交互操作 | 删除重建分区风险高,谨慎 |
cfdisk | 交互式,直观 | 磁盘被占用时可能读不到新大小 |
注意:只有最后一个分区能直接向后扩展。中间分区后面被其他分区挡住,growpart 会失败。所以规划时应避免在数据盘上切多个区。
六、场景四:Swap 扩容(顺手可做)
内存吃紧又不能立刻升配时,可以扩 Swap 应急(注意:Swap 救不了性能,只是防 OOM)。
# 方式一:Swap 文件(最简单,无需分区) sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab # 验证 free -h swapon --show # 调整使用倾向(默认 60,数据库服务器建议调低到 10) sudo sysctl vm.swappiness=10 echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
如果是 LVM 上的 Swap LV:sudo swapoff /dev/vg/swap → lvextend -L +2G → mkswap → swapon。
七、场景五:CPU / 内存扩容(云服务器升配)
磁盘之外的扩容相对简单,但有几个注意点:
1.实例规格调整通常需要关机(部分云厂商支持热升级,以控制台提示为准)。
2.系统盘容量通常不能单独扩容,需要升级到更高规格的套餐(如腾讯云轻量应用服务器)。
3.升配后确认内核是否识别:
nproc # CPU 核数 free -h # 内存 lscpu | grep -E 'CPU\(s\)|Model name' dmidecode -t memory # 物理机查看内存条
4.扩容后别忘了调优:进程数、连接池、JVM 堆、nginx worker_processes 等参数往往写死了旧规格的值。
八、扩容后验证清单(逐层确认)
不要只看 df -h,从底往上核对每一层:
lsblk -o NAME,PATH,SIZE,TYPE,FSTYPE,MOUNTPOINTS # 块设备 + 分区 sudo pvs; sudo vgs; sudo lvs # LVM 三层 df -hT # 文件系统(最终要变的那一个数) findmnt -no SOURCE,FSTYPE,TARGET / # 挂载关系 df -ih # inode 是否也够用
五个数字都对得上,才算扩容成功。
九、故障排查速查表
| 报错 / 现象 | 原因 | 解决办法 |
|---|---|---|
growpart: command not found | 没装工具 | apt install cloud-guest-utils 或 yum install cloud-utils-growpart |
NOCHANGE: partition 1 could not be grown | ①分区已占满磁盘 ②后面还有别的分区挡着 ③控制台刚扩容,内核还没识别 | ①跳过直接扩文件系统 ②只能加新盘 ③等 30~60 秒或 partprobe / 重启 |
resize2fs: Bad magic number in super-block | 文件系统类型判断错了(其实是 XFS) | 改用 xfs_growfs <挂载点> |
xfs_growfs: is not a mounted XFS filesystem | 传了设备名而非挂载点 | xfs_growfs /data 而不是 /dev/sdb1 |
df -h 没变,但 lsblk 已变大 | 漏做文件系统扩展 | 执行 resize2fs / xfs_growfs |
| 磁盘扩了但空间仍不足 | 大文件被删除但进程仍占用 | lsof | grep deleted,重启对应进程释放 |
GPT PMBR size mismatch ... will be corrected by write | GPT 备份分区表位置异常 | 进 parted 执行 print 后按提示 Fix,或先备份再修复 |
| 扩容后重启进不了系统 | /etc/fstab 写错 | 进救援模式/VNC 修正 fstab,用 UUID 而非 /dev/sdX |
| 容量显示正常但应用写不进去 | inode 耗尽 / 配额限制 / 应用自身限制 | df -ih 查 inode;检查 quota 与应用存储上限 |
| 想缩容 | 云盘与 XFS 均不支持缩容 | 只能新建更小的盘再迁移数据;ext4 可离线缩容 |
关于缩容,务必知道的三句话
- 云硬盘只支持扩容,不支持缩容(阿里云、腾讯云官方明确说明)。
- XFS 只能增,不能减,缩 XFS 的唯一办法是备份 → 重建更小的文件系统 → 恢复。
- ext4 可缩容但必须离线(卸载),且顺序是先缩文件系统,再缩 LV;顺序反了直接毁数据。
# ext4 缩容示例(高风险,务必先备份!) sudo umount /data sudo e2fsck -f /dev/vg_data/lv_data sudo resize2fs /dev/vg_data/lv_data 50G # 1. 先缩文件系统 sudo lvreduce -L 50G /dev/vg_data/lv_data # 2. 再缩 LV sudo mount /data
十、最佳实践与运维建议
- 能用 LVM 就用 LVM。 普通分区日后扩容要动分区表,LVM 只需
lvextend -r一条命令,且支持跨盘聚合,在线无感知。 - 新盘一律用 GPT,别再用 MBR,避免 2TB 天花板。
- 数据盘不分区、直接整盘做 PV(
pvcreate /dev/sdb),省掉 growpart 这一层。 /etc/fstab一律用 UUID,并用nofail参数,防止盘缺失导致系统起不来。- 配置磁盘告警:使用率到 80% 就告警,留出从容处理的窗口,远比写满后救火稳妥。
# 一个简单的巡检脚本,可放进 crontab
#!/bin/bash
# disk_check.sh
THRESHOLD=80
df -hP | awk -v t=$THRESHOLD 'NR>1 {
gsub("%","",$5);
if ($5+0 >= t) printf "警告: %s 已用 %s%% (挂载点 %s)\n", $1, $5, $6
}'
# 每天 9 点巡检 0 9 * * * /bin/bash /opt/disk_check.sh
- 扩容窗口放在业务低峰,改分区表前确认快照已生成。
十一、一图流总结
# ── 无 LVM,ext4 ──────────────────────────── growpart /dev/vda 1 && resize2fs /dev/vda1 # ── 无 LVM,XFS ───────────────────────────── growpart /dev/vda 1 && xfs_growfs / # ── LVM,原盘变大 ─────────────────────────── growpart /dev/sda 3 && pvresize /dev/sda3 && lvextend -r -l +100%FREE /dev/vg/lv # ── LVM,新盘加入 ─────────────────────────── pvcreate /dev/sdb && vgextend vg /dev/sdb && lvextend -r -l +100%FREE /dev/vg/lv # ── 新增数据盘(GPT)──────────────────────── parted -s /dev/vdb mklabel gpt parted -s /dev/vdb mkpart primary 0% 100% mkfs.ext4 /dev/vdb1 && mount /dev/vdb1 /data # 记得写 UUID 到 fstab
最后三句话:
- 控制台扩容成功 ≠ 空间可用,三层都要扩。
resize2fs传设备,xfs_growfs传挂载点,别搞混。- 动手前打快照,改
/etc/fstab后用mount -a验证。
本文基于主流 Linux 发行版(CentOS/RHEL 系、Ubuntu/Debian 系)与主流云厂商的通用实践整理。不同云厂商在系统盘扩容上可能存在"需重启"或"需重挂"的差异,操作前请以对应云厂商最新官方文档为准。
到此这篇关于Linux服务器磁盘扩容的完整指南的文章就介绍到这了,更多相关Linux磁盘扩容内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Linux使用vim编辑文件保存时报E514:write error (file system full?)问题解决
最近在用vi编辑文档,保存的时候,提示如下错误:E514: write error (file system full?),所以这篇文章主要给大家介绍了关于Linux使用vim编辑文件保存时报E514:write error (file system full?)问题的解决方法,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。2018-02-02
Linux使用journalctl命令进行日志分析和管理全过程
这篇文章主要介绍了Linux使用journalctl命令进行日志分析和管理全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2026-01-01
LVS+Keepalived构建高可用负载均衡配置方法(配置篇)
这篇文章主要介绍了LVS+Keepalived构建高可用负载均衡配置方法,需要的朋友可以参考下2013-06-06


最新评论