🐧 Linux LVM 與硬碟擴容完整教學:PV / VG / LV 擴充、縮減、線上擴容一次搞懂
很多人在 Linux 伺服器上跑一跑,突然發現:/var 快爆、/data 不夠、VM 磁碟要加大,才想到一開始分割磁碟分太小。 這時如果沒有使用 LVM(Logical Volume Manager),擴容就會變得非常痛苦。 本篇從 概念 → 建置 → 擴容 → 縮容 → 常見錯誤排查 一次講清楚,並示範 EXT4 / XFS 線上擴容 的實戰流程。
一、為什麼要用 LVM?傳統分割 vs LVM
傳統做法是在 /dev/sda 上用 fdisk 或 parted 做固定大小的分割區,例如:
/dev/sda1 → /boot
/dev/sda2 → /
/dev/sda3 → /var
/dev/sda4 → /home
缺點是:
- 一開始大小決定錯了,之後要調整就很麻煩。
- 新增一顆硬碟,只能再掛新分割區,沒辦法輕鬆「併入」原本的 /var 或 /data。
LVM 則是把磁碟想成「積木」:
- PV(Physical Volume):實體磁碟或分割區,例如
/dev/sda2、/dev/sdb。 - VG(Volume Group):容量池,把多個 PV 湊在一起,像一個「大的硬碟盆栽」。
- LV(Logical Volume):在 VG 上切出來的「邏輯分割」,可隨時增減容量,最後再格式化成 EXT4 / XFS 掛載。
🔎 簡化示意圖:傳統 vs LVM
【傳統分割】
/dev/sda
├─ /dev/sda1 → /
├─ /dev/sda2 → /var
└─ /dev/sda3 → /home
【LVM 架構】
/dev/sda2 /dev/sdb
│ │
└── PVs(Physical Volume)
│
└── VG:vg_data
├── LV:lv_var → /var
└── LV:lv_home → /home
當空間不夠時,你可以:
- 再加一顆硬碟變成新的 PV。
- 把 PV 加入同一個 VG → 擴大容量池。
- 再把某個 LV(例如
lv_var)往外長一點,線上擴容 檔案系統即可。
二、LVM 架構總覽:PV / VG / LV 關係
以下用一個典型例子說明:
# 假設你有兩顆磁碟
/dev/sda2 → 要拿來做 LVM
/dev/sdb → 新增硬碟,也要併進同一個 LVM
# 要達成的目標
/dev/vg_main/lv_root → /
/dev/vg_main/lv_var → /var
/dev/vg_main/lv_data → /data
邏輯圖如下:
/dev/sda2 /dev/sdb
│ │
└── PV0 └── PV1
│
└────── VG:vg_main
├── LV:lv_root → /
├── LV:lv_var → /var
└── LV:lv_data → /data
之後當 /data 不夠用,只要:
VG 增加容量 → LV 擴容 → 檔案系統線上擴容,就能完成,而不用搬家或重新分割。
三、建立 LVM:從磁碟到掛載點(一步一步)
1️⃣ 新增硬碟、建立分割區(若使用整顆磁碟可略過分割)
假設新硬碟為 /dev/sdb:
# 方式一:使用整顆磁碟做 PV(較簡單)
sudo pvcreate /dev/sdb
# 方式二:先切一個分割區再用(較彈性)
sudo fdisk /dev/sdb
# 建立 /dev/sdb1,type 設為 8e(Linux LVM)
sudo pvcreate /dev/sdb1
2️⃣ 建立 PV、VG、LV
# 建立 PV
sudo pvcreate /dev/sda2
sudo pvcreate /dev/sdb1 # 若有
# 建立 VG(容量池)
sudo vgcreate vg_main /dev/sda2
sudo vgextend vg_main /dev/sdb1 # 之後新增 PV 也用 vgextend
# 建立 LV(邏輯卷)
sudo lvcreate -L 20G -n lv_root vg_main
sudo lvcreate -L 50G -n lv_var vg_main
sudo lvcreate -L 100G -n lv_data vg_main
3️⃣ 格式化檔案系統並掛載
假設要使用 EXT4:
sudo mkfs.ext4 /dev/vg_main/lv_root
sudo mkfs.ext4 /dev/vg_main/lv_var
sudo mkfs.ext4 /dev/vg_main/lv_data
sudo mkdir -p /var /data
sudo mount /dev/vg_main/lv_var /var
sudo mount /dev/vg_main/lv_data /data
/etc/fstab 設定範例:
/dev/vg_main/lv_var /var ext4 defaults 0 2
/dev/vg_main/lv_data /data ext4 defaults 0 2
四、LVM 線上擴容:EXT4 / XFS 實戰範例
通常最常用的情境是:
新增硬碟 → 加入 VG → 擴充某個 LV → 線上擴容檔案系統。
以下以 /data 掛載在 /dev/vg_main/lv_data 為例。
步驟 1:確認現況
df -h
lsblk
sudo vgs
sudo lvs
步驟 2:新增 PV 並擴充 VG
# 新硬碟 /dev/sdc
sudo pvcreate /dev/sdc
# 把 /dev/sdc 加入現有 VG
sudo vgextend vg_main /dev/sdc
# 再看一次
sudo vgs
步驟 3:擴充 LV(不卸載、不中斷服務)
假設要讓 lv_data 再多 100G:
# 方式一:加上固定容量(+100G)
sudo lvextend -L +100G /dev/vg_main/lv_data
# 方式二:直接吃掉 VG 剩餘空間全部
sudo lvextend -l +100%FREE /dev/vg_main/lv_data
步驟 4:線上擴容檔案系統
EXT4:
# EXT4 可以在線上擴容(掛載狀態下)
sudo resize2fs /dev/vg_main/lv_data
df -h /data
XFS:
# XFS 用 xfs_growfs,且必須在掛載中的目錄上執行
sudo xfs_growfs /data
df -h /data
執行完後,/data 容量就會直接變大,對服務幾乎零停機。
五、LVM 縮容(特別危險):流程與風險
縮容永遠比擴容危險,建議原則是:
- 能不用縮容就不要用,改成新增一個新的 LV + rsync 搬資料比較安全。
- 縮容前一定要完整備份。
- XFS 不支援縮容,想縮只能改走「新 LV + 搬家」路線。
✅ EXT4 安全縮容流程(/data 為例)
- 停止相關服務(例如資料庫、NFS、Web 服務)。
- 卸載檔案系統。
- 檢查檔案系統。
- 先縮小檔案系統(必須先縮檔案系統再縮 LV)。
- 最後才縮小 LV。
# 1. 停止服務(以範例代替)
sudo systemctl stop nginx
sudo systemctl stop mysqld
# 2. 卸載
sudo umount /data
# 3. 檢查檔案系統
sudo e2fsck -f /dev/vg_main/lv_data
# 4. 先縮檔案系統(假設要縮到 200G)
sudo resize2fs /dev/vg_main/lv_data 200G
# 5. 再縮 LV
sudo lvreduce -L 200G /dev/vg_main/lv_data
# 6. 重新掛載並確認
sudo mount /data
df -h /data
如果你反過來(先縮 LV 再縮檔案系統),高機率直接毀損檔案系統。 這也是很多人對 LVM 縮容心生陰影的原因。
六、常見錯誤與排查:實務踩雷整理
1️⃣ device is busy:無法卸載
umount: /data: target is busy.
代表仍有人在使用該掛載點,可用:
sudo lsof +f -- /data
sudo fuser -vm /data # 列出使用中的 process
找出相關服務並停止,才重新 umount。
2️⃣ not enough free space in VG:VG 空間不夠
sudo lvextend -L +100G /dev/vg_main/lv_data
Insufficient free space: ...
用 vgs 查看:
sudo vgs
sudo pvs
如果 VFree = 0,代表 VG 的空間已用完,需要:
- 新增一顆磁碟建立 PV,再用
vgextend加進來。 - 或刪除其他不必要的 LV。
3️⃣ 忘記跑檔案系統擴容
有些人只做了 lvextend,結果 df -h 看起來容量沒變。
這是因為 檔案系統本身還沒長大。
# EXT4
sudo resize2fs /dev/vg_main/lv_data
# XFS
sudo xfs_growfs /data
4️⃣ Proxmox / 虛擬機擴容情境簡述
在虛擬化環境常見流程是:
- 先在 Proxmox 介面把 VM 的虛擬磁碟加大(例如由 100G → 150G)。
- 進入 VM 內部,用
lsblk確認虛擬磁碟已變大。 - 如果是 LVM 架構,再依照本文流程:
pvresize → lvextend → 檔案系統擴容。
# 在 VM 內部
sudo pvdisplay
sudo pvresize /dev/sda2 # 假設 PV 在 /dev/sda2
sudo lvextend -L +50G /dev/vg_main/lv_data
sudo xfs_growfs /data # 或 resize2fs
七、LVM 管理常用指令速查表
| 用途 | 指令範例 | 說明 |
|---|---|---|
| 查看 PV/VG/LV 狀態 | pvs / vgs / lvs |
快速總覽 LVM 目前配置與剩餘容量 |
| 建立 PV | pvcreate /dev/sdb |
將實體磁碟或分割區加入 LVM 世界 |
| 建立 VG | vgcreate vg_main /dev/sda2 |
建立容量池,之後 LV 都從這邊切 |
| 擴充 VG | vgextend vg_main /dev/sdb |
把新的 PV 併入同一個 VG |
| 建立 LV | lvcreate -L 50G -n lv_data vg_main |
從 VG 拿出指定容量形成 LV |
| 擴充 LV | lvextend -L +100G /dev/vg_main/lv_data |
讓 LV 往外長更大,檔案系統再線上擴容 |
| 縮小 LV(EXT4) | resize2fs → lvreduce |
先縮檔案系統再縮 LV,且必須卸載 |
🧭 實作行動清單
✅ 在測試環境中建立一個小型 VG + LV,熟悉基本指令(pvcreate / vgcreate / lvcreate)
✅ 練習一次「新增硬碟 → pvcreate → vgextend → lvextend → 檔案系統線上擴容」
✅ 針對 EXT4 在非關鍵資料集上做一次縮容實驗,理解正確順序與風險
✅ 在 Proxmox / 虛擬機環境實際操作一次:先在 Hypervisor 擴磁,再在 VM 內用 LVM 擴容
✅ 將目前 Production 主機的 LVM 拍快照與備份策略整理成文件(含 rollback 流程)
📘 結語:把磁碟當積木,才有調度空間
LVM 聽起來概念很多:PV / VG / LV、EXT4 / XFS、擴容與縮容順序,但一旦你在測試環境中走過幾次流程, 就會發現:它其實只是多了一層「彈性抽象」,讓你可以不用被當初的分割決定綁死。
尤其在 Proxmox 叢集、資料庫伺服器、Log / Backup 節點這種磁碟成長速度很快的場景, LVM 幾乎是必備技能。建議你先在非關鍵環境把本文的指令全部跑過一次,熟悉擴容與縮容流程, 再把這套流程寫成自己的「標準作業文件(SOP)」,之後就不會每次遇到硬碟爆掉都在救火。
🔗 延伸閱讀
- 🐧 Linux 檔案系統深入剖析:EXT4、XFS、Btrfs、ZFS 優缺點與實務選擇指南
- 🐧 Linux systemd 深入解析與啟動流程管理
- 🐧 Linux Nginx 反向代理實戰:HTTPS、負載平衡與後端服務整合
— WWFandy・Linux LVM 與磁碟擴容筆記
沒有留言: