Orange的運維學習日記–28.Linux邏輯卷詳解
文章目錄
- Orange的運維學習日記--28.Linux邏輯卷詳解
- 為什么使用 LVM
- 基本概念
- 創建物理卷
- 創建卷組
- 創建邏輯卷
- 創建文件系統并掛載
- 清理 LVM 對象
- 擴展與縮減邏輯卷
- 擴展 LV
- 縮減 LV
- 調整文件系統大小
- 擴展 XFS 文件系統
- 擴展 EXT4 文件系統
- 縮減 EXT4 文件系統
- 邏輯卷快照
- 創建 RAID 邏輯卷
- 創建 RAID0 條帶卷
- 創建 RAID1 鏡像卷
為什么使用 LVM
物理分區方式雖然簡單,但存在以下不足
- 分區必須使用連續空間,擴展時經常需要借助額外工具進行掛載區間移動
- 難以跨多塊硬盤創建單一文件系統,受單盤容量限制
- 單盤故障將導致該分區上所有數據不可用
LVM 提供了一種邏輯抽象層,將多個物理設備合并為一個存儲池,實現靈活的動態擴展、縮減、快照及鏡像等功能
基本概念
LVM 由三個核心對象組成
- 物理卷(PV)
基于磁盤、分區或軟件 RAID 設備創建,存儲 LVM 元數據 - 卷組(VG)
將一個或多個 PV 聚合為一個邏輯存儲池,管理員可在池內劃分空間 - 邏輯卷(LV)
從 VG 中按需切分出的可掛載塊設備,類似于傳統分區
LVM 管理流程分為三步
- 在物理設備上創建 PV
- 將 PV 加入 VG
- 從 VG 上創建 LV
創建物理卷
創建 PV 時,LVM 會在設備開頭和結尾寫入元數據,建議新加設備、分區或 RAID 設備上執行
# 單個設備創建 PV
pvcreate /dev/sdb# 同時對多個設備創建 PV
pvcreate /dev/sd{c,d}# 查看所有 PV 列表
pvs# 檢查單個 PV 詳細屬性
pvdisplay /dev/sdb
在 PV 詳細信息中,你可以看到 PV 大小、可用物理擴展(PE)數量及 UUID 等關鍵信息
創建卷組
卷組是物理卷的集合,后續邏輯卷會從中分配空間
# 創建名稱為 webapp 的 VG,包含 /dev/sdb
vgcreate webapp /dev/sdb# 創建名稱為 dbapp 的 VG,包含 /dev/sdc 和 /dev/sdd
vgcreate dbapp /dev/sd{c,d}# 查看所有 VG 列表及其聚合容量
vgs# 查看卷組 dbapp 詳細信息
vgdisplay dbapp
在 vgdisplay 輸出中,重點關注 VG 大小(VSize)、空閑空間(VFree)和 PE 大小(默認 4MiB,可用 -s
調整)
創建邏輯卷
邏輯卷相當于傳統分區,支持跨盤、在線擴容、鏡像及快照等高級功能
# webapp VG 中創建 5G 大小的 LV,名稱為 webapp01
lvcreate -n webapp01 -L 5G webapp# dbapp VG 中創建 25G 跨盤 LV,名稱為 data01
lvcreate -n data01 -L 25G dbapp# 列出所有 LV 及其所屬 VG、大小等信息
lvs
邏輯卷有三種常見路徑
/dev/卷組名/邏輯卷名
/dev/mapper/卷組名-邏輯卷名
/dev/dm-數字
可通過 ls -l /dev/卷組名/邏輯卷名
查看對應映射
創建文件系統并掛載
在邏輯卷上創建文件系統與普通分區相同,可選 XFS、EXT4 等格式
# 使用 XFS 格式化
mkfs.xfs /dev/webapp/webapp01# 掛載至目標目錄
mount /dev/webapp/webapp01 /var/www/html
持久化掛載需在 /etc/fstab
中添加相應條目,保證重啟后自動掛載
清理 LVM 對象
刪除操作會清除所有數據,請務必確認無用后再執行
# 卸載掛載點
umount /dev/webapp/webapp01# 刪除 LV
lvremove /dev/webapp/webapp01 /dev/dbapp/data01# 刪除 VG
vgremove webapp dbapp# 刪除 PV
pvremove /dev/sd{b..d}
擴展與縮減邏輯卷
擴展 LV
當 VG 空間充足,需要在線為 LV 增加容量時使用
# 在 webapp01 上增加 2G 空間
lvextend -L +2G /dev/webapp/webapp01# 查看最新大小
lvs /dev/webapp/webapp01
縮減 LV
縮減前請確保文件系統先縮減且無活躍寫操作,避免數據損壞
# 從 webapp01 上減少 2G 空間
lvreduce -L -2G /dev/webapp/webapp01# 查看最新大小
lvs /dev/webapp/webapp01
調整文件系統大小
擴展 XFS 文件系統
XFS
只支持在線擴展,不支持在線縮減
# 擴展 LV 至 15G
lvextend -L 15G /dev/webapp/webapp01# 掛載點已掛載情況下在線擴容
xfs_growfs /var/www/html# 或者一并擴容 LV 和文件系統
lvextend -rL 20G /dev/webapp/webapp01
擴展 EXT4 文件系統
EXT4
支持在線擴展、離線縮減
# 擴展 LV 至 25G
lvextend -L 25G /dev/webapp/webapp01# 在線擴容文件系統
resize2fs /dev/webapp/webapp01# 或者一并擴容 LV 和文件系統
lvextend -rL 30G /dev/webapp/webapp01
縮減 EXT4 文件系統
縮減需提前卸載,且不能小于當前使用空間
- 卸載文件系統
- 檢查文件系統完整性
- 離線縮減文件系統至目標大小
- 縮減 LV
- 掛載并驗證
umount /var/www/html
e2fsck -f /dev/webapp/webapp01
resize2fs /dev/webapp/webapp01 10G
lvreduce -L 10G /dev/webapp/webapp01
mount /dev/webapp/webapp01 /var/www/html
邏輯卷快照
快照基于寫時復制機制,記錄原 LV 某一時刻數據狀態
# 創建容量 10G 快照,名稱 webapp01-snap1
lvcreate -s -n webapp01-snap1 -L 10G /dev/webapp/webapp01# 卸載原 LV 并掛載快照
umount /dev/webapp/webapp01
mount /dev/webapp/webapp01-snap1 /mnt/snapshot# 在快照上進行讀寫測試
echo hello world > /mnt/snapshot/hello.txt
cat /mnt/snapshot/hello.txt
快照可用作臨時備份或測試環境,還原后可選擇保留或刪除
創建 RAID 邏輯卷
創建 RAID0 條帶卷
條帶卷將數據分散寫入多個物理卷,提升并行讀寫性能,無冗余,任何一塊設備故障都會丟失數據
假設存在三個未使用的物理卷 /dev/sdb
、/dev/sdc
、/dev/sdd
,先將它們加入同一卷組
pvcreate /dev/sdb /dev/sdc /dev/sddvgcreate raidvg /dev/sdb /dev/sdc /dev/sdd
使用三條帶創建一個 30G 大小的邏輯卷,指定條帶數(-i)和條帶大小(-I)
lvcreate -n lv_stripe -L 30G -i3 -I64K raidvg
參數說明
-i3
:將數據分成 3 條帶,分別寫入三塊物理卷-I64K
:每條帶大小為 64KB,增大并行度需適配實際 I/O 大小
格式化并掛載
mkfs.xfs /dev/raidvg/lv_stripe
mount /dev/raidvg/lv_stripe /mnt/stripe
查看條帶卷分布
lsblk /dev/sd{b..d}
# 三個設備下都會出現同一個 lv_stripe 的映射
創建 RAID1 鏡像卷
鏡像卷將數據寫入兩塊或多塊物理卷,提供數據冗余,任一副本設備損壞后仍可讀取
假設存在兩個物理卷 /dev/sdb
、/dev/sdc
,先加入卷組
pvcreate /dev/sdb /dev/sdcvgcreate mirrorgroup /dev/sdb /dev/sdc
創建一個帶有 1 份鏡像的 5G 邏輯卷
lvcreate -n lv_mirror -L 5G -m1 mirrorgroup
參數說明
-m1
:每個數據塊有一份鏡像,共兩份副本- 若要兩份鏡像(總 3 份),可指定
-m2
格式化并掛載
mkfs.ext4 /dev/mirrorgroup/lv_mirror
mount /dev/mirrorgroup/lv_mirror /mnt/mirror
檢查鏡像狀態
lvs -o +devices mirrorgroup/lv_mirror
# 可見兩個物理設備各自映射相同 LV
卷```bash
lvcreate -n lv_mirror -L 5G -m1 mirrorgroup
參數說明
-m1
:每個數據塊有一份鏡像,共兩份副本- 若要兩份鏡像(總 3 份),可指定
-m2
格式化并掛載
mkfs.ext4 /dev/mirrorgroup/lv_mirror
mount /dev/mirrorgroup/lv_mirror /mnt/mirror
檢查鏡像狀態
lvs -o +devices mirrorgroup/lv_mirror
# 可見兩個物理設備各自映射相同 LV