使用RAID與LVM磁盤陣列技術。


7.2 LVM邏輯卷管理器

前面學習的硬盤設備管理技術雖然能夠有效地提高硬盤設備的讀寫速度以及數據的安全性,但是在硬盤分好區或者部署為RAID磁盤陣列之后,再想修改硬盤分區大小就不容易了。換句話說,當用戶想要隨着實際需求的變化調整硬盤分區的大小時,會受到硬盤“靈活性”的限制。這時就需要用到另外一項非常普及的硬盤設備資源管理技術了—LVM(邏輯卷管理器)。LVM可以允許用戶對硬盤資源進行動態調整。

邏輯卷管理器是Linux系統用於對硬盤分區進行管理的一種機制,理論性較強,其創建初衷是為了解決硬盤設備在創建分區后不易修改分區大小的缺陷。盡管對傳統的硬盤分區進行強制擴容或縮容從理論上來講是可行的,但是卻可能造成數據的丟失。而LVM技術是在硬盤分區和文件系統之間添加了一個邏輯層,它提供了一個抽象的卷組,可以把多塊硬盤進行卷組合並。這樣一來,用戶不必關心物理硬盤設備的底層架構和布局,就可以實現對硬盤分區的動態調整。LVM的技術架構如圖7-7所示。

第7章 使用RAID與LVM磁盤陣列技術。使用RAID與LVM磁盤陣列技術。

圖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的信息時就不會再看到信息了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM