熱門分類
載入中…
目錄0%

🐧 Linux LVM 與硬碟擴容完整教學:PV / VG / LV 擴充、縮減、線上擴容一次搞懂

    🐧 Linux LVM 與硬碟擴容完整教學:PV / VG / LV 擴充、縮減、線上擴容一次搞懂

    很多人在 Linux 伺服器上跑一跑,突然發現:/var 快爆、/data 不夠、VM 磁碟要加大,才想到一開始分割磁碟分太小。 這時如果沒有使用 LVM(Logical Volume Manager),擴容就會變得非常痛苦。 本篇從 概念 → 建置 → 擴容 → 縮容 → 常見錯誤排查 一次講清楚,並示範 EXT4 / XFS 線上擴容 的實戰流程。

    一、為什麼要用 LVM?傳統分割 vs LVM

    傳統做法是在 /dev/sda 上用 fdiskparted 做固定大小的分割區,例如:

    /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 為例)

    1. 停止相關服務(例如資料庫、NFS、Web 服務)。
    2. 卸載檔案系統。
    3. 檢查檔案系統。
    4. 先縮小檔案系統(必須先縮檔案系統再縮 LV)。
    5. 最後才縮小 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 / 虛擬機擴容情境簡述

    在虛擬化環境常見流程是:

    1. 先在 Proxmox 介面把 VM 的虛擬磁碟加大(例如由 100G → 150G)。
    2. 進入 VM 內部,用 lsblk 確認虛擬磁碟已變大。
    3. 如果是 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)」,之後就不會每次遇到硬碟爆掉都在救火。


    🔗 延伸閱讀

    — WWFandy・Linux LVM 與磁碟擴容筆記

    🔗 分享這篇 LINE Facebook X

    沒有留言:

    字級