7.2 LVM邏輯卷管理器
前面學習的硬盤設備管理技術雖然能夠有效地提高硬盤設備的讀寫速度以及數據的安全性,但是在硬盤分好區或者部署為RAID磁盤陣列之后,再想修改硬盤分區大小就不容易了。換句話說,當用戶想要隨着實際需求的變化調整硬盤分區的大小時,會受到硬盤“靈活性”的限制。這時就需要用到另外一項非常普及的硬盤設備資源管理技術了—LVM(邏輯卷管理器)。LVM可以允許用戶對硬盤資源進行動態調整。
邏輯卷管理器是Linux系統用於對硬盤分區進行管理的一種機制,理論性較強,其創建初衷是為了解決硬盤設備在創建分區后不易修改分區大小的缺陷。盡管對傳統的硬盤分區進行強制擴容或縮容從理論上來講是可行的,但是卻可能造成數據的丟失。而LVM技術是在硬盤分區和文件系統之間添加了一個邏輯層,它提供了一個抽象的卷組,可以把多塊硬盤進行卷組合並。這樣一來,用戶不必關心物理硬盤設備的底層架構和布局,就可以實現對硬盤分區的動態調整。LVM的技術架構如圖7-7所示。

圖7-7 邏輯卷管理器的技術結構
為了幫助大家理解,劉遄老師來舉一個吃貨的例子。比如小明家里想吃饅頭但是面粉不夠了,於是媽媽從隔壁老王家、老李家、老張家分別借來一些面粉,准備蒸饅頭吃。首先需要把這些面粉(物理卷[PV,Physical Volume])揉成一個大面團(卷組[VG,Volume Group]),然后再把這個大面團分割成一個個小饅頭(邏輯卷[LV,Logical Volume]),而且每個小饅頭的重量必須是每勺面粉(基本單元[PE,Physical Extent])的倍數。
物理卷處於LVM中的最底層,可以將其理解為物理硬盤、硬盤分區或者RAID磁盤陣列,這都可以。卷組建立在物理卷之上,一個卷組可以包含多個物理卷,而且在卷組創建之后也可以繼續向其中添加新的物理卷。邏輯卷是用卷組中空閑的資源建立的,並且邏輯卷在建立后可以動態地擴展或縮小空間。這就是LVM的核心理念。
7.2.1 部署邏輯卷
一般而言,在生產環境中無法精確地評估每個硬盤分區在日后的使用情況,因此會導致原先分配的硬盤分區不夠用。比如,伴隨着業務量的增加,用於存放交易記錄的數據庫目錄的體積也隨之增加;因為分析並記錄用戶的行為從而導致日志目錄的體積不斷變大,這些都會導致原有的硬盤分區在使用上捉襟見肘。而且,還存在對較大的硬盤分區進行精簡縮容的情況。
我們可以通過部署LVM來解決上述問題。部署LVM時,需要逐個配置物理卷、卷組和邏輯卷。常用的部署命令如表7-2所示。
表7-2 常用的LVM部署命令
| 功能/命令 | 物理卷管理 | 卷組管理 | 邏輯卷管理 |
| 掃描 | pvscan | vgscan | lvscan |
| 建立 | pvcreate | vgcreate | lvcreate |
| 顯示 | pvdisplay | vgdisplay | lvdisplay |
| 刪除 | pvremove | vgremove | lvremove |
| 擴展 | vgextend | lvextend | |
| 縮小 | vgreduce | lvreduce |
為了避免多個實驗之間相互發生沖突,請大家自行將虛擬機還原到初始狀態,並在虛擬機中添加兩塊新硬盤設備,然后開機,如圖7-8所示。
在虛擬機中添加兩塊新硬盤設備的目的,是為了更好地演示LVM理念中用戶無需關心底層物理硬盤設備的特性。我們先對這兩塊新硬盤進行創建物理卷的操作,可以將該操作簡單理解成讓硬盤設備支持LVM技術,或者理解成是把硬盤設備加入到LVM技術可用的硬件資源池中,然后對這兩塊硬盤進行卷組合並,卷組的名稱可以由用戶來自定義。接下來,根據需求把合並后的卷組切割出一個約為150MB的邏輯卷設備,最后把這個邏輯卷設備格式化成EXT4文件系統后掛載使用。在下文中,劉遄老師將對每一個步驟再作一些簡單的描述。
第1步:讓新添加的兩塊硬盤設備支持LVM技術。
[root@linuxprobe ~]# pvcreate /dev/sdb /dev/sdc Physical volume "/dev/sdb" successfully created Physical volume "/dev/sdc" successfully created
第2步:把兩塊硬盤設備加入到storage卷組中,然后查看卷組的狀態。
[root@linuxprobe ~]# vgcreate storage /dev/sdb /dev/sdc Volume group "storage" successfully created [root@linuxprobe ~]# vgdisplay --- Volume group --- VG Name storage 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 39.99 GiB PE Size 4.00 MiB Total PE 10238 Alloc PE / Size 0 / 0 Free PE / Size 10238 / 39.99 GiB VG UUID KUeAMF-qMLh-XjQy-ArUo-LCQI-YF0o-pScxm1 ………………省略部分輸出信息………………
第3步:切割出一個約為150MB的邏輯卷設備。
這里需要注意切割單位的問題。在對邏輯卷進行切割時有兩種計量單位。第一種是以容量為單位,所使用的參數為-L。例如,使用-L 150M生成一個大小為150MB的邏輯卷。另外一種是以基本單元的個數為單位,所使用的參數為-l。每個基本單元的大小默認為4MB。例如,使用-l 37可以生成一個大小為37×4MB=148MB的邏輯卷。
[root@linuxprobe ~]# lvcreate -n vo -l 37 storage Logical volume "vo" created [root@linuxprobe ~]# lvdisplay --- Logical volume --- LV Path /dev/storage/vo LV Name vo VG Name storage LV UUID D09HYI-BHBl-iXGr-X2n4-HEzo-FAQH-HRcM2I LV Write Access read/write LV Creation host, time localhost.localdomain, 2017-02-01 01:22:54 -0500 LV Status available # open 0 LV Size 148.00 MiB Current LE 37 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:2 ………………省略部分輸出信息………………
第4步:把生成好的邏輯卷進行格式化,然后掛載使用。
Linux系統會把LVM中的邏輯卷設備存放在/dev設備目錄中(實際上是做了一個符號鏈接),同時會以卷組的名稱來建立一個目錄,其中保存了邏輯卷的設備映射文件(即/dev/卷組名稱/邏輯卷名稱)。
[root@linuxprobe ~]# mkfs.ext4 /dev/storage/vo mke2fs 1.42.9 (28-Dec-2013) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) Stride=0 blocks, Stripe width=0 blocks 38000 inodes, 151552 blocks 7577 blocks (5.00%) reserved for the super user First data block=1 Maximum filesystem blocks=33816576 19 block groups 8192 blocks per group, 8192 fragments per group 2000 inodes per group Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729 Allocating group tables: done Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done [root@linuxprobe ~]# mkdir /linuxprobe [root@linuxprobe ~]# mount /dev/storage/vo /linuxprobe
第5步:查看掛載狀態,並寫入到配置文件,使其永久生效。
[root@linuxprobe ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/rhel-root 18G 3.0G 15G 17% / devtmpfs 905M 0 905M 0% /dev tmpfs 914M 140K 914M 1% /dev/shm tmpfs 914M 8.8M 905M 1% /run tmpfs 914M 0 914M 0% /sys/fs/cgroup /dev/sr0 3.5G 3.5G 0 100% /media/cdrom /dev/sda1 497M 119M 379M 24% /boot /dev/mapper/storage-vo 145M 7.6M 138M 6% /linuxprobe [root@linuxprobe ~]# echo "/dev/storage/vo /linuxprobe ext4 defaults 0 0" >> /etc/fstab
7.2.2 擴容邏輯卷
在前面的實驗中,卷組是由兩塊硬盤設備共同組成的。用戶在使用存儲設備時感知不到設備底層的架構和布局,更不用關心底層是由多少塊硬盤組成的,只要卷組中有足夠的資源,就可以一直為邏輯卷擴容。擴展前請一定要記得卸載設備和掛載點的關聯。
[root@linuxprobe ~]# umount /linuxprobe
第1步:把上一個實驗中的邏輯卷vo擴展至290MB。
[root@linuxprobe ~]# lvextend -L 290M /dev/storage/vo Rounding size to boundary between physical extents: 292.00 MiB Extending logical volume vo to 292.00 MiB Logical volume vo successfully resized
第2步:檢查硬盤完整性,並重置硬盤容量。
[root@linuxprobe ~]# e2fsck -f /dev/storage/vo e2fsck 1.42.9 (28-Dec-2013) 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/storage/vo: 11/38000 files (0.0% non-contiguous), 10453/151552 blocks [root@linuxprobe ~]# resize2fs /dev/storage/vo resize2fs 1.42.9 (28-Dec-2013) Resizing the filesystem on /dev/storage/vo to 299008 (1k) blocks. The filesystem on /dev/storage/vo is now 299008 blocks long.
第3步:重新掛載硬盤設備並查看掛載狀態。
[root@linuxprobe ~]# mount -a [root@linuxprobe ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/rhel-root 18G 3.0G 15G 17% / devtmpfs 985M 0 985M 0% /dev tmpfs 994M 80K 994M 1% /dev/shm tmpfs 994M 8.8M 986M 1% /run tmpfs 994M 0 994M 0% /sys/fs/cgroup /dev/sr0 3.5G 3.5G 0 100% /media/cdrom /dev/sda1 497M 119M 379M 24% /boot /dev/mapper/storage-vo 279M 2.1M 259M 1% /linuxprobe
7.2.3 縮小邏輯卷
相較於擴容邏輯卷,在對邏輯卷進行縮容操作時,其丟失數據的風險更大。所以在生產環境中執行相應操作時,一定要提前備份好數據。另外Linux系統規定,在對LVM邏輯卷進行縮容操作之前,要先檢查文件系統的完整性(當然這也是為了保證我們的數據安全)。在執行縮容操作前記得先把文件系統卸載掉。
[root@linuxprobe ~]# umount /linuxprobe
第1步:檢查文件系統的完整性。
[root@linuxprobe ~]# e2fsck -f /dev/storage/vo e2fsck 1.42.9 (28-Dec-2013) 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/storage/vo: 11/74000 files (0.0% non-contiguous), 15507/299008 blocks
第2步:把邏輯卷vo的容量減小到120MB。
[root@linuxprobe ~]# resize2fs /dev/storage/vo 120M resize2fs 1.42.9 (28-Dec-2013) Resizing the filesystem on /dev/storage/vo to 122880 (1k) blocks. The filesystem on /dev/storage/vo is now 122880 blocks long. [root@linuxprobe ~]# lvreduce -L 120M /dev/storage/vo WARNING: Reducing active logical volume to 120.00 MiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce vo? [y/n]: y Reducing logical volume vo to 120.00 MiB Logical volume vo successfully resized
第3步:重新掛載文件系統並查看系統狀態。
[root@linuxprobe ~]# mount -a [root@linuxprobe ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/rhel-root 18G 3.0G 15G 17% / devtmpfs 985M 0 985M 0% /dev tmpfs 994M 80K 994M 1% /dev/shm tmpfs 994M 8.8M 986M 1% /run tmpfs 994M 0 994M 0% /sys/fs/cgroup /dev/sr0 3.5G 3.5G 0 100% /media/cdrom /dev/sda1 497M 119M 379M 24% /boot /dev/mapper/storage-vo 113M 1.6M 103M 2% /linuxprobe
7.2.4 邏輯卷快照
LVM還具備有“快照卷”功能,該功能類似於虛擬機軟件的還原時間點功能。例如,可以對某一個邏輯卷設備做一次快照,如果日后發現數據被改錯了,就可以利用之前做好的快照卷進行覆蓋還原。LVM的快照卷功能有兩個特點:
快照卷的容量必須等同於邏輯卷的容量;
快照卷僅一次有效,一旦執行還原操作后則會被立即自動刪除。
首先查看卷組的信息。
[root@linuxprobe ~]# vgdisplay --- Volume group --- VG Name storage System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 4 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 2 Act PV 2 VG Size 39.99 GiB PE Size 4.00 MiB Total PE 10238 Alloc PE / Size 30 / 120.00 MiB Free PE / Size 10208 / 39.88 GiB VG UUID CTaHAK-0TQv-Abdb-R83O-RU6V-YYkx-8o2R0e ………………省略部分輸出信息………………
通過卷組的輸出信息可以清晰看到,卷組中已經使用了120MB的容量,空閑容量還有39.88GB。接下來用重定向往邏輯卷設備所掛載的目錄中寫入一個文件。
[root@linuxprobe ~]# echo "Welcome to Linuxprobe.com" > /linuxprobe/readme.txt [root@linuxprobe ~]# ls -l /linuxprobe total 14 drwx------. 2 root root 12288 Feb 1 07:18 lost+found -rw-r--r--. 1 root root 26 Feb 1 07:38 readme.txt
第1步:使用-s參數生成一個快照卷,使用-L參數指定切割的大小。另外,還需要在命令后面寫上是針對哪個邏輯卷執行的快照操作。
[root@linuxprobe ~]# lvcreate -L 120M -s -n SNAP /dev/storage/vo Logical volume "SNAP" created [root@linuxprobe ~]# lvdisplay --- Logical volume --- LV Path /dev/storage/SNAP LV Name SNAP VG Name storage LV UUID BC7WKg-fHoK-Pc7J-yhSd-vD7d-lUnl-TihKlt LV Write Access read/write LV Creation host, time localhost.localdomain, 2017-02-01 07:42:31 -0500 LV snapshot status active destination for vo LV Status available # open 0 LV Size 120.00 MiB Current LE 30 COW-table size 120.00 MiB COW-table LE 30 Allocated to snapshot 0.01% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:3 ………………省略部分輸出信息………………
第2步:在邏輯卷所掛載的目錄中創建一個100MB的垃圾文件,然后再查看快照卷的狀態。可以發現存儲空間占的用量上升了。
[root@linuxprobe ~]# dd if=/dev/zero of=/linuxprobe/files count=1 bs=100M 1+0 records in 1+0 records out 104857600 bytes (105 MB) copied, 3.35432 s, 31.3 MB/s [root@linuxprobe ~]# lvdisplay --- Logical volume --- LV Path /dev/storage/SNAP LV Name SNAP VG Name storage LV UUID BC7WKg-fHoK-Pc7J-yhSd-vD7d-lUnl-TihKlt LV Write Access read/write LV Creation host, time localhost.localdomain, 2017-02-01 07:42:31 -0500 LV snapshot status active destination for vo LV Status available # open 0 LV Size 120.00 MiB Current LE 30 COW-table size 120.00 MiB COW-table LE 30 Allocated to snapshot 83.71% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:3
第3步:為了校驗SNAP快照卷的效果,需要對邏輯卷進行快照還原操作。在此之前記得先卸載掉邏輯卷設備與目錄的掛載。
[root@linuxprobe ~]# umount /linuxprobe [root@linuxprobe ~]# lvconvert --merge /dev/storage/SNAP Merging of volume SNAP started. vo: Merged: 21.4% vo: Merged: 100.0% Merge of snapshot into logical volume vo has finished. Logical volume "SNAP" successfully removed
第4步:快照卷會被自動刪除掉,並且剛剛在邏輯卷設備被執行快照操作后再創建出來的100MB的垃圾文件也被清除了。
[root@linuxprobe ~]# mount -a [root@linuxprobe ~]# ls /linuxprobe/ lost+found readme.txt
7.2.5 刪除邏輯卷
7.2.5 刪除邏輯卷
當生產環境中想要重新部署LVM或者不再需要使用LVM時,則需要執行LVM的刪除操作。為此,需要提前備份好重要的數據信息,然后依次刪除邏輯卷、卷組、物理卷設備,這個順序不可顛倒。
第1步:取消邏輯卷與目錄的掛載關聯,刪除配置文件中永久生效的設備參數。
[root@linuxprobe ~]# umount /linuxprobe [root@linuxprobe ~]# vim /etc/fstab # # /etc/fstab # Created by anaconda on Fri Feb 19 22:08:59 2017 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/rhel-root / xfs defaults 1 1 UUID=50591e35-d47a-4aeb-a0ca-1b4e8336d9b1 /boot xfs defaults 1 2 /dev/mapper/rhel-swap swap swap defaults 0 0 /dev/cdrom /media/cdrom iso9660 defaults 0 0/dev/storage/vo /linuxprobe ext4 defaults 0 0
第2步:刪除邏輯卷設備,需要輸入y來確認操作。
[root@linuxprobe ~]# lvremove /dev/storage/vo Do you really want to remove active logical volume vo? [y/n]: y Logical volume "vo" successfully removed
第3步:刪除卷組,此處只寫卷組名稱即可,不需要設備的絕對路徑。
[root@linuxprobe ~]# vgremove storage Volume group "storage" successfully removed
第4步:刪除物理卷設備。
[root@linuxprobe ~]# pvremove /dev/sdb /dev/sdc Labels on physical volume "/dev/sdb" successfully wiped Labels on physical volume "/dev/sdc" successfully wiped
在上述操作執行完畢之后,再執行lvdisplay、vgdisplay、pvdisplay命令來查看LVM的信息時就不會再看到信息了
