LVM邏輯捲管理器 為什麼要使用邏輯捲? 邏輯捲管理器是Linux系統用於對硬碟分區進行管理的一種機制,為瞭解決硬碟設備在創建分區後不易修改分區大小的缺陷。儘管對傳統的硬碟分區進行強制擴容或縮容從理論上講是可行的。但是卻可能造成數據的丟失。LVM技術是在硬碟分區和文件系統之間添加了一個邏輯層,它提供 ...
LVM邏輯捲管理器
為什麼要使用邏輯捲?
邏輯捲管理器是Linux系統用於對硬碟分區進行管理的一種機制,為瞭解決硬碟設備在創建分區後不易修改分區大小的缺陷。儘管對傳統的硬碟分區進行強制擴容或縮容從理論上講是可行的。但是卻可能造成數據的丟失。LVM技術是在硬碟分區和文件系統之間添加了一個邏輯層,它提供了一個抽象的捲組,可以把多塊硬碟進行捲組合併。這樣一來,用戶不必關心物理設備和底層架構和佈局,就可以實現對硬碟分區的動態調整。
LVM的技術架構圖:
舉例理解:
比如小明家裡想吃饅頭但是麵粉不夠了,於是媽媽從隔壁老王家、老李家、老張家分別借來一些麵粉,準備蒸饅頭吃。首先需要把這些麵粉( 物理捲[ PV, Physical Volume ] )揉成一個大麵團( 捲組[ VG,Volume Group ] ),然後再把這個大麵團分割成一個個小饅頭( 邏輯捲[ LV, Logical Volume ] ),而且每個小饅頭的重量必須是每勺麵粉( 基本單元[ PE, Physical Extent ] )的倍數。
理論:
物理捲處於LVM中的最底層,可以將其理解為物理硬碟、硬碟分區或者RAID磁碟陣列,這都可以。捲組建立在物理捲之上,一個捲組可以包含多個物理捲,而且在捲組創建之後也可以繼續向其中添加新的物理捲。邏輯捲是用捲組中空閑的資源建立的,並且邏輯捲在建立後可以動態地擴展或縮小空間。這就是LVM的核心理念。
- 物理捲(PV:Physical Volume):物理捲是底層真正提供容量,存放數據的設備,它可以是整個硬碟、硬碟上的分區等。
- 捲組(VG:Volume Group):捲組建立在物理捲之上,它由一個或多個物理捲組成。即把物理捲整合起來提供容量分配。一個LVM系統中可以只有一個捲組,也可以包含多個捲組。
- 邏輯捲(LV:Logical Volume):邏輯捲建立在捲組之上,它是從捲組中“切出”的一塊空間。它是最終用戶使用的邏輯設備。邏輯捲創建之後,其大小可以伸縮。
- 基本單元(PE:Physical Extents):具有唯一編號的PE是能被LVM定址的最小單元。PE的大小可以指定,預設為4MB。PE的大小一旦確定將不能改變,同一個捲組中的所有的物理捲的PE的大小是一直的
部署邏輯捲
常用的LVM部署命令
功能/命令 | 物理捲管理 | 捲組管理 | 邏輯捲管理 |
掃描 | pvscan | vgscan | lvscan |
建立 | pvcreate | vgcreate | lvcreate |
顯示 | pvdisplay | vgdisplay | lvdisplay |
刪除 | pvremove | vgremove | lvremove |
擴展 | vgextend | lvextend | |
縮小 | vgreduce | lvreduce |
添加兩塊新硬碟設備
在虛擬機中添加兩塊新硬碟設備的目的,是為了更好地演示LVM理念中用戶無需關心底層物理硬碟設備的特性。我們先對這兩塊新硬碟進行創建物理捲的操作,可以將該操作簡單理解成讓硬碟設備支持LVM技術,或者理解成是把硬碟設備加入到LVM技術可用的硬體資源池中,然後對這兩塊硬碟進行捲組合併,捲組的名稱可以由用戶來自定義。接下來,根據需求把合併後的捲組切割出一個約為150MB的邏輯捲設備,最後把這個邏輯捲設備格式化成EXT4文件系統後掛載使用。
[root@centos7-1 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom vda 252:0 0 10G 0 disk ├─vda1 252:1 0 500M 0 part /boot └─vda2 252:2 0 9.5G 0 part ├─cl-root 253:0 0 9G 0 lvm / └─cl-swap 253:1 0 500M 0 lvm [SWAP] vdb 252:16 0 10G 0 disk vdc 252:32 0 10G 0 disk
第1步:創建物理捲,讓新添加的兩塊硬碟設備支持LVM技術。
[root@centos7-1 ~]# pvcreate /dev/vdb /dev/vdc Physical volume "/dev/vdb" successfully created. Physical volume "/dev/vdc" successfully created. [root@centos7-1 ~]# pvs //簡單查看 PV VG Fmt Attr PSize PFree /dev/vda2 cl lvm2 a-- 9.51g 0 /dev/vdb lvm2 --- 10.00g 10.00g /dev/vdc lvm2 --- 10.00g 10.00 [root@centos7-1 ~]# pvdisplay /dev/vdb //查看物理捲詳細信息 "/dev/vdb" is a new physical volume of "10.00 GiB" --- NEW Physical volume --- PV Name /dev/vdb VG Name PV Size 10.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID bUTpIc-J6Hq-LUvk-WinD-hoYk-HQkX-sNgA2W
第2步:創建捲組並將物理捲加入到捲組
[root@centos7-1 ~]# vgcreate vg_storage /dev/vdb /dev/vdc //vg_storage 自定義捲組名稱 Volume group "vg_storage" successfully created [root@centos7-1 ~]# vgdisplay --- Volume group --- VG Name vg_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 19.99 GiB PE Size 4.00 MiB Total PE 5118 Alloc PE / Size 0 / 0 Free PE / Size 5118 / 19.99 GiB VG UUID PRDBRS-ybbD-Dwud-GPbM-XxKu-5NHA-a0BMEm ...........省略部分輸出信息..........
第3步:創建一個約為150MB的邏輯捲設備
這裡需要註意切割單位的問題,在對邏輯捲進行切割時有兩種計量單位。第一種是以容量為單位,所使用的參數為-L,列如使用 —L 150M 則生成一個大小為150MB的邏輯捲。另外一種是以基本單元的個數為單位,所使用的參數為-l。每個基本單元的大小預設為4MB,例如,使用-l 37可以生成一個大小為37×4MB=148MB的邏輯捲。
root@centos7-1 ~]# lvcreate -n lv_vo -L 150M vg_storage // -n 指定邏輯捲設備名稱 Rounding up size to full physical extent 152.00 MiB Logical volume "lv_vo" created. [root@centos7-1 ~]# lvdisplay --- Logical volume --- LV Path /dev/vg_storage/lv_vo LV Name lv_vo VG Name vg_storage LV UUID dIo5Ff-pKyD-97Hw-RMs3-dQ10-9tHG-ZGh5o9 LV Write Access read/write LV Creation host, time centos7-1, 2018-11-12 11:00:28 +0800 LV Status available # open 0 LV Size 152.00 MiB Current LE 38 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:2 ...........省略部分輸出信息..........
第4步:將生成好的邏輯捲進行格式化,然後掛載使用
Linux系統會把LVM中的邏輯捲設備存放在/dev設備目錄中(實際上是做了一個符號鏈接),同時會以捲組的名稱來建立一個目錄,其中保存了邏輯捲的設備映射文件(即/dev/捲組名稱/邏輯捲名稱)。
[root@centos7-1 ~]# ls /dev/vg_storage/lv_vo /dev/vg_storage/lv_vo [root@centos7-1 ~]# mkfs.ext4 /dev/vg_storage/lv_vo mke2fs 1.42.9 (28-Dec-2013) 文件系統標簽= OS type: Linux 塊大小=1024 (log=0) 分塊大小=1024 (log=0) Stride=0 blocks, Stripe width=0 blocks 38912 inodes, 155648 blocks 7782 blocks (5.00%) reserved for the super user 第一個數據塊=1 Maximum filesystem blocks=33816576 19 block groups 8192 blocks per group, 8192 fragments per group 2048 inodes per group Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729 Allocating group tables: 完成 正在寫入inode表: 完成 Creating journal (4096 blocks): 完成 Writing superblocks and filesystem accounting information: 完成 [root@centos7-1 ~]# mkdir /linuxlvm [root@centos7-1 ~]# mount /dev/vg_storage/lv_vo /linuxlvm/
第5步:查看掛載狀態,並寫入到配置文件、使其永久生效
[root@centos7-1 ~]# df -h 文件系統 容量 已用 可用 已用% 掛載點 /dev/mapper/cl-root 9.1G 3.7G 5.4G 41% / devtmpfs 481M 0 481M 0% /dev tmpfs 497M 84K 497M 1% /dev/shm tmpfs 497M 7.1M 490M 2% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup /dev/vda1 497M 166M 332M 34% /boot tmpfs 100M 16K 100M 1% /run/user/42 tmpfs 100M 0 100M 0% /run/user/0 /dev/mapper/vg_storage-lv_vo 144M 1.6M 132M 2% /linuxlvm [root@centos7-1 ~]# echo "/dev/vg_storage/lv_vo /linuxlvm ext4 defaults 0 0" >>/etc/fstab
擴容邏輯捲
在前面的實驗中,捲組是由兩塊硬碟設備共同組成的。用戶在使用存儲設備時感知不到設備底層的架構和佈局,更不用關心底層是由多少塊硬碟組成的,只要捲組中有足夠的資源,就可以一直為邏輯捲擴容。擴展前請一定要記得卸載設備和掛載點的關聯。
[root@centos7-1 ~]# umount /linuxlvm
第1步:把上一個實驗中的邏輯捲vo擴展至300MB。
[root@centos7-1 ~]# lvextend -L 300M /dev/vg_storage/lv_vo Size of logical volume vg_storage/lv_vo changed from 152.00 MiB (38 extents) to 300.00 MiB (75 extents). Logical volume vg_storage/lv_vo successfully resized.
第2步:檢查硬碟完整性,並重置硬碟容量。
[root@centos7-1 ~]# e2fsck -f /dev/vg_storage/lv_vo 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/vg_storage/lv_vo: 11/38912 files (0.0% non-contiguous), 10567/155648 blocks [root@centos7-1 ~]# resize2fs /dev/vg_storage/lv_vo resize2fs 1.42.9 (28-Dec-2013) Resizing the filesystem on /dev/vg_storage/lv_vo to 307200 (1k) blocks. The filesystem on /dev/vg_storage/lv_vo is now 307200 blocks long.
第3步:重新掛載硬碟設備並查看掛載狀態。
[root@centos7-1 ~]# mount -a [root@centos7-1 ~]# df -h 文件系統 容量 已用 可用 已用% 掛載點 /dev/mapper/cl-root 9.1G 3.7G 5.4G 41% / devtmpfs 481M 0 481M 0% /dev tmpfs 497M 84K 497M 1% /dev/shm tmpfs 497M 7.1M 490M 2% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup /dev/vda1 497M 166M 332M 34% /boot tmpfs 100M 16K 100M 1% /run/user/42 tmpfs 100M 0 100M 0% /run/user/0 /dev/mapper/vg_storage-lv_vo 287M 2.1M 266M 1% /linuxlvm
縮小邏輯捲
相較於擴容邏輯捲,在對邏輯捲進行縮容操作時,其丟失數據的風險更大。所以在生產環境中執行相應操作時,一定要提前備份好數據。另外Linux系統規定,在對LVM邏輯捲進行縮容操作之前,要先檢查文件系統的完整性(當然這也是為了保證我們的數據安全)。在執行縮容操作前記得先把文件系統卸載掉。
[root@centos7-1 ~]# umount /linuxlvm/
第1步:檢查文件系統的完整性
[root@centos7-1 ~]# e2fsck -f /dev/vg_storage/lv_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/vg_storage/lv_vo: 11/77824 files (0.0% non-contiguous), 15987/307200 blocks
第2步:把邏輯捲lv_vo的容量減小到120MB
[root@centos7-1 ~]# resize2fs /dev/vg_storage/lv_vo 120M resize2fs 1.42.9 (28-Dec-2013) Resizing the filesystem on /dev/vg_storage/lv_vo to 122880 (1k) blocks. The filesystem on /dev/vg_storage/lv_vo is now 122880 blocks lon [root@centos7-1 ~]# lvreduce -L 120M /dev/vg_storage/lv_vo WARNING: Reducing active logical volume to 120.00 MiB. THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce vg_storage/lv_vo? [y/n]: y Size of logical volume vg_storage/lv_vo changed from 300.00 MiB (75 extents) to 120.00 MiB (30 extents). Logical volume vg_storage/lv_vo successfully resized.
第3步:重新掛載文件系統並查看系統狀態
[root@centos7-1 ~]# mount -a [root@centos7-1 ~]# df -h 文件系統 容量 已用 可用 已用% 掛載點 /dev/mapper/cl-root 9.1G 3.7G 5.4G 41% / devtmpfs 481M 0 481M 0% /dev tmpfs 497M 84K 497M 1% /dev/shm tmpfs 497M 7.1M 490M 2% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup /dev/vda1 497M 166M 332M 34% /boot tmpfs 100M 16K 100M 1% /run/user/42 tmpfs 100M 0 100M 0% /run/user/0 /dev/mapper/vg_storage-lv_vo 113M 1.6M 103M 2% /linuxlvm
邏輯捲快照
LVM還具備有“快照捲”功能,該功能類似於虛擬機軟體的還原時間點功能。例如,可以對某一個邏輯捲設備做一次快照,如果日後發現數據被改錯了,就可以利用之前做好的快照捲進行覆蓋還原。
首先查看捲組的信息
[root@centos7-1 ~]# vgdisplay --- Volume group --- VG Name vg_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 19.99 GiB PE Size 4.00 MiB Total PE 5118 Alloc PE / Size 30 / 120.00 MiB Free PE / Size 5088 / 19.88 GiB VG UUID PRDBRS-ybbD-Dwud-GPbM-XxKu-5NHA-a0BMEm ...........省略部分輸出信息..........
通過捲組的輸出信息可以清晰看到,捲組中已經使用了120MB的容量,空閑容量還有19.88GB。接下來用重定嚮往邏輯捲設備所掛載的目錄中寫入一個文件。
[root@centos7-1 ~]# echo "to day is good day" > /linuxlvm/today.txt [root@centos7-1 ~]# ll /linuxlvm/ 總用量 13 drwx------ 2 root root 12288 11月 12 11:04 lost+found -rw-r--r-- 1 root root 19 11月 12 11:57 today.txt
第1步:使用-s參數生成一個快照捲,使用-L參數指定切割的大小。另外,還需要在命令後面寫上是針對哪個邏輯捲執行的快照操作。
[root@centos7-1 ~]# lvcreate -L 120M -s -n SNAP /dev/vg_storage/lv_vo Using default stripesize 64.00 KiB. Rounding up size to full physical extent 52.00 MiB Logical volume "SNAP" created. [root@centos7-1 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 9.02g
swap cl -wi-ao---- 500.00m
SNAP vg_storage swi-a-s--- 120.00m lv_vo 0.01
lv_vo vg_storage owi-aos--- 120.00m
第2步:在邏輯捲所掛載的目錄中創建一個100MB的垃圾文件,然後再查看快照捲的狀態。可以發現存儲空間占的用量上升了。
[root@centos7-1 ~]# dd if=/dev/zero of=/linuxlvm/files count=1 bs=100M 記錄了1+0 的讀入 記錄了1+0 的寫出 104857600位元組(105 MB)已複製,0.680154 秒,154 MB/秒 [root@centos7-1 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root cl -wi-ao---- 9.02g swap cl -wi-ao---- 500.00m SNAP vg_storage swi-a-s--- 120.00m lv_vo 83.69 lv_vo vg_storage owi-aos--- 120.00m
第3步:為了校驗SNAP快照捲的效果,需要對邏輯捲進行快照還原操作。在此之前記得先卸載掉邏輯捲設備與目錄的掛載。
[root@centos7-1 ~]# umount /linuxlvm [root@centos7-1 ~]# lvconvert --merge /dev/vg_storage/SNAP Merging of volume vg_storage/SNAP started. lv_vo: Merged: 18.84% lv_vo: Merged: 100.00%
第4步:快照捲會被自動刪除掉,並且剛剛在邏輯捲設備被執行快照操作後再創建出來的100MB的垃圾文件也被清除了。
[root@centos7-1 ~]# mount -a [root@centos7-1 ~]# ls /linuxlvm/ lost+found today.txt
刪除邏輯捲
當生產環境中想要重新部署LVM或者不再需要使用LVM時,則需要執行LVM的刪除操作。為此,需要提前備份好重要的數據信息,然後依次刪除邏輯捲、捲組、物理捲設備,這個順序不可顛倒。
第1步:取消邏輯捲與目錄的掛載關聯,刪除配置文件中永久生效的設備參數。
[root@centos7-1 ~]# umount /linuxlvm/ [root@centos7-1 ~]# vim /etc/fstab # # /etc/fstab # Created by anaconda on Mon Oct 29 12:25:27 2018 # # 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/cl-root / xfs defaults 0 0 UUID=07d3a8ca-89fa-4011-837d-47ac9f7660c4 /boot xfs defaults 0 0 /dev/mapper/cl-swap swap swap defaults 0 0 /dev/vg_storage/lv_vo /linuxlvm ext4 defaults 0 0
第2步:刪除邏輯捲設備,需要輸入y來確認操作。
[root@centos7-1 ~]# lvremove /dev/vg_storage/lv_vo Do you really want to remove active logical volume vg_storage/lv_vo? [y/n]: y Logical volume "lv_vo" successfully removed
第3步:刪除捲組,此處只寫捲組名稱即可,不需要設備的絕對路徑。
[root@centos7-1 ~]# vgremove vg_storage Volume group "vg_storage" successfully removed
第4步:刪除物理捲設備。
[root@centos7-1 ~]# pvremove /dev/vdb /dev/vdc Labels on physical volume "/dev/vdb" successfully wiped. Labels on physical volume "/dev/vdc" successfully wiped.
在上述操作執行完畢之後,再執行lvdisplay、vgdisplay、pvdisplay命令來查看LVM的信息時就不會再看到信息了(前提是上述步驟的操作是正確的)。