Linux LVM管理

1、lvm相關概念和理論

參考資料:http://blog.51cto.com/nolinux/1350941

中文名 英文縮寫 英文全名 說明
物理卷 PV physical volumes 物理卷處於邏輯卷管理器中的底層,任何的邏輯卷和卷組都必需依靠物理捲來建立。物理卷可以是一個完整的硬盤,也可以是硬盤中的一個分區,並有一個名字 ( 如hdisk0)。
卷組 VG volume group 卷組是建立在物理卷之上的。一個卷組中可以包含一個物理卷或者多個物理卷。
邏輯卷 LV logical volumes 邏輯卷建立在卷組之上,卷組中的空間可以建立多個邏輯卷,並且邏輯卷可以隨意在卷組的空閒空間中增減,邏輯卷可以屬於一個卷組,也可以屬於不同的多個卷組。LV 是位於 PV 上的信息的組合,在 LV 上的數據可以連續或者不連續地出現在 PV。
卷組描述區域 VGDA Volume Group Descriptor Area 用於描述物理卷、卷組、邏輯卷分配的所由信息。和非 LVM 系統將包含分區信息的元數據保存在位於分區的起始位置的分區表中一樣,邏輯卷以及卷組相關的元數據也是保存在位於物理捲起始處的 VGDA( 卷組描述符區域 ) 中。
物理區段 PE physical extent 物理區域是物理卷中可用於分配的最小存儲單元(默認4M),物理區域大小在建立卷組時指定,一旦確定不能更改,同一卷組所有物理卷的物理區域大小需一致,新的pv加入到vg後,pe的大小自動更改爲vg中定義的pe大小。
邏輯區段 LE logical extent 邏輯區段是邏輯卷中可用於分配的最小存儲單元,邏輯區域的大小取決於邏輯卷所在卷組中的物理區域的大小。

一圖勝千言:
硬盤分區組成物理卷(官方建議整個盤分一個區),物理卷組成卷組,卷組分配空間給邏輯卷

在這裏插入圖片描述

下面用幾個範例給大家講解一下:

在這裏插入圖片描述

依舊是上面那個圖,我們從圖中能看到物理磁盤disk 0上的所有四個分區(/dev/hda[1-4])以及完整的物理磁盤1(/dev/hdb)和物理磁盤2(/dev/hdd)作爲物理卷添加到卷組VG0中。

卷組是實現n-to-m映射的關鍵(也就是,將n個PV看作m個LV)。在將PV分配給卷組之後,就可以創建任意大小的邏輯卷(只要不超過VG的大小)。在圖中,創建了一個稱爲LV0的邏輯卷,並給其他LV留下了一些空間(這些空間也可以用來應付LV0以後的增長)。

LVM中的邏輯卷就相當於物理磁盤分區。在實際使用中,它們就是物理磁盤分區。

在創建 LV 之後,可以使用任何文件系統對它進行格式化並將它掛載在某個掛載點上,然後就可以開始使用它了。上圖的下面顯示了一個經過格式化的邏輯卷LV0被掛載在/var。

通過上面的例子應該對邏輯卷的基本概念有了更加清晰的瞭解了。下面,我們要再對兩個概念進行深入瞭解,來爲後面更好的操作LVM做基礎。

區段

爲了實現n-to-m物理到邏輯卷映射,PV和VG的基本塊必須具有相同的大小。這些基本塊被稱爲物理區段(PE)和邏輯區段(LE)。儘管n個物理卷(PV)映射到m個邏輯卷(LV),但是物理區段(PE)和邏輯區段(LE)總是一對一映射的。

在使用 LVM時,對於每個 PV/LV 的最大區段數量並沒有限制。默認的區段大小是 4MB,對於大多數配置不需要修改這個設置,因爲區段的大小並不影響I/O性能。但是,區段數量太多會降低LVM的效率,所以可以使用比較大的區段,從而減少區段數量。

然而需要注意的是,在一個VG中不能混用不同的區段大小,而且用LVM修改區段大小是一種不安全的操作,會破壞數據,因此建議在初始設置時選擇一個合適的區段大小,以後不要更改。

由於不同的區段大小意味着不同的VG粒度,因此如果選擇的區段大小是4GB,那麼只能以4GB的整數倍進行縮小或擴展LV。

在這裏插入圖片描述

上圖是用PE和LE顯示的與前面示例相同的佈局(VG0中的空閒空間也由空閒LE組成,儘管圖中沒有顯示它們),整個圖展現了物理到邏輯區段的映射。

另外,我們需要注意上圖的區段分配策略。因爲LVM並非總是連續分配PE的,因此運維人員可以設置不同的分配策略,但是一般不需要這麼做,因爲默認策略(名爲一般分配策略(normal allocation policy))使用符合常規的規則,比如不把並行的條帶放在同一物理捲上。

大家想下,如果現在創建出第二個LV即LV1的話,最終的PE分配會是什麼樣子的呢?

在這裏插入圖片描述

最終的PE分配就如上圖一樣,中間增加的黃色色塊即爲新增加的LV即LV1的PE。這樣子,大家應該就能理解區段和區塊的關係了吧。

設備映射器

設備映射器(也稱爲dm_mod)是一個Linux內核模塊(也可以是內置的),它的作用是對設備進行映射 ——LVM的2.0以上版本必須使用這個模塊。通過下面的命令可以查看到該模塊。

# lsmod | grep dm_mod
dm_mod

在大多數主流發行版中,設備映射器會被默認安裝,常常會在引導時或者在安裝或啓用 LVM或EVMS包時自動進行裝載(EVMS是一種替代LVM的工具)。如果沒有啓用這個模塊,可以使用如下命令進行引導。

# modprobe dm_mod

注意:作爲運維人員,在創建VG和LV時,儘量使用便於理解記憶,標註其用途的名字進行命名,千萬不要像前面的VG0,LV0之類的。設備映射器的作用就是將這些名稱正確地映射到物理設備。

與物理磁盤相反,無法直接訪問卷組(這意味着沒有/dev/mapper/VG0這樣的文件,也不能執行dd if=/dev/VG0 of=dev/VG1)。

2、物理卷(Physical Volumes)管理

如果你想把整個磁盤創建成物理卷,首先要抹除磁盤上的分區信息

# dd if=/dev/zero of=PhysicalVolume bs=512 count=1

2.1、創建物理卷

所有lvm相關的命令都支持-v, -vv, -vvv, -vvvv參數來顯示不同級別的詳細信息,-vvvv顯示最詳細的信息。

對整塊盤

# pvcreate /dev/sdd /dev/sde /dev/sdf

對某個分區

# pvcreate /dev/hdb1

掃描下塊設備

# lvmdiskscan

Displaying物理卷信息

  • pvs命令:

以比較規整的格式顯示每個pv的詳細信息,方便使用腳本查詢並過濾信息。

pvs -a -o +devices
  • pvdisplay命令:

pvdisplay命令爲每個物理卷提供詳細的多行輸出。它以固定的格式顯示物理屬性(大小、區段、卷組等)。

  • pvscan命令:

pvscan命令掃描系統中所有支持的LVM塊設備的物理卷。

2.3、維護或準備刪除物理卷

如果發現有盤壞掉,或者準備刪除一個物理卷,可以提前做配置,阻止空閒空間分配到該物理捲上。

例如,不允許physical extents分配到磁盤/dev/sdk1:

# pvchange -x n /dev/sdk1

允許分配到該磁盤:

# pvchange -x n /dev/sdk1

2.4、resize/removing物理卷

pvresize

# pvresize /dev/sda2 目標大小
# pvresize --reportformat basic

pvmove

# pvremove /dev/ram15
完成後看下這個pv下是否還有數據
# pvs -o+pv_used

3、卷組(Volume Groups)

3.1、創建卷組

3.1.1、基本創建

# vgcreate vg1 /dev/sdd1 /dev/sde1

默認情況下,extent大小爲4M。你可以使用-s參數來指定不同的extent大小。
使用–alloc參數來指定不同的分配策略。

3.1.2、物理extent分配策略(LVM Allocation)

這部分,對於官方的文檔解釋看的不是很明白,先留下原文

normal 默認的方式

An allocation policy of normal will not choose a physical extent that shares the same physical volume as a logical extent already allocated to a parallel logical volume (that is, a different stripe or mirror image/leg) at the same offset within that parallel logical volume.

contiguous

An allocation policy of contiguous requires that the physical location of any logical extent that is not the first logical extent of a logical volume is adjacent to the physical location of the logical extent immediately preceding it.

cling

An allocation policy of cling requires that the physical volume used for any logical extent be added to an existing logical volume that is already in use by at least one logical extent earlier in that logical volume.

可以使用vgchange命令來改變物理extent分配策略。

3.1.3、支持在cluster環境創建vg

參考資料:LVM Logical Volumes in a Red Hat High Availability Cluster

# vgcreate -c n vg1 /dev/sdd1 /dev/sde1

3.2、Displaying卷組

vgscan命令

vgscan命令掃描所有磁盤的卷組,並重新構建LVM緩存文件,它還顯示卷組信息。

vgs命令

vgs命令以可配置的形式提供卷組信息,每個卷組顯示一行。vgs命令提供了大量的格式控制,對於腳本編寫非常有用。

vgs -a -o +devices

vgdisplay命令

vgdisplay命令以固定的形式顯示卷組屬性(例如大小、區段、物理卷的數量等)。如果不指定卷組,則顯示所有現有的卷組。

3.3、vg中添加刪除物理卷

添加:

# vgextend vg1 /dev/sdf1

如何從vg中刪除物理卷

第一步:看下準備刪除的pv是否在被lv使用

pvdisplay /dev/hda1

第二步:如果未使用直接vgreduce,若在使用 則使用pvmove把數據挪到其它vg

pvmove命令搬移PV中的資料(只限於同一VG中)。

# pvmove /dev/hda5 /dev/hda6   #將VG中pv hda5的內容搬移到hda6中
# pvmove /dev/hda5   #也可以這樣,lvm決定hda5的內容被複制到哪裏

第三步:vgreduce刪除

# vgreduce my_volume_group /dev/hda1

使用pvremove命令刪除物理卷也可以

如果從vg中移除一個有問題的pv時會報錯,加參數–removemissing 甚至–force

3.4、修改vg參數

修改vg00中只能有128個邏輯卷:

# vgchange -l 128 /dev/vg00

deactivate or activate 卷組

# vgchange -a n my_volume_group
# vgchange -a y my_volume_group

3.5、刪除vg

# vgremove officevg

3.6、分裂/合併 vg

split,原有vg test,新建vg new1

vgsplit test new1 /dev/sdb
  New volume group "new1" successfully split from "test"

split,原有vg test,new1 添加一個pv,當test裏面沒有pv的時候會自動刪除test這個vg

vgsplit test new1 /dev/sdc
  Existing volume group "new1" successfully split from "test"

vgmerge,下面把vg1合併到vgtest裏面,注意:vg1必須爲inactive狀態

命令:vgmerge -v vgtest vg1
[root@onetest ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree  
  centos   1   3   0 wz--n- <99.00g   4.00m
  vg1      1   0   0 wz--n- <40.00g <40.00g
  vg2      1   0   0 wz--n- <10.00g <10.00g
  vgtest   1   0   0 wz--n- <20.00g <20.00g
[root@onetest ~]# vgmerge -v vgtest vg1
    Checking for volume group "vg1"
    Checking for volume group "vgtest"
    Archiving volume group "vg1" metadata (seqno 2).
    Archiving volume group "vgtest" metadata (seqno 1).
    Writing out updated volume group
    Creating volume group backup "/etc/lvm/backup/vgtest" (seqno 2).
  Volume group "vg1" successfully merged into "vgtest"
[root@onetest ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree  
  centos   1   3   0 wz--n- <99.00g   4.00m
  vg2      1   0   0 wz--n- <10.00g <10.00g
  vgtest   2   0   0 wz--n-  59.99g  59.99g

3.7、重命名&備份&還原&遷移

重命名:

# vgrename vg1 new_volume_group

備份:

系統會自動備份lvm的元數據信息,默認存放在/etc/lvm/archive目錄下。可以修改配置文件/etc/lvm/lvm.conf來禁用/啓用備份、備份集存放位置等

還原:

參考官方 Recovering Physical Volume Metadata
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/logical_volume_manager_administration/mdatarecover

命令:vgcfgrestore VG1

遷移:

1)確保沒有用戶訪問卷組中活動捲上的文件,然後卸載邏輯卷。

使用vgchange命令的-a n參數將卷組標記爲非活動,以防止卷組是活動狀態。

vgchange -a n vgtest

2)源系統執行vgexport vgtest命令把vgtest的信息導出,文件默認存放在/etc/lvm/backup/vgtest

vgexport vgtest

pvscan命令可以看到vgtest的pv狀態爲is in exported

[root@onetest archive]# pvscan
  PV /dev/sda2   VG centos          lvm2 [<99.00 GiB / 4.00 MiB free]
  PV /dev/sdc    VG vg1             lvm2 [<10.00 GiB / <10.00 GiB free]
  PV /dev/sdd     is in exported VG vgtest [<20.00 GiB / <20.00 GiB free]
  PV /dev/sdb     is in exported VG vgtest [<40.00 GiB / <40.00 GiB free]
  PV /dev/sde                       lvm2 [20.00 GiB]
  Total: 5 [188.98 GiB] / in use: 4 [168.98 GiB] / in no VG: 1 [20.00 GiB]

3)把導出的文件以及pv對應的盤挪到新系統上後使用vgimport導入,並激活

vgimport vgtest
vgchange -a y vgtest

4、邏輯卷(Logical Volume)

4.1、創建邏輯卷

創建邏輯卷的順序:Linux分區/磁盤—物理卷(pv)—卷組(vg)—邏輯卷(lv)

4.1.1、創建線性邏輯卷(Linear Logical Volumes)**

1)創建一個名字爲testlv,從卷組vg1上分配50G大小。若-L後面不指定單位,默認單位是M

# lvcreate -L 50G -n testlv vg1

2)使用-l參數指定extents個數或按照百分比指定

分配1000個extent

# lvcreate -l 1000 -n testlv vgtest /dev/sdg1

分配vgtestg總空間的60%

# lvcreate -l 60%VG -n mylv vgtest

分配vgtest全部剩餘空間給yourlv

# lvcreate -l 100%FREE -n yourlv vgtest

分配vgtest中pv /dev/sdb的10%空間給mylv

lvcreate -l 10%PVS -n mylv vgtest /dev/sdb

3)在物理卷/dev/sda1的區段0到25之間創建一個線性邏輯卷,然後在區段100處繼續分配置邏輯卷,總共分配100個extents

# lvcreate -l 100 -n testlv testvg /dev/sda1:0-25:100-

4.1.2、創建條帶邏輯卷(Striped Volumes)

條帶化技術就是一種自動的將I/O的負載均衡到多個物理磁盤上的技術,將一塊連續的數據分成很多小部分並把他們分別存儲到不同磁盤上去。這就能使多個進程同時訪問數據的多個不同部分而不會造成磁盤衝突,而且在需要對這種數據進行順序訪問的時候可以獲得最大程度上的I/O 並行能力,從而獲得非常好的性能。

分配50G空間,指定兩個條帶pv,條帶大小爲64KB,命名爲gfslv

# lvcreate -L 50G -i 2 -I 64 -n gfslv vgtest

4.1.3、創建raid邏輯卷(RAID Logical Volumes)

LVM 支持 RAID0/1/4/5/6/10,使用比較廣泛的是raid5和raid10

RAID1

創建一個名爲my_lv 大小爲1G的raid1邏輯卷,-m參數指定mirrors副本數量,所有副本不能超過卷組下pv的數量,比如有2個pv,-m 只能爲1

# lvcreate --type raid1 -m 1 -L 10G -n lv_raid1 vgtest

RAID5 (至少需要2 stripes + 1 implicit parity drive)

raid5至少需要vgtest中有三個pv組建,-i參數指定stripes數量

lvcreate --type raid5 -i 2 -L 10G -n lv_raid5 vgtest

RAID6(至少需要3 stripes + 2 implicit parity drives)

raid6至少需要vgtest中有5個pv組建,-i參數指定stripes數量

lvcreate --type raid6 -i 3 -L 10G -n lv_raid6 vgtest

RAID10

raid10至少需要vgtest中有4個pv組建,-i參數指定stripes數量

lvcreate --type raid10 -i 2 -m 1 -L 10G --maxrecoveryrate 128 -n lv_raid10 vgtest

測試問題:虛擬機測試不成功,命令敲完後卡死

4.1.4、創建鏡像卷(Mirrored Volumes)

類似於raid1 可以設置不同的副本創建鏡像卷,但是raid卷只能創建在本地,不支持集羣。對於不支持raid的系統可以用鏡像卷。在做數據同步複製的時候也可以考慮使用鏡像卷。

創建一個50G大小,2份數據的鏡像卷,默認region大小是512KB,如果是集羣可能要根據邏輯卷大小設置region,參數-R

# lvcreate --type mirror -L 50G -m 1 -n mirrorlv vg0

備註:可以使用lvconvert 命令來修改鏡像卷的策略,詳見官網文檔。

4.1.5、創建預分配邏輯卷(Thinly-Provisioned Logical Volumes)

Thinly-Provisioned Logical Volumes核心思想是實際用多少空間,就動態分配多少空間,意味着你可以爲卷組上所有的邏輯卷分配的空間總和超過卷組總大小。這種策略類似vmwareworkstation添加的硬盤"不立即分配空間"。

# lvcreate -L 100M -T vgtest/mythinpool -V 1G -n lv_thinvolume

解釋:-L參數 爲“瘦池”指定大小100M

-T參數 在vgtest卷組下創建一個mythinpool的“瘦池”

-V參數 在mythinpool上分配1G空間

-n參數 邏輯卷名稱lv_thinvolume

可以看出爲lv分配的空間其實是可以超出pool的大小的。

4.1.6、快照邏輯卷(Snapshot Volumes)

快照邏輯卷比較好玩,在已經存在的邏輯捲上創建一些快照,可以方便的時候快照把文件恢復到之前的狀態。類似於虛擬機的快照功能或者docker的分層文件系統。

1)創建一個lv_test

lvcreate -L 2g -n lv_test vgtest

2)把lv_test創建爲xfs文件系統

mkfs.xfs /dev/vgtest/lv_test 

3)準備好掛載點,並掛載lv_test作爲原始可讀寫目錄

mkdir -p /backup/{lv_test,lv_snap1,lv_snap2}
mount /dev/vgtest/lv_test /backup/lv_test/ -onouuid,rw

4)創建快照邏輯卷lv_snap1
創建快照lv_snap1之前,先在目錄/backup/lv_test下存放文件lv_snap1.txt

echo snap1 > /backup/lv_test/lv_snap1.txt
lvcreate --size 100M --snapshot --name lv_snap1 /dev/vgtest/lv_test

5)創建快照邏輯卷lv_snap2
創建快照lv_snap2之前,先在目錄/backup/lv_test下存放文件lv_snap2.txt

echo snap2 > /backup/lv_test/lv_snap2.txt
lvcreate --size 100M --snapshot --name lv_snap2 /dev/vgtest/lv_test

6)掛載邏輯卷lv_snap1和lv_snap2,並驗證數據
驗證:/backup/lv_snap1目錄下有一個文件lv_snap1.txt,/backup/lv_snap2目錄下有兩個文件lv_snap1.txt、lv_snap2.txt

mount /dev/vgtest/lv_snap1 /backup/lv_snap1/ -onouuid,ro
mount /dev/vgtest/lv_snap2 /backup/lv_snap2/ -onouuid,ro

[root@onetest lv_test]# ls /backup/lv_snap1
lv_snap1.txt
[root@onetest lv_test]# ls /backup/lv_snap2
lv_snap1.txt  lv_snap2.txt

4.2、Displaying邏輯卷

lvs命令

以可配置的形式提供邏輯卷信息,每個邏輯卷顯示一行。lvs命令提供了大量的格式控制,對於腳本編寫非常有用。

查看設備狀況

# lvs -a -o +devices

lvdisplay命令

以固定的格式顯示邏輯卷屬性(例如大小、佈局和映射),默認顯示所有邏輯卷信息。可以顯示某個:

# lvdisplay -v /dev/vg00/lvol2

lvscan命令

掃描系統中的所有邏輯卷並列出它們。

4.3、刪除&重命名&合併快照&改參數

刪除邏輯卷

刪除之前先umount掛載目錄
# lvremove /dev/testvg/testlv

重命名邏輯卷

# lvrename /dev/vg02/lvold /dev/vg02/lvnew
或者
# lvrename vg02 lvold lvnew

邏輯卷修改參數

激活/禁用lv

激活
lvchange -a y vgtest/lv_test
禁用
lvchange -a n vgtest/lv_test

設置爲readonly

lvchange -pr vgtest/lv_test

合併快照卷
接着上面的測試,我把lv_snap2重新掛載爲可寫,然後添加文件test.txt,最後把lv_snap2合併到原始分支。再來個干擾項(lv_snap2裏面的文件刪除,lv_test裏面的文件刪除)

驗證1:lv_snap2是合併到lv_snap1還是lv_test? lv_test

驗證2:原始分支中的文件如何變化? lv_snap2中的文件覆蓋到lv_test中

設置測試環境:

umount /backup/lv_snap1/
umount /backup/lv_snap2/
mount /dev/vgtest/lv_snap1 /backup/lv_snap1/ -onouuid,rw
mount /dev/vgtest/lv_snap2 /backup/lv_snap2/ -onouuid,rw
rm /backup/lv_snap1/lv_snap1.txt
echo 123 > /backup/lv_snap2/test.txt
[root@onetest ~]# ls /backup/lv_snap1
[root@onetest ~]# ls /backup/lv_snap2
lv_snap1.txt  lv_snap2.txt  test.txt
[root@onetest ~]# ls /backup/lv_test

把lv_snap2合併到原始分支:lvconvert --merge vgtest/lv_snap2

# lvconvert --merge vgtest/lv_snap2
  Delaying merge since origin is open.
  Merging of snapshot vgtest/lv_snap2 will occur on next activation of vgtest/lv_test.
提示中看到合併到lv_test中,並發現lv_snap2消失,/backup/lv_test目錄下並無新增文件test.txt

重新激活下lv_test

[root@onetest ~]# lvchange -a n vgtest/lv_test
  Logical volume vgtest/lv_test contains a filesystem in use.
[root@onetest ~]# umount /backup/lv_test/
[root@onetest ~]# lvchange -a n vgtest/lv_test
  Logical volume vgtest/lv_snap1 contains a filesystem in use.
  Logical volume vgtest/lv_snap2 contains a filesystem in use.
  LV vgtest/lv_test has open 2 snapshot(s), not deactivating.
[root@onetest ~]# umount /backup/lv_snap1
[root@onetest ~]# umount /backup/lv_snap2
[root@onetest ~]# umount /backup/lv_test/
umount: /backup/lv_test/: not mounted
[root@onetest ~]# lvchange -a y vgtest/lv_test
[root@onetest ~]# vgchange -a n vgtest
[root@onetest ~]# vgchange -a y vgtest
[root@onetest ~]# mount /dev/vgtest/lv_test /backup/lv_test/ -onouuid,rw
[root@onetest ~]# mount /dev/vgtest/lv_snap1 /backup/lv_snap1/ -onouuid,rw
[root@onetest ~]# ls /backup/lv_test/
lv_snap1.txt  lv_snap2.txt  test.txt

可以看到lv_snap2中的文件成功覆蓋到lv_test中

4.4、擴展邏輯卷(Growing Logical Volumes)

把lv_test擴展到10G

# lvextend -L10G /dev/vgtest/lv_test

在原有容量上再添加1G空間

# lvextend -L+1G  /dev/vgtest/lv_test

和vgextend一樣,通過-l參數設置extents個數或者相應百分比來擴展,比如擴展VG上剩餘所有空間:

# lvextend -l +100%FREE /dev/vgtest/lv_test

4.5、縮容邏輯卷(Shrinking Logical Volumes)

縮容操作不支持GFS2和XFS文件系統。在使用lvreduce命令縮容時,如果邏輯捲上包含文件系統,強烈建議使用–resizefs。

把邏輯卷lv_test縮容到5GB

# lvreduce --resizefs -L 5G vgtest/lv_test

把邏輯卷lv_test減少100M空間

# lvreduce --resizefs -L -100M vgtest/lv_test
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章