1. LVM的工作原理 LVM( Logical Volume Manager)邏輯捲管理,是在磁碟分區和文件系統之間添加的一個邏輯層,來為文件系統屏蔽下層磁碟分區佈局,提供一個抽象的盤捲,在盤捲上建立文件系統。管理員利用LVM可以在磁碟不用重新分區的情況下動態調整文件系統的大小,並且利用LVM管理 ...
LVM的工作原理
LVM( Logical Volume Manager)邏輯捲管理,是在磁碟分區和文件系統之間添加的一個邏輯層,來為文件系統屏蔽下層磁碟分區佈局,提供一個抽象的盤捲,在盤捲上建立文件系統。管理員利用LVM可以在磁碟不用重新分區的情況下動態調整文件系統的大小,並且利用LVM管理的文件系統可以跨越磁碟,當伺服器添加了新的磁碟後,管理員不必將原有的文件移動到新的磁碟上,而是通過LVM可以直接擴展文件系統跨越磁碟。
它就是通過將底層的物理硬碟封裝起來,然後以邏輯捲的方式呈現給上層應用。在LVM中,其通過對底層的硬碟進行封裝,當我們對底層的物理硬碟進行操作時,其不再是針對於分區進行操作,而是通過一個叫做邏輯捲的東西來對其進行底層的磁碟管理操作。
1.1 LVM常用的術語
物理存儲介質(The physical media):LVM存儲介質可以是磁碟分區,整個磁碟,RAID陣列或SAN磁碟,設備必須初始化為LVM物理捲,才能與LVM結合使用。
物理捲PV(physical volume) :物理捲就是LVM的基本存儲邏輯塊,但和基本的物理存儲介質(如分區、磁碟等)比較,卻包含有與LVM相關的管理參數,創建物理捲它可以用硬碟分區,也可以用硬碟本身;
捲組VG(Volume Group) :一個LVM捲組由一個或多個物理捲組成
邏輯捲LV(logical volume) :LV建立在VG之上,可以在LV之上建立文件系統
PE(physical extents) :PV物理捲中可以分配的最小存儲單元,PE的大小是可以指定的,預設為4MB
LE(logical extent) : LV邏輯捲中可以分配的最小存儲單元,在同一個捲組中,LE的大小和PE是相同的,並且一一對應
最小存儲單位總結:
名稱 最小存儲單位
硬碟 扇區(512位元組)
文件系統 block(1K或4K )# mkfs.ext4 -b 2048 /dev/sdb1 ,最大支持到4096
raid chunk (512K) #mdadm -C -v /dev/md5 -l 5 -n 3 -c 512 -x 1 /dev/sde{1,2,3,5}
LVM PE (4M) # vgcreate -s 4M vg1 /dev/sdb{1,2}
LVM主要元素構成:
總結:多個磁碟/分區/raid-》多個物理捲PV-》合成捲組VG-》從VG划出邏輯捲LV-》格式化LV掛載使用
1.2 LVM優點
使用捲組,使多個硬碟空間看起來像是一個大的硬碟
使用邏輯捲,可以跨多個硬碟空間的分區 sdb1 sdb2 sdc1 sdd2 sdf
在使用邏輯捲時,它可以在空間不足時動態調整它的大小
在調整邏輯捲大小時,不需要考慮邏輯捲在硬碟上的位置,不用擔心沒有可用的連續空間
可以線上對LV,VG 進行創建,刪除,調整大小等操作。LVM上的文件系統也需要重新調整大小。
允許創建快照,可以用來保存文件系統的備份。
RAID+LVM一起用:LVM是軟體的捲管理方式,而RAID是磁碟管理的方法。對於重要的數據,使用RAID來保護物理的磁碟不會因為故障而中斷業務,再用LVM用來實現對捲的良性的管理,更好的利用磁碟資源。
2 創建LVM的基本步驟
1) 物理磁碟被格式化為PV,(空間被劃分為一個個的PE) #PV包含PE
2) 不同的PV加入到同一個VG中,(不同PV的PE全部進入到了VG的PE池內) #VG包含PV
3) 在VG中創建LV邏輯捲,基於PE創建,(組成LV的PE可能來自不同的物理磁碟) #LV基於PE創建
4) LV直接可以格式化後掛載使用 #格式化掛載使用
5) LV的擴充縮減實際上就是增加或減少組成該LV的PE數量,其過程不會丟失原始數據
2.1 lvm常用的命令
功能
PV管理命令
VG管理命令
LV管理命令
scan 掃描
pvscan
vgscan
lvscan
create 創建
pvcreate
vgcreate
lvcreate
display顯示
pvdisplay
vgdisplay
lvdisplay
remove 移除
pvremove
vgremove
lvremove
extend 擴展
vgextend
lvextend
reduce減少
vgreduce
lvreduce
下麵的操作會用的一些查看命令:
查看捲名
簡單對應捲信息的查看
掃描相關的所有的對應捲
詳細對應捲信息的查看
物理捲
pvs
pvscan
pvdisplay
捲組
vgs
vgscan
vgdisplay
邏輯捲
lvs
lvscan
lvdisplay
2.2 創建並使用LVM邏輯捲
創建PV
添加一個sdb磁碟
[root@xuegod63 ~]# fdisk /dev/sdb #創建4個主分區,每個分區1G
[root@xuegod63 ~]# ls /dev/sdb*
/dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb4
設定分區類型代碼:fdisk /dev/sdb ===> t ===> 選擇分區號 ====> 8e ====> w
註:現在系統已經很智能了, 直接使用預設的 83 Linux分區,也可以創建pv的。
[root@xuegod63 ~]# pvcreate /dev/sdb{1,2,3,4} #創建pv
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdb2" successfully created.
Physical volume "/dev/sdb3" successfully created.
Physical volume "/dev/sdb4" successfully created.
[root@xuegod63 ~]# pvdisplay /dev/sdb1 #查看物理捲信息
"/dev/sdb1" is a new physical volume of "1.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 1.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID SHKFwf-WsLr-kkox-wlee-dAXc-5eL0-hyhaTV
創建vg捲組:
語法: vgcreate vg名字 pv的名字 可以跟多個pv
[root@xuegod63 ~]# vgcreate vg01 /dev/sdb1
Volume group "vg01" successfully created
[root@xuegod63 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 1 0 0 wz--n- 1020.00m 1020.00m
[root@xuegod63 ~]# vgdisplay vg01
--- Volume group ---
VG Name vg01
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 1020.00 MiB
PE Size 4.00 MiB
Total PE 255
Alloc PE / Size 0 / 0
創建LV
lvcreate -n 指定新邏輯捲的名稱 -L指定lv大小的SIZE(M,G) (-l:小l 指定LE的數量) vgname
[root@xuegod63 ~]# lvcreate -n lv01 -L 16M vg01
Logical volume "lv01" created.
[root@xuegod63 ~]# lvcreate -n lv02 -l 4 vg01
Logical volume "lv02" created.
[root@xuegod63 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv01 vg01 -wi-a----- 16.00m
lv02 vg01 -wi-a----- 16.00m
[root@xuegod63 ~]# pvdisplay /dev/sdb1
--- Physical volume ---
PV Name /dev/sdb1
VG Name vg01
PV Size 1.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 255
Free PE 247
Allocated PE 8 # Allocated ['æləkeɪtɪd] 分配 ,已經使用了8個PE
[root@xuegod63 ~]# vgdisplay vg01
Alloc PE / Size 8 / 32.00 MiB #已經使用8個PE,32MB
Free PE / Size 247 / 988.00 MiB
2.3 文件系統格式與掛載
[root@xuegod63 ~]# mkdir /lv01
[root@xuegod63 ~]# ls /dev/vg01/ #查看邏輯捲
lv01 lv02
[root@xuegod63 ~]# ll /dev/vg01/lv01 #其實lv01是dm-0的軟鏈接
lrwxrwxrwx 1 root root 7 5月 18 19:02 /dev/vg01/lv01 -> ../dm-0
[root@xuegod63 ~]# mkfs.ext4 /dev/vg01/lv01
[root@xuegod63 ~]# mount /dev/vg01/lv01 /lv01
[root@xuegod63 ~]# df -Th /lv01
文件系統 類型 容量 已用 可用 已用% 掛載點
/dev/mapper/vg01-lv01 ext4 15M 268K 14M 2% /lv01
[root@xuegod63 ~]#echo "/dev/vg01/lv01 /lv01 ext4 defaults 0 0" >> /etc/fstab
2.3 指定PE大小用
指定PE大小用的參數: -s ,如果存儲的數據都是大文件,那麼PE儘量調大,讀取速度快
[root@xuegod63 ~]# vgcreate -s 16M vg02 /dev/sdb2
Volume group "vg02" successfully created
PE的大小隻有為2的冪數,且最大為512M
[root@xuegod63 ~]# vgdisplay vg02
--- Volume group ---
VG Name vg02
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 1008.00 MiB
PE Size 16.00 MiB #已經是16MB
2.4 LV擴容
首先,確定一下是否有可用的擴容空間,因為空間是從VG裡面創建的,並且LV不能跨VG擴容
[root@xuegod63 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 1 2 0 wz--n- 1020.00m 988.00m
vg02 1 0 0 wz--n- 1008.00m 1008.00m
用的命令如下:
擴容邏輯捲
[root@xuegod63 ~]# lvextend -L +30m /dev/vg01/lv01
說明:在指定大小的時候,擴容30m和擴容到30m是不一樣的寫法
擴容30m ====> -L +30M
擴容到30m =====> -L 30M
[root@xuegod63 ~]# lvextend -L +30m /dev/vg01/lv01
Rounding size to boundary between physical extents: 32.00 MiB.
Size of logical volume vg01/lv01 changed from 16.00 MiB (4 extents) to 48.00 MiB (12 extents).
Logical volume vg01/lv01 successfully resized.
[root@xuegod63 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv01 vg01 -wi-ao---- 48.00m #LV已經擴容成功
lv02 vg01 -wi-a----- 16.00m
[root@xuegod63 ~]# df -Th /lv01
文件系統 類型 容量 已用 可用 已用% 掛載點
/dev/mapper/vg01-lv01 ext4 15M 268K 14M 2% /lv01
註:可以看到LV雖然擴展了,但是文件系統大小還是原來的,下麵開始擴容文件系統
ext4文件系統擴容使用命令語法: resize2fs 邏輯捲名稱
xfs文件系統擴容使用命令語法: xfs_growfs 掛載點
resize2fs和xfs_growfs 兩者的區別是傳遞的參數不一樣的,xfs_growfs是採用的掛載點;resize2fs是邏輯捲名稱,而且resize2fs命令不能對xfs類型文件系統使用
[root@xuegod63 ~]# resize2fs /dev/vg01/lv01
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vg01/lv01 is mounted on /lv01; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/vg01/lv01 is now 49152 blocks long.
[root@xuegod63 ~]# df -Th /lv01
文件系統 類型 容量 已用 可用 已用% 掛載點
/dev/mapper/vg01-lv01 ext4 46M (擴容成功)522K 43M 2% /lv01
[root@xuegod63 ~]# lvextend -L 80M -r /dev/vg01/lv01 #直接擴容到80M空間,一步到位,不用再擴文件系統了
[root@xuegod63 ~]# df -T /lv01/
文件系統 類型 1K-塊 已用 可用 已用% 掛載點
/dev/mapper/vg01-lv01 ext4 78303 776 73761 2% /lv01
[root@xuegod63 ~]# df -Th /lv01/
文件系統 類型 容量 已用 可用 已用% 掛載點
/dev/mapper/vg01-lv01 ext4 77M 776K 73M 2% /lv01
2.5 VG擴容
[root@xuegod63 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 1 2 0 wz--n- 1020.00m 924.00m
vg02 1 0 0 wz--n- 1008.00m 1008.00m
vg擴容的場景:vg捲組中的空間不了夠,需要添加新的硬碟進來
[root@xuegod63 ~]# pvcreate /dev/sdb3 # 創建pv
[root@xuegod63 ~]# vgextend vg01 /dev/sdb3 #擴容成功
Volume group "vg01" successfully extended
[root@xuegod63 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 2 2 0 wz--n- 1.99g <1.90g
vg02 1 0 0 wz--n- 1008.00m 1008.00m
2.6 LVM縮小
LVM可以動態增加,可以動態縮小嗎?
答:LVM可以動態增加,也可以動態縮小,但是XFS不支持動態縮小,所以我們無法實現基於xfs的動態縮小。btrfs文件系統支持線上縮小。
[root@xuegod63 ~]# lvreduce -L -20m /dev/vg01/lv01
WARNING: Reducing active and open logical volume to 60.00 MiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg01/lv01? [y/n]: y
Size of logical volume vg01/lv01 changed from 80.00 MiB (20 extents) to 60.00 MiB (15 extents).
Logical volume vg01/lv01 successfully resized. #縮小成功
但是文件系統沒有縮小成功:
[root@xuegod63 ~]# df -h /lv01/
文件系統 容量 已用 可用 已用% 掛載點
/dev/mapper/vg01-lv01 77M 776K 73M 2% /lv01 #發現文件系統上空間沒有變
[root@xuegod63 ~]# lvextend -L 10M -r /dev/vg01/lv01 #這兩個命令也是不能執行成功的
[root@xuegod63 ~]# resize2fs /dev/vg01/lv01 #這兩個命令也是不能執行成功的
備註:VG的縮減,要保證你的物理捲是否被使用,是因為它無法縮減一個正在使用的PV
[root@xuegod63 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 2 2 0 wz--n- 1.99g <1.92g
vg02 1 0 0 wz--n- 1008.00m 1008.00m
[root@xuegod63 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 vg01 lvm2 a-- 1020.00m 944.00m
/dev/sdb2 vg02 lvm2 a-- 1008.00m 1008.00m
/dev/sdb3 vg01 lvm2 a-- 1020.00m 1020.00m
/dev/sdb4 lvm2 --- 1.00g 1.00g
[root@xuegod63 ~]# cp -r /boot/grub /lv01/ #複製一些測試數據
[root@xuegod63 ~]# vgreduce vg01 /dev/sdb1 #將sdb1移出失敗,因sdb1正在被使用
Physical volume "/dev/sdb1" still in use
擴展:如果sdb1是一個磁碟陣列,而這個磁碟陣列使用年代太久,我們必須移出怎麼辦?
移動數據:
[root@xuegod63 ~]# pvmove /dev/sdb1 /dev/sdb3 #將sdb1上數據移到新增加sdb3 pv 上
/dev/sdb1: Moved: 23.53%
/dev/sdb1: Moved: 76.47%
/dev/sdb1: Moved: 100.00%
[root@xuegod63 ~]# vgreduce vg01 /dev/sdb1 #移完數據再移出
Removed "/dev/sdb1" from volume group "vg01"
[root@xuegod63 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 lvm2 --- 1.00g 1.00g
/dev/sdb2 vg02 lvm2 a-- 1008.00m 1008.00m
/dev/sdb3 vg01 lvm2 a-- 1020.00m 952.00m #vg01中只有sdb3了
2.7 LVM刪除
創建LVM流程:
pvcreate創建pv -> vgcreate創建捲組 -> lvcreate創建邏輯捲 -> mkfs.xfs lv 格式化-> mount掛載
刪除LVM流程:
umount卸載 -> lvremove lv移出捲組中所有邏輯捲-> vgremove vg移出捲組-> pvremove 移出pv
[root@xuegod63 ~]# umount /lv01
[root@xuegod63 ~]# lvremove /dev/vg01/lv01
Do you really want to remove active logical volume vg01/lv01? [y/n]: y
Logical volume "lv01" successfully removed
[root@xuegod63 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv02 vg01 -wi-a----- 16.00m #已經看不到lv01
[root@xuegod63 ~]# vgremove vg01 #直接移出捲組
Do you really want to remove volume group "vg01" containing 1 logical volumes? [y/n]: y
Do you really want to remove active logical volume vg01/lv02? [y/n]: y
#如果捲組中還有lv,移出時,會提示,是否也移出,咱們這裡直接移出
Logical volume "lv02" successfully removed
Volume group "vg01" successfully removed
[root@xuegod63 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg02 1 0 0 wz--n- 1008.00m 1008.00m #沒有vg01
移出pv sdb1
[root@xuegod63 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 lvm2 --- 1.00g 1.00g
/dev/sdb2 vg02 lvm2 a-- 1008.00m 1008.00m
/dev/sdb3 lvm2 --- 1.00g 1.00g
/dev/sdb4 lvm2 --- 1.00g 1.00g
[root@xuegod63 ~]# pvremove /dev/sdb1 #已經移出
Labels on physical volume "/dev/sdb1" successfully wiped.
[root@xuegod63 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb2 vg02 lvm2 a-- 1008.00m 1008.00m
/dev/sdb3 lvm2 --- 1.00g 1.00g
/dev/sdb4 lvm2 --- 1.00g 1.00g