邏輯卷(LVM:Logical Volume Management)是利用系統核心中的device-mapper(DM)機制,在實體儲存設備上建立一個抽象層,允許在其上建立邏輯存儲卷;相對于直接使用儲存設備增加了靈活性。
工作原理:
LVM是利用磁盤上的任意空間建構實體卷(PV);
實體卷由相同大小的實體單元(PE)組成;
将多個實體卷(PV)組成卷組(VG);
在卷組基礎上建構邏輯卷(LV);
邏輯卷由多個相等大小的邏輯單元(LE)組成 ;
邏輯卷對PE的使用和映射由DM的表傳入核心;
卷管理由使用者空間使用LVM工具進行;
卷管理是對位于實體卷首的LVM中繼資料(metadata)的修改;
邏輯卷的優勢:
部署靈活,支援線上調整大小和配置設定空間;裝置命名友善;
邏輯卷的建構結構:

現在比較常用的是LVM2版本
LVM的一般操作和管理辦法
一、PV的基本操作指令
二、VG的基本操作指令
三、LV的基本操作指令及擴充與縮小邏輯卷的詳細過程
四、LVM快照
一、PV的基本指令:pvchange pvck pvcreate pvdisplay pvmove pvremove pvresize pvs pvscan
pvcreate: pv建立指令, pv可以是由fdisk指令建立的帶有标志的分區建立,type 8e,也可以是直接沒有分區的磁盤建立。指令格式: pvcreate PhysicalVolume [PhysicalVolume...]
exam:
[root@localhost ~]# pvcreate /dev/xvdg
Physical volume "/dev/xvdg" successfully created
[root@localhost ~]# pvcreate /dev/xvde1
Physical volume "/dev/xvde1" successfully created
pvs pvdisplay : 顯示PV資訊,pvs隻是簡單的資訊,pvdisplay 顯示詳細資訊
pvmove 與pvremove
pvmove : 将一個塊磁盤上的資料移動另一塊磁盤,可以移動整個盤的資料,也可以移動指定extent範圍的資料。通過pvs -o+pv_used 可以顯示目前PV的使用情況,然後能過 pvmove Sou_Pv_Name Des_Pv_Name,就可以把資料移除,然後,通過vgreduce VG_NAME PV_NAME 把資料已經移除的pv在VG卷組中删除。
pvremove: 删除一個存在的實體卷,不管這個實體卷是否有卷組還是沒有。在pvremove後面直接接實體卷即可操作。
pvchange [選項] [參數] : 修改實體卷屬性
pvchange指令允許管理者改變實體卷的配置設定許可。如果實體卷出現故障,可以使用pvchange指令禁止配置設定實體卷上的PE。
-u : 生成新的UUID
-x : 是否允許配置設定PE
exam: pvchang –x n /dev/sdb1 #禁止配置設定‘/dev/sdb1’ 上的PE
pvck 與pvscan
pvscan : 掃描所有磁盤上的實體卷,包括屬于卷組和不恪屬于卷組
-d : 調試模式
-e : 僅顯示屬于輸出卷組的實體卷
-n : 僅顯示不屬于任何卷組的實體卷,這些實體卷是未被使用的
pvck : 檢查實體卷的LVM中繼資料的一緻性,中繼資料,指的是以ASCII的形式存儲,儲存了LVM卷組的詳細配置。
-d :調試模式
-v : 詳細資訊模式
--labelsector : 指定LVM卷标所在扇區
example:
二、VG的基本操作與指令
vgcreate : 建立一個LVM卷組,
-s : 指定卷組上實體卷的PE大小
指令格式 vgcreate VG_NAME pv…. example: vgcreate VG_DATA /dev/sdb1 /dev/sdc1
vgdisplay : 顯示vg詳細資訊,包括
-A 僅顯示活動卷組的屬性
vgs : 顯示VG的一些基本資訊
vgscan : 僅顯示找到的卷組的名稱和LVM中繼資料類型
三個指令顯示效果如下
vgextend :向已有卷組中添加實體卷,即擴充卷,指令文法很簡單,vgextend 卷組名 pv卷 即可
exam: vgextend VG_DATA /dev/sd#
vgreduce : 通過删除LVM卷組中的實體卷來減少卷組容量,文法: vgreduce [選項] [參數],不能删除lvm卷組中剩餘的最後一個實體卷。
-a : 如果指令行中沒有指定要删除的實體卷,則删除所有的空實體卷,如果使用pvmove移除了所有的資料,則可以用 –a來删除空的實體卷。
--removemissing : 删除卷組中丢失的實體卷,使卷組恢複正常狀态
vgchange : 修改卷組屬性,經常被用來設定卷組處于活動狀态或非活動狀态
-a[y|n] : 指定卷組處理活動狀态或非活動狀态,
卷組處于活動狀态時無法被删除,必須使用vgchange設定為非活動狀态後才能删除。
vgremove : 删除卷組 ,文法 vgremove VG_NAME
-f : 強制删除
當卷組中已經建立了邏輯卷時,vgremove需要進行确認删除,防止删除資料。
vgconver : 轉換卷組中繼資料格式,通用于轉換指定LVM卷組的中繼資料格式,通過把LVM1格式的卷組轉換無LVM2格式,轉換中繼資料前必須保證卷組處于非活動狀态,否則無法完成操作。example : vgconvert –M2 VG_NAME
三、LV的基本操作指令
lvcreate : 建立LVM的邏輯卷,文法: lvcreate [選項][參數] VG_NAME
-L : 指定邏輯卷的大小,機關為“kKmMgGtT”
-l : 指定邏輯卷的大小,但指定的是LE的個數,LE對應的是建立VG時PE,大小和PE一樣
lvdisplay : 顯示邏輯卷的屬性 ,用于顯示LVM邏輯卷的大小,讀寫狀态和快照資訊等
lvscan : 掃描邏輯卷及其對應的裝置
lvs : 顯示邏輯卷的資訊
lvextend : 擴充邏輯卷空間,lvextend線上擴充空間,整個過程對于應用程式來說是完全透明的。
-L : 指定邏輯卷的大小,機關為“kKmMgGtT”
-l : 指定邏輯卷的大小,但指定的是LE的個數
注意: 邏輯卷實體邊界的增加或減少不代表所挂載分區的檔案系統的邏輯邊界也同樣已經發生改變,在用上面的指令完成後,用df -h指令檢視挂載分區的大小結果還是顯示和以前一樣,沒有變化,因為檔案系統的分區邏輯邊界沒有發生改變,是以,必須用 resize2fs指令來擴充檔案系統邏輯邊界。如果分區本身有100G的空間,用上面的指令擴充10G後,整個分區的大小為110G,是以擴充檔案系統的過程如下幾步:
1.用lvexted 指令增加LVM的邏輯分區的實體邊界大小。
2.用指令lvs檢視目前邏輯分區lv邊界的大小
3.用 df –h 指令檢視目前挂載的分區大小
4.用resize2fs指令來擴大目前檔案系統分區的邊界,用df -h指令檢視當新檔案系統大小,操作如下:
resize2fs 還有一個選項 –p ,是指達到目前lv邏輯卷的實體邊界的最大邊界,即 resize2fs –p /PATH/TO/LV即可
lvreduce : 收縮邏輯卷空間,用法和lvextend 相反,收縮邏輯卷有可能會損壞資料,是以要有個确認過程。
注意:實際操作過程,如果沒有先縮小檔案系統的邏輯邊界就先縮小邏輯卷的邊界,就有很大可能會損壞資料,如果要縮小分區大小,操作過程如下:
1.用df -h指令檢視目前分區已使用的資料有多少,确定縮小後的容量是多少,一定不能小于已使用的資料,否則,資料會損壞。
2.先用umount解除安裝分區,然後用e2fsck指令檢查要縮小分區的檔案系統,确定檔案系統保持一至性,e2fsck –f /PATH/TO/lv 。
3. 用resize2fs 縮小檔案系統分區, resize2fs /PATH/TO/PV #G 注意,這裡#表示的是剩下的空間是多少G,不是減少的空間是多少,
4. 重新挂載,用df -h指令檢視目前檔案系統的空間是多少,用lvs指令檢視目前實體分區的容量是多少
5. 使用lvreduce 指令縮小目前分區的實體分區。然後用lvs檢視目前邏輯卷的空間,用pvs檢視目前剩餘實體卷的空間變化。過程如下
縮小分區一定要十分的注意,lvreduce指令後面-L 選項後面跟的參數有’-‘表示縮小的空間,如果沒有’-‘,表示剩餘的空間,一定不要弄錯,否則,一旦資料損壞,就可能會有嚴重後果,最好在進行操作前進行備份資料或使用快照功能。
lvresize : 調整邏輯卷空間大小,可以擴充,也可以縮小。使用選項也是-L 與-l ,然後用+ - 來表示增加或減少空間。用lvresize有可能導緻資料丢失,
lvremove : 删除邏輯卷,要删除邏輯卷必須先umount解除安裝後才能删除,否則是無法删除的。
LVM快照
寫時複制:當一個snapshot建立的時候,僅拷貝原始卷裡資料的中繼資料(meta-data)。建立的時候,并不會有資料的實體拷貝,是以,snapshot的建立幾乎是實時的,當原始卷上有寫操作執行時,snapshot跟蹤原始的改變,這個時候原始卷上将要改變的資料在改變之前被拷貝到snapshot預留的空間裡,是以這個原理的實作叫做寫時複制(copy-on-write)。
在寫操作寫入塊之前,cow将原始資料移動到snapshot空間裡,這樣就保證了所有的資料在snapshot建立時保持一至。而對于snapshot的讀操作,如果是讀取資料塊是沒有修改過的,那麼會将讀操作直接重定向到原始卷上,如果是要讀取已經修改過的塊,那麼就讀取拷貝到snapshot中的塊。
這樣,檔案的I/O流程有一個改變,那就是在檔案系統和裝置驅動之間增加了一個cow層,如下:
file I/0 –> filesystem –>CoW –> block I/O
采用cow做為快照的實作方式時,snapshot的大小并不需要和原始卷一樣大,其大小隻需要考慮: 1.從shapshot建立到釋放這段時間内,估計塊的改變量有多大;2 資料更新的頻率。一旦snapshot的空間記錄滿了原始卷塊變換的資訊,那麼這個snapshot立刻被翻譯,進而導緻這個snapshot無效。是以,非常重要的一點,一定要在snapshot的生命周期裡,做完你需要做的事情。如果snapshot隻是做為備份來建立的,那麼在建立快照時就做為隻讀最好,快照卷的建立要和原始卷在同一個卷組内,也就是,在vg裡有空閑的pe才能給這個卷組裡的邏輯卷建立快照。
建立快照:
lvcreate :
-s : 建立快照卷,如果不加s,那就是建立新的邏輯卷lv
-p r|w : 指定快照卷的權限,隻讀,讀寫
-n : 指定快照卷組名
文法: lvcreate –L # –n SLV_NAME –s –p r /PATH/TO/LV
-L : 指定快照卷的大小
這裡可以看到 Data% 顯示為0,表示快照點用的空間百分比,如果快照變化已經超過了快照空間的大小,那麼快照就會失效,是以,如果快照的空間和邏輯卷空間大小一樣或比之更大,那麼就不會出現快照卷失效的情況