1. 程式人生 > 實用技巧 >Linux LVM管理機制

Linux LVM管理機制

Linux LVM管理機制

lvmsnap

歡迎來到 來到大浪濤天的部落格

一、Linux LVM管理機制

1. Linux LVM 介紹

LVM是 Logical Volume Manager(邏輯卷管理)的簡寫,它是Linux環境下對磁碟分割槽進行管理的一種機制。LVM是利用了Linux核心中的dm模組,將底層的一個或多個裝置組織成一個邏輯塊的模組,注意RAID是利用核心的md模組。
LVM的卷的原始目錄是在/dev/dm-#,因為我們不好區分所以有兩個軟連結路徑分別為:

  • /dev/mapper/VG_NAME-LV_NAME
  • /dev/VG_NAME/LV_NAME

2. Linux LVM 的源由

在對未來的業務無法預知的情況下,直接使用fdisk分割槽掛載的話,隨著時間的推移,資料量越來越大,硬碟空間越來越小,要想擴充容量的話,就必須掛載新硬碟然後做資料遷移,這就必然導致前臺業務的停止,不符合企業需求,因此完美的解決方法應該是在零停機前提下可以自如對檔案系統的大小進行調整,可以方便實現檔案系統跨越不同磁碟和分割槽。Linux提供的邏輯盤卷管理(LVM,Logical Volume Manager)機制就是一個完美的解決方案。LVM邏輯卷管理通過將底層物理硬碟抽象封裝起來,以邏輯卷的形式表現給上層系統,邏輯卷的大小可以動態調整,而且不會丟失現有資料。新加入的硬碟也不會改變現有上層的邏輯卷,大大提高了磁碟管理的靈活性。

3. Linux LVM 的機制


LVS機制原理圖

3-1. Linux相關術語如下:

  1. 物理儲存介質(The physical media):這裡指系統的儲存裝置:硬碟,如:/dev/hda、/dev/sda等等,是儲存系統最低層的儲存單元。
  2. 物理卷(physical volume):物理卷就是指硬碟分割槽或從邏輯上與磁碟分割槽具有同樣功能的裝置(如RAID),是LVM的基本儲存邏輯塊,但和基本的物理儲存介質(如分割槽、磁碟等)比較,卻包含有與LVM相關的管理引數。
  3. 卷組(Volume Group):LVM卷組類似於非LVM系統中的物理硬碟,其由物理卷組成。可以在卷組上建立一個或多個“LVM分割槽”(邏輯卷),LVM卷組由一個或多個物理卷組成。
  4. 邏輯卷(logical volume):LVM的邏輯卷類似於非LVM系統中的硬碟分割槽,在邏輯卷之上可以建立檔案系統(比如/home或者/usr等)。
  5. PE(physical extent):每一個物理卷被劃分為稱為PE(Physical Extents)的基本單元,具有唯一編號的PE是可以被LVM定址的最小單元。PE的大小是可配置的,預設為4MB。
  6. LE(logical extent):邏輯卷也被劃分為被稱為LE(Logical Extents) 的可被定址的基本單位。在同一個卷組中,LE的大小和PE是相同的,並且一一對應。

3-2. Linux LVM原理

  1. 一塊硬碟(物理儲存介質)被格式化為物理卷(physical volume),其內部被分成若干個可以自定義大小的儲存塊的PE(physical extent)。
  2. PV的基礎上建立卷組(Volume Group),可以把一個或者多個PV加到VG中,VG就好像一個空間池,假如多少個PV,VG就有多大的容量。
  3. 最後基於VG建立邏輯卷(logical volume),一個邏輯卷就是若干個LE。
  4. 將LV格式化再掛載(將LV當成是分割槽),這個就是我們日常使用的卷,格式化的過程當然也是整個儲存空間劃分block和inode的過程。

4. Linux LVM相關的命令

4-1. PV管理相關的命令:

  1. pvcreate:建立pv卷。
[root@test01 ~]# pvcreate /dev/sdb1
  1. pvdisplay:詳細顯示pv的資訊,可以直接pvdisplay,也可以後面跟裝置,單獨顯示某裝置的詳細資訊。
[root@test01 ~]# pvdisplay  /dev/sde
  "/dev/sde" is a new physical volume of "2.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sde
  VG Name               
  PV Size               2.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               7E0Xej-RZUE-uUZt-psed-53dF-N2oW-TBwG0Y
  1. pvmove:移除裝置上的pe,用於vgreduce掉vg中的裝置前的操作,如:
[root@test01 ~]# pvmove /dev/sdb1
  No data to move for myvg
  1. pvremove:刪除pv卷
[root@test01 ~]# pvremove /dev/sde
  Labels on physical volume "/dev/sde" successfully wiped.
  1. pvs:簡要顯示pv的資訊。
[root@test01 ~]# pvs
  PV         VG                 Fmt  Attr PSize  PFree 
  /dev/sde                      lvm2 ---   2.00g  2.00g
  [root@test01 ~]# pvs /dev/sde
  PV         VG Fmt  Attr PSize PFree
  /dev/sde      lvm2 ---  2.00g 2.00g

4-2. VG管理工具相關命令

  1. vgdisplay:顯示vg的詳細資訊,和pvdisplay類似,如:
[root@test01 ~]# vgdisplay myvg
  --- Volume group ---
  VG Name               myvg
  System ID             
  Format                lvm2
  Metadata Areas        3
  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                3
  Act PV                3
  VG Size               <5.99 GiB
  PE Size               4.00 MiB
  Total PE              1533
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1533 / <5.99 GiB
  VG UUID               9hA9hh-Mz3x-pJsK-b27b-wEKk-9dQH-29bRiI
  1. vgextend:新增未使用的裝置來擴充套件vg池,例如:
[root@test01 ~]# vgextend myvg /dev/sde1
  Volume group "myvg" successfully extended
[root@test01 ~]# vgs myvg
  VG   #PV #LV #SN Attr   VSize VFree
  myvg   4   0   0 wz--n- 7.98g 7.98g
  1. vgs:顯示vg的簡要資訊,和pvs類似,如:
[root@test01 ~]# vgs
  VG                 #PV #LV #SN Attr   VSize  VFree 
  centos_centos7-tmp   1   2   0 wz--n- 30.30g  4.00m
  myvg                 3   0   0 wz--n- <5.99g <5.99g
  1. vgcreate:建立vg,常用引數-s 指定pe的大小,-s後面直接加數字及單位(M,m,K,k,G,g),例如
[root@test01 ~]# vgcreate myvg -s 4M /dev/sdb1 /dev/sdc1 /dev/sdd1
  Volume group "myvg" successfully created
  1. vgreduce:移除vg池中的裝置,記住移除前必須先將此裝置上的pe移走,具體命令如下:
[root@test01 ~]# pvmove /dev/sdb1
  No data to move for myvg
[root@test01 ~]# vgreduce myvg /dev/sdb1
  Removed "/dev/sdb1" from volume group "myvg"      

4-3. LV的管理工具相關命令

  1. lvcreate:lvcreate -L #[mM,gG,tT] -n name volumegroup,lv建立完成後可以直接格式化並使用。
[root@test01 ~]# lvcreate -L 1g -n mylv-test myvg
  Logical volume "mylv-test" created.                                                  
[root@test01 ~]# lvs /dev/myvg/mylv-test 
  LV        VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv-test myvg -wi-a----- 1.00g      
  1. lvextend:lvextend -L [+]#[mM,gG,tT] /dev/myvg/mylv-test,注意帶+代表擴充套件多少,不帶+表示,擴充套件到多少。擴充套件的步驟,先擴充套件物理邊界,然後再擴充套件邏輯邊界,例如:
[root@test01 ~]# lvextend -L +1G /dev/myvg/mylv-test 
  Size of logical volume myvg/mylv-test changed from 1.00 GiB (256 extents) to 2.00 GiB (512 extents).
  Logical volume myvg/mylv-test successfully resized.
[root@test01 ~]# df -h |grep "/mnt"
/dev/mapper/myvg-mylv--test           976M  2.6M  907M    1% /mnt
[root@test01 ~]# res
reset       resize2fs   resizecons  resizepart  restorecon  
[root@test01 ~]# resize2fs /dev/myvg/mylv-test 
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/myvg/mylv-test is mounted on /mnt; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/myvg/mylv-test is now 524288 blocks long.

[root@test01 ~]# df -h |grep "/mnt"            
/dev/mapper/myvg-mylv--test           2.0G  3.1M  1.9G    1% /mnt
  1. lvreduce:lvreduce -L [-]#[mM,gG,tT] /dev/myvg/mylv-test,注意帶-代表縮減多少,不帶+表示,縮減到多少。
    縮減lv的大小,一般不建議使用,使用的時候檔案系統必須先解除安裝,然後強制性fsck,然後縮減邏輯邊界,最後再縮減物理邊界
[root@test01 /]# umount /mnt
[root@test01 /]# e2fsck -f /dev/myvg/mylv-test 
e2fsck 1.42.9 (28-Dec-2013)
第一步: 檢查inode,塊,和大小
第二步: 檢查目錄結構
第3步: 檢查目錄連線性
Pass 4: Checking reference counts
第5步: 檢查簇概要資訊
/dev/myvg/mylv-test: 12/131072 files (0.0% non-contiguous), 17197/524288 blocks
[root@test01 /]# resize2fs /dev/myvg/mylv-test 500M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/myvg/mylv-test to 128000 (4k) blocks.
The filesystem on /dev/myvg/mylv-test is now 128000 blocks long.

[root@test01 /]# lvreduce /dev/myvg/mylv-test -L 500m  
  WARNING: Reducing active logical volume to 500.00 MiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce myvg/mylv-test? [y/n]: y
  Size of logical volume myvg/mylv-test changed from 2.00 GiB (512 extents) to 500.00 MiB (125 extents).
  Logical volume myvg/mylv-test successfully resized.
[root@test01 /]# df -h |grep "/mnt"                    
[root@test01 /]# mount /dev/myvg/mylv-test /mnt
[root@test01 /]# df -h |grep "/mnt"            
/dev/mapper/myvg-mylv--test           460M  1.6M  426M    1% /mnt

5. LVM 快照卷

5-1. LVM快照卷的機制

LVM 快照卷機制如下圖所示:

  1. LVM對LV提供的快照功能,只對LVM有效。
  2. 當一個snapshot建立的時候,僅拷貝原始卷裡資料的元資料(meta-data)。建立的時候,並不會有資料的物理拷貝,因此snapshot的建立幾乎是實時的。
  3. 當原始捲上有寫操作執行時,snapshot跟蹤原始卷塊的改變,這個時候原始捲上將要改變的資料在改變之前被拷貝到snapshot預留的空間裡,因此這個原理的實現叫做寫時複製(copy-on-write)。
  4. 在寫操作寫入塊之前,將原始資料移動到 snapshot空間裡,這樣就保證了所有的資料在snapshot建立時保持一致。
  5. 對於snapshot的讀操作,如果是讀取資料塊是沒有修改過的,那麼會將讀操作直接重定向到原始捲上,如果是要讀取已經修改過的塊,那麼就讀取拷貝到snapshot中的塊。
  6. 一旦 snapshot的空間記錄滿了原始卷塊變換的資訊,那麼這個snapshot立刻被釋放,從而無法使用,從而導致這個snapshot無效。
  7. 建立snapshot的大小並不需要和原始卷一樣大,其大小僅僅只需要考慮兩個方面:
    • 從shapshot建立到釋放這段時間內,估計塊的改變數有多大;
    • 資料更新的頻率。

5-2. 快照卷的建立

語法:

lvreduce -L [-]#[mM,gG,tT] -p r -s -n snapshot_lv_name original_lv_name
注意:快照卷一般只讀,如果要設定為讀寫,則-p rw,original_lv_name為原卷的卷名

例如,對mylv-test做快照卷,預計變化的部分不超過500M,許可權設定為只讀

[root@test01 myvg]# lvcreate -s -L 500M -p r -n snap_mylvtest /dev/myvg/mylv-test
  Using default stripesize 64.00 KiB.
  Logical volume "snap_mylvtest" created.
[root@test01 mylvtest]# mount /dev/myvg/snap_mylvtest /mnt
如果需要對快照捲進行解除安裝,則先umount
[root@test01 mylvtest]# umount /mnt
[root@test01 mylvtest]# lvremove /dev/myvg/snap_mylvtest 
Do you really want to remove active logical volume myvg/snap_mylvtest? [y/n]: y
  Logical volume "snap_mylvtest" successfully removed