一、LVM的基本概念
在對磁盤進行分區大小規劃時,有時往往不能確定這個分區要使用的總空間大小,而用fdisk對磁盤分區後,每個分區的大小已經固定了,如果分區設置的過大,就白白浪費了磁盤空間,而分區設置的過小,就會導致空間不夠用的情形,此時最常見的方法是重新劃分磁盤分區,或者通過軟連接的方式將此分區的目錄鏈接到另一個分區,雖然能臨時解決問題,但是給管理帶來了麻煩。如何能解決這些問題呢,LVM是一個不錯的方法。
LVM,是Logical Volume Manager的縮寫,中文意思是邏輯卷管理,它是linux下對磁盤分區進行管理的一種機制,LVM是建立在磁盤分區和文件系統之間的一個邏輯層,管理員利用LVM可以在磁盤不用重新分區的情況下動態的調整分區的大小。如果系統新增了一塊硬盤,通過LVM就可以將新增的硬盤空間直接擴展到原來的磁盤分區上。
二、 LVM的使用術語
通過LVM技術,屏蔽了磁盤分區的底層差異,在邏輯上給文件系統提供了一個卷的概念,然後在這些卷上建立相應的文件系統,在認識LVM之前,先熟悉下LVM中幾個常用的術語,在LVM中主要涉及以下幾個概念。
物理存儲設備(physical media):指系統的存儲設備文件,比如:/dev/sda、/dev/hdb等等。
物理卷(physical volume):簡稱PV,是指硬盤分區或者從邏輯上看起來和硬盤分區類似的設備(比如RAID設備)。
卷組(Volume Group):簡稱VG,類似與非LVM系統中的物理硬盤,一個LVM卷組有一個或者多個物理卷組成。
邏輯卷(logical volume):簡稱LV,類似與非LVM系統上的硬盤分區,LV建立在VG上,可以在LV上創建文件系統。
PE(physical extent):PV中可以分配的最小存儲單元稱為PE,PE的大小是可指定的,默認為4M。
LE(logical extent):LV中可以分配的最小存儲單元稱為LE,在同一個卷組中,LE的大小和PE是一樣的,且一一對應。
圖1清楚的說明了LVM各個組成部分之間的對應關系:
圖1 LVM磁盤組織結構圖
在圖1中:
有兩塊物理硬盤組成了LVM的底層結構,這兩塊硬盤的大小、型號可以不同。
PV可以看作是硬盤上的分區,因此,可以說物理硬盤A劃分了兩個分區,物理硬盤B劃分了3個分區。
然後將前三個PV組成了一個卷組VG1,後兩個PV組成了一個卷組VG2。
接著在卷組VG1上劃分了兩個邏輯卷LV1和LV2,在卷組VG2上劃分了一個獨立的邏輯卷LV3。
最後,在邏輯卷LV1、LV2和LV3上創建文件系統,分別用來掛載/usr、/home和/var分區。
三、 安裝LVM工具
通過下面的命令確認LVM是否已經安裝:
[root@localhost ~]# rpm -qa|grep lvm
lvm2-2.02.16-3.el5
system-config-lvm-1.0.22-1.0.el5
如果有類似上面的輸出,就說明系統中已經安裝了LVM,如果沒有任何輸出,則說明系統中還沒有安裝LVM,可以從系統安裝光盤或者網絡上找到對應的rpm包安裝即可,安裝方法這裡不在講述。
現在默認的linux發行版本內核一般都支持LVM,因此只要安裝好LVM工具,即可使用LVM提供的強大功能。
四、 LVM的創建與管理
LVM的創建需要經過以下幾個步驟:
1.創建物理分區
在使用LVM之前,需要首先劃分磁盤分區,也就是用fdisk命令劃分磁盤分區,劃分的方法在上個章節已經介紹過,稍微不同的是,在創建分區的時候,需要指定分區類型為linux LVM,對應的ID為8e(其實LVM也能識別linux默認的分區類型83),
這裡我們將所有分區類型都指定為8e,假定linux下新增了兩塊硬盤,分區後顯示如下:
[root@localhost ~]# fdisk -l /dev/sdb /dev/sdc
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 1044 8385898+ 5 Extended
/dev/sdb5 1 250 2008062 8e Linux LVM
/dev/sdb6 251 500 2008093+ 8e Linux LVM
/dev/sdb7 501 750 2008093+ 8e Linux LVM
/dev/sdb8 751 1044 2361523+ 8e Linux LVM
Disk /dev/sdc: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdc1 1 1044 8385898+ 5 Extended
/dev/sdc5 1 499 4008154+ 8e Linux LVM
/dev/sdc6 500 1044 4377681 8e Linux LVM
由上面輸出可知,/dev/sdb硬盤劃分了一個擴展分區和四個邏輯分區,分區類型均為Linux LVM,/dev/sdc磁盤劃分了一個擴展分區和兩個邏輯分區,分區類型也都是Linux LVM。
這裡以兩塊硬盤舉例的主要目的是為了突出LVM可以跨磁盤操作的概念。也就是LVM可以操作多塊物理硬盤上的不同分區,通過LVM管理磁盤,屏蔽了底層物理設備的異構性。
注意,這裡僅僅是進行了分區操作,磁盤分區還沒有進行格式化。
2.創建物理卷(PV)
創建物理卷的命令是pvcreate,通過該命令可以將希望添加到卷組(VG)的所有磁盤分區或者整個磁盤創建為物理卷。使用格式為:
pvcreate 磁盤分區或整個磁盤
這裡將第一步中劃分的所有磁盤分區創建為物理卷,操作如下:
[root@localhost ~]# pvcreate /dev/sdb5 /dev/sdb6 /dev/sdb7 /dev/sdb8 /dev/sdc5 /dev/sdc6
Physical volume "/dev/sdb5" successfully created
Physical volume "/dev/sdb6" successfully created
Physical volume "/dev/sdb7" successfully created
Physical volume "/dev/sdb8" successfully created
Physical volume "/dev/sdc5" successfully created
Physical volume "/dev/sdc6" successfully created
3.創建卷組
創建卷組的命令是vgcreate,使用格式為:
vgcreate 卷組名 物理卷
卷組名:就是要創建的卷組的名稱。
物理卷:指定希望添加到此卷組的所有磁盤分區或者整個磁盤。
這裡我們創建兩個卷組myvg1和myvg2,同時兩個卷組都跨越了不同的磁盤,卷組myvg1由/dev/sdb磁盤的/dev/sdb5、/dev/sdb6和/dev/sdc磁盤的/dev/sdc5分區組成。同理,卷組myvg2由/dev/sdb磁盤的/dev/sdb7、/dev/sdb8和/dev/sdc磁盤的/dev/sdc6分區組成。操作如下:
[root@localhost ~]# vgcreate myvg1 /dev/sdb5 /dev/sdb6 /dev/sdc5
Volume group "myvg1" successfully created
[root@localhost ~]# vgcreate myvg2 /dev/sdb7 /dev/sdb8 /dev/sdc6
Volume group "myvg2" successfully created
4.激活卷組
卷組創建完畢後,可以通過vgchange命令激活卷組,而無需重啟系統。Vgchange使用格式如下:
vgchange -a y 卷組名 (激活卷組)
vgchange -a n 卷組名 (停用卷組)
這裡我們激活卷組myvg1和myvg2,使用如下命令:
[root@localhost ~]# vgchange -a y myvg1
0 logical volume(s) in volume group "myvg1" now active
[root@localhost ~]# vgchange -a y myvg2
0 logical volume(s) in volume group "myvg2" now active
5.顯示卷組、物理卷屬性信息
vgdisplay用於顯示創建的卷組信息,同理pvdisplay命令用於顯示物理卷組信息,使用格式為:
vgdisplay 卷組名
pvdisplay 物理卷名
要顯示卷組myvg1的信息,執行操作如下:
[root@localhost ~]# vgdisplay myvg1
--- Volume group ---
VG Name myvg1
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 7.65 GB
PE Size 4.00 MB
Total PE 1958
Alloc PE / Size 0 / 0
Free PE / Size 1958 / 7.65 GB
VG UUID H6RMci-9F2C-QlPw-Bnl2-07AP-J0h7-XPq4FQ
從輸出可以看出此卷組所有信息,例如卷組大小為7.65 GB,每個PE大小為4M,總共的PE數為1958。
6.創建邏輯卷
創建邏輯卷的命令是lvcreate,常用的使用格式為:
lvcreate [-L 邏輯卷大小| -l PE數 ] –n 邏輯卷名稱 所屬的卷組名
其中:
-L:後面接邏輯卷的大小,可以用K、M、G表示。例如100M、10G等
-l:用PE數來計算邏輯卷的大小。
這裡我們在卷組myvg1下創建兩個邏輯卷mylv11和mylv12,在卷組myvg2下創建一個卷組mylv2:
[root@localhost ~]# lvcreate -L 4G -n mylv11 myvg1
#在卷組myvg1中創建一個大小為4G的卷組mylv11
Logical volume "mylv11" created
[root@localhost ~]# vgdisplay myvg1|grep "Free PE"
#檢查卷組myvg1中可用的卷組空間
Free PE / Size 934 / 3.65 GB
[root@localhost ~]# lvcreate -l 934 -n mylv12 myvg1
#將卷組myvg1中剩余的空間全部分給邏輯卷mylv12
Logical volume "mylv12" created
[root@localhost ~]# vgdisplay myvg1|grep "Free PE"
#檢查卷組myvg1中是否還有剩余空間,從輸出可知,空間全部利用,沒有浪費。
Free PE / Size 0 / 0
[root@localhost ~]# vgdisplay myvg2|grep "Free PE"
#檢查卷組myvg2的可用空間
Free PE / Size 2134 / 8.34 GB
[root@localhost ~]# lvcreate -l 2134 -n mylv2 myvg2
#將卷組myvg2的所有空間分配給邏輯卷mylv2
Logical volume "mylv2" created
7.格式化邏輯卷,創建文件系統
文件系統是創建在邏輯卷上的,這裡假定使用linux默認的ext3文件系統,接下來的工作是用mkfs.ext3格式化文件系統:
[root@localhost ~]# mkfs.ext3 /dev/myvg1/mylv11
[root@localhost ~]# mkfs.ext3 /dev/myvg1/mylv12
[root@localhost ~]# mkfs.ext3 /dev/myvg2/mylv2
最後,建立掛載目錄,掛載這些邏輯卷即可:
[root@localhost ~]#mkdir /mylv11
[root@localhost ~]#mkdir /mylv12
[root@localhost ~]# mkdir /mylv2
[root@localhost ~]# mount /dev/myvg1/mylv11 /mylv11
[root@localhost ~]# mount /dev/myvg1/mylv12 /mylv12
[root@localhost ~]# mount /dev/myvg2/mylv2 /mylv2
[root@localhost ~]# df -h|grep mylv
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/myvg1-mylv11 4.0G 137M 3.7G 4% /mylv11
/dev/mapper/myvg1-mylv12 3.6G 72M 3.4G 3% /mylv12
/dev/mapper/myvg2-mylv2 8.3G 147M 7.7G 2% /mylv2
到這裡為止,新增的磁盤設備已經可以使用了,如果要開機自動掛載,編輯/etc/fstab文件,加上新增的三個邏輯分區即可。
8.添加新的物理卷到卷組
添加新的物理卷到卷組的命令為vgextend,使用格式為:
vgextend 卷組名 新加入的物理卷
緊接著上面的講解實例,假定系統增加了第四塊硬盤/dev/sdd,大小為4G,同時通過fdisk進行了磁盤分區,對應的分區為/dev/sdd5,現在要把新增的硬盤分區加入到卷組myvg2,操作如下:
[root@localhost ~]# vgdisplay myvg2|grep “Free PE” #首先檢查myvg2卷是否有空閒空間,由輸出可知,空間全部用完。
Free PE / Size 0 / 0
[root@localhost ~]# pvcreate /dev/sdd5 #先將/dev/sdd5轉換為物理卷
Physical volume "/dev/sdd5" successfully created
[root@localhost ~]# vgextend myvg2 /dev/sdd5 #將新增物理卷添加到卷組myvg2中
Volume group "myvg2" successfully extended
[root@localhost ~]# vgdisplay myvg2|grep "Free PE" #此時剩余卷組空間還有4G,剛好是新增物理卷的大小
Free PE / Size 1023 / 4.00 GB
9.修改邏輯卷的大小
LVM最主要的功能就是能動態的調整分區的大小,其實也就是修改邏輯卷的大小,修改邏輯卷需要用到的命令有lvextend(擴展邏輯卷)、lvreduce(縮減邏輯卷)以及ext2resize(修改文件系統大小),下面分別進行介紹。
lvextend與lvreduce的使用格式類似,如下所示:
lvextend [-L (+size) –l (+PE數)] 邏輯卷名稱
lvreduce [-L (-size) –l (-PE數)] 邏輯卷名稱
-L:“+size”表示給邏輯卷空間增加指定的大小,“-size”表示給邏輯卷空間縮減指定的大小。size表示將邏輯卷增加(lvextend)或縮減(lvreduce)到指定的空間大小。例如“+300”表示將邏輯卷空間增大300M,“-2G”表示將邏輯卷的空間縮減2G。
-l:與“-L”用法相同,不同的是“-l”選項用PE數來表示邏輯卷的大小。
ext2resize的使用格式如下:
ext2resize 設備文件或邏輯卷 空間大小
修改邏輯卷分為擴充邏輯卷大小和減小邏輯卷大小兩種情況,下面依次介紹。
(1)擴充邏輯卷空間
擴充邏輯卷大小的一般步驟為:
利用擴展邏輯卷命令lvextend擴展邏輯卷空間
卸載已經掛載的邏輯卷分區
利用ext2resize指令修改文件系統大小以實現空間擴充
掛載擴充後的邏輯卷分區