LVM是邏輯盤卷管理(Logical Volume Manager)的簡稱,它是Linux環境下對磁盤分區進行管理的一種機制,LVM是建立在硬碟和分區之上的一個邏輯層,來提高磁盤分區管理的靈活性。
如果用标準分區在硬碟上建立了檔案系統,為已有檔案系統添加額外的空間是一種痛苦的體驗。你隻能在同一個實體硬碟的可用空間範圍内調整分區大小。如果硬碟上沒有地方了,你就必須再加一個硬碟,然後可能還需要将已有的檔案系統移動到新的硬碟上。
邏輯卷管理的核心在于如何處理安裝在系統上的硬碟分區。在邏輯卷管理的世界裡,硬碟稱為實體卷PV。多個實體卷集中在一起可以形成一個卷組VG。邏輯卷管理系統将卷組視為一個整體的實體硬碟。在卷組VG上面則是可以建立邏輯卷LV,而這正是檔案系統的分區環境,作用類似于Linux中的實體硬碟分區。Linux系統将邏輯卷LV視為實體分區。
基本的LVM管理概念:
PV(Physical Volume)- 實體卷
實體卷在LVM中處于最底層,它可以是實際實體硬碟上的分區,也可以是整個實體硬碟,也可以是raid裝置。
VG(Volumne Group)- 卷組
VG卷組建立在PV卷之上,一個VG卷組中至少要包括一個PV卷,在VG卷組建立之後可動态添加PV卷到VG卷組中。一個LVM中可以隻有一個VG卷組,也可以擁有多個VG卷組。PV卷是用固定大小的實體區域PE(Physical Extent)來定義的。也可以認為PE就是PV卷的機關。PE的大小是在VG卷指定的。
LV(Logical Volume)- 邏輯卷
LV卷建立在VG卷組之上,VG卷組中的未配置設定空間可以用于建立新的LV卷,LV卷建立後可以動态地擴充和縮小空間。系統中的多個LV卷可以屬于同一個VG卷組,也可以屬于不同的多個VG卷組。
下圖簡要的表明了互相的關系和一些常用的指令。
版本
選項
文法
說明
vgcreate
vgcreate [選項] VG卷組名 實體卷
建立VG卷
-s
指定PE大小,機關有以下
[bBsSkKmMgGtTpPeE]
vgscan
掃描存在的VG卷
vgdisplay
顯示詳細的VG卷資訊
vgrename
vgrename 舊VG卷組名 新VG卷組名
#vgrename vg0 VG0
vgchange
vgchange [選項] VG卷組名
VG卷組狀态設定
-an 禁用
-ay 啟用
vgextend
将PV卷添加到VG卷中
lvcreate
lvcreate [選項] VG卷組名
建立LV卷
-n
指定lV卷名字
-l
指定建立的LV卷 的PE 數量
-L
指定建立的LV卷 的空間大小
建立快照
-m
建立鏡像卷
lvscan
掃描存在的LV卷
lvdisplay
顯示詳細的LV卷資訊
lvrename
lvrename 舊LV卷名 新LV卷名
lvchange
lvchange [選項] LV卷組名
LV卷狀态設定
lvextend
增加LV卷大小
需要使用resize2fs手動修整檔案系統來
處理大小上的變化
-r
擴充卷的同時,把檔案系統一并擴充,
不需要額外的resize2fs指令
lvreduce
減少LV卷大小
指令太多,僅僅列出一部分。剩下的可以man.
實驗系統環境
實驗環境:VMware Workstation Pro 14(試用版)
系統平台:
CentOS release 6.9 (Final) 核心 2.6.32-696.el6.x86_64
CentOS Linux release 7.4.1708 (Core) 核心 3.10.0-693.el7.x86_64 (方法基本與6一緻)
LVM 版本:
CentOS6:lvm2-2.02.143-12.el6.x86_64
CentOS7:lvm2-2.02.171-8.el7.x86_64
裝置類型:
vmware虛拟實體硬碟、分區、raid 裝置
硬碟準備:
每個虛拟機,1GB X 4 ,2GB X 4
磁盤規劃如下:
磁盤編号
分區1
分區2
分區格式
69-1G-1
500M
未分區
ext4
69-1G-2
1GB
69-1G-3
300M
700M
69-1G-4
初始狀态
69-2G-5
RAID5
69-2G-6
69-2G-7
69-2G-8
備用
建立好的LVM分别以2種命名方式,都是通過軟連結指向真正的dm-X裝置。
/dev/mapper/VG卷組名-LV卷名
/dev/VG卷組名/LV卷名
準備工作就緒,下面我們使用三種裝置/dev/md0、/dev/sdb1、/dev/sdc1 來完成LVM實驗。
建立PV卷
文法: pvcreate /dev/裝置名
#pvcreate /dev/md0 /dev/sdc1 /dev/sdb1
Physical volume "/dev/md0" successfully created
Physical volume "/dev/sdc1" successfully created
Physical volume "/dev/sdb1" successfully created
注意,建立PV卷的時候,有挂載的話請先umount原來的磁盤分區或裝置,否則可能出現以下提示
Can't open /dev/md0 exclusively. Mounted filesystem?
使用指令pvs 和pvscan 檢視簡略資訊
當然,也可以使用pvdisplay檢視更詳細的資訊
看到下圖的PE相關的數字都是0了嗎?因為,這些參數是在VG建立的時候指定的
一個實體PV卷隻能同時配置設定給一個VG卷
#vgcreate -s 16M vg0 /dev/md0 /dev/sd{b1,c1}
Volume group "vg0" successfully created
指令解讀:
-s 16M 指定PE的大小為16M。預設不指定是的4M
vg0 VG卷組名
/dev/md0 /dev/sd{b1,c1} 加入vg0卷組的PV卷名
此時就可以看到PE的相關資訊了
使用vgdisplay檢視詳細資訊
#lvcreate -n LV0 -L 2G VG0
Logical volume "LV0" created.
-n LV0 指定LV卷名
-L 2G 指定LV0卷的容量為2GB
VG0 指定從VG0卷組中劃分容量
使用lvs,lvscan,lvdisplay都可以檢視LV卷相關的資訊
從VG卷的資訊裡可以看到數值發生了變化
繼續建立第二個LV卷,此時可以有多種方法指定大小了,
-L 指定剩下空間容量
-l 指定剩下的PE數量
-l +100%FREE 指定剩下的Free百分比
#lvcreate -n LV1 -l +100%FREE VG0
Logical volume "LV1" created.
檢視存在LV數量
前面講過建立LV卷後會有2種指令顯示,其實都是通過軟連結指向了真正的dm-X裝置。是以,命名的時候,建議取有意義的名字。
建立LV卷上的檔案系統
mkfs.ext4 /dev/VG0/LV0 -L "/mnt/LV0"
mkfs.ext4 /dev/VG0/LV1 -L "/mnt/LV1"
挂載使用
#mount -a
#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VG0-LV0 2.0G 3.0M 1.9G 1% /mnt/LV0
/dev/mapper/VG0-LV1 3.4G 6.9M 3.2G 1% /mnt/LV1
測試下性能(實際中會更可觀),畢竟是VG卷的底層就是由多塊磁盤構成的,與RAID 0相似
LVM的擴容操作
LVM最大的好處就是可以對磁盤進行動态管理,可以對LVM進行擴容或者縮小。擴容的時候基本不會對資料有影響,縮小的時候,如果存放的資料大于縮小後的空間,将需要提前将資料進行備份。
先擴充VG卷》再擴充LV卷
#vgs
VG #PV #LV #SN Attr VSize VFree
VG0 3 2 0 wz--n- 5.45g 0
想要擴容必須VG卷有空空餘容量,既然現在沒有空餘,那我們就繼續從其他裝置或分區添加。這裡有一個分區/dev/sdb2是空閑的,直接添加會發生什麼情況呢?
#pvcreate /dev/sdb2
Device /dev/sdb2 not found (or ignored by filtering).
是以,如果想對磁盤分區進行LVM操作,必須使用分區工具(如fdisk)将此分區的分區類型變為8e Linux LVM
Device Boot Start End Blocks Id System
/dev/sdb2 66 130 522112+ 8e Linux LVM
記錄通知核心更新分區資訊
#partx -a /dev/sdb
Physical volume "/dev/sdb2" successfully created
變成PV卷了,但是目前此PV卷并沒有明确歸屬給哪個VG卷組使用
擴充VG卷
#vgextend VG0 /dev/sdb2
Volume group "VG0" successfully extended
VG0 指定擴容的VG卷組名
/dev/sdb2 指定添加哪個裝置添加到擴容VG卷組
剛好多出了496M的容量,也就是剛才添加的/dev/sdb2
擴充LV卷
擴充前的LV卷
擴充的時候,就要注意了
直接指定數值,就是擴充到XX容量
+數值,就是在原有數值上增加多少容量
比如:
#lvextend -L 5G /dev/VG0/LV0 将 LV0的容量擴充到5G
#lvextend -L +5G /dev/VG0/LV0 将 LV0的容量增加5G
本例中将剛添加的空間全部劃分到LV0
#lvextend -l +100%FREE /dev/VG0/LV0
Size of logical volume VG0/LV0 changed from 2.00 GiB (128 extents) to 2.48 GiB (159 extents).
Logical volume LV0 successfully resized.
上面的圖确實LV空間增長了,但是使用df -h 指令時,卻發現使用的容量并沒有增長呢,怎麼回事呢?
那是因為空間增加了,檔案系統并沒有擴充,是以需要使用
#resize2fs /dev/VG0/LV0
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/VG0/LV0 is mounted on /mnt/LV0; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/VG0/LV0 to 651264 (4k) blocks.
The filesystem on /dev/VG0/LV0 is now 651264 blocks long.
看到了吧,擴容是線上添加的,使用者是不受影響的哦。
下圖就确認了容量确實可以使用上增加的了。
LVM的縮減操作
縮減操作需要離線處理,縮減有風險,請注意備份資料。
縮減LV卷
本示例以縮減LV1為場景,目标是縮小到 2GB
A. umount 檔案系統
#umount /mnt/LV1
B. 縮減檔案系統
#resize2fs /dev/VG0/LV1 2G 注意,這裡的2G是縮小到最終的容量
Please run 'e2fsck -f /dev/VG0/LV1' first.
C. 檢查磁盤
#e2fsck -f /dev/VG0/LV1
D. 再次執行縮減檔案系統操作
#resize2fs /dev/VG0/LV1 2G
E. 縮減LV
既然是縮小到2GB,那麼就有2種方法來處理了。
1.指定目标最終的容量大小
使用指令:#lvreduce /dev/VG0/LV1 -L 2G
2.指定縮小多少到目标容量
使用指令:#lvreduce /dev/VG0/LV1 -L -1.45G
Step E 和Step D 縮減的大小必須保持一緻,2種不同的指令産生的最終空間不一緻,這些算法上面的小差異,請注意。
看到了吧,lvs的減少,剛好是vgs的VFree增加。
F. 挂載檢視
#df -h /dev/VG0/LV1
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VG0-LV1 2.0G 5.2M 1.9G 1% /mnt/LV1
至此,LV卷的縮減完成。
縮減VG卷
xfs檔案系統不支援縮減操作。
檢視哪個PV卷的PFree是完整的,也就是完全沒有PE被使用。這樣可以不用umount,直接縮減掉
#vgreduce VG0 /dev/sdb1
Removed "/dev/sdb1" from volume group "VG0"
此時/dev/sdb1已經不屬于任何VG卷了
#vgs (縮減前)
VG0 4 2 0 wz--n- 5.94g 1.45g
#vgs (縮減後)
VG0 3 2 0 wz--n- 5.45g 992.00m
如果沒有一個完整的磁盤的PFree,則會提示在使用
Physical volume "/dev/sdb1" still in use
如果發生以下的提示錯誤,那就是縮減過度,原來的檔案系統屬性中的block count數值大于縮減後的值,将會無法mount使用。隻有lvextend回到合理值才會正常。
#dmesg|tail
EXT4-fs (dm-1): bad geometry: block count 905216 exceeds size of device (131072 blocks)
[root@a69 LV1]#du -ah
16K ./lost+found
1001M ./lv1
1001M ./lv3
224M ./lv2
2.2G .
LVM的PV卷替換操作
為什麼需要替換PV卷呢?因為LVM卷不像RAID裝置,有容錯功能,它隻是一堆磁盤的集合,是以磁盤的健康度需要随時關注,以防止某塊磁盤的損壞而導緻資料的丢失。當硬體監控到某塊磁盤裝置提示異常時,一般可能會報警或亮黃燈。那麼這個時候就需要将某個硬碟替換下來,那麼這個上面關聯的資料就要移走了。
關鍵要點:
A. 重要資料備份
這個是基本,用你喜歡的方式吧
B. 檢視需要替換的磁盤上面的PV卷上的PE數量
本例中以替換/dev/sdb2為例子,一共需要31個PE
#pvdisplay
C.檢視需要替換PV卷所屬的VG卷是否有大于替換PV卷PE數量的容量
剩餘空閑PE 63 > 31個,滿足基本條件
#pvmove /dev/sdb1
/dev/sdb1: Moved: 0.0%
/dev/sdb1: Moved: 100.0%
/devsdb1的Free PE數量等于Total PE了,也就是完全騰空了資料。
把/dev/sdb1移出VG0卷組
把PV卷變為普通磁盤
#pvremove /dev/sdb1
Labels on physical volume "/dev/sdb1" successfully wiped
LVM的遷移至新主機操作
可能實際中,原來的LVM卷上的主機由于服役年限長了性能也不如新買的主機好,可靠性也沒有新主機高,此時遷移操作就派上用場了。
提前準備好以下措施
1.提前考慮到新主機是否有同名的VG卷或LV卷,建議先在原主機把VG卷和LV卷使用先改名稱。
2.備份好重要資料
開始遷移:
A.解除安裝遷移的LV卷
#umount /dev/VG-NEW/LV-NEW
B.禁用将要遷移的VG卷
#vgchange -an VG-NEW
0 logical volume(s) in volume group "VG-NEW" now active
C.将要遷移的VG卷變為導出狀态
#vgexport VG-NEW
Volume group "VG-NEW" successfully exported
#lvdisplay
Volume group VG-NEW is exported
#lvs
D.将要遷移的VG卷對應的實體硬碟找到,拆卸并安裝至新主機(不支援熱拔插的就安心的關機吧)
這裡以Centos 7為新主機,新主機增加了一塊sdj磁盤
sdk 8:160 0 4G 0 disk
使用pvscan等指令将會發現主機上面的LVM卷資訊
E.将遷移的VG導入
#vgimport VG-NEW
Volume group "VG-NEW" successfully imported
F.激活VG卷
#vgchange -ay VG-NEW
1 logical volume(s) in volume group "VG-NEW" now active
G.挂載使用
#mount /dev/VG-NEW/LV-NEW /mnt
資料同時也一起過來了,沒有丢失
#cat old_lv_data
this old LV-NEW data
删除LVM
與建立的時候不一樣,删除則是把順序倒過來操作。
A.解除安裝挂載點
#umount /mnt
B.停止并删除LV卷
#lvchange -an /dev/VG-NEW/LV-NEW
#lvremove /dev/VG-NEW/LV-NEW
Logical volume "LV-NEW" successfully removed
C.停止并删除VG卷
#vgremove VG-NEW
Volume group "VG-NEW" successfully removed
D.删除PV卷
#pvremove /dev/sdk
Labels on physical volume "/dev/sdk" successfully wiped.
LVM快照snapshot
LVM允許你建立線上邏輯卷的可讀寫快照。有了快照,就可以删除原先的邏輯卷,然後将快照作為替代挂載上。這個功能對快速故障轉移可涉及修改資料的程式試驗(如果失敗,需要恢複修改過的資料)非常有用。
快照就是将當時的系統資訊記錄下來,就好像照相一樣,未來若有任何資料變動了,則原始資料會被移動到快照區,沒有被改動的區域則由快照區與檔案系統共享。
LVM 系統快照區域的備份示意圖(虛線為檔案系統,長虛線為快照區)
左圖為最初建立系統快照區的狀況,LVM 快照區域 (左圖的左側三個PE 區塊) 作為資料存放處。此時快照區内并沒有任何資料,而快照區與系統區共享所有的PE 資料, 是以你會看到快照區的内容與檔案系統是一模一樣的。等到系統運作一陣子後,假設A 區域的資料被更動了 (上面右圖所示),則更動前系統會将該區域的資料移動到快照區,是以在右圖的快照區被占用了一塊PE 成為A,而其他B~I 的區塊則還是與檔案系統共享。
由于快照區與原本的LV共用很多PE的區塊,是以快照與被快照的LV必須在同一個VG卷。建立快照的時候的檔案數量不能高于快照區的實際容量
本次執行個體以操作VG0卷為例,此VG0卷一共2GB容量,以下約定名稱以便清晰講解
#lvcreate -n LV0-snapshot -l 100%FREE -s -p r /dev/VG0/LV0
-n LV0-snapshot 指定建立的快照的名稱
-l 100%FREE 指定快照使用的容量,這裡是使用VG卷組中剩餘容量100%
-p r 指定權限為隻讀
/dev/VG0/LV0 指定為哪個LV卷生成快照
A區的資料如下:
#cat a b nmu
a 》aaa
b 》bbb
nmu 》123456
把B區資料挂載到一個目錄,看下。(xfs檔案系統建立了快照後是無法挂載的)
[root@a69 LV0-Snapshot]#ll
total 12
-rw-r--r--. 1 root root 4 Dec 12 20:11 a
-rw-r--r--. 1 root root 4 Dec 12 20:11 b
-rw-r--r--. 1 root root 7 Dec 12 20:11 nmu
咦,不是說剛建立的時候是空的狀态嗎?怎麼回事。快照區内并沒有任何資料,而快照區與系統區共享所有的PE 資料, 是以你會看到快照區的内容與檔案系統是一模一樣的。現在可以深刻了解這段話的意思了吧。
測試開始了
把A區的a檔案修改一下
#echo 123 >> a
#cat a
aaa
123
#cat /mnt/LV0-Snapshot/a B區的檔案内空還是原來最舊的那個版本
把A區的b檔案删除了
#rm b
rm: remove regular file `b'? y
#cat /mnt/LV0-Snapshot/b B區的檔案還在且内空還是原來最舊的那個版本
bbb
在A區的建立一個新檔案
#echo newfile > newfile
#cat newfile
ll /mnt/LV0-Snapshot B區并沒有新增加的檔案
由此可以明确的看出來,快照區的内容就是當時建立快照時指令一回車一下去的時候,當時狀态資料的完整備份。
現在把A區的檔案全部删除,并且再建立一個全新的檔案。
#rm -rf *
#echo newfile2 > newfile2
用快照資料恢複,在恢複之前,得把A和B都umount。
#umount /mnt/LV0
#umount /mnt/LV0-Snapshot/
#lvconvert --merge /dev/VG0/LV0-snapshot
Merging of volume LV0-snapshot started.
LV0: Merged: 100.0%
Merge of snapshot into logical volume LV0 has finished.
Logical volume "LV0-snapshot" successfully removed
A區的資料回來了,可是最後建立的新檔案卻沒了。覆寫性的恢複呢
#ls
a b nmu
#cat *
123456
另外,快照卷也沒有了,到這裡,明白了。快照是用自身的資料來頂替原來的LV卷的。
LVM鏡像
通過LVM安裝檔案系統并不意味着不會再出問題。和實體分區一樣,LVM邏輯卷也容易受到斷電和磁盤故障影響。一旦檔案系統損壞,就有可能再也無法恢複。
LVM快照功能提供了一些安慰,你可以随時的建立邏輯卷的備份副本,但對有些環境來說可能還不夠。對于涉及大量資料變動的系統,比如你的資料庫伺服器,自上次快照之後可能要存儲成百上千條記錄。
這個問題的一個解決方法就是LVM鏡像。鏡像是一個實時更新的邏輯卷的完整副本。
一旦LVM鏡像同步完成,LVM會為檔案系統的每次寫操作執行2次寫入:1次寫入到邏輯卷,1次寫入鏡像卷。這個過程會降低系統的寫入性能。這是一種折中的方案,如果原始邏輯卷因為某些原因損壞了,手頭上也已經有一個完整的最新的副本。
以下實驗待續吧~~~
必要條件,建立鏡像的時候,必須在同一個VG卷組裡,且這個卷組至少有2塊PV卷,被當作鏡像盤的PV卷容量需要大于資料盤PV卷。
建立鏡像卷的時候,會建立鏡像盤,鏡像日志盤
#pvs
PV VG Fmt Attr PSize PFree
/dev/sdf VG0 lvm2 a--u 2.00g 1020.00m 資料盤
/dev/sdg VG0 lvm2 a--u 2.00g 2.00g 鏡像盤
/dev/sdi VG0 lvm2 a--u 2.00g 2.00g 鏡像盤
/dev/sdj VG0 lvm2 a--u 4.00g 4.00g 鏡像日志盤
#lvcreate -m 1 -n mirror-VG0 -l 100%FREE VG0 /dev/sd{g,i,j}
Logical volume "mirror-VG0" created.
-m 1 建立鏡像卷
-n mirror-VG0 指定鏡像卷名字
-l 100%FREE 指定鏡像卷容量
VG0 指定鏡像哪個卷
/dev/sd{g,i,j} 鏡像卷包含的PV卷
移除失效的VG卷
#vgreduce --removemissing --force VG0
Couldn't find device with uuid 525vmy-4JK7-dKEM-crOB-lFaZ-pbYA-iCdVyo.
Couldn't find device for segment belonging to VG0/LV0 while checking used and assumed devices.
Removing partial LV LV0.
Logical volume "LV0" successfully removed
Wrote out consistent volume group VG0
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mirror-VG0 VG0 mwi-a-m--- 3.99g [mirror-VG0_mlog] 100.00
本文轉自 ljpwinxp 51CTO部落格,原文連結:http://blog.51cto.com/191226139/2051196