天天看點

Centos 6 & 7 LVM 邏輯盤卷管理

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

繼續閱讀