linux LVM 簡介及指令介紹
前言
由於幫客戶主機建立 LVM 時常遇到 linux 系統完全沒有 LVM ,導致我們常常會需要重新建立一個 LVM 這邊就做一個較完整的筆記幫忙紀錄常常容易忘掉的步驟,另一方面也幫忙釐清 linux 系統中的 LVM 複雜的觀念。
一、 LVM簡介
LVM,Logical Volume Manager 邏輯磁碟管理。LVM主要功能為可以彈性調整磁碟、分割區與檔案系統的大小。其概念為,將實體分割區變成PV,由PV組成VG(相當於虛擬磁碟),VG可以分割成數個LV(相當於虛擬分割區),然後在LV上建立檔案系統,此檔案系統我們可以把它當成一般檔案系統使用。亦即,我們透過組合多個實體分割區,以實現可以彈性改變大小的磁碟、分割區及檔案系統。
二、PV、VG、LV、PE、檔案系統 resize2fs指令
(一) PV,Physical Volume實體捲軸
我們須將實體分割區變成PV,此實體分割區才能夠被LVM所使用。
PV名稱與「分割區之裝置檔名」相同,如/dev/sdb1、/dev/sdc3。
一個實體分割區只對應一個PV。
在PV的metadata區中,會記錄此PV是否被任何VG使用,若被VG使用,會記錄被那一個VG使用。
PV相關指令:
1. pvcreate
語法: pvcreate 分割區名稱
說明:
此指令用來「建立PV」,即將實體分割區建立(轉換)為PV。在使用此指令前,須先將分割區的 Partition ID設成8e(可以使用fdisk指令設定)。
註:筆者測試分割區的Partition ID不設定成8e,分割區也是可以建立成PV。
範例1:將 /dev/sdb1建立成為PV。
[root@CentOS6NEW ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
範例2:將 /dev/sdc{1,2,3}建立成為PV。
[root@CentOS6NEW ~]# pvcreate /dev/sdc{1,2,3}
Physical volume "/dev/sdc1" successfully created
Physical volume "/dev/sdc2" successfully created
Physical volume "/dev/sdc3" successfully created
2. pvremove
語法: pvremove PV名稱
說明:
將PV還原成一般實體分割區。還原後,分割區的Partition ID依然為8e,使用者可視需求改變Partition ID。
範例: 將 /dev/sdb1此PV還原成一般實體分割區。
[root@CentOS6NEW ~]# pvremove /dev/sdb1
Labels on physical volume "/dev/sdb1" successfully wiped
3. pvscan
語法: pvscan
說明:
搜尋目前系統上存在的PV並顯示PV資訊。
範例: 搜尋並顯示目前系統上的PV。
[root@CentOS6NEW ~]# pvscan
PV /dev/sdb1 lvm2 [1.01 GiB]
PV /dev/sdc1 lvm2 [1.01 GiB]
PV /dev/sdc2 lvm2 [407.90 MiB]
PV /dev/sdc3 lvm2 [407.90 MiB]
Total: 4 [2.82 GiB] / in use: 0 [0 ] / in no VG: 4 [2.82 GiB]
4. pvdisplay
語法: pvdisplay PV名稱
說明:
顯示PV的詳細資訊。若沒有參數「PV名稱」,則顯示系統上所有的PV詳細資訊。
範例1:顯示 /dev/sdb1 此PV的詳細資訊。
[root@CentOS6NEW ~]# pvdisplay /dev/sdb1
"/dev/sdb1" is a new physical volume of "1.01 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 1.01 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 0tA0MH-8AAR-yVs0-DBcR-2m8u-j2c4-zvt10B
範例2:顯示所有PV的詳細資訊。
[root@CentOS6NEW ~]# pvdisplay
"/dev/sdb1" is a new physical volume of "1.01 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 1.01 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 0tA0MH-8AAR-yVs0-DBcR-2m8u-j2c4-zvt10B
"/dev/sdc3" is a new physical volume of "407.90 MiB"
--- NEW Physical volume ---
PV Name /dev/sdc3
VG Name
PV Size 407.90 MiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID JqGpho-QCOJ-DYuJ-3Pcm-UhvL-14qS-aXZGs1
(二) VG,Volume Group 捲軸群組
VG相當於虛擬磁碟,由一到多個PV所組成。在建立VG之後,我們還可以任意增加PV到VG,或從VG減少PV。
VG相關指令:
1. vgcreate
語法:vgcreate -s PE大小 VG名稱 PV名稱
說明:
此指令用來建立VG。參數有三個,參數「-s PE大小」用來設定PE 的大小,PE大小須為2的次方,單位可以是T、G、M(大小寫皆可),若無此參數,PE預設大小為4MB。參數「VG名稱」為使用者自己創建的VG名稱,可自由取名。參數「PV名稱」用來指定VG要使用的PV。
註1:
PE為VG的容量使用單位,如同真實檔案系統中的block一樣。VG會將PV畫分成數個PE,然後使用PE。
註2:
不一定要兩個以上的PV才能建立VG,其實一個PV也能建立成VG。
範例:建立並觀察VG
使用/dev/sdb{1,2}此兩個PV建立VG,VG名稱為vg01,PE大小為32MB。
[root@CentOS6NEW ~]# vgcreate -s 32M vg01 /dev/sdb{1,2}
Volume group "vg01" successfully created
使用「pvscan」觀察此兩個pv,可發現/dev/sdb{1,2}己規劃到VG裡頭。
[root@CentOS6NEW ~]# pvscan
PV /dev/sdb1 VG vg01 lvm2 [1.00 GiB / 1.00 GiB free]
PV /dev/sdb2 VG vg01 lvm2 [992.00 MiB / 992.00 MiB free]
Total: 2 [1.97 GiB] / in use: 2 [1.97 GiB] / in no VG: 0 [0 ]
2. vgremove
語法: vgremove VG名稱
說明:
此指令用來移除 VG。
範例:移除vg01此VG。
[root@CentOS6NEW ~]# vgremove vg01
Volume group "vg01" successfully removed
3. vgextend
語法: vgextend VG名稱 PV名稱
說明:
新增PV到VG中,可加大VG的空間,相當於加大虛擬磁碟的空間。
範例: 新增 /dev/sdc1 (PV)到 vg01(VG)中。
[root@CentOS6NEW ~]# vgextend vg01 /dev/sdc1
Volume group "vg01" successfully extended
4. vgreduce
語法: vgreduce VG名稱 PV名稱
說明:
從VG中移除PV。會縮小VG的空間,相當於縮小虛擬磁碟的空間。雖然PV從VG中移出,但不代表移除的PV就會變成實體分割區。
範例:從vg01 (VG)移除 /dev/sdc1 (PV)。
[root@CentOS6NEW ~]# vgreduce vg01 /dev/sdc1
Removed "/dev/sdc1" from volume group "vg01"
5. vgchange
語法:vgchange -a n|y VG名稱
說明:
啟動或停用VG。當啟動VG,會將VG中的所有LV啟動;若停用VG,會將VG中的所有LV停用。
範例:測試啟用及停用vg01(VG),並觀察所有LV。
目前LV工作狀態:
[root@CentOS6NEW ~]# lvscan
ACTIVE '/dev/vg01/lv01' [1.56 GiB] inherit
ACTIVE '/dev/vg01/lv02' [1.41 GiB] inherit
停用vg01,並觀察LV:
[root@CentOS6NEW ~]# vgchange -a n vg01
0 logical volume(s) in volume group "vg01" now active
[root@CentOS6NEW ~]# lvscan
inactive '/dev/vg01/lv01' [1.56 GiB] inherit
inactive '/dev/vg01/lv02' [1.41 GiB] inherit
啟用vg01,並觀察LV:
[root@CentOS6NEW ~]# vgchange -a y vg01
2 logical volume(s) in volume group "vg01" now active
[root@CentOS6NEW ~]# lvscan
ACTIVE '/dev/vg01/lv01' [1.56 GiB] inherit
ACTIVE '/dev/vg01/lv02' [1.41 GiB] inherit
6. vgscan
語法:vgscan
說明:
搜尋VG並顯示。其運作過程為,搜尋系統上所有的PV,以PV上的metadata資訊來知道目前系統上有那些VG並顯示。
範例:搜尋VG並顯示。
[root@CentOS6NEW ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vg02" using metadata type lvm2
Found volume group "vg01" using metadata type lvm2
上面結果表示,目前系統上有兩個VG,分別是vg01、vg02。
7. vgdisplay
語法:vgdisplay VG名稱
說明:
顯示VG詳細資訊。參數「VG名稱」用來指定要顯示那個VG的資訊,若沒有參數「VG名稱」,則顯示所有的VG資訊,即若有10個VG,就顯示10個VG的資訊。
筆者通常利用此指令來知道VG中的PE使用情況。
範例:顯示所有的VG詳細資訊
[root@CentOS6NEW ~]# vgdisplay
--- Volume group ---
VG Name vg01 <== VG名稱
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 2
VG Access read/write <==此VG可讀可寫
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size 2.97 GiB
PE Size 32.00 MiB
Total PE 95 <==此VG的全部PE
Alloc PE / Size 50 / 1.56 GiB <==已使用PE
Free PE / Size 45 / 1.41 GiB <==未使用PE
VG UUID GHwRAP-2yYp-uOPA-QY4k-Dj5Y-sh8P-fQ29vo
(三)LV,Logical Volume 邏輯捲軸
LV相當於虛擬分割區,由一到多個PE所組成。在建立LV之後,我們可以任意增加PE到LV,或減少PE,使LV彈性調整容量。一個VG可以包含多個LV,就像一個實體磁碟可以建立多個分割區一樣。
LV相關指令:
1. lvcreate
語法1: lvcreate -l PE數量 -n LV名稱 VG名稱
語法2: lvcreate -L 容量 -n LV名稱 VG名稱
說明:
此指令用來建立LV,語法1與語法2的差別在於設定此LV容量之方式不同而已,語法1使用「PE數量」決定LV容量,而語法2直接使用「數字加T、G、M」來決定LV容量。由於LV的使用單位為PE,所以語法2的容量值需為PE的倍數,若非 PE倍數,LVM會自動以相近PE倍數值來決定LV容量。
範例1: 在vg01(VG)中建立lv01(LV),lv01容量為50個PE。
[root@CentOS6NEW ~]# lvcreate -l 50 -n lv01 vg01
Logical volume "lv01" created
註:雖然lvcreate指令中之LV名稱為lv01,但在建立後LV後,實際之LV名稱為 /dev/vg01/lv01 ,以後要指定LV,就是使用 /dev/vg01/lv01。此 /dev/vg01/lv01為連結檔,連結到/dev/dm-0;另/dev/mapper/vg01-lv01連結檔也是連結到/dev/dm-0,所以/dev/vg01/lv01、/dev/mapper/vg01-lv01、/dev/dm-0皆為相同檔案。很多應用程式都使用/dev/mapper/vg01-lv01此連結檔來指定LV。
範例2:在 vg01 (VG) 中建立 lv02 (LV),lv01 容量為1GB。
[root@CentOS6NEW ~]# lvcreate -L 1G -n lv02 vg01
Logical volume "lv02" created
2. lvremove
語法: lvremove LV名稱
說明:
移除 LV。
範例:移除 /dev/vg01/lv02 (LV)。
[root@CentOS6NEW dev]# lvremove /dev/vg01/lv02
Logical volume "lv02" successfully removed
3. lvresize
語法:lvresize -l PE數量 LV名稱
說明:
調整LV容量大小。參數「PE數量」值須加上+、-號,如「+30」、「-60」來代表要增加PE或減少PE。「-l PE數量」也可換成 「-L 容量」的指定方法,和lvcreate指令相同。
註:另有「lvextend」和「lvreduce」指令可以來增加或減少LV容量,不過可以由lvresize取代。簡單說明一下「lvextend、lvreduce」指令用法:假設要增加20個PE,則使用lvextend指令為 「 lvextend -l +20 LV名稱」;減少20個PE,使用lvreduce指令為「lvreduce -l -20 LV名稱 」。lvextend只能用來增加PE,lvreduce只能用來減少PE,如此看來,不如統一使用lvresize指令來的簡單。 所以,筆者建議使用lvresize來調整LV的容量大小。
範例1:將 /dev/vg01/lv01 (VG) 增加20個PE的容量。
[root@CentOS6NEW ~]# lvresize -l +20 /dev/vg01/lv01
Extending logical volume lv01 to 2.19 GiB
Logical volume lv01 successfully resized
註:可先使用 「vgdisplay vg01」指令了解VG還有多少個PE未使用。
範例2 :將 /dev/vg01/lv01 (VG) 減少50個PE的容量。
[root@CentOS6NEW ~]# lvresize -l -50 /dev/vg01/lv01
WARNING: Reducing active logical volume to 640.00 MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv01? [y/n]: y <==使用者須鍵入 y 。
Reducing logical volume lv01 to 640.00 MiB
Logical volume lv01 successfully resized
4. lvchange
語法: lvchange -a n|y LV名稱
說明:
啟用或停用LV。當LV為啟用時,應用程式才能使用此LV,如建立檔案系統或掛載等。
範例:啟用或停用/dev/vg01/lv01(LV)。
先觀察目前的 lv01工作狀態:
[root@CentOS6NEW mnt]# lvscan
ACTIVE '/dev/vg01/lv01' [640.00 MiB] inherit <==啟用狀態
ACTIVE '/dev/vg01/lv02' [1.56 GiB] inherit
停用 /dev/vg01/lv01,並觀察是否停用成功:
[root@CentOS6NEW mnt]# lvchange -a n /dev/vg01/lv01 <==停用LV
[root@CentOS6NEW mnt]# lvscan
inactive '/dev/vg01/lv01' [640.00 MiB] inherit <== 目前停用
ACTIVE '/dev/vg01/lv02' [1.56 GiB] inherit
現在啟用 /dev/vg01/lv01,並觀察是否啟用成功:
[root@CentOS6NEW mnt]# lvchange -a y /dev/vg01/lv01
[root@CentOS6NEW mnt]# lvscan
ACTIVE '/dev/vg01/lv01' [640.00 MiB] inherit <==目前啟用
ACTIVE '/dev/vg01/lv02' [1.56 GiB] inherit
5. lvscan
語法: lvscan
說明:
搜尋系統上存在的LV並顯示。
範例:搜尋系統上存在的LV並顯示
[root@CentOS6NEW ~]# lvscan
ACTIVE '/dev/vg01/lv01' [640.00 MiB] inherit
6. lvdisplay
語法: lvdisplay LV名稱
說明:
顯示指定的LV之資訊。若沒有「 LV名稱」參數,則顯示所有的LV之資訊。
範例:顯示 /dev/vg01/lv02(LV) 之資訊
[root@CentOS6NEW ~]# lvdisplay /dev/vg01/lv02
--- Logical volume ---
LV Name /dev/vg01/lv02
VG Name vg01 <==此LV屬於vg01(VG)
LV UUID hnQn5M-prIz-FsOo-oiFI-Mj88-xLSc-lBBP5S
LV Write Access read/write <==此LV可讀與寫
LV Status available <==工作狀態為啟用(可使用)
# open 0
LV Size 1.56 GiB <==此LV容量為1.5GB
Current LE 50 <==此LV有50個PE
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
(四) PE,Physical Extend 實體延伸區塊
PE為LVM的儲存單位。一個VG最多只能含有65534個PE,不過每個PE的大小可以由使用者決定,一個PE的大小可以數個MB、數個GB或數個TB大。因此可知,一個VG的最大容量,跟PE的大小有關係。
PV會記載PV中的每個PE隸屬那個LV。要記得,LV是由PE組成,不是由PV組成。一個PV中的PE可能分散隸屬於多個LV。例如,假設有一個PV含有50個PE,則其中20個PE可能屬於第一個LV,其中20個PE可能屬於第二個LV,剩下的10個PE可能屬於第三個LV。
在一開始時,PE是由vgcreate指令規畫出來,vgcreate指令依指定的PE大小在PV上劃分成一到多個PE。例如,假設有一個PV容量為1GB,PE為4MB,則此PV可劃分成256個PE。
每個PE可以視為一個獨立的個體,就算是屬於同一個PV的PE,它們不一定會隸屬於同一個LV。
註:PE的觀念很重要,如果不清楚的話,可能就無法正確使用「pvmove」這個指令。
PE相關指令:(PE只有一個指令---> pvmove)
1. pvmove
語法: pvmove 來源PV [ 目的PV]
說明:
此指令為搬移「使用中的PE」 到 「未使用的PE」。「目的PV」需有足夠的「未使用PE數」才能做搬移動作,若不足夠的話,將無法執行此指令。參數「目的PV」可以為多個PV,只要這些PV中「未使用PE數」加起來的PE總數足夠讓來源PV中的「使用中的PE」來置放,指令都允許。
此指令通常使用在此情況下:我們要移除某個PV,可是這個PV被LV所使用,就需要此pvmove指令先做搬移PE動作。
我們要了解,當一個PV有使用中的PE時,是不能直接移除的,否則使用這些PE的LV將會出問題,建立在此LV上的檔案系統中的檔案也會損毀。因此要移除此種PV時,一定要先搬移裡面使用中的PE才行。(註:使用中的PE,指的是分配給LV的PE,這些PE裡面不一定都會包含資料,也有可能不包含資料。)
在此指令中,「目的PV」需有足夠的未使用PE供置放,為了彈性的達到這個需求,「目的PV」數量可以多個,但「來源PV」只能一個。
這個pvmove指令名稱中的「pv」兩個字可能會把人搞糊塗,此指令明明搬移的是PE,但是指令名稱會讓人以為搬移的是PV,也可能認為PV中的全部PE是完全屬於某一LV,因此把PV當成是隸屬於LV而做搬移動作,此搬移動作就是將整個PV搬移到另一個PV上。這是很大的誤解。
前面提過,同一個PV中的PE可能分散隸屬於不同LV,每個PE為獨立個體,有自已的metadata與data。所以在搬移PE時,應該看成是,pvmove將「來源PV中每個PE的data與meatadata」搬移到其它的PE上(metadata記錄此PE隸屬於那個LV)。筆者認為,使用pvmove指令時,最好省略「目的PV名稱」選項,因為省略時,LVM會將PE搬移到同個VG中未使用的PE上,而這些未使用的PE可能分別位於不同的PV中,這有助於釐清觀念及了解LVM運作方式。雖然觀念有點複雜,但還是得搞懂才行。
當使用lvcreate指令「建立LV」時,才是真正分配使用PE的時候,此時可從pvdisplay指令知道PV中的PE使用情況。比較可惜的是,我們只能知道PV中有幾個PE是在使用中或不在使用中,無法明確的知道那些PE是給那個LV使用的。你只要知道,LVM會很聰明的管理分配這些PE給LV使用就是了。
範例:
假設有一個vg01(VG),含有四個PV,分別是/dev/sdb1、/dev/sdc{1,2,3},其中/ dev/sdb1有20個PE在使用中,/dev/sdc1有32個PE未使用,dev/sdc2、/dev/sdc3各有12個PE未使用。現在我們要移除 /dev/sdb1(PV),由於此/dev/sdb1中有PE在使用中,所以我們必須先把這些PE搬移到其它PE才行。
我們有三種方式來進行搬移動作:
第1種方式:將/dev/sdb1上有使用的PE 全部搬移到 /dev/sdc1中未使用PE中。
[root@CentOS6NEW ~]# pvmove /dev/sdb1 /dev/sdc1
/dev/sdb1: Moved: 0.0%
/dev/sdb1: Moved: 30.0%
/dev/sdb1: Moved: 100.0%
第2種方式:將/dev/sdb1上有使用的PE全部 搬移到 /dev/sdc2、/dev/sdc3中未使用的PE中。
[root@CentOS6NEW ~]# pvmove /dev/sdb1 /dev/sdc2 /dev/sdc3 /dev/sdb1: Moved: 0.0%
/dev/sdb1: Moved: 20.0%
/dev/sdb1: Moved: 60.0%
/dev/sdb1: Moved: 100.0%
若指令中有三個以上的PV名稱,pvmove會把第一個PV名稱視為「來源PV」,第二個以後的名稱視為「目的PV」。
第3種方式:搬移到VG未使用的PE。
[root@CentOS6NEW ~]# pvmove /dev/sdb1
/dev/sdb1: Moved: 0.0%
/dev/sdb1: Moved: 25.0%
/dev/sdb1: Moved: 100.0%
若沒有「目的PV」參數,pvmove會把PE搬移到VG中未使用的PE中。
不管使用上面那一種方式,都需要確定「 目的PV」有足夠的未使用PE可供置放。若不足夠時,就需要再新增PV到VG中以補足空間。
(五)檔案系統 resize2fs 指令
resize2fs指令可調整檔案系統大小,剛好可以與LVM配合。
若要將檔案系統「變大」,檔案系統可以不用卸載,直接就可線上調整;
若將檔案系統縮小,則須先卸載並且須先執行「e2fsck -f 檔案系統」指令後才能成功執行resize2fs。如果不先執行「e2fsck」指令,而直接執行resize2fs的話,會出現請你先執行e2fsck的訊息,所以你還是得先執行e2fsck指令。
若要將檔案系統縮小,必須縮小後還有足夠的空間給原來的資料存放,否則資料(檔案)會不見。
先調整檔案系統大小還是先調整分割區的大小?
當要加大容量時,須先調整分割區(LV)容量,再調整檔案系統。
當要縮小容量時,須先調整檔案系統,再調整分割區(LV)容量。「縮小的檔案系統」須小於「縮小的分割區容量」。
筆者建議,若要縮小容量,最好按照三個步驟執行:
步驟一:縮小檔案系統。 (使用 resize2fs 指令)
步驟二:縮小分割區(LV)。(使用lvresize 指令)
步驟三:加大檔案系統。 (使用resize2fs指令)
需要第三個步驟的原因是,resize2fs指令調整的容量單位為GB、MB,而lvresize指令調整的容量單位為PE,兩者無法剛好指定為相同容量,因此,為了讓檔案系統能夠等於分割區的大小,所以必須變成三個步驟來縮小容量。首先,在步驟一時,先將檔案系統的大小調整成比「步驟二縮小後的分割區容量」再小一點,最好縮小的差距為2、3個PE大小,等lvresize把分割區縮小後,我們再使用resize2fs加大一次檔案系統,使得檔案系統可以使用到所有的分割區空間,這樣,檔案系統就可以和分割區大小一樣了。
resize2fs 指令只可使用於ext2、ext3檔案系統,當檔案系統為掛載狀態時,ext3檔案系統可線上擴充空間(ext2檔案系統不行);若檔案系統要縮小,須先卸載才能調整。
語法: resize2fs 檔案系統 [ 容量值 ]
參數「容量值」指的是要將檔案系統調整成多大容量。若省略「容量值」參數,表示要將檔案系統調整成與分割區一樣大(或者可以說是,調整成檔案系統可以使用到所有的分割區空間),不過省略「容量值」參數時,只能適用於分割區比檔案系統大的情況。
範例一:加大容量
LVM環境:
1. 只有一個VG,PE=32MB,VG總共有150個PE,使用中的PE有100個,未使用的PE有50個。
2. 此VG只有一個LV,名稱為/dev/vg01/lv01,有100個PE容量,相當於32*100=3200MB大小。
3. /dev/vg01/lv01格式化為ext3的檔案系統,掛載到 /mnt/vg01/lv01目錄上。
規劃如下:
1. 將/dev/vg01/lv01(LV)加大10個PE大小。
2. 加大檔案系統,讓檔案系統能使用到全部分割區(LV)的空間。
實作:
由於是加大容量,所以不需要卸載檔案系統,可以直接線上調整容量。
1. lvresize -l +10 /dev/vg01/lv01
加大分割區(LV)空間。
2. resize2fs /dev/vg01/lv01
將檔案系統調整成與分割區一樣大。
完成。
範例二:縮小容量
LVM環境:
1. 只有一個VG,PE=32MB,VG總共有150個PE,使用中的PE有100個,未使用的有500個。
2. 此VG只有一個LV,名稱為/dev/vg01/lv01,有100個PE容量,相當於32*100=3200MB大小。
3. /dev/vg01/lv01格式化為ext3的檔案系統,掛載到 /mnt/vg01/lv01目錄上。
規劃如下:
1. 將/dev/vg01/lv01(LV)縮小20個PE。
2. 縮小檔案系統,使檔案系統能使用到全部分割區的空間。
實作:
1. umount /dev/vg01/lv01
須先卸載檔案系統。
2. e2fsck -f /dev/vg01/lv01
須先檢查檔案系統
3. resize2fs /dev/vg01/lv01 2400M
LV要縮小20個PE,相當於是縮小20x32=640MB容量,因此縮小後的LV為3200-640=2560MB。前面說過,縮小的檔案系統須比縮小的分割區(LV)還小個至少2、3個PE,筆者這邊直接把檔案系統縮小為2400MB。
4. lvresize -l -20 /dev/vg01/lv01
縮小分割區(LV)。
5. resize2fs /dev/vg01/lv01
再執行一次resize2fs來使得檔案系統剛好符合分割區大小。
完成。
由於幫客戶主機建立 LVM 時常遇到 linux 系統完全沒有 LVM ,導致我們常常會需要重新建立一個 LVM 這邊就做一個較完整的筆記幫忙紀錄常常容易忘掉的步驟,另一方面也幫忙釐清 linux 系統中的 LVM 複雜的觀念。
一、 LVM簡介
LVM,Logical Volume Manager 邏輯磁碟管理。LVM主要功能為可以彈性調整磁碟、分割區與檔案系統的大小。其概念為,將實體分割區變成PV,由PV組成VG(相當於虛擬磁碟),VG可以分割成數個LV(相當於虛擬分割區),然後在LV上建立檔案系統,此檔案系統我們可以把它當成一般檔案系統使用。亦即,我們透過組合多個實體分割區,以實現可以彈性改變大小的磁碟、分割區及檔案系統。
圖1 LVM架構圖
(引用自鳥哥的私房菜)
二、PV、VG、LV、PE、檔案系統 resize2fs指令
圖2 VG、LV、PE相關性
(引用自鳥哥的私房菜)
(引用自鳥哥的私房菜)
(一) PV,Physical Volume實體捲軸
我們須將實體分割區變成PV,此實體分割區才能夠被LVM所使用。
PV名稱與「分割區之裝置檔名」相同,如/dev/sdb1、/dev/sdc3。
一個實體分割區只對應一個PV。
在PV的metadata區中,會記錄此PV是否被任何VG使用,若被VG使用,會記錄被那一個VG使用。
PV相關指令:
1. pvcreate
語法: pvcreate 分割區名稱
說明:
此指令用來「建立PV」,即將實體分割區建立(轉換)為PV。在使用此指令前,須先將分割區的 Partition ID設成8e(可以使用fdisk指令設定)。
註:筆者測試分割區的Partition ID不設定成8e,分割區也是可以建立成PV。
範例1:將 /dev/sdb1建立成為PV。
[root@CentOS6NEW ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
範例2:將 /dev/sdc{1,2,3}建立成為PV。
[root@CentOS6NEW ~]# pvcreate /dev/sdc{1,2,3}
Physical volume "/dev/sdc1" successfully created
Physical volume "/dev/sdc2" successfully created
Physical volume "/dev/sdc3" successfully created
2. pvremove
語法: pvremove PV名稱
說明:
將PV還原成一般實體分割區。還原後,分割區的Partition ID依然為8e,使用者可視需求改變Partition ID。
範例: 將 /dev/sdb1此PV還原成一般實體分割區。
[root@CentOS6NEW ~]# pvremove /dev/sdb1
Labels on physical volume "/dev/sdb1" successfully wiped
3. pvscan
語法: pvscan
說明:
搜尋目前系統上存在的PV並顯示PV資訊。
範例: 搜尋並顯示目前系統上的PV。
[root@CentOS6NEW ~]# pvscan
PV /dev/sdb1 lvm2 [1.01 GiB]
PV /dev/sdc1 lvm2 [1.01 GiB]
PV /dev/sdc2 lvm2 [407.90 MiB]
PV /dev/sdc3 lvm2 [407.90 MiB]
Total: 4 [2.82 GiB] / in use: 0 [0 ] / in no VG: 4 [2.82 GiB]
4. pvdisplay
語法: pvdisplay PV名稱
說明:
顯示PV的詳細資訊。若沒有參數「PV名稱」,則顯示系統上所有的PV詳細資訊。
範例1:顯示 /dev/sdb1 此PV的詳細資訊。
[root@CentOS6NEW ~]# pvdisplay /dev/sdb1
"/dev/sdb1" is a new physical volume of "1.01 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 1.01 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 0tA0MH-8AAR-yVs0-DBcR-2m8u-j2c4-zvt10B
範例2:顯示所有PV的詳細資訊。
[root@CentOS6NEW ~]# pvdisplay
"/dev/sdb1" is a new physical volume of "1.01 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 1.01 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 0tA0MH-8AAR-yVs0-DBcR-2m8u-j2c4-zvt10B
"/dev/sdc3" is a new physical volume of "407.90 MiB"
--- NEW Physical volume ---
PV Name /dev/sdc3
VG Name
PV Size 407.90 MiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID JqGpho-QCOJ-DYuJ-3Pcm-UhvL-14qS-aXZGs1
(二) VG,Volume Group 捲軸群組
VG相當於虛擬磁碟,由一到多個PV所組成。在建立VG之後,我們還可以任意增加PV到VG,或從VG減少PV。
VG相關指令:
1. vgcreate
語法:vgcreate -s PE大小 VG名稱 PV名稱
說明:
此指令用來建立VG。參數有三個,參數「-s PE大小」用來設定PE 的大小,PE大小須為2的次方,單位可以是T、G、M(大小寫皆可),若無此參數,PE預設大小為4MB。參數「VG名稱」為使用者自己創建的VG名稱,可自由取名。參數「PV名稱」用來指定VG要使用的PV。
註1:
PE為VG的容量使用單位,如同真實檔案系統中的block一樣。VG會將PV畫分成數個PE,然後使用PE。
註2:
不一定要兩個以上的PV才能建立VG,其實一個PV也能建立成VG。
範例:建立並觀察VG
使用/dev/sdb{1,2}此兩個PV建立VG,VG名稱為vg01,PE大小為32MB。
[root@CentOS6NEW ~]# vgcreate -s 32M vg01 /dev/sdb{1,2}
Volume group "vg01" successfully created
使用「pvscan」觀察此兩個pv,可發現/dev/sdb{1,2}己規劃到VG裡頭。
[root@CentOS6NEW ~]# pvscan
PV /dev/sdb1 VG vg01 lvm2 [1.00 GiB / 1.00 GiB free]
PV /dev/sdb2 VG vg01 lvm2 [992.00 MiB / 992.00 MiB free]
Total: 2 [1.97 GiB] / in use: 2 [1.97 GiB] / in no VG: 0 [0 ]
2. vgremove
語法: vgremove VG名稱
說明:
此指令用來移除 VG。
範例:移除vg01此VG。
[root@CentOS6NEW ~]# vgremove vg01
Volume group "vg01" successfully removed
3. vgextend
語法: vgextend VG名稱 PV名稱
說明:
新增PV到VG中,可加大VG的空間,相當於加大虛擬磁碟的空間。
範例: 新增 /dev/sdc1 (PV)到 vg01(VG)中。
[root@CentOS6NEW ~]# vgextend vg01 /dev/sdc1
Volume group "vg01" successfully extended
4. vgreduce
語法: vgreduce VG名稱 PV名稱
說明:
從VG中移除PV。會縮小VG的空間,相當於縮小虛擬磁碟的空間。雖然PV從VG中移出,但不代表移除的PV就會變成實體分割區。
範例:從vg01 (VG)移除 /dev/sdc1 (PV)。
[root@CentOS6NEW ~]# vgreduce vg01 /dev/sdc1
Removed "/dev/sdc1" from volume group "vg01"
5. vgchange
語法:vgchange -a n|y VG名稱
說明:
啟動或停用VG。當啟動VG,會將VG中的所有LV啟動;若停用VG,會將VG中的所有LV停用。
範例:測試啟用及停用vg01(VG),並觀察所有LV。
目前LV工作狀態:
[root@CentOS6NEW ~]# lvscan
ACTIVE '/dev/vg01/lv01' [1.56 GiB] inherit
ACTIVE '/dev/vg01/lv02' [1.41 GiB] inherit
停用vg01,並觀察LV:
[root@CentOS6NEW ~]# vgchange -a n vg01
0 logical volume(s) in volume group "vg01" now active
[root@CentOS6NEW ~]# lvscan
inactive '/dev/vg01/lv01' [1.56 GiB] inherit
inactive '/dev/vg01/lv02' [1.41 GiB] inherit
啟用vg01,並觀察LV:
[root@CentOS6NEW ~]# vgchange -a y vg01
2 logical volume(s) in volume group "vg01" now active
[root@CentOS6NEW ~]# lvscan
ACTIVE '/dev/vg01/lv01' [1.56 GiB] inherit
ACTIVE '/dev/vg01/lv02' [1.41 GiB] inherit
6. vgscan
語法:vgscan
說明:
搜尋VG並顯示。其運作過程為,搜尋系統上所有的PV,以PV上的metadata資訊來知道目前系統上有那些VG並顯示。
範例:搜尋VG並顯示。
[root@CentOS6NEW ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vg02" using metadata type lvm2
Found volume group "vg01" using metadata type lvm2
上面結果表示,目前系統上有兩個VG,分別是vg01、vg02。
7. vgdisplay
語法:vgdisplay VG名稱
說明:
顯示VG詳細資訊。參數「VG名稱」用來指定要顯示那個VG的資訊,若沒有參數「VG名稱」,則顯示所有的VG資訊,即若有10個VG,就顯示10個VG的資訊。
筆者通常利用此指令來知道VG中的PE使用情況。
範例:顯示所有的VG詳細資訊
[root@CentOS6NEW ~]# vgdisplay
--- Volume group ---
VG Name vg01 <== VG名稱
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 2
VG Access read/write <==此VG可讀可寫
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size 2.97 GiB
PE Size 32.00 MiB
Total PE 95 <==此VG的全部PE
Alloc PE / Size 50 / 1.56 GiB <==已使用PE
Free PE / Size 45 / 1.41 GiB <==未使用PE
VG UUID GHwRAP-2yYp-uOPA-QY4k-Dj5Y-sh8P-fQ29vo
(三)LV,Logical Volume 邏輯捲軸
LV相當於虛擬分割區,由一到多個PE所組成。在建立LV之後,我們可以任意增加PE到LV,或減少PE,使LV彈性調整容量。一個VG可以包含多個LV,就像一個實體磁碟可以建立多個分割區一樣。
LV相關指令:
1. lvcreate
語法1: lvcreate -l PE數量 -n LV名稱 VG名稱
語法2: lvcreate -L 容量 -n LV名稱 VG名稱
說明:
此指令用來建立LV,語法1與語法2的差別在於設定此LV容量之方式不同而已,語法1使用「PE數量」決定LV容量,而語法2直接使用「數字加T、G、M」來決定LV容量。由於LV的使用單位為PE,所以語法2的容量值需為PE的倍數,若非 PE倍數,LVM會自動以相近PE倍數值來決定LV容量。
範例1: 在vg01(VG)中建立lv01(LV),lv01容量為50個PE。
[root@CentOS6NEW ~]# lvcreate -l 50 -n lv01 vg01
Logical volume "lv01" created
註:雖然lvcreate指令中之LV名稱為lv01,但在建立後LV後,實際之LV名稱為 /dev/vg01/lv01 ,以後要指定LV,就是使用 /dev/vg01/lv01。此 /dev/vg01/lv01為連結檔,連結到/dev/dm-0;另/dev/mapper/vg01-lv01連結檔也是連結到/dev/dm-0,所以/dev/vg01/lv01、/dev/mapper/vg01-lv01、/dev/dm-0皆為相同檔案。很多應用程式都使用/dev/mapper/vg01-lv01此連結檔來指定LV。
範例2:在 vg01 (VG) 中建立 lv02 (LV),lv01 容量為1GB。
[root@CentOS6NEW ~]# lvcreate -L 1G -n lv02 vg01
Logical volume "lv02" created
2. lvremove
語法: lvremove LV名稱
說明:
移除 LV。
範例:移除 /dev/vg01/lv02 (LV)。
[root@CentOS6NEW dev]# lvremove /dev/vg01/lv02
Logical volume "lv02" successfully removed
3. lvresize
語法:lvresize -l PE數量 LV名稱
說明:
調整LV容量大小。參數「PE數量」值須加上+、-號,如「+30」、「-60」來代表要增加PE或減少PE。「-l PE數量」也可換成 「-L 容量」的指定方法,和lvcreate指令相同。
註:另有「lvextend」和「lvreduce」指令可以來增加或減少LV容量,不過可以由lvresize取代。簡單說明一下「lvextend、lvreduce」指令用法:假設要增加20個PE,則使用lvextend指令為 「 lvextend -l +20 LV名稱」;減少20個PE,使用lvreduce指令為「lvreduce -l -20 LV名稱 」。lvextend只能用來增加PE,lvreduce只能用來減少PE,如此看來,不如統一使用lvresize指令來的簡單。 所以,筆者建議使用lvresize來調整LV的容量大小。
範例1:將 /dev/vg01/lv01 (VG) 增加20個PE的容量。
[root@CentOS6NEW ~]# lvresize -l +20 /dev/vg01/lv01
Extending logical volume lv01 to 2.19 GiB
Logical volume lv01 successfully resized
註:可先使用 「vgdisplay vg01」指令了解VG還有多少個PE未使用。
範例2 :將 /dev/vg01/lv01 (VG) 減少50個PE的容量。
[root@CentOS6NEW ~]# lvresize -l -50 /dev/vg01/lv01
WARNING: Reducing active logical volume to 640.00 MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv01? [y/n]: y <==使用者須鍵入 y 。
Reducing logical volume lv01 to 640.00 MiB
Logical volume lv01 successfully resized
4. lvchange
語法: lvchange -a n|y LV名稱
說明:
啟用或停用LV。當LV為啟用時,應用程式才能使用此LV,如建立檔案系統或掛載等。
範例:啟用或停用/dev/vg01/lv01(LV)。
先觀察目前的 lv01工作狀態:
[root@CentOS6NEW mnt]# lvscan
ACTIVE '/dev/vg01/lv01' [640.00 MiB] inherit <==啟用狀態
ACTIVE '/dev/vg01/lv02' [1.56 GiB] inherit
停用 /dev/vg01/lv01,並觀察是否停用成功:
[root@CentOS6NEW mnt]# lvchange -a n /dev/vg01/lv01 <==停用LV
[root@CentOS6NEW mnt]# lvscan
inactive '/dev/vg01/lv01' [640.00 MiB] inherit <== 目前停用
ACTIVE '/dev/vg01/lv02' [1.56 GiB] inherit
現在啟用 /dev/vg01/lv01,並觀察是否啟用成功:
[root@CentOS6NEW mnt]# lvchange -a y /dev/vg01/lv01
[root@CentOS6NEW mnt]# lvscan
ACTIVE '/dev/vg01/lv01' [640.00 MiB] inherit <==目前啟用
ACTIVE '/dev/vg01/lv02' [1.56 GiB] inherit
5. lvscan
語法: lvscan
說明:
搜尋系統上存在的LV並顯示。
範例:搜尋系統上存在的LV並顯示
[root@CentOS6NEW ~]# lvscan
ACTIVE '/dev/vg01/lv01' [640.00 MiB] inherit
6. lvdisplay
語法: lvdisplay LV名稱
說明:
顯示指定的LV之資訊。若沒有「 LV名稱」參數,則顯示所有的LV之資訊。
範例:顯示 /dev/vg01/lv02(LV) 之資訊
[root@CentOS6NEW ~]# lvdisplay /dev/vg01/lv02
--- Logical volume ---
LV Name /dev/vg01/lv02
VG Name vg01 <==此LV屬於vg01(VG)
LV UUID hnQn5M-prIz-FsOo-oiFI-Mj88-xLSc-lBBP5S
LV Write Access read/write <==此LV可讀與寫
LV Status available <==工作狀態為啟用(可使用)
# open 0
LV Size 1.56 GiB <==此LV容量為1.5GB
Current LE 50 <==此LV有50個PE
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
(四) PE,Physical Extend 實體延伸區塊
PE為LVM的儲存單位。一個VG最多只能含有65534個PE,不過每個PE的大小可以由使用者決定,一個PE的大小可以數個MB、數個GB或數個TB大。因此可知,一個VG的最大容量,跟PE的大小有關係。
PV會記載PV中的每個PE隸屬那個LV。要記得,LV是由PE組成,不是由PV組成。一個PV中的PE可能分散隸屬於多個LV。例如,假設有一個PV含有50個PE,則其中20個PE可能屬於第一個LV,其中20個PE可能屬於第二個LV,剩下的10個PE可能屬於第三個LV。
在一開始時,PE是由vgcreate指令規畫出來,vgcreate指令依指定的PE大小在PV上劃分成一到多個PE。例如,假設有一個PV容量為1GB,PE為4MB,則此PV可劃分成256個PE。
每個PE可以視為一個獨立的個體,就算是屬於同一個PV的PE,它們不一定會隸屬於同一個LV。
註:PE的觀念很重要,如果不清楚的話,可能就無法正確使用「pvmove」這個指令。
PE相關指令:(PE只有一個指令---> pvmove)
1. pvmove
語法: pvmove 來源PV [ 目的PV]
說明:
此指令為搬移「使用中的PE」 到 「未使用的PE」。「目的PV」需有足夠的「未使用PE數」才能做搬移動作,若不足夠的話,將無法執行此指令。參數「目的PV」可以為多個PV,只要這些PV中「未使用PE數」加起來的PE總數足夠讓來源PV中的「使用中的PE」來置放,指令都允許。
此指令通常使用在此情況下:我們要移除某個PV,可是這個PV被LV所使用,就需要此pvmove指令先做搬移PE動作。
我們要了解,當一個PV有使用中的PE時,是不能直接移除的,否則使用這些PE的LV將會出問題,建立在此LV上的檔案系統中的檔案也會損毀。因此要移除此種PV時,一定要先搬移裡面使用中的PE才行。(註:使用中的PE,指的是分配給LV的PE,這些PE裡面不一定都會包含資料,也有可能不包含資料。)
在此指令中,「目的PV」需有足夠的未使用PE供置放,為了彈性的達到這個需求,「目的PV」數量可以多個,但「來源PV」只能一個。
這個pvmove指令名稱中的「pv」兩個字可能會把人搞糊塗,此指令明明搬移的是PE,但是指令名稱會讓人以為搬移的是PV,也可能認為PV中的全部PE是完全屬於某一LV,因此把PV當成是隸屬於LV而做搬移動作,此搬移動作就是將整個PV搬移到另一個PV上。這是很大的誤解。
前面提過,同一個PV中的PE可能分散隸屬於不同LV,每個PE為獨立個體,有自已的metadata與data。所以在搬移PE時,應該看成是,pvmove將「來源PV中每個PE的data與meatadata」搬移到其它的PE上(metadata記錄此PE隸屬於那個LV)。筆者認為,使用pvmove指令時,最好省略「目的PV名稱」選項,因為省略時,LVM會將PE搬移到同個VG中未使用的PE上,而這些未使用的PE可能分別位於不同的PV中,這有助於釐清觀念及了解LVM運作方式。雖然觀念有點複雜,但還是得搞懂才行。
當使用lvcreate指令「建立LV」時,才是真正分配使用PE的時候,此時可從pvdisplay指令知道PV中的PE使用情況。比較可惜的是,我們只能知道PV中有幾個PE是在使用中或不在使用中,無法明確的知道那些PE是給那個LV使用的。你只要知道,LVM會很聰明的管理分配這些PE給LV使用就是了。
範例:
假設有一個vg01(VG),含有四個PV,分別是/dev/sdb1、/dev/sdc{1,2,3},其中/ dev/sdb1有20個PE在使用中,/dev/sdc1有32個PE未使用,dev/sdc2、/dev/sdc3各有12個PE未使用。現在我們要移除 /dev/sdb1(PV),由於此/dev/sdb1中有PE在使用中,所以我們必須先把這些PE搬移到其它PE才行。
我們有三種方式來進行搬移動作:
第1種方式:將/dev/sdb1上有使用的PE 全部搬移到 /dev/sdc1中未使用PE中。
[root@CentOS6NEW ~]# pvmove /dev/sdb1 /dev/sdc1
/dev/sdb1: Moved: 0.0%
/dev/sdb1: Moved: 30.0%
/dev/sdb1: Moved: 100.0%
第2種方式:將/dev/sdb1上有使用的PE全部 搬移到 /dev/sdc2、/dev/sdc3中未使用的PE中。
[root@CentOS6NEW ~]# pvmove /dev/sdb1 /dev/sdc2 /dev/sdc3 /dev/sdb1: Moved: 0.0%
/dev/sdb1: Moved: 20.0%
/dev/sdb1: Moved: 60.0%
/dev/sdb1: Moved: 100.0%
若指令中有三個以上的PV名稱,pvmove會把第一個PV名稱視為「來源PV」,第二個以後的名稱視為「目的PV」。
第3種方式:搬移到VG未使用的PE。
[root@CentOS6NEW ~]# pvmove /dev/sdb1
/dev/sdb1: Moved: 0.0%
/dev/sdb1: Moved: 25.0%
/dev/sdb1: Moved: 100.0%
若沒有「目的PV」參數,pvmove會把PE搬移到VG中未使用的PE中。
不管使用上面那一種方式,都需要確定「 目的PV」有足夠的未使用PE可供置放。若不足夠時,就需要再新增PV到VG中以補足空間。
(五)檔案系統 resize2fs 指令
resize2fs指令可調整檔案系統大小,剛好可以與LVM配合。
若要將檔案系統「變大」,檔案系統可以不用卸載,直接就可線上調整;
若將檔案系統縮小,則須先卸載並且須先執行「e2fsck -f 檔案系統」指令後才能成功執行resize2fs。如果不先執行「e2fsck」指令,而直接執行resize2fs的話,會出現請你先執行e2fsck的訊息,所以你還是得先執行e2fsck指令。
若要將檔案系統縮小,必須縮小後還有足夠的空間給原來的資料存放,否則資料(檔案)會不見。
先調整檔案系統大小還是先調整分割區的大小?
當要加大容量時,須先調整分割區(LV)容量,再調整檔案系統。
當要縮小容量時,須先調整檔案系統,再調整分割區(LV)容量。「縮小的檔案系統」須小於「縮小的分割區容量」。
筆者建議,若要縮小容量,最好按照三個步驟執行:
步驟一:縮小檔案系統。 (使用 resize2fs 指令)
步驟二:縮小分割區(LV)。(使用lvresize 指令)
步驟三:加大檔案系統。 (使用resize2fs指令)
需要第三個步驟的原因是,resize2fs指令調整的容量單位為GB、MB,而lvresize指令調整的容量單位為PE,兩者無法剛好指定為相同容量,因此,為了讓檔案系統能夠等於分割區的大小,所以必須變成三個步驟來縮小容量。首先,在步驟一時,先將檔案系統的大小調整成比「步驟二縮小後的分割區容量」再小一點,最好縮小的差距為2、3個PE大小,等lvresize把分割區縮小後,我們再使用resize2fs加大一次檔案系統,使得檔案系統可以使用到所有的分割區空間,這樣,檔案系統就可以和分割區大小一樣了。
resize2fs 指令只可使用於ext2、ext3檔案系統,當檔案系統為掛載狀態時,ext3檔案系統可線上擴充空間(ext2檔案系統不行);若檔案系統要縮小,須先卸載才能調整。
語法: resize2fs 檔案系統 [ 容量值 ]
參數「容量值」指的是要將檔案系統調整成多大容量。若省略「容量值」參數,表示要將檔案系統調整成與分割區一樣大(或者可以說是,調整成檔案系統可以使用到所有的分割區空間),不過省略「容量值」參數時,只能適用於分割區比檔案系統大的情況。
範例一:加大容量
LVM環境:
1. 只有一個VG,PE=32MB,VG總共有150個PE,使用中的PE有100個,未使用的PE有50個。
2. 此VG只有一個LV,名稱為/dev/vg01/lv01,有100個PE容量,相當於32*100=3200MB大小。
3. /dev/vg01/lv01格式化為ext3的檔案系統,掛載到 /mnt/vg01/lv01目錄上。
規劃如下:
1. 將/dev/vg01/lv01(LV)加大10個PE大小。
2. 加大檔案系統,讓檔案系統能使用到全部分割區(LV)的空間。
實作:
由於是加大容量,所以不需要卸載檔案系統,可以直接線上調整容量。
1. lvresize -l +10 /dev/vg01/lv01
加大分割區(LV)空間。
2. resize2fs /dev/vg01/lv01
將檔案系統調整成與分割區一樣大。
完成。
範例二:縮小容量
LVM環境:
1. 只有一個VG,PE=32MB,VG總共有150個PE,使用中的PE有100個,未使用的有500個。
2. 此VG只有一個LV,名稱為/dev/vg01/lv01,有100個PE容量,相當於32*100=3200MB大小。
3. /dev/vg01/lv01格式化為ext3的檔案系統,掛載到 /mnt/vg01/lv01目錄上。
規劃如下:
1. 將/dev/vg01/lv01(LV)縮小20個PE。
2. 縮小檔案系統,使檔案系統能使用到全部分割區的空間。
實作:
1. umount /dev/vg01/lv01
須先卸載檔案系統。
2. e2fsck -f /dev/vg01/lv01
須先檢查檔案系統
3. resize2fs /dev/vg01/lv01 2400M
LV要縮小20個PE,相當於是縮小20x32=640MB容量,因此縮小後的LV為3200-640=2560MB。前面說過,縮小的檔案系統須比縮小的分割區(LV)還小個至少2、3個PE,筆者這邊直接把檔案系統縮小為2400MB。
4. lvresize -l -20 /dev/vg01/lv01
縮小分割區(LV)。
5. resize2fs /dev/vg01/lv01
再執行一次resize2fs來使得檔案系統剛好符合分割區大小。
完成。
留言
張貼留言