Linux 磁盘扩容实战案例:从问题发现到完美解决
案例背景
某企业服务器根目录 (/
) 空间不足,运维人员通过 df -h
发现 /dev/vda1
分区已 100% 占满(99G 已用)。检查发现物理磁盘 /dev/vda
已扩展至 200G,但分区和文件系统未完全扩展,导致 df -h
和 lsblk
输出不一致。本文档记录从问题排查、触发、发现到成功扩容的详细过程,包括具体命令、输入输出及问题原因分析。
初始状态检查
1. 磁盘空间查看
运行以下命令检查磁盘使用情况:
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. 检查磁盘和分区情况
运行以下命令查看磁盘和分区信息:
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. 检查文件系统类型
运行以下命令确认文件系统类型:
df -Th /
输出:
文件系统 类型 1K-块 已用 可用 已用% 挂载点
/dev/vda1 ext4 103080204 103063820 0 100% /
分析:文件系统为 ext4
,后续扩展将使用 resize2fs
。
问题触发:分区扩展未同步文件系统
触发步骤
为解决磁盘空间不足问题,运维人员尝试扩展 /dev/vda1
分区以使用 /dev/vda
的全部 200G 空间。以下操作触发了 df -h
和 lsblk
不一致的问题:
1. 扩展底层磁盘
操作:在云服务器控制台(如阿里云、AWS)或虚拟机管理器(如 KVM、VMware)将
/dev/vda
从 100G 扩展到 200G。命令:使系统识别新磁盘大小:
echo "- - -" > /sys/class/scsi_device/<device>/device/rescan
(
<device>
替换为实际设备,例如2:0:0:0
,可通过ls /sys/class/scsi_device/
查看。)验证:
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
分区:
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. 使分区表生效
运行以下命令通知内核更新分区表:
partprobe /dev/vda
若提示分区正在使用,则重启:
reboot
4. 验证分区扩展
检查分区是否扩展:
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 -h
和 lsblk
不一致
在完成分区扩展后,运行以下命令发现问题:
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. 备份数据
扩容操作可能导致数据丢失,强烈建议备份:
rsync -a / /mnt/backup
注意:确保备份完整后再继续。
2. 检查文件系统完整ity
在扩展文件系统前,检查 ext4
文件系统:
e2fsck -f /dev/vda1
注意:根分区无法直接卸载,若需检查,进入单用户模式:
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. 扩展文件系统
确认文件系统类型:
df -Th / | awk '{print $2}' | tail -n 1
输出:
ext4
扩展 ext4
文件系统:
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. 验证扩容结果
运行以下命令确认扩容效果:
lsblk | grep vda1
df -h / | grep vda1
预期输出:
└─vda1 253:1 0 201G 0 part /
/dev/vda1 201G 78G 123G 39% /
常见问题:
若
df -h
未更新,重新挂载: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 索引
解决步骤:
删除 RPM 锁文件:
rm -f /var/lib/rpm/__db*
重建 RPM 数据库:
rpm --rebuilddb
预期输出:
[无错误输出]
清理
yum
缓存:yum clean all
安装
cloud-utils-growpart
:yum install -y cloud-utils-growpart
预期输出:
Installed: cloud-utils-growpart.x86_64 0.31-1.el7 Complete!
使用 growpart
扩展分区(可选):
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
:parted /dev/vda
云服务器:确保磁盘已在云平台控制台扩展。
文件系统缓存:若
df -h
未更新,重新挂载:mount -o remount /
救援模式:若误操作导致系统无法启动,使用 Live CD/USB 修复。
总结
通过 df -h
和 lsblk
发现分区扩展未同步文件系统的问题,确认问题源于使用 fdisk
扩展分区后未执行文件系统扩展。使用 resize2fs
扩展 ext4
文件系统,最终使根分区容量从 99G 扩展到 201G,解决了空间不足问题。文档详细记录了命令、输入输出、问题原因及解决步骤,确保运维人员可安全复现扩容操作。