邏輯卷(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,表示快照點用的空間百分比,如果快照變化已經超過了快照空間的大小,那麼快照就會失效,所以,如果快照的空間和邏輯卷空間大小一樣或比之更大,那麼就不會出現快照卷失效的情況