Linux下使用LVM(Logical Volume Manager)(一)

ForTechnology發表於2013-03-26
1 簡介

1.1 什麼是LVM?
LVM是 Logical Volume Manager(邏輯卷管理)的簡寫,它由Heinz Mauelshagen在Linux 2.4核心上實現,目前最新版本為:穩定版1.0.5,開發版 1.1.0-rc2,以及LVM2開發版。
與 傳統的磁碟與分割槽相比,LVM為計算機提供了更高層次的磁碟儲存。它使系統管理員可以更方便的為應用與使用者分配儲存空間。在LVM管理下的儲存卷可以按需 要隨時改變大小與移除(可能需對檔案系統工具進行升級)。LVM也允許按使用者組對儲存捲進行管理,允許管理員用更直觀的名稱(如"sales'、  'development')代替物理磁碟名(如'sda'、'sdb')來標識儲存卷。
1.2 為什麼使用LVM?
LVM通常用於裝備大量磁碟的系統,但它同樣適於僅有一、兩塊硬碟的小系統。
1.2.1 小系統使用LVM的益處
傳統的檔案系統是基於分割槽的,一個檔案系統對應一個分割槽。這種方式比較直觀,但不易改變:
1.不同的分割槽相對獨立,無相互聯絡,各分割槽空間很易利用不平衡,空間不能充分利用;
2.當一個檔案系統/分割槽已滿時,無法對其擴充,只能採用重新分割槽/建立檔案系統,非常麻煩;或把分割槽中的資料移到另一個更大的分割槽中;或採用符號連線的方式使用其它分割槽的空間。
3.如果要把硬碟上的多個分割槽合併在一起使用,只能採用再分割槽的方式,這個過程需要資料的備份與恢復。
當採用LVM時,情況有所不同:
1.硬碟的多個分割槽由LVM統一為卷組管理,可以方便的加入或移走分割槽以擴大或減小卷組的可用容量,充分利用硬碟空間;
2.檔案系統建立在邏輯捲上,而邏輯卷可根據需要改變大小(在卷組容量範圍內)以滿足要求;
3.檔案系統建立在LVM上,可以跨分割槽,方便使用;
1.2.2 大系統使用LVM的益處
在使用很多硬碟的大系統中,使用LVM主要是方便管理、增加了系統的擴充套件性。
在一個有很多不同容量硬碟的大型系統中,對不同的使用者的空間分配是一個技巧性的工作,要在使用者需求與實際可用空間中尋求平衡。
用 戶/使用者組的空間建立在LVM上,可以隨時按要求增大,或根據使用情況對各邏輯捲進行調整。當系統空間不足而加入新的硬碟時,不必把使用者的資料從原硬碟遷 移到新硬碟,而只須把新的分割槽加入卷組並擴充邏輯卷即可。同樣,使用LVM可以在不停服務的情況下。把使用者資料從舊硬碟轉移到新硬碟空間中去。
2 LVM構成
LVM的結構簡圖如下:
   hda1  hdc1  sdc     (PV:s  物理卷,一般為分割槽或整個硬碟)                        
      \   |   /                                                                    
       \  |  /                                                                     
       diskvg          (VG 卷組由物理卷組成)                                                       
       /  |  \                                                                  
      /   |   \                                                                 
  usrlv rootlv varlv   (LV:s 邏輯卷在卷組上建立)
    |      |     |                                                              
ext2  reiserfs  xfs   (建立在邏輯捲上的檔案系統)  
2.1 卷組volume group (VG)
卷組是LVM中最高抽象層,是由一個或多個物理卷所組成的儲存器池。
2.2 物理卷physical volume (PV)
典型的物理卷是硬碟分割槽,但也可以是整個硬碟或已建立的Software RAID 卷。
2.3 邏輯卷logical volume (LV)
邏輯卷相當於非LVM系統中的分割槽,它在卷組上建立,是一個標準的塊裝置,可以在其上建立檔案系統。
2.4 物理塊physical extent (PE)
物理卷按大小相等的“塊”為單位儲存,塊的大小與卷組中邏輯卷塊的大小相同。
2.5 邏輯塊logical extent (LE)
邏輯卷按“塊”為單位儲存,在一卷組中的所有邏輯卷的塊大小是相同的。
2.6 總述
例 子:有一個卷組VG1,它的物理塊大小為4MB。在這個卷組中為2個硬碟分割槽:/dev/hda1與/dev/hdb1,它們分別成為物理卷PV1與 PV2。物理卷將按4MB為單位分塊,如PV1與PV2分別可分為99與248塊。在VG1上建立邏輯卷,它的大小可在1至347(99+248)塊之 間。當建立邏輯卷時,會建立邏輯塊與物理塊的一一對映關係。
2.7 對映模式 (linear/striped)
在建立邏輯卷時,可以選擇邏輯塊與物理塊對映的策略:
1.線性對映-將把一定範圍的物理塊按順序分配給邏輯卷,如 LV的LE 1 – 99對映到PV1,LE 100 – 347對映到PV2。
2.交錯模式-將把邏輯塊交錯對映到不同的物理卷中,如 LV的LE 1對映為PV1的PE1,LE 2對映為PV2的PE1,LE 3對映為PV1的PE2...。這種方式可以提高邏輯卷的效能,但是採用這種方式建立的邏輯卷將不能在它們所在的物理卷中擴充套件。
2.8 Snapshots (快照)
LVM 提供了一個非常好的特性:snapshots。它允許管理員建立一個塊裝置:該裝置是一邏輯卷在某一時刻凍結的精確拷貝。這個特性通常用於批處理過程(如 備份)需要處理邏輯卷,但又不能停止系統。當操作完成時,snapshot裝置可以被移除。這個特性要求在建立snapshot裝置時邏輯卷處於相容狀 態。
3 LVM的一般操作
3.1 建立PV
為把一個磁碟或分割槽作為PV,首先應使用 pvcreate 對其初始化,如對IDE硬碟/dev/hdb,
"使用整個磁碟,
# pvcreate /dev/hdb
這將在磁碟上建立VG的描述符。
"使用磁碟分割槽,如/dev/hdb1。
使用fdisk 的t 命令把/dev/hda1的分割槽型別設為0x8e,然後執行:
# pvcreate /dev/hdb1
這將在分割槽/dev/hda1上建立VG的描述符。
PV初始化命令pvcreate的一般用法為:
pvcreate PV1 [ PV2 ... ]
它的引數可以是整個磁碟、分割槽,也可以是一loop裝置。
3.2 建立VG
在使用pvcreate 建立了PV後,可以用vgcreate 建立卷組,如有PV1、PV2分別是/dev/hda1與/dev/hdb1,使用
# vgcreate testvg /dev/hda1 /dev/hdb1
將建立一個名為testvg的卷組,它由兩個PV:/dev/hda1與/dev/hdb1組成。vgcreate的一般用法為:
# vgcreate [options]  VG_name  PV1 [PV2 ...]
其中的可選項包括設定VG最大支援的LV數、PE大小(預設為4MB)等。
注意:當使用devfs系統時,應使用裝置的全名而不能是Symbol Link,如對上例應為:
# vgcreate testvg /dev/ide/host0/bus0/target0/lun0/part1\
                  /dev/ide/host0/bus0/target1/lun0/part1
3.3 啟用VG
在被啟用之前,VG與LV是無法訪問的,這時可用命令:
# vgchange -a y  testvg
啟用所要使用的卷組。當不再使用VG時,可用
# vgchange -a n  testvg
使之不再可用。
vgchange可用來設定VG的一些引數,如是否可用( -a [y|n]選項)、支援最大邏輯卷數等。
3.4 移除VG
在移除一卷組前應確認卷組中不再有邏輯卷,首先休眠卷組:
# vgchange -a n testvg
然後可用vgremove移除該卷組:
# vgremove testvg
3.5 為VG增加新PV
當卷組空間不足時,可以加入新的物理捲來擴大容量,這時可用命令vgextend,如
# vgextend testvg /dev/hdc1
其中/dev/hdc1是新的PV,當然在這之前,它應使用pvcreate初始化。
3.6 從VG移除PV
在移除PV之前,應確認該PV沒用被LV使用,這可用命令pvdisplay檢視,如:
# pvdisplay /dev/hda1
--- Physical volume ---
PV Name               /dev/hda1
VG Name               testvg
PV Size               1.95 GB / NOT usable 4 MB [LVM: 122 KB]
PV#                   1
PV Status             available
Allocatable           yes (but full)
Cur LV                1
PE Size (KByte)       4096
Total PE              499
Free PE               0
Allocated PE          499
PV UUID               Sd44tK-9IRw-SrMC-MOkn-76iP-iftz-OVSen7
如這個PV仍在被使用,則應把資料傳移到其它PV上。在確認它未被使用後,可用命令vgreduce把它從VG中刪除,如:
# vgreduce testvg /dev/hda1
3.7 建立LV
在建立邏輯卷前,應決定LV使用哪些PV,這可用命令vgdisplay與pvdisplay檢視當前卷組與PV的使用情況。在已有的卷組上建立邏輯卷使用命令lvcreate,如:
# lvcreate -L1500 -ntestlv testvg
將在卷組testvg上建立一個1500MB的線性LV,其命名為testlv,對應的塊裝置為/dev/testvg/testlv。
# lvcreate -i2 -I4 -l100 -nanothertestlv testvg
將在卷組testvg上建立名為anothertestlv的LV,其大小為100LE,採用交錯方式存放,交錯值為2,塊大小為4KB。
如果需要LV使用整個VG,可首先用vgdisplay 查詢 Total PE 值,然後在執行lvcreate時指定,如:
# vgdisplay testvg | grep "Total PE"
Total PE              10230
# lvcreate -l 10230 testvg -n mylv
將使用卷組testvg的全部空間建立邏輯卷mylv。
在建立邏輯卷後,就可在其上建立檔案系統並使用它。
命令lvcreate的常用方法:
lvcreate [options]  -n 邏輯卷名  卷組名 [PV1 ... ]
其中的常用可選項有:
"-i Stripes :採用交錯(striped)方式建立LV,其中Stripes指卷組中PV的數量。
"-I Stripe_size :採用交錯方式時採用的塊大小(單位為KB),Stripe_size必須為2的指數:2N ,N=2,3...9。
"-l LEs :指定LV的邏輯塊數。
"-L size :指定LV的大小,其後可以用K、M、G表示KB、MB、GB。
"-s :建立一已存在LV的snapshot卷。
"-n name :為LV指定名稱。
3.8 刪除LV
為刪除一個邏輯卷,必須首先從系統解除安裝其上的檔案系統,然後可用lvremove刪除,如:
# umount /dev/testvg/testlv
# lvremove /dev/testvg/testlv
lvremove -- do you really want to remove "/dev/testvg/testlv"? [y/n]: y
lvremove -- doing automatic backup of volume group "testvg"
lvremove -- logical volume "/dev/testvg/testlv" successfully removed
3.9 擴充套件LV
為邏輯卷增加容量可用使用lvextend,即可以指定要增加的尺寸也可以指定擴容後的尺寸,如
# lvextend -L12G /dev/testvg/testlv
lvextend -- extending logical volume "/dev/testvg/testlv" to 12 GB
lvextend -- doing automatic backup of volume group "testvg"
lvextend -- logical volume "/dev/testvg/testlv" successfully extended
將擴大邏輯卷testlv的容量為12GB。
# lvextend -L+1G /dev/testvg/testlv
lvextend -- extending logical volume "/dev/testvg/testlv" to 13 GB
lvextend -- doing automatic backup of volume group "testvg"
lvextend -- logical volume "/dev/testvg/testlv" successfully extended
將為LV testlv再增大容量1GB至13GB。
為LV擴容的一個前提是:LV所在的VG有足夠的空閒儲存空間可用。
在為LV擴容之後,應同時為LV之上的檔案系統擴容,使二者相匹配。對不同的檔案系統有相對應的擴容方法。
3.9.1 ext2/ext3
除非核心已有ext2online 補丁,否則在改變ext2/ext3檔案系統的大小時應解除安裝它:
# umount /dev/testvg/testlv
# resize2fs /dev/testvg/testlv
# mount /dev/testvg/testlv /home
這裡假設testlv安裝點為/home。在es2fsprogs-1.19或以上版本中包含resize2fs命令。
在LVM發行包中有一個稱為e2fsadm的工具,它同時包含了lvextend與resize2fs的功能,如:
# e2fsadm -L+1G /dev/testvg/testlv
等價於下面兩條命令:
# lvextend -L+1G /dev/testvg/testlv
# resize2fs /dev/testvg/testlv
但使用者仍需首先解除安裝檔案系統。
3.9.2 reiserfs
與ext2不同,Reiserfs不必解除安裝檔案系統,如:
# resize_reiserfs -f /dev/testvg/testvl
3.9.3  xfs
SGI XFS檔案系統必須在安裝的情況下才可改變大小,並且要使用安裝點而不是塊裝置,如:
# xfs_growfs /home
3.10 縮小LV
邏輯卷可擴充套件同樣也可縮小,但應在縮小LV之前首先減小檔案系統,否則將可能導致資料丟失。
3.10.1 ext2/ext3
可以使用LVM的工具e2fsadm操作,如:
# umount /home
# e2fsadm -L-1G /dev/testvg/testvl
# mount /home
如果採用resize2fs,就必須知道縮少後卷的塊數:
# umount /home
# resize2fs /dev/testvg/testvl 524288
# lvreduce -L-1G /dev/testvg/testvl
# mount /home
3.10.2 reiserfs
在縮小reiserfs時,應首先解除安裝它,如:
# umount /home
# resize_reiserfs -s-1G /dev/testvg/testvl
# lvreduce -L-1G /dev/testvg/testvl
# mount -treiserfs /dev/testvg/testvl /home
3.10.3 xfs
無法實現。
3.11 在PV間轉移資料
若要把一個PV從VG中移除,應首先把其上所有活動PE中的資料轉移到其它PV上,而新的PV必須是本VG的一部分,有足夠的空間。如要把PV1:/dev/hda1上的資料移到PV2:/dev/sda1上可用命令:
# pvmove /dev/hdb1 /dev/sdg1
如果在該PV之上的LV採用交錯方式存放,則這個轉移過程不能被打斷。
建議在轉移資料之前備份LV中的資料。
3.12 系統啟動/關閉
"為使系統啟動時可自動啟用並使用LVM,可將以下幾行新增到啟動 rc 指令碼中:
/sbin/vgscan
/sbin/vgchange -a y
這些行將瀏覽所有可用的卷組並啟用它們。要注意的是,它們應在安裝卷組上的檔案系統操作之前被執行,否則將無法正常安裝檔案系統。
"在系統關機時,要關閉LVM,這可將以下這行新增到關機 rc 指令碼中,並確保它在卸裝了所有檔案系統後執行:
/sbin/vgchange -a n
4 磁碟分割槽問題
4.1 一個磁碟上的多個分割槽
LVM允許PV建立在幾乎所有塊裝置上,如整個硬碟、硬碟分割槽、Soft RAID:
# pvcreate /dev/sda1
# pvcreate /dev/sdf
# pvcreate /dev/hda8
# pvcreate /dev/hda6
# pvcreate /dev/md1
所以在一塊硬碟上可以有多個PV/分割槽,但一般建議一塊硬碟上只有一個PV:
"便於管理,易於處理錯誤
"避免交錯方式中效能下降。LVM不能辨別兩個PV是否在同一硬碟上,故當採用交錯方式時,會導致效能更差。
但在某些情況下可採用:
"把已存在的系統合併到LVM中。在一個只有少數硬碟的系統中,轉換為LVM時需在在各分割槽之間轉移資料。
"把一個大硬碟分給不同的VG使用。
當一個VG的有不同的PV在同一硬碟時,建立交錯方式的LV時應注意使用哪一個PV。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25897606/viewspace-757173/,如需轉載,請註明出處,否則將追究法律責任。

相關文章