虛擬機磁盤擴展實戰:解決Docker存儲空間不足問題
問題背景
在虛擬機中運行的Linux系統上,Docker服務因根分區空間不足而無法正常運行。初始狀態如下:
[root@localhost ~]# df -h /
文件系統 容量 已用 可用 已用% 掛載點
/dev/mapper/centos-root 17G 17G 983M 95% /[root@localhost ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 8 7 3.914GB 260.4MB
Containers 8 4 6.741GB 18.13kB
根分區使用率已達95%,僅剩983MB空間,導致Docker無法正常工作。
完整解決方案
步驟1:安裝parted工具(如未安裝)
# 檢查parted是否已安裝
which parted || echo "parted not installed"# 安裝parted工具
sudo yum install -y parted # CentOS/RHEL
# 或
sudo apt-get install -y parted # Ubuntu/Debian# 驗證安裝
sudo parted --version
步驟2:擴展虛擬機磁盤
- 關閉虛擬機
- 在虛擬機管理軟件中:
- VMware: 虛擬機設置 → 硬盤 → 擴展
- VirtualBox: 設置 → 存儲 → 調整大小
- 將磁盤從30GB擴展到53.7GB
- 啟動虛擬機
步驟3:進入parted交互模式
# 啟動parted工具(需要root權限)
sudo parted /dev/sda
步驟4:parted交互操作指南
在parted交互模式中,按順序執行以下命令:
# 1. 查看當前分區信息
(parted) print# 2. 調整分區大小(注意:100%后不要添加任何注釋)
(parted) resizepart 2 100%# 3. 確認分區已擴展
(parted) print# 4. 退出parted
(parted) quit
關鍵操作截圖:
(parted) print # 執行前
Number Start End Size Type File system 標志
1 1049kB 1075MB 1074MB primary xfs 啟動
2 1075MB 30.0GB 28.9GB primary lvm(parted) resizepart 2 100% # 正確執行(parted) print # 執行后
Number Start End Size Type File system 標志
1 1049kB 1075MB 1074MB primary xfs 啟動
2 1075MB 53.7GB 52.6GB primary lvm
步驟5:更新分區表
# 強制內核重新讀取分區表
sudo partprobe -s /dev/sda
sudo udevadm settle# 確認分區已擴展
sudo fdisk -l /dev/sda
預期輸出:
設備 Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 104857599 51379200 8e Linux LVM
步驟6:擴展物理卷(PV)
# 強制物理卷使用整個分區空間
sudo pvresize /dev/sda2# 驗證PV大小
sudo pvdisplay /dev/sda2
檢查關鍵值:
PV Size
應接近53.7GBFree PE
應有大量空間
步驟7:擴展邏輯卷(LV)和文件系統
# 查看卷組可用空間
sudo vgdisplay centos | grep "Free"# 將所有空閑空間分配給根邏輯卷
sudo lvextend -l +100%FREE /dev/mapper/centos-root# 擴展XFS文件系統
sudo xfs_growfs /dev/mapper/centos-root# 驗證最終結果
df -h /
成功驗證
操作完成后,系統顯示:
[root@localhost ~]# df -h /
文件系統 容量 已用 可用 已用% 掛載點
/dev/mapper/centos-root 54G 17G 37G 32% /[root@localhost ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 8 7 3.914GB 260.4MB
Containers 8 4 6.741GB 18.13kB
根分區從17GB擴展到54GB,Docker存儲空間不足問題得到解決。
Parted交互模式詳解
什么是parted交互模式?
parted是一個磁盤分區工具,提供兩種使用方式:
- 命令行模式:
sudo parted /dev/sda resizepart 2 100%
- 交互模式:通過
sudo parted /dev/sda
進入,然后輸入命令
為什么使用交互模式?
- 更直觀:每一步操作都有明確提示
- 更安全:操作前可預覽更改
- 更靈活:支持多種磁盤操作命令
常用交互命令:
命令 | 功能 | 示例 |
---|---|---|
print | 顯示分區表 | (parted) print |
resizepart | 調整分區大小 | (parted) resizepart 2 100% |
rm | 刪除分區 | (parted) rm 3 |
mkpart | 創建新分區 | (parted) mkpart primary 30GB 100% |
quit | 退出交互模式 | (parted) quit |
關鍵要點
-
操作順序至關重要:
- 先擴展虛擬機磁盤
- 再擴展Linux分區
- 最后擴展LVM和文件系統
-
parted命令注意事項:
# 正確命令(簡潔無注釋) (parted) resizepart 2 100%# 錯誤命令(會導致失敗) (parted) resizepart 2 # 選擇要調整的分區(這里是分區2)
-
LVM擴展邏輯:
物理磁盤 → 分區 → 物理卷(PV) → 卷組(VG) → 邏輯卷(LV) → 文件系統
-
XFS文件系統特性:
- 支持在線擴展(無需卸載)
- 使用
xfs_growfs
命令擴展
常見問題解決方案
問題1:parted未安裝
# CentOS/RHEL
sudo yum install -y parted# Ubuntu/Debian
sudo apt-get update && sudo apt-get install -y parted
問題2:parted命令無效
# 確保使用正確語法
(parted) help resizepart # 查看命令幫助# 使用絕對路徑
/sbin/parted /dev/sda
問題3:空間未完全釋放
# 清理Docker無用數據
docker system prune -af# 清理系統日志
sudo journalctl --vacuum-size=200M
sudo rm -rf /var/log/journal/*
問題4:parted無法調整分區
使用fdisk替代方案:
# 備份分區表
sudo sfdisk -d /dev/sda > sda.bak# 進入fdisk交互模式
sudo fdisk /dev/sda# 在fdisk中執行:
d # 刪除分區
2 # 選擇分區2
n # 新建分區
p # 主分區
2 # 分區號2
2099200 # 起始扇區(必須相同!)
Enter # 使用默認結束位置(整個磁盤)
t # 更改類型
2 # 選擇分區2
8e # Linux LVM 類型
w # 寫入更改
總結
通過本指南,您成功實現了:
- parted工具的安裝與使用
- 虛擬機磁盤從30GB擴展到53.7GB
- Linux分區擴展到整個可用空間
- LVM物理卷和邏輯卷的擴展
- XFS文件系統的在線擴展
- Docker存儲空間不足問題的解決
經驗提示:在生產環境中操作前,務必對虛擬機進行快照備份,以防操作失誤導致數據丟失。parted交互模式雖然需要額外學習,但提供了更直觀和安全的分區管理方式。