LVM 邏輯卷管理 logical volume manager
--參考下面的文檔
# ls Red_Hat_Enterprise_Linux-5-Cluster_Logical_Volume_Manager-zh-CN.pdf
pv physical volume(物理卷) 把實際分區或設備划為pv , pv是lvm物理標記
vg volume group (卷組) 把pv組合成vg,相當於組合成lvm能夠使用一個大硬盤
lv logical volume (邏輯卷) 實際可以使用的lvm的設備,相當是把vg划分成可用的分區
pe physical extend (物理擴展)vg組成的最小單位,默認是4M,vg最大支持65535個pe,相當於是block
block devices --> PV --> VG --> LV (線型,條帶,鏡像) --> 格式化成文件系統 --->掛載使用
做成lvm的優勢:
1,可以靈活變動大小
2,可以自定義設備名(物理卷也可以改名,使用udev)
3,可以做線型(linear),條帶(stripe),鏡像(mirror)
4,可以做lvm快照
1,划分pv
# pvcreate /dev/md0
Physical volume "/dev/md0" successfully created
# pvcreate /dev/md1
Physical volume "/dev/md1" successfully created
# pvcreate /dev/md10
Physical volume "/dev/md10" successfully created
查看相關信息的命令 pvscan pvdisplay pvs
刪除pv的命令 pvremove /dev/md10
# pv
pvchange pvcreate pvmove pvresize pvscan
pvck pvdisplay pvremove pvs pv.sh
2,划分vg
# vgcreate vg01 /dev/md10
Volume group "vg01" successfully created
# vgextend vg01 /dev/md0
Volume group "vg01" successfully extended
# vgextend vg01 /dev/md1
Volume group "vg01" successfully extended
--補充:vgcreate -s 指定PE的大小
查看相關信息的命令vgscan vgdisplay vgs
# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 3 0 0 wz--n- 4.99G 4.99G
# vgreduce vg01 /dev/md0
Removed "/dev/md0" from volume group "vg01"
--vgreduce跟vgextend是相反的,是在vg里移除pv
移除vg的命令是vgremove,它是和vgcreate相反
3,把vg划分為邏輯卷(線性卷linear)
# lvcreate -L 1000M -n lv01 vg01 --L指定大小,n指定lv的名字
Logical volume "lv01" created
# lvcreate -l 250 -n lv02 vg01 --l指定PE的個數,n指定lv的名字
Logical volume "lv02" created
=======================
# lvcreate -L 1001M -n lv03 vg01 --指定為1001M,它會自動做成1004M,要是PE的倍數
Rounding up size to full physical extent 1004.00 MB
Logical volume "lv03" created
=======================
# ls /dev/vg01/ -l
lrwxrwxrwx 1 root root 21 May 7 14:14 lv01 -> /dev/mapper/vg01-lv01
lrwxrwxrwx 1 root root 21 May 7 14:15 lv02 -> /dev/mapper/vg01-lv02
# ls /dev/mapper/ -l
brw-rw---- 1 root disk 253, 0 May 7 14:14 vg01-lv01
brw-rw---- 1 root disk 253, 1 May 7 14:15 vg01-lv02
# mkfs.ext4 /dev/vg01/lv01
# mkfs.ext4 /dev/vg01/lv02
# mount /dev/vg01/lv01 /mnt/
# mount /dev/vg01/lv02 /media/
# df -h | tail -4
/dev/mapper/vg01-lv01
985M 18M 918M 2% /mnt
/dev/mapper/vg01-lv02
985M 18M 918M 2% /media
# echo '12345' > /mnt/1
# echo '678910' > /media/2
查看的相關參數為lvscan lvdisplay
# lvscan
ACTIVE '/dev/vg01/lv01' [1000.00 MB] inherit
ACTIVE '/dev/vg01/lv02' [1000.00 MB] inherit
移除lv使用lvremove
完全刪除lvm,就要先lvremove,再vgremove,最后pvremove
--------------------------------------------------------------------------------------------------
# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 3 2 0 wz--n- 4.99G 3.04G
# lvcreate -l 50%VG -n lv03 vg01 --創建lv03,大小為vg01的一半
# lvcreate -l 100%FREE -n lv04 vg01 --把剩下的所有空間都分配給新創建的lv04
# lvs --使用lvs驗證
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv01 vg01 -wi-ao 1000.00M
lv02 vg01 -wi-ao 1000.00M
lv03 vg01 -wi-a- 2.49G
lv04 vg01 -wi-a- 556.00M
--------------------------------------------------------------------------------------------------
使用lvremove把上面的四個卷給移除,再來創建條狀卷
# lvremove vg01 --移除四個卷
Do you really want to remove active logical volume lv01? [y/n]: y
Logical volume "lv01" successfully removed
Do you really want to remove active logical volume lv02? [y/n]: y
Logical volume "lv02" successfully removed
Do you really want to remove active logical volume lv03? [y/n]: y
Logical volume "lv03" successfully removed
Do you really want to remove active logical volume lv04? [y/n]: y
Logical volume "lv04" successfully removed
Volume group "lv01" not found
當您創建條狀邏輯卷時,請使用 lvcreate 命令的 -i 參數指定條帶的數目。這取決於邏輯卷要進行條帶化的物理卷數目。條帶的數目不能超過卷組中物理卷的數目(除非使用 --alloc anywhere 參數)
如果構成邏輯卷的基本物理設備的大小不同,條狀卷的最大容量由最小的基本設備決定。例如,在有兩個分支條狀卷中,其容量最大為較小設備的兩倍。在有三個分支的條狀卷中,其容量是最小設備的三倍。
條帶卷的大小由最小的PV和創建命令的-i參數(條帶數)來決定
以這個為例
PV VG Fmt Attr PSize PFree
/dev/md0 vg01 lvm2 a-- 2.00g 2.00g
/dev/md1 vg01 lvm2 a-- 1020.00m 1020.00m
/dev/md10 vg01 lvm2 a-- 2.00g 2.00g
1,因為我這有三個PV,所以用-i 3實現三個條帶;那么最大大小為1020*3=3060M
--創建條帶卷
# lvcreate -L 3060M -i3 -n stripe_lv_01 vg01
Logical volume "stripe_lv_01" created
可以對其格式化,再用dd和iostat來做測試(但測試的結果比較復雜,因為我是幾種不同的raid做的條帶卷)
---------------------------------------------------------------------------------------------------------------------
鏡像卷
當您創建一個鏡像卷時,您可使用 lvcreate 命令的 -m 參數來指定數據的備份數目。指定 -m1 生成一
個鏡像,也就是生成兩個文件系統副本:一個線性邏輯卷加上一個副本。同樣的,指定 -m2 會生成兩
個鏡像,也就是生成三個文件系統副本。
鏡像卷的大小由最小的PV和副本數(也就是-m后接的數字)來決定
以這個為例
PV VG Fmt Attr PSize PFree
/dev/md0 vg01 lvm2 a-- 2.00g 2.00g
/dev/md1 vg01 lvm2 a-- 1020.00m 1020.00m
/dev/md10 vg01 lvm2 a-- 2.00g 2.00g
1,如果-m 1,那么他會選md0和md10這兩個來做鏡像,所以最大大小為2G
2,如果-m 2,那么他會選這三個一起來做,最大大小為1020M
3,不能-m 3或者更大;因為我這里只有三個PV
--以下面的為例
# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb13 vg01 lvm2 a- 964.00M 964.00M
/dev/sdb14 vg01 lvm2 a- 964.00M 964.00M
/dev/sdb15 vg01 lvm2 a- 964.00M 964.00M
# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 3 0 0 wz--n- 2.82G 2.82G
8,再次創建鏡像卷,成功創建
# lvcreate -n lv_mirror -L 300M -m 1 vg01
Logical volume "lv_mirror" created
# ls /dev/mapper/
control vg01-lv_mirror_mimage_0 vg01-lv_mirror_mlog
vg01-lv_mirror vg01-lv_mirror_mimage_1
格式化這個鏡像卷,並掛載
# mkfs.ext3 /dev/mapper/vg01-lv_mirror
# mount /dev/mapper/vg01-lv_mirror /media/
# df -h
/dev/mapper/vg01-lv_mirror
291M 11M 266M 4% /media
測試鏡像卷可用性
# echo 123 > /media/123
# cat /media/123
123
破壞其中一個物理卷。
# dd if=/dev/zero of=/dev/sdb13
或者
# mkfs.ext3 /dev/sdb13
pvs 檢測出有物理卷被損壞,找不到uuid
但數據仍然可以正常訪問
# cat /media/123
123
可以對其格式化,再用dd和iostat來做測試(但測試的結果比較復雜,因為我是幾種不同的raid做的條帶卷)
關於三種卷之間的轉換
--把線性卷轉化成鏡像卷
lvconvert -m 1 vg01/lv_linear --速度較慢
--把鏡像卷轉化成線性卷
lvconvert -m 0 vg01/lv_mirror --速度較快
實現總結:
1,如果物理做了raid10,那么就可以不做條帶和鏡像卷了,只有線性卷就可以了
2,如果物理沒做raid,那么你希望提高IO性能或高可用,則可以使用條帶或鏡像卷
---------------------------------------------------------------------------------------------------------------------
lv的擴容
1,先考慮vg是否還有空間去擴容,如果沒有,那么要先擴容vg,使用vgextend(或者刪除其它的lv來釋放空間)
2,
# lvextend -L 1.5g /dev/vg01/lv01
Extending logical volume lv01 to 1.50 GB
Logical volume lv01 successfully resized
下面兩種寫法也可以
# lvextend -L +500M /dev/vg01/lv01
# lvextend -l +125 /dev/vg01/lv01
# df -h
/dev/mapper/vg01-lv01
985M 18M 918M 2% /mnt--查看已經掛載的大小,沒有變化
3,
# resize2fs /dev/vg01/lv01 --再使用這個命令去在線同步
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/vg01/lv01 is mounted on /mnt; on-line resizing required
Performing an on-line resize of /dev/vg01/lv01 to 393216 (4k) blocks.
The filesystem on /dev/vg01/lv01 is now 393216 blocks long.
# df -h
/dev/mapper/vg01-lv01
1.5G 18M 1.4G 2% /mnt --再次查看,已經掛載的lv擴大了,並且數據沒有影響
---------------------------------------------------------------------------------------------------------------------
lv的縮小(裁減)
做縮小操作之前,都要去驗證查看一下數據的大小,縮小時不要縮到比已經存在的數據量還要小(數據庫內的表空間縮小也是一樣要先查看已有數據大小)
# resize2fs /dev/vg01/lv01 1g --這樣去縮小的話,報錯已經mount了
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/vg01/lv01 is mounted on /mnt; on-line resizing required
On-line shrinking from 393216 to 262144 not supported.
# umount /mnt/
# resize2fs /dev/vg01/lv01 1g --umount后再使用resize2fs命令,要求先去e2fsck檢測
resize2fs 1.39 (29-May-2006)
Please run 'e2fsck -f /dev/vg01/lv01' first.
# e2fsck -f /dev/vg01/lv01
e2fsck 1.39 (29-May-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vg01/lv01: 12/192000 files (8.3% non-contiguous), 10517/393216 blocks
# resize2fs /dev/vg01/lv01 1g --檢測后再使用resize2fs命令縮小,並掛載查看大小是否縮小
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/vg01/lv01 to 262144 (4k) blocks.
The filesystem on /dev/vg01/lv01 is now 262144 blocks long.
# lvscan
ACTIVE '/dev/vg01/lv01' [1.50 GB] inherit --但這里查看的還是1.5g
ACTIVE '/dev/vg01/lv02' [1000.00 MB] inherit
# lvreduce -L 1g /dev/vg01/lv01 --所以lvreduce也要做
WARNING: Reducing active logical volume to 1.00 GB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv01? [y/n]: y
Reducing logical volume lv01 to 1.00 GB
Logical volume lv01 successfully resized
# lvscan
ACTIVE '/dev/vg01/lv01' [1.00 GB] inherit --OK
ACTIVE '/dev/vg01/lv02' [1000.00 MB] inherit
# mount /dev/vg01/lv01 /mnt/
# df -h
/dev/mapper/vg01-lv02
985M 18M 918M 2% /media --縮小了
-----------------------------------------------------------------------------------------------------------------------
lvm 快照功能 snapshot
1,快照創建的速度非常快,不需要停止生產環境
2,快照的大小是存儲差異數據,或是快照時間點的狀態,不需要和lv同大小
3,它可以用於一些特殊的情況,比如數據庫備份,或者批量復制虛擬機(不關閉虛擬機的情況下,克隆是需要關閉或暫停虛擬機的),虛擬機做快照等
實驗:
# dd if=/dev/zero of=/media/10m bs=1M count=10
# dd if=/dev/zero of=/media/20m bs=1M count=20
# dd if=/dev/zero of=/media/30m bs=1M count=30
# ls /media/ -l
total 61532
-rw-r--r-- 1 root root 10485760 May 7 15:18 10m
-rw-r--r-- 1 root root 20971520 May 7 15:18 20m
-rw-r--r-- 1 root root 31457280 May 7 15:18 30m
drwx------ 2 root root 16384 May 7 14:17 lost+found
# lvcreate -s -L 100m -n snap01 /dev/vg01/lv02 --L參數指定的大小不是快照大小,它類似於一個快照存活的時間(由源的改變來定義存活時間的長短。源增加多少,這個100M‘時間‘就會被使用多少,源刪除,這個100M時間只會被增加一點點,因為刪除只記錄它的一個innode失效。但注意,快照的內容不會跟着改變。(快照大小不能超過源lvm的大小)
Logical volume "snap01" created
# ls /dev/vg01/snap01
/dev/vg01/snap01
# mkdir /snap
# mount /dev/vg01/snap01 /snap/
# ls /snap/ --快照的內容
10m 20m 30m lost+found
# dd if=/dev/zero of=/media/50m bs=1M count=50
--在源目錄加一個50M的文件
# ls /snap/ --快照的內容不會跟着變
10m 20m 30m lost+found
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv01 vg01 -wi-ao 1.00G
lv02 vg01 owi-ao 1000.00M
snap01 vg01 swi-ao 100.00M lv02 50.48 --但是這個snap%會發現由幾乎為0變化到50%
--下面再可以繼續做試驗:
1,在源刪除一個文件,再使用lvs查看 %snap只會增加一點點
2,當%snap用完了100%,則快照失效。umount和mount快照都會出問題
3, 快照的內容不會跟着源改變
# lvremove /dev/vg01/snap01 --快照的移除
Do you really want to remove active logical volume snap01? [y/n]: y
Logical volume "snap01" successfully removed
