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,解决了空间不足问题。文档详细记录了命令、输入输出、问题原因及解决步骤,确保运维人员可安全复现扩容操作。

相关推荐
mazi2004几秒前
Linux 系统不终止进程的情况下关闭长连接
linux·运维·服务器
亲爱的马哥5 小时前
TDuckX 2.6 正式发布|API 能力开放,核心表单逻辑重构,多项实用功能上线。
java·服务器·前端
休息一下接着来5 小时前
进程间通信(IPC)常用方式对比
linux·c++·进程间通讯
sinizu7 小时前
搭建阅读linux源码的舒适环境(vscode+clangd)
linux·vscode·计算机·clangd
付出不多7 小时前
linux——mysql故障排查与生产环境优化
linux·运维·mysql
。puppy8 小时前
下载Ubuntu 64 位
linux
前行居士8 小时前
ubuntu下实时检测机械硬盘和固态硬盘温度
linux·服务器·ubuntu
Big__Star8 小时前
Git 和 GitHub 学习指南本地 Git 配置、基础命令、GitHub 上传流程、企业开发中 Git 的使用流程、以及如何将代码部署到生产服务器
服务器·git·github
鸠摩智首席音效师9 小时前
Linux Bash 中 $? 的详细用法
linux·chrome·bash