LVM 技術介紹
LVM技術介紹 – 『 LINUX交流/中標普華專區 』 – 中天在線論壇 – Powered by Discuz!
LVM技術介紹
LVM – Logical Volume Manager 是Linux系統下最強大的磁盤管理技術之一.它將您從不得不思考物理容量中解脫出來,代之以邏輯形式來思考這些容量. 當您需要考慮如何替用戶數據和系統文件分配空間的時候,LVM可以讓您徹底忘記傳統的分區做法.
簡單地來說,LVM就是將眾多物理設備組合成一個大的虛擬設備,用戶只需思考如何在虛擬設備上做傳統的空間分配策略,而將物理設備的管理交由LVM自己去 處理.這個由物理設備組合所成的虛擬設備稱為卷組(Volume Group),簡稱為VG; 而用戶在卷組VG上所劃分的磁盤空間則稱為邏輯卷(Logical Volume),簡稱為LV; 而原始物理設備必須經過初始化處理才能加入卷組集合, 這種經過特別處理的原始設備或磁盤空間則稱為物理卷(Physical Volume),簡稱為PV.
LVM磁盤空間管理系統允許您在需要的時候重新調整大小, 這也就意味著在管理磁盤空間資源方面, 您將獲得極大程度的自由. 基本上這是很有誘惑力的, 但您應該留心硬盤出錯的情況, 如果您沒有在LVM管理中為出現這種情況而做好計劃,那麼您可能會丟失大量數據.
【基本術語】
PV – Physical Volume 物理卷,例如一個硬盤,或一個Software RAID設備; VG – Volume Group 卷組,將一組物理卷收集為一個管理單元; LV – Logical Volume 邏輯卷,等同於傳統分區,可看作便準的塊設備,以容納文件系統; PE – Physical Extent 物理塊,劃分物理卷的數據塊; LE – Logical Extent 邏輯塊,劃分邏輯卷的數據塊;
【LVM架構簡單示意圖】
一個物理卷(PV)包含許多物理延伸:
+—–[ Physical Volume ]—–+
| PE | PE | PE | PE | PE | PE |
+—————————–+
一個卷組(VG)包含一個或多個物理卷(PV):
+———[ Volume Group ]———-+
| +—-[PV]——+ +—–[PV]—–+ |
| | PE | PE | PE | | PE | PE | PE | |
| +————–+ +————–+ |
+———————————–+
邏輯卷(LV)在卷組(VG)的基礎上劃分文件系統:
+———–[Logical Volume]————+
| |<—/—>|<——–/home——>| |
| +———[ Volume Group ]———-+ |
| | +—-[PV]——+ +—–[PV]—–+ | |
| | | PE | PE | PE | | PE | PE | PE | | |
| | +————–+ +————–+ | |
| +———————————–+ |
+—————————————+
【物理塊PE的角色】 PE – Physical Extent
當建立卷組VG的時候可以指定指定PE數值(用-s參數),它的預設大小是4MB.PE是該卷組中每個物理卷將被劃分的最小單元,它具有可被LVM尋址的 唯一編號. 在LVM1中,因為每個邏輯卷最多只可容納65534個數據塊,所以從4MB大小的PE可推導出每個邏輯卷的最大容量為256GB,而LVM2 則取消了這些限制.
設置有大量數目的數據塊將會減慢工具, 但不會影響邏輯卷LV的I/O性能. 事實上物理塊PE的作用類似於ext2/ext3檔案系統的塊大小(Block Size), 因此可以把PE當作是VG的Block塊.
【邏輯塊LE的角色】 LE – Logical Extent
卷組VG的總體空間是由所屬物理卷PV的物理塊PE集合構成的,所有尚未分配使用的物理塊PE則放置在空閒物理塊池(free physical extent pool)中. 當執行 lvcreate 在一個卷組中創建邏輯卷LV時,其實就是通過分配空閒物理塊PE給邏輯塊LE來建立新邏輯卷空間的.
在LVM系統中,一個邏輯卷LV由若干個邏輯塊LE構成,而這些邏輯塊LE和物理塊PE之間通常也是一一對應(1:1)的, 也就是說每個LE都可以找到其對應的PE, 它們之間的關聯信息儲存在一個關係表(TranslationTable)中, 稱為”PE/LE對應表”. 這個關係表儲存在LVM磁盤上,只當卷組激活時才會被加載到內存中.
LVM系統自動創建並維護”PE/LE對應表”,在默認情況下按照PV在VG中的加入順序來分配空閒PE, 但也可以在lvextend命令中直接指定想要分配的物理卷.
【參考資源】
鳥哥Linux私房菜: http://linux.vbird.org/linux_basic/0610hardware.php#lvm IBM林彥明講座一: http://linux.vbird.org/somepaper/20050321-LVM-1.pdf IBM林彥明講座二: http://linux.vbird.org/somepaper/20050321-LVM-2.pdf LVM HOWTO(英文): http://tldp.org/HOWTO/LVM-HOWTO/ LVM (維基-英文): http://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux) LVM2 資源(英文): http://sources.redhat.com/lvm2/ – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - -
- – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - 3.2 LVM對系統的要求;
- – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - 【內核編譯選項】
現代Linux發行版基本上已經預設支持LVM, 內核2.6預設已經支持LVM2,但2.4內核則需打補丁才能支持到LVM2. 如果自己編譯內核,則需留意包括如下選項:
在2.4內核版本中: │Multi-device support (RAID and LVM) —> │ │
Multiple devices driver support (RAID and LVM)
在2.6內核版本中: │Device Drivers —> │ │Multi-device support (RAID and LVM) —> │ │
Multiple devices driver support (RAID and LVM) │ │ …(選擇上面主項目後,將會展開子項目,按照默認項目即可)
【磁盤分區類型】
可以直接在整個硬盤設備(如/dev/sdb)上創建物理卷(PV),但是該設備必須先清空舊的分區表信息,否則 pvcreate 命令會報錯失敗.也可以在現有的磁盤分區(如/dev/hda1)上創建物理卷, 但是該分區必須先指定為 Linux LVM(代碼為8e) 分區類型(LVM2無此限制).
如欲使用整個磁盤來創建物理卷(PV),須先清除舊分區表信息,可用如下命令清空分區表: dd if=/dev/zero of=/dev/sdb bs=1k count=1; #清空/dev/sdb的分區表; dd if=/dev/zero of=/dev/hda bs=1k count=1; #清空/dev/hda的分區表; dd if=/dev/zero of=/dev/hda1 bs=1k count=1; #清除/dev/hda1的頭部(保留分區表); dd if=/dev/zero of=/dev/hda2 bs=1k count=1; #清除/dev/hda2的頭部(保留分區表);
【卷組描述區】 VGDA – Volume Group Descriptor Area
使用 pvcreate 創建物理卷的過程,包括在磁盤(或分區)的頭部創建一個保留區塊, 用來儲存記錄LVM的屬性,這個區塊叫VGDA(卷組描述區 – Volume Group Descriptor Area). 其實執行 pvscan 命令也就是讀取此區塊的信息來判斷是否存在物理卷.
VGDA 是創建物理卷(PV)時在磁盤上保留的一塊空間, 通常在開頭處, 它包含描述該卷組VG的信息: 如邏輯卷(LV)列表, 物理卷(PV)列表, 以及物理延伸(PE)塊大小等等.每個物理捲至少有一個VGDA,通常卷組VG會分散儲存多個內容完全相同的VGDA. 例如: 如果卷組VG中只有一個物理卷PV, 那麼該物理卷PV上會有兩個VGDA; 若卷組VG有兩個物理卷,那麼第一個物理卷PV上會有兩個VGDA, 而另外一個物理卷PV上則會有1個VGDA, 也就是說總共會有三個VGDA.
在 LVM2 之前沒有專門用來刪除物理卷的 Linux 命令, 若要清除物理卷, 或令 pvscan 掃瞄不到, 就必須清除此區塊內容. 在 LVM2 可以用 pvremove 刪除物理卷,但必須先將該物理卷從所屬卷組中移除.
可以用前述 dd 命令來清空該物理卷所屬的磁盤或分區的頭部區塊(1K), 或者乾脆用 fdisk 等工具刪除該分區(或清除分區表). 但要留意的是, 僅僅刪除分區信息是不會清空VGDA磁盤區塊的, 而下次重新分區時若剛好分在相同的起點上, 就有機會重新讀出此區塊的VGDA而被認作物理捲了.不過如果舊的 VGDA 所記錄的卷信息不吻合新分區空間大小等信息的話,最好還是先清空該區塊, 或者用 pvcreate 重新創建物理卷.
相同的原理可用來實現 VGDA 的備份和恢復,例如當一個物理卷因VGDA損壞而無法加入卷組時, 就可以從同一個卷組的其他物理捲上複製VGDA(它們是相同的)即可完全恢復,但若從別的卷組的物理捲上複製VGDA,即使結構相同可令物理卷再次加入卷 組,也可能會喪失數據. – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - -
- – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - 3.3 操作LVM的序列命令集 – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – 設置LVM的基本步驟:
.1. 使用pvcreate工具在磁盤或分區上創建物理卷,將它納入LVM管理之下; .2. 使用vgcreate工具創建卷組,將一個或多個物理磁盤聯合成一個大的虛擬磁盤; .3. 使用lvcreate工具在卷組上創建邏輯卷,以便將它格式化為文件系統;
Linux有一序列用來建立,觀察和調整LVM目標的命令集,請參考如下表格:
物理卷(PV) 卷組(VG) 邏輯卷(LV)
創建 pvcreate vgcreate lvcreate
顯示 pvdisplay vgdisplay lvdisplay
掃瞄 pvscan vgscan lvscan
增加 vgextend lvextend
減少 vgreduce lvreduce
清空 pvmove
刪除 pvremove vgremove lvremove
resize pvresize lvresize
其中有些工具需特別留意:
pvmove 這個命令不是刪除物理卷(PV),而是將一個物理卷的PE移動到另一個物理卷 – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - -
[ 本帖最後由 chengkinhung 於 2007-8-10 21:51 編輯 ]
論壇模式 推薦 收藏 分享給好友 推薦到圈子 管理
TAG:
chengkinhung 發佈於2007-08-10 21:34:55
LVM 學習筆記(下) 3.4 創建物理卷的範例:
直接在硬盤設備上創建物理卷(PV): pvcreate /dev/sdb; pvcreate /dev/sdc; pvcreate /dev/sdd; pvcreate /dev/sde;
在磁盤分區(類型8e)上創建物理卷(PV): pvcreate /dev/hda1; pvcreate /dev/hdb1; pvcreate /dev/hdc1;
pvscan; #掃瞄看看剛創建的PV; – - – - – - – - – - – - – - – - – - – - – - – - – - -
PV /dev/hda1 lvm2 [80.00 GB]
PV /dev/hdc1 lvm2 [80.00 GB]
PV /dev/hdb1 lvm2 [80.00 GB]
Total: 3 [240.00 GB] / in use: 0 [0 ] / in no VG: 3 [240.00 GB]
- – - – - – - – - – - – - – - – - – - – - – - – - – -
pvdisplay /dev/hda1; #顯示物理卷信息; – - – - – - – - – - – - – - – - – - – - – - – - – - -
— Physical volume —
PV Name /dev/hda1
VG Name vg1
PV Size 80.00 GB / not usable 0
Allocatable yes
PE Size (KByte) 4096
Total PE 20479
Free PE 20479
Allocated PE 0
PV UUID sfEXEg-xYSz-NE3C-Timx-s0og-tyAh-Rgb3s6
- – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - -
3.5 創建卷組的範例:
vgcreate vg1 /dev/hda1; #創建包含一個物理卷的卷組; vgcreate vg2 /dev/hdb1 /dev/hdc1; #一個卷組可以包含多個物理卷;
vgscan; #掃瞄看看剛創建的卷組; – - – - – - – - – - – - – - – - – - – - – - – - – - -
Reading all physical volumes. This may take a while…
Found volume group “vg2″ using metadata type lvm2
Found volume group “vg1″ using metadata type lvm2
- – - – - – - – - – - – - – - – - – - – - – - – - – -
vgdisplay -v vg2; #顯示卷組vg2的信息; – - – - – - – - – - – - – - – - – - – - – - – - – - -
Using volume group(s) on command line
Finding volume group “vg2″
— Volume group —
VG Name vg2
System ID
Format lvm2
Metadata Areas 2
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 2
Act PV 2
VG Size 159.99 GB
PE Size 4.00 MB
Total PE 40958
Alloc PE / Size 0 / 0
Free PE / Size 40958 / 159.99 GB
VG UUID m2BEoc-liXS-h3dn-L4tH-ORF7-bG5p-Yx052h
— Physical volumes —
PV Name /dev/hdb1
PV UUID 6rdZod-Cprh-a9tS-zCK2-5DVx-hkFC-7ndR04
PV Status allocatable
Total PE / Free PE 20479 / 20479
PV Name /dev/hdc1
PV UUID 1coCsZ-BFCW-kYmJ-uCfG-jtol-WqjC-auA4zX
PV Status allocatable
Total PE / Free PE 20479 / 20479
- – - – - – - – - – - – - – - – - – - – - – - – - – -
vgextend vg1 /dev/hdd1; #將物理卷/dev/hdd添加到卷組vg1中; pvmove /dev/hdd1; #準備從卷組vg1中移除物理卷/dve/hdd,先騰空該物理卷的數據; vgreduce vg1 /dev/hdd1; #將物理卷/dev/hdd移出卷組vg1; – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - -
3.6 創建邏輯卷的範例: – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – lvcreate -L 100M -n lv1 vg1; lvcreate -L 500M -n lv2 vg1; lvcreate -L 100G -n lv1 vg2; lvcreate -L 500M -n lv2 vg2;
ls -l /dev/vg*; #創建邏輯卷(LV)後,會自動產生設備節點; – - – - – - – - – - – - – - – - – - – - – - – - – - – - /dev/vg1: total 0 lrwxrwxrwx 1 root root 19 Aug 8 01:08 lv1 -> /dev/mapper/vg1-lv1 lrwxrwxrwx 1 root root 19 Aug 8 01:09 lv2 -> /dev/mapper/vg1-lv2
/dev/vg2: total 0 lrwxrwxrwx 1 root root 19 Aug 8 01:08 lv1 -> /dev/mapper/vg2-lv1 lrwxrwxrwx 1 root root 19 Aug 8 01:10 lv2 -> /dev/mapper/vg2-lv2 – - – - – - – - – - – - – - – - – - – - – - – - – - – -
lvscan; #掃瞄看看剛創建的邏輯卷; – - – - – - – - – - – - – - – - – - – - – - – - – - – -
ACTIVE ’/dev/vg2/lv1′ [100.00 GB] inherit
ACTIVE ’/dev/vg2/lv2′ [500.00 MB] inherit
ACTIVE ’/dev/vg1/lv1′ [100.00 MB] inherit
ACTIVE ’/dev/vg1/lv2′ [500.00 MB] inherit
- – - – - – - – - – - – - – - – - – - – - – - – - – - -
lvdisplay /dev/vg2/lv1; #顯示邏輯卷信息; – - – - – - – - – - – - – - – - – - – - – - – - – - -
— Logical volume —
LV Name /dev/vg2/lv1
VG Name vg2
LV UUID 0Y3o6N-pVlw-gFd9-8zSH-nS0D-27eH-2u4GU4
LV Write Access read/write
LV Status available
# open 0
LV Size 100.00 GB
Current LE 25600
Segments 2
Allocation inherit
Read ahead sectors 0
Block device 253:1
- – - – - – - – - – - – - – - – - – - – - – - – - – -
lvdisplay vg2; #顯示卷組vg2中的所有邏輯卷信息; – - – - – - – - – - – - – - – - – - – - – - – - – - -
— Logical volume —
LV Name /dev/vg2/lv1
VG Name vg2
LV UUID 0Y3o6N-pVlw-gFd9-8zSH-nS0D-27eH-2u4GU4
LV Write Access read/write
LV Status available
# open 0
LV Size 100.00 GB
Current LE 25600
Segments 2
Allocation inherit
Read ahead sectors 0
Block device 253:0
— Logical volume —
LV Name /dev/vg2/lv2
VG Name vg2
LV UUID UkUiTC-BO5l-3om3-VY1N-6pG2-AWpe-6zKV8X
LV Write Access read/write
LV Status available
# open 0
LV Size 500.00 MB
Current LE 125
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:1
- – - – - – - – - – - – - – - – - – - – - – - – - – -
擴大空間: lvextend -L +500M vg1/lv1; #添加500M空間到邏輯卷vg1/lv1; e2fsck -f /dev/vg1/lv1; #先掃瞄一下掃瞄文件系統; resize2fs /dev/vg1/lv1; #擴大文件系統;
縮小空間: e2fsck -f /dev/vg1/lv1; #先掃瞄一下掃瞄文件系統; resize2fs /dev/vg1/lv1 700M; #縮小空間,新空間等於700M; lvreduce -L -200M vg1/lv1; #邏輯卷空間減少200M(因為原先的總空間為900M); lvreduce -L 700M vg1/lv1; #也可以直接將邏輯卷空間變更為700M; resize2fs /dev/vg1/lv1; #重新調整文件系統的空間;
注意: 可以不創建文件系統而直接使用邏輯卷LV,直接進行數據讀寫操作以提高性能. 也就是說可以將邏輯卷當作裸設備(raw device)來使用,例如有些數據庫系統就是利用這種方式來儲存資料. – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - -
3.7 其他LVM的操作範例: – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – 如欲保存數據,需先騰空相關物理卷的數據,例如: pvmove /dev/hda1; #騰空物理卷/dev/hda數據;
先刪除卷組中的所有邏輯卷: lvremove vg1/lv1; #刪除邏輯卷vg1/lv1; lvremove /dev/vg1/lv2; #刪除邏輯卷vg1/lv2; lvremove vg2/lv1; #刪除邏輯卷vg2/lv1;
將物理卷移出卷組: vgreduce vg2 /dev/hdb1; #從卷組中移出物理卷;
將物理卷加入卷組: vgextend vg2 /dev/hdb1; #將物理卷添加到卷組;
如果要刪除卷組,請按如下步驟: vgchange -a n vg1; #刪除卷組前需要先停止該卷組的活動狀態; vgremove vg1; #然後再刪除卷組;
注意: 如要刪除整個卷組,需先刪除該卷組的所有邏輯卷;
最後刪除物理卷: pvremove /dev/hda1; #此命令只在LVM2版本中才有;
維護操作步驟: vgscan; #掃瞄卷組的物理卷和邏輯卷狀態信息; vgchange -ay; #啟動LVM; vgchange -an; #停止LVM – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - -
3.8 LVM快照 – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – - – 快照(snapshot)是LVM所提供的一個非常有用的特性. 利用快照您可以凍結一個正在使用中的邏輯卷,然後製作一份凍結時刻的備份,這個備份是具有一致性的. 快照是特殊類型的邏輯卷, 它含有創建時刻所指定的原始邏輯卷的完整數據,因此您可以操作快照而無需擔心數據的變更令備份失效.
lsmod | grep dm; #使用snapshot需要內核模塊dm-snapshot; modprobe dm-snapshot; #如有需要,必須先加載此模塊;
建立邏輯卷vg1/lv1的快照: lvcreate -L500M -s -n sh1 vg1/lv1;
lvscan; #看看剛創建的快照; – - – - – - – - – - – - – - – - – - – - – - – - – - -
ACTIVE Original ‘/dev/vg1/lv1′ [1.00 GB] inherit
ACTIVE ’/dev/vg1/lv2′ [2.00 GB] inherit
ACTIVE ’/dev/vg1/lv3′ [3.00 GB] inherit
ACTIVE Snapshot ‘/dev/vg1/sh1′ [500.00 MB] inherit
- – - – - – - – - – - – - – - – - – - – - – - – - – -
快照卷無需做格式化步驟,可以直接將快照卷掛載,卸載等操作,而且操作完成後,可以立即刪除快照,因為快照不會自動更新,長久保留是沒有意義的:
lvremove /dev/vg1/sh1; #刪除快照;
注意: 創建快照卷的容量必須大於原始卷的實際數據總量(通常是1.1倍);
通常創建快照卷的主要目的是做備份用途, 可以寫一個簡單的備份腳本來自動創建快照, 然後掛載進行備份, 備份完成後又自動卸載和刪除. 因為快照的創建速度非常快, 所以使用快照來操作備份作業不僅可以解決一致性問題, 而且可以減少備份時間. 請參考如下代碼:
vi snapshot_backup.sh; #建立備份腳本; – - – - – - – - – - – - – - – - – - – - – - – - – - -
!/bin/bash
today=`date “+%Y%m%d”`; lvcreate -L1G -s -n sh1 /dev/vg1/lv1; mount /dev/vg1/sh1 /disk/vg1/sh1; tar -zcvf /tmp/snapshot_backup_$today.tar.gz /disk/vg1/sh1/*; umount /dev/vg1/sh1; lvremove -f /dev/vg1/sh1; – - – - – - – - – - – - – - – - – - – - – - – - – - – chmod 755 snapshot_backup.sh; #設置運行權限;
可以將此備份腳本設置成每天定時運行,就可當成是一個完整備份的方案.
