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,解決了空間不足問題。文檔詳細記錄了命令、輸入輸出、問題原因及解決步驟,確保運維人員可安全復現擴容操作。