Linux 磁盘扩容实战案例:从问题发现到完美解决

Linux 磁盘扩容实战案例:从问题发现到完美解决

案例背景

某企业服务器根目录 (/) 空间不足,运维人员通过 df -h 发现 /dev/vda1 分区已 100% 占满(99G 已用)。检查发现物理磁盘 /dev/vda 已扩展至 200G,但分区和文件系统未完全扩展,导致 df -hlsblk 输出不一致。本文档记录从问题排查、触发、发现到成功扩容的详细过程,包括具体命令、输入输出及问题原因分析。

初始状态检查

1. 磁盘空间查看

运行以下命令检查磁盘使用情况:

bash 复制代码
df -h

初始输出:

复制代码
文件系统        容量  已用  可用 已用% 挂载点
devtmpfs        7.5G     0  7.5G    0% /dev
tmpfs           7.5G     0  7.5G    0% /dev/shm
tmpfs           7.5G  267M  7.2G    4% /run
tmpfs           7.5G     0  7.5G    0% /sys/fs/cgroup
/dev/vda1        99G   99G     0  100% /

分析 :根分区 /dev/vda1 已满(99G 已用,0 可用),需扩容。

2. 检查磁盘和分区情况

运行以下命令查看磁盘和分区信息:

bash 复制代码
lsblk
fdisk -l /dev/vda

输出:

复制代码
[root@master ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0  200G  0 disk 
└─vda1 253:1    0  100G  0 part /

[root@master ~]# fdisk -l /dev/vda
磁盘 /dev/vda:214.7 GB, 214748364800 字节,419430400 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000c4c7a

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048   209715166   104856559+  83  Linux

分析

  • 磁盘 /dev/vda 大小:200GB(214.7 GB)。
  • 分区 /dev/vda1 大小:100GB,挂载点为 /
  • 分区表类型:MBR(dos)。
  • 起始扇区:2048(扩容时必须保持一致)。
  • 分区未使用磁盘全部空间,需扩展分区和文件系统。

3. 检查文件系统类型

运行以下命令确认文件系统类型:

bash 复制代码
df -Th /

输出:

复制代码
文件系统       类型     1K-块      已用  可用 已用% 挂载点
/dev/vda1      ext4 103080204 103063820     0  100% /

分析 :文件系统为 ext4,后续扩展将使用 resize2fs

问题触发:分区扩展未同步文件系统

触发步骤

为解决磁盘空间不足问题,运维人员尝试扩展 /dev/vda1 分区以使用 /dev/vda 的全部 200G 空间。以下操作触发了 df -hlsblk 不一致的问题:

1. 扩展底层磁盘
  • 操作 :在云服务器控制台(如阿里云、AWS)或虚拟机管理器(如 KVM、VMware)将 /dev/vda 从 100G 扩展到 200G。

  • 命令:使系统识别新磁盘大小:

    bash 复制代码
    echo "- - -" > /sys/class/scsi_device/<device>/device/rescan

    <device> 替换为实际设备,例如 2:0:0:0,可通过 ls /sys/class/scsi_device/ 查看。)

  • 验证

    bash 复制代码
    lsblk

    输出:

    复制代码
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    vda    253:0    0  200G  0 disk 
    └─vda1 253:1    0  100G  0 part /

    分析 :磁盘 /dev/vda 已扩展到 200G,但分区 /dev/vda1 仍为 100G。

2. 扩展分区

使用 fdisk 扩展 /dev/vda1 分区:

bash 复制代码
fdisk /dev/vda

交互过程:

复制代码
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定写入磁盘。
使用写入命令前请谨慎。

命令(输入 m 获取帮助): d
选定分区 1

命令(输入 m 获取帮助): n
分区类型
   p   主分区 (0个主分区,0个扩展分区,4空闲)
   e   扩展分区
选择 (默认 p): p
分区号 (1-4, 默认 1): 1
第一个扇区 (2048-419430399, 默认 2048): 2048
Last sector, +sectors or +size{K,M,G,T,P} (2048-419430399, 默认 419430399): [直接回车]

命令(输入 m 获取帮助): p
磁盘 /dev/vda:214.7 GB, 214748364800 字节,419430400 个扇区
...
   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1            2048   419430399   209714176   83  Linux

命令(输入 m 获取帮助): w
分区表已调整。
正在同步磁盘。
3. 使分区表生效

运行以下命令通知内核更新分区表:

bash 复制代码
partprobe /dev/vda

若提示分区正在使用,则重启:

bash 复制代码
reboot
4. 验证分区扩展

检查分区是否扩展:

bash 复制代码
lsblk

输出:

复制代码
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0  201G  0 disk 
└─vda1 253:1    0  201G  0 part /

分析 :分区 /dev/vda1 已扩展到 201G,但未扩展文件系统。

问题原因

  • 分区扩展完成 :通过 fdisk 扩展了 /dev/vda1 分区,lsblk 显示新分区大小(201G)。
  • 文件系统未扩展 :文件系统仍基于旧分区大小(99G),未同步到新分区大小,导致 df -h 显示容量未变化。
  • 机制差异lsblk 显示分区大小(底层块设备),而 df -h 显示文件系统大小,两者未同步是常见问题。

问题发现:df -hlsblk 不一致

在完成分区扩展后,运行以下命令发现问题:

bash 复制代码
df -h
lsblk

输出:

复制代码
[root@master ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
devtmpfs        7.5G     0  7.5G    0% /dev
tmpfs           7.5G     0  7.5G    0% /dev/shm
tmpfs           7.5G  5.3M  7.5G    1% /run
tmpfs           7.5G     0  7.5G    0% /sys/fs/cgroup
/dev/vda1        99G   78G   17G   83% /

[root@master ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0  201G  0 disk 
└─vda1 253:1    0  201G  0 part /

问题

  • lsblk 显示 /dev/vda1 为 201G,说明分区扩展成功。
  • df -h 显示 /dev/vda1 仍为 99G,说明文件系统未扩展。
    结论:需扩展文件系统以匹配分区大小。

解决方案

1. 备份数据

扩容操作可能导致数据丢失,强烈建议备份:

bash 复制代码
rsync -a / /mnt/backup

注意:确保备份完整后再继续。

2. 检查文件系统完整ity

在扩展文件系统前,检查 ext4 文件系统:

bash 复制代码
e2fsck -f /dev/vda1

注意:根分区无法直接卸载,若需检查,进入单用户模式:

bash 复制代码
init 1
e2fsck -f /dev/vda1
init 5

预期输出:

复制代码
e2fsck 1.42.9 (28-Dec-2013)
/dev/vda1: clean, 123456/6553600 files, 26211839/26211839 blocks

3. 扩展文件系统

确认文件系统类型:

bash 复制代码
df -Th / | awk '{print $2}' | tail -n 1

输出:

复制代码
ext4

扩展 ext4 文件系统:

bash 复制代码
resize2fs /dev/vda1

预期输出:

复制代码
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/vda1 to 52428544 (4k) blocks.
The filesystem on /dev/vda1 is now 52428544 blocks long.

4. 验证扩容结果

运行以下命令确认扩容效果:

bash 复制代码
lsblk | grep vda1
df -h / | grep vda1

预期输出:

复制代码
└─vda1 253:1    0  201G  0 part /
/dev/vda1       201G   78G  123G   39% /

常见问题

  • df -h 未更新,重新挂载:

    bash 复制代码
    mount -o remount /
    df -h

    预期输出:

    复制代码
    /dev/vda1       201G   78G  123G   39% /
  • resize2fs 报错 The filesystem is already XXXX blocks long

    • 文件系统已自动扩展,重新挂载即可。

5. 解决 yum 安装问题(附加)

尝试安装 cloud-utils-growpart 时,遇到 RPM 数据库错误:

复制代码
错误:db5 错误(11) 来自 dbenv->open:资源暂时不可用
错误:无法使用 db5 - 资源暂时不可用 (11) 打开 Packages 索引

解决步骤

  1. 删除 RPM 锁文件:

    bash 复制代码
    rm -f /var/lib/rpm/__db*
  2. 重建 RPM 数据库:

    bash 复制代码
    rpm --rebuilddb

    预期输出:

    复制代码
    [无错误输出]
  3. 清理 yum 缓存:

    bash 复制代码
    yum clean all
  4. 安装 cloud-utils-growpart

    bash 复制代码
    yum install -y cloud-utils-growpart

    预期输出:

    复制代码
    Installed:
      cloud-utils-growpart.x86_64 0.31-1.el7
    Complete!

使用 growpart 扩展分区(可选)

bash 复制代码
growpart /dev/vda 1
resize2fs /dev/vda1

预期输出:

复制代码
CHANGED: partition=1 start=2048 old: size=209713119 end=209715167 new: size=419426303 end=419430399

注意事项

  • 备份优先:任何磁盘操作前必须备份数据。

  • 起始扇区:重建分区时,起始扇区必须为 2048,否则数据会丢失。

  • 分区表类型 :本案例为 MBR 分区表,若为 GPT,建议使用 parted

    bash 复制代码
    parted /dev/vda
  • 云服务器:确保磁盘已在云平台控制台扩展。

  • 文件系统缓存 :若 df -h 未更新,重新挂载:

    bash 复制代码
    mount -o remount /
  • 救援模式:若误操作导致系统无法启动,使用 Live CD/USB 修复。

总结

通过 df -hlsblk 发现分区扩展未同步文件系统的问题,确认问题源于使用 fdisk 扩展分区后未执行文件系统扩展。使用 resize2fs 扩展 ext4 文件系统,最终使根分区容量从 99G 扩展到 201G,解决了空间不足问题。文档详细记录了命令、输入输出、问题原因及解决步骤,确保运维人员可安全复现扩容操作。

相关推荐
树℡独9 小时前
ns-3仿真之应用层(五)
服务器·网络·tcp/ip·ns3
嵩山小老虎9 小时前
Windows 10/11 安装 WSL2 并配置 VSCode 开发环境(C 语言 / Linux API 适用)
linux·windows·vscode
Fleshy数模9 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
a413244710 小时前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
Configure-Handler10 小时前
buildroot System configuration
java·服务器·数据库
津津有味道10 小时前
易语言TCP服务端接收刷卡数据并向客户端读卡器发送指令
服务器·网络协议·tcp·易语言
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.11 小时前
Keepalived VIP迁移邮件告警配置指南
运维·服务器·笔记
Genie cloud11 小时前
1Panel SSL证书申请完整教程
服务器·网络协议·云计算·ssl
一只自律的鸡11 小时前
【Linux驱动】bug处理 ens33找不到IP
linux·运维·bug
17(无规则自律)12 小时前
【CSAPP 读书笔记】第二章:信息的表示和处理
linux·嵌入式硬件·考研·高考