一、LVM介紹
LVM,Logical Volume Manager,即邏輯卷管理,是在磁盤分區和文件系統之間添加的一個邏輯層,來爲文件系統屏蔽下層磁盤分區佈局,提供的一個抽象的存儲卷,在存儲捲上建立文件系統,以便實現對文件系統的大小靈活調整。
試想有這樣一個場景:home目錄獨立分區,剛開始只有一個用戶使用,後來增加了10個用戶,home目錄空間不夠用了。
有沒有什麼方法可以根據實際需要分配和控制分區大小,即隨着數據的增長,當現有分區空間不夠用時,可以調大分區空間;
當分區在初始分配時分配過大,過一段時間後,還可以隨意縮減分區大小。這只是LVM的功能之一,LVM還可以實現快照功能,對數據進行增量備份,即對修改前的原數據進行備份,這樣可以減少快照佔用空間的大小。
二、PV,VG及LV,PE相關概念
PV(PhysicalVolume),物理卷
VG(Volume Group),卷組
LV(Logical Volume),邏輯卷
PE(Physical Extend),物理擴展塊
LVM的實現是通過將幾個分區(或磁盤)調整System ID 成8e,然後通過pvcreate命令轉換成LVM最底層的物理卷PV,
再將多個PV整合成一塊看起來是獨立的大磁盤,即卷組(VG);再將卷組分成一個或多個可使用的分區(LV),將LV格式化創建文件系統,掛載後就能正常使用了。PE是LVM最小的存儲塊,類似於文件系統裏的block,VG,LV的大小與PE有關,分區縮減或增加容量可以通過調整PE來實現。
三、創建PV,VG以及LV
該實驗對LVM的創建刪除擴展縮減快照等功能進行操作,以下實驗在虛擬環境VMWare上進
行,系統爲Centos 6.6 64位,在虛擬機上對新添加的硬盤/dev/sdb進行操作。實驗步驟如下:
1、創建LVM標識符分區
利用fdisk對/dev/sdb進行分區,並指定System ID爲8e(Linux LVM),具體的分區操作見上篇博文。
[root@localhost ~]# fdisk /dev/sdb # 新建磁盤分區,見如下。 [root@localhost ~]# partx -a /dev/sdb # 通知內核重新識別新建分區 [root@localhost ~]# fdisk -l /dev/sdb # 查看/dev/sdb磁盤的分區信息 Disk /dev/sdb: 42.9 GB, 42949672960 bytes 255 heads, 63 sectors/track, 5221 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x9d1b8246 Device Boot Start End Blocks Id System /dev/sdb1 1 1306 10490413+ 8e Linux LVM /dev/sdb2 1307 2612 10490445 8e Linux LVM /dev/sdb3 2613 4571 15735667+ 8e Linux LVM
2、創建PV
pv管理命令:
pvs:簡要pv信息顯示
pvdisplay:顯示pv的詳細信息
pvscan:查詢當前系統含有PV的磁盤
pvremove:移除一個物理卷
命令格式:pvmove PhysicalDevicePath [PhysicalDevicePath...]
pvmove:移動物理卷數據
命令格式:pvmove [-n LogicalVolume][SourcePhysicalVol-ume[:PE[-PE]...] [DestinationPhysicalVolume[:PE[-PE]...]...]]
pvcreate: 創建pv
命令格式:pvcreate PhysicalDevicePath [PhysicalDevicePath...]
[root@localhost ~]# pvcreate /dev/sdb{1,2} # 將/dev/sdb1和/dev/sdb2整合創建成一個PV Physical volume "/dev/sdb1" successfully created Physical volume "/dev/sdb2" successfully created
[root@localhost ~]# pvdisplay # 顯示PV的詳細信息 "/dev/sdb1" is a new physical volume of "10.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb1 VG Name PV Size 10.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID AznT7f-2ybU-MF4P-xkoM-F4tX-eonQ-fMjA74 "/dev/sdb2" is a new physical volume of "10.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb2 VG Name PV Size 10.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID yVmQtU-UNue-i8o6-nQwc-PYFR-vvvL-UOD4w9
創建PV非常簡單,只需要pvcreate命令和創建PV的分區對象就可以了。從上面PV的信息中可以看出,PV在創建後VG 、PE等相關信息爲空,要想利用到PV的空間,那麼下一步就要創建VG 和指定PE大小。
3、創建VG
vg管理命令:
vgs:簡要VG信息顯示
vgdisplay:詳細的VG信息顯示
vgcreate:創建VG
命令格式:vgcreate[-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
選項:-s:指定VG大小,單位爲kKmMgGtTpPeE(字節,兆,千兆...)
vgextend:擴展VG
命令格式:vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
vgreduce:縮減VG
命令格式:vgreduceVolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
減少或移除pv,爲了避免數據損壞,需要先做pvmove
vgremove:移除一個卷組
如下:將PV /dev/sdb1和/dev/sdb2創建成名爲testvg的VG,PE大小指定爲16M
[root@localhost ~]# vgcreate -s 16M testvg /dev/sdb{1,2} Volume group "testvg" successfully created [root@localhost ~]# vgdisplay --- Volume group --- VG Name testvg System ID Format lvm2 Metadata Areas 2 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 2 Act PV 2 VG Size 20.00 GiB PE Size 16.00 MiB Total PE 1280 Alloc PE / Size 0 / 0 Free PE / Size 1280 / 20.00 GiB VG UUID hBmQdf-Z2hW-1UOM-xJ5n-yvrp-yX0d-8DrIof
4、創建LV
LV管理命令:
lvs:簡要顯示LV信息
lvscan:查詢當前系統具有LV的分區
lvceate:創建LV
命令格式:lvcreate -L #[mMgGtT] -n NAME LogicalVolume{Name|Path}
選項:-L:指定LV大小
-n:指定LV名稱
lvreduce:縮減LV
命令格式:lvreduce -L [-]#[mMgGtT] LogicalVolume{Name|Path}
選項:-L:指定LV大小,-表示縮減多少,不加-表示縮減至多少
lvextend:擴展LV
lvremove:移除一個LV
如下:創建大小爲5G,名稱爲testlv的PV
[root@localhost ~]# lvcreate -L 5G -n testlv /dev/testvg
[root@localhost ~]# lvdisplay /dev/testvg/testlv --- Logical volume --- LV Path /dev/testvg/testlv LV Name testlv VG Name testvg LV UUID icxsNx-y53V-81KM-Iqp3-1PFZ-U0d6-1E22dL LV Write Access read/write LV Creation host, time localhost.localdomain, 2015-08-15 02:50:24 +0800 LV Status available # open 0 LV Size 5.00 GiB Current LE 320 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
創建文件系統並掛載使用
[root@localhost ~]# mke2fs -t ext4 /dev/testvg/testlv # testlv的文件系統創建爲ext4 [root@localhost ~]# mkdir /users [root@localhost ~]# mount /dev/testvg/testlv /users #將testlv掛載至/users目錄 [root@localhost ~]# ls /users lost+found # 新增lost+found目錄表示掛載成功
四、擴展PE、VG、LV
1、擴展PV步驟如下:
只需用fdisk /dev/sdb命令將指定分區的System ID指定爲 8e (Linux LVM),再用pvcreate 命令將該
分區轉換爲PV,即可使用。 [root@localhost ~]# pvcreate /dev/sdb3
2、擴展VG步驟如下:
用pvscan或pvdisplay 命令查看PV剩餘空間是否滿足擴展需求,若不滿足則需擴展PV
[root@localhost ~]# pvscan PV /dev/sdb1 VG testvg lvm2 [10.00 GiB / 7.00 GiB free] PV /dev/sdb2 VG testvg lvm2 [10.00 GiB / 10.00 GiB free] PV /dev/sdb3 lvm2 [15.01 GiB] Total: 3 [35.01 GiB] / in use: 2 [20.00 GiB] / in no VG: 1 [15.01 GiB]
用vgextend 命令增加VG
[root@localhost ~]# vgextend testvg /dev/sdb3 Volume group "testvg" successfully extended
3、擴展LV步驟如下:
先用vgdisplay查看VG中PE剩餘大小,確保有足夠的剩餘空間供擴展
[root@localhost ~]# vgdisplay /dev/testvg # 查看testvg PE剩餘大小,對應項爲Free PE/Size
用lvextend命令擴展物理邊界
[root@localhost ~]# lvextend -L 7G /dev/testvg/testlv Size of logical volume testvg/testlv changed from 5.00 GiB (320 extents) to 7.00 GiB (448 extents). Logical volume testlv successfully resized
用resize2fs 擴展邏輯邊界
[root@localhost ~]# resize2fs /dev/testvg/testlv
查看是否擴展成功
[root@localhost ~]# lvdisplay /dev/testvg/testlv | grep "LV Size" LV Size 7.00 GiB # 物理邊界擴展成功 [root@localhost ~]# df -hP | awk '/testlv/{print $2}' 7.00G # 邏輯邊界擴展成功
五、縮減邏輯卷(LV)
縮減邏輯卷不支持在線縮減,需要umount LV,在縮減前要確保有足夠的空餘空間供縮
減,要保障正常的數據不受影響,步驟如下:
1、先用vsdisplay查看剩餘的空間,確保有足夠的空間供縮減
[root@localhost ~]# lvdisplay /dev/testvg/testlv
2、卸載LV
[root@localhost ~]# umount /dev/testvg/testlv
3、縮減前需要強制檢查文件系統,沒有報告錯誤可繼續下面步驟
[root@localhost ~]# e2fsck -f /dev/testvg/testlv e2fsck 1.41.12 (17-May-2010) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/testvg/testlv: 40/327680 files (0.0% non-contiguous), 55927/1310720 blocks
4、用 resize2fs 命令縮減到3G
[root@localhost ~]# resize2fs /dev/testvg/testlv 3G resize2fs 1.41.12 (17-May-2010) Resizing the filesystem on /dev/testvg/testlv to 786432 (4k) blocks. The filesystem on /dev/testvg/testlv is now 786432 blocks long.
5、重新掛載並查看大小調整是否成功
[root@localhost ~]# mount /dev/testvg/testlv /users [root@localhost ~]# df -hP | awk '/testlv/{print $2}' 2.9G [root@localhost ~]# lvdisplay /dev/testvg/testlv | grep "LV Size" LV Size 3.00 GiB
6、查看調整前後文件是否有減少或者損壞情況,若沒有,則縮減正常
六、快照功能
快照的功能是在創建快照區,如果有數據需要改動,則在改動之前備份一份原始數據到快
照卷中,沒有被改動的區域則由快照區和文件系統共享。由於快照區和被快照的LV共享PE塊,
因此快照區和被快照區需要在同一個VG中。
命令:lvcreate
作用:可以用來創建LVM快照
格式:lvcreate -L #[mMgGtT] -p r -s -n snapshot_lv_name original_lv_name
選項:-p:指定權限,r或rw
-s:snapshot,指定創建快照
-n:設定快照卷名稱
1、創建快照
[root@localhost ~]# lvcreate -L 3G -p r -s -n testsnsh /dev/testvg/testlv Logical volume "testsnsh" created.
2、查看快照相關信息
[root@localhost ~]# lvdisplay /dev/testvg/testsnsh --- Logical volume --- LV Path /dev/testvg/testsnsh LV Name testsnsh VG Name testvg LV UUID 4f18IK-oJWi-tpnv-1wNT-7X1i-RwID-vXhxlq LV Write Access read only LV Creation host, time localhost.localdomain, 2015-08-15 03:45:14 +0800 LV snapshot status active destination for testlv # 爲testlv所建快照 LV Status available # open 0 LV Size 3.00 GiB Current LE 192 COW-table size 3.00 GiB COW-table LE 192 Allocated to snapshot 0.00% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:3
[root@localhost ~]# lvdisplay /dev/testvg/testlv --- Logical volume --- LV Path /dev/testvg/testlv LV Name testlv VG Name testvg LV UUID icxsNx-y53V-81KM-Iqp3-1PFZ-U0d6-1E22dL LV Write Access read/write LV Creation host, time localhost.localdomain, 2015-08-15 02:50:24 +0800 LV snapshot status source of testsnsh [active] # 快照狀態正常 LV Status available
3、驗證
[root@localhost users]# rm -rf pam.d/ # 將掛載目錄下的pam.d目錄及目錄的所有文件刪除 [root@localhost users]# ls lost+found [root@localhost ]# mount /dev/testvg/testsnsh /mnt mount: block device /dev/mapper/testvg-testsnsh is write-protected, mounting read-only [root@localhost ]# cd /mnt [root@localhost mnt]# ls pam.d/ # 所刪除的文件被備份到快照卷中 chfn crond login passwd remote runuser smtp ssh-keycat sudo-i chsh cvs newrole password-auth ricci runuser-l smtp.postfix su su-l config-util fingerprint-auth other polkit-1 run_init smartcard-auth sshd sudo system-auth
4、歸檔和恢復快照
把快照區的內容歸檔壓縮備份
[root@localhost users]# tar -Jcf /tmp/testlv.tar.xz *
卸載快照區並移除
[root@localhost ~]# umount /dev/testvg/testsnsh [root@localhost ~]# lvremove /dev/testvg/testsnsh Do you really want to remove active logical volume testsnsh? [y/n]: y Logical volume "testsnsh" successfully removed
恢復
[root@localhost ~]# umount /dev/testvg/testlv [root@localhost ~]# mkfs -t ext4 /dev/testvg/testlv [root@localhost ~]# mount /dev/testvg/testlv /users [root@localhost ~]# tar -Jxf /tmp/testlv.tar.xz -C /users [root@localhost ~]# ll /users total 20 drwxr-xr-x. 2 root root 4096 Aug 15 03:48 archlinux drwx------. 2 root root 16384 Aug 15 03:12 lost+found
總結:
在LVM管理的時候需要特別注意的是,PV,VG或LV在擴展時要先擴展物理邊界,再擴展邏輯邊界;在縮減時要保證FREE空間滿足,而且不能損壞正常數據,要先縮減邏輯邊界再縮減物理邊界。在移除PV的時候要查看要移除的PV上是否有數據,即確保Allocated PE爲0,不爲0,則需要用盤pvmove命令將數據移動到其他PV的Free 空間上去。