Linux服务器磁盘扩容的完整指南

 更新时间:2026年11月08日 11:03:15   作者:姜楠Ace  
这篇文章主要为大家详细介绍了Linux服务器磁盘扩容的五大核心场景,分别是云盘直接扩容、LVM扩容、GPT大容量数据盘初始化、Swap扩容及云服务器升配,文内提供了可直接复制的命令和排查表,有需要的可以参考下

摘要:在云控制台把磁盘从 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 需转 GPTGPT 分区第五章

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 writeGPT 备份分区表位置异常进 parted 执行 print 后按提示 Fix,或先备份再修复
扩容后重启进不了系统/etc/fstab 写错进救援模式/VNC 修正 fstab,用 UUID 而非 /dev/sdX
容量显示正常但应用写不进去inode 耗尽 / 配额限制 / 应用自身限制df -ih 查 inode;检查 quota 与应用存储上限
想缩容云盘与 XFS 均不支持缩容只能新建更小的盘再迁移数据;ext4 可离线缩容

关于缩容,务必知道的三句话

  1. 云硬盘只支持扩容,不支持缩容(阿里云、腾讯云官方明确说明)。
  2. XFS 只能增,不能减,缩 XFS 的唯一办法是备份 → 重建更小的文件系统 → 恢复。
  3. 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

十、最佳实践与运维建议

  1. 能用 LVM 就用 LVM。 普通分区日后扩容要动分区表,LVM 只需 lvextend -r 一条命令,且支持跨盘聚合,在线无感知。
  2. 新盘一律用 GPT,别再用 MBR,避免 2TB 天花板。
  3. 数据盘不分区、直接整盘做 PV(pvcreate /dev/sdb),省掉 growpart 这一层。
  4. /etc/fstab 一律用 UUID,并用 nofail 参数,防止盘缺失导致系统起不来。
  5. 配置磁盘告警:使用率到 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
  1. 扩容窗口放在业务低峰,改分区表前确认快照已生成。

十一、一图流总结

# ── 无 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如何查看kafka的消费组里是否有积压

    linux如何查看kafka的消费组里是否有积压

    当Flink消费数据导致页面延迟时,需检查Kafka消费组是否存在积压,若数据已实时消费完毕,说明Flink处理能力与生产速度匹配,无积压问题
    2025-08-08
  • Linux下Tomcat的几种运行方式讲解

    Linux下Tomcat的几种运行方式讲解

    今天小编就为大家分享一篇关于Linux下Tomcat的几种运行方式讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • Linux常用命令last的使用方法详解

    Linux常用命令last的使用方法详解

    最近在学习linux命令,学习到了last命令,发现很多同学对last命令不是很熟悉,last命令的功能列出目前与过去登入系统的用户相关信息,下面这篇文章主要给大家介绍了关于Linux常用命令last的使用方法,需要的朋友可以参考借鉴。
    2017-08-08
  • linux系统下如何挂载NTFS移动硬盘

    linux系统下如何挂载NTFS移动硬盘

    用命令行挂载移动硬盘是Linux的基本操作之一,虽然目前有些Linux系统能自动加载移动硬盘,但有些时候(比如使用Ubuntu Server或其它Linux系统的时候)仍然需要手动操作,下面这篇文章主要介绍了linux系统下如何挂载NTFS移动硬盘,需要的朋友可以参考借鉴。
    2017-01-01
  • Linux使用vim编辑文件保存时报E514:write error (file system full?)问题解决

    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命令进行日志分析和管理全过程

    这篇文章主要介绍了Linux使用journalctl命令进行日志分析和管理全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-01-01
  • Linux中查看并删除端口方式

    Linux中查看并删除端口方式

    这篇文章主要介绍了Linux中查看并删除端口方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • Linux 下读XML 的类详解及实现代码

    Linux 下读XML 的类详解及实现代码

    这篇文章主要介绍了 Linux 下读XML 的类详解及实现代码的相关资料,需要的朋友可以参考下
    2017-03-03
  • LVS+Keepalived构建高可用负载均衡配置方法(配置篇)

    LVS+Keepalived构建高可用负载均衡配置方法(配置篇)

    这篇文章主要介绍了LVS+Keepalived构建高可用负载均衡配置方法,需要的朋友可以参考下
    2013-06-06
  • Linux中mv命令的高级用法示例

    Linux中mv命令的高级用法示例

    这篇文章主要给大家介绍了关于Linux中mv命令的高级用法示例,文中通过示例代码介绍的非常详细,对大家学习或者使用Linux具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05

最新评论