前言:根據前面的學習我們知道,一個磁盤一旦分完區并且格式化后,其空間大小是沒有辦法進行調整了。因此推出了LVM(Logical Volume Manager)邏輯卷管理機制,LVM重點在于可以彈性的調整文件系統的容量!并非在于性能和數據保全方面,需要文件的讀寫性能或者數據的可靠性,需要用到RAID。而LVM可以整合多個物理分區在一起,讓這些分區看起來像是一個磁盤一樣,而且還可以將其他的物理分區或將從這個LVM管理的磁盤中刪除。實現磁盤的擴大和縮小容量,LVM最精華的部分是可以實現快照功能,快照就是將當前的系統信息記錄下來,將來有任何數據改動了,就會將原始數據移動到快照,沒有改動的區域則由快照區域和文件系統共享。并且LVM在我們實際的生產環境中運用廣泛,因此我們必須要非常熟悉其基本原理和使用方法,下面我們通過一個實驗來演示其各個階段,讓我們一睹為快吧!
一、PV,PE,VG,LV的含義
1、PV(Physical Volume)物理卷
我們實際的分區需要調整系統標示符(system id)成為8e(LVM的標示符)然后經過pvcreate的命令將它轉為LVM最底層的物理卷PV,之后才能將這些PV加以利用,調整system id的方法是使用fdisk命令。
2、VG(Volume Group)卷用戶組
所謂的LVM大磁盤就是將許多PV整合成這個VG,因此VG就是PV組合起來的大磁盤。那么這個大磁盤的容量為多少呢?這是與有多少個PE有關,我們默認VG最多可以有65534個PE,后續我們介紹PE,在這里我們先知道一個VG最大可達256G的容量。
3、PE(Physical Extend)物理擴展塊
LVM默認使用4M的PE塊,而LVM的VG最多僅能含有65534個PE,因此兩者相乘就得到上述所說的256G。PE是整個LVM最小的存儲塊,也就是說,其實我們的文件數據都是有寫入PE來處理的,簡單地說,這個PE就有點像文件系統的block大小,又有點像RAID中的chunk,因此調整PE的大小,會影響到VG的最大容量。
4、LV(Logical Volume)邏輯卷
最終的VG還會被切割成LV,這個LV就可以最后被格式化使用的類似分區。LV的容量也是和LV中的PE的數量有關的,其大小是不可以調整的,當然我們可以通過VG里面的沒有使用的PE加入到LV里面,就可以實現LV的擴容。為了方便LVM管理其系統,它的設備名通常指定為“/dev/vgname/lvname”的樣式,而VG的名字是可以隨意指定的。這一點必須的注意!
二、VG、LV、PE的相互關系
如上圖所示,我們知道LVM里面最小的儲存塊就是PE,但是它可以屬于不同階段的PE,上圖表示的VG內的PE會分給虛線部分的LV作為LV的PE,如果將來這個VG需要擴充的話,我們增加其他的PV即可。而重要的LV擴充的話,可以通過加入VG內沒有使用的PE來擴充,當然如果LV需要降低容量,可以將其內的PE扔回VG即可。
三、LVM各組件實現的流程
通過PV、VG、LV的規劃之后,再利用mkfs就可以將你得LV格式化成可以利用的文件系統了,而且這個文件系統的容量將來還可以能夠進行擴充或減少,里面的數據不會受到影響。下面我們來了解下到底有哪些階段,如下圖所示:
四、LVM實際操作流程
實驗目的:了解LVM的命令使用方法
實驗規劃流程:
·分出4個分區,每個分區的容量為2G,且system id需要更改為8e
·全部的分區需要整合到一個VG內,VG的名稱我們設置為andyvg,且我們設置PE的大小為16M
·全部的VG容量都丟給LV,LV的名稱設置為/dev/andyvg/andylv(實際我們也需要演示丟6G的VG容量給LV)
·最終我們將LV格式化ext4的文件系統,并且實現開機掛載到/mnt/lvm中
根據上述實驗規劃流程,我們趕緊進入實際操作中來。
1、先規劃自己系統的環境,前提就是刪除之前實驗操作的分區全部刪除,具體我們可以按照下面幾步操作來還原系統:
(1)利用umount先卸載之前掛載的文件系統
(2)修改/etc/fstab里面的數據,讓開機不會自動掛載
(3)利用fdisk將對應的分區刪除
(4)注意一點如果機器之前做過RAID的實驗,需要卸載,修改/etc/fstab文件,然后再關閉服務,并且要得刪除RAID的配置文件,具體操作請查閱軟RAID的模擬實驗。
(5)如果已經掛載了LVM,我們也需要刪除,具體操作后續也會介紹。
我開始實驗前的系統環境:
[root@centos7 ~ #1]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 200M 0 part /boot ├─sda2 8:2 0 100G 0 part / ├─sda3 8:3 0 4G 0 part [SWAP] ├─sda4 8:4 0 1K 0 part ├─sda5 8:5 0 20G 0 part /testdir └─sda6 8:6 0 10G 0 part /mnt/home sdb 8:16 0 200G 0 disk ├─sdb1 8:17 0 10G 0 part ├─sdb2 8:18 0 10G 0 part /mnt/sdb2 ├─sdb3 8:19 0 10G 0 part └─sdb4 8:20 0 1K 0 part sdc 8:32 0 20G 0 disk ├─sdc1 8:33 0 2G 0 part /test └─sdc2 8:34 0 10G 0 part sdd 8:48 0 20G 0 disk └─sdd2 8:50 0 19.8G 0 part sde 8:64 0 20G 0 disk ├─sde1 8:65 0 10G 0 part │ └─vg0-lv0 253:0 0 17G 0 lvm /mnt/lvm ├─sde2 8:66 0 5G 0 part │ └─vg0-lv0 253:0 0 17G 0 lvm /mnt/lvm └─sde3 8:67 0 2G 0 part └─vg0-lv0 253:0 0 17G 0 lvm /mnt/lvm sdf 8:80 0 20G 0 disk sr0 11:0 1 7.2G 0 rom
按照上面的還原系統的流程,達到下面環境即可
[root@centos7 ~ #5]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 200M 0 part /boot ├─sda2 8:2 0 100G 0 part / ├─sda3 8:3 0 4G 0 part [SWAP] ├─sda4 8:4 0 1K 0 part ├─sda5 8:5 0 20G 0 part /testdir └─sda6 8:6 0 10G 0 part sdb 8:16 0 200G 0 disk sdc 8:32 0 20G 0 disk sdd 8:48 0 20G 0 disk sde 8:64 0 20G 0 disk sdf 8:80 0 20G 0 disk sr0 11:0 1 7.2G 0 rom /run/media/root/CentOS 7 x86_64 [root@centos7 ~ #6]# blkid /dev/block/8:2: UUID="bd6898a4-e81d-484f-a98c-bf0db692a30b" TYPE="xfs" /dev/block/8:1: UUID="cfa0ba95-faf2-41ed-a849-70c59f56e00a" TYPE="xfs" /dev/block/8:3: UUID="4c2a179a-61d4-4a7f-91f0-15979fc699f2" TYPE="swap" /dev/sr0: UUID="2015-12-09-22-36-30-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos" /dev/sda5: UUID="b1c4ae19-2384-4e09-bea7-2f1cffaa3dcb" TYPE="xfs" /dev/sda6: LABEL="/home" UUID="2cf5ce7d-46d7-443a-bb1d-3b782bb65200" TYPE="ext4" /dev/sdb: PTTYPE="dos" /dev/sde: PTTYPE="dos" /dev/sdd: PTTYPE="dos" /dev/sdc: PTTYPE="dos"
實驗第一步:我們在/dev/sdc上分出4個分區,每個分區的容量為2G,且system id需要更改為8e,具體使用fdisk完成操作,其具體創建細節我們就不再多介紹,最終結果如下:
[root@centos7 ~ #11]# fdisk -l #...................省略................ Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0xef657dc4 Device Boot Start End Blocks Id System /dev/sdc1 2048 4196351 2097152 83 Linux /dev/sdc2 4196352 39847935 17825792 5 Extended /dev/sdc5 4198400 8392703 2097152 8e Linux LVM /dev/sdc6 8394752 12589055 2097152 8e Linux LVM /dev/sdc7 12591104 16785407 2097152 8e Linux LVM /dev/sdc8 16787456 20981759 2097152 8e Linux LVM
上面的/dev/sdc{5,6,7,8}這四個分區就是我們的物理分區。
實驗第二步:PV階段
要創建PV其實很簡單,只要pvcreate即可,我們先看看有關PV的相關命令。
·pvcreate:將物理分區新建成為PV
·pvscan:查詢目前系統里面任何具有PV的磁盤
·pvdisplay:顯示目前系統上面的PV狀態
·pvs:PV的報表
·pvremove:將PV屬性刪除,讓該分區不具有PV的屬性
[root@centos7 ~ #19]# pvscan No matching physical volumes found [root@centos7 ~ #20]# pvcreate /dev/sdc{5,6,7,8} Physical volume "/dev/sdc5" successfully created Physical volume "/dev/sdc6" successfully created Physical volume "/dev/sdc7" successfully created Physical volume "/dev/sdc8" successfully created [root@centos7 ~ #21]# pvscan PV /dev/sdc6 lvm2 [2.00 GiB] PV /dev/sdc8 lvm2 [2.00 GiB] PV /dev/sdc5 lvm2 [2.00 GiB] PV /dev/sdc7 lvm2 [2.00 GiB] Total: 4 [8.00 GiB] / in use: 0 [0 ] / in no VG: 4 [8.00 GiB] [root@centos7 ~ #22]# pvs PV VG Fmt Attr PSize PFree /dev/sdc5 lvm2 --- 2.00g 2.00g /dev/sdc6 lvm2 --- 2.00g 2.00g /dev/sdc7 lvm2 --- 2.00g 2.00g /dev/sdc8 lvm2 --- 2.00g 2.00g [root@centos7 ~ #23]# pvdisplay "/dev/sdc6" is a new physical volume of "2.00 GiB" --- NEW Physical volume --- PV Name /dev/sdc6 VG Name PV Size 2.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID 7dOEay-UWx3-4jYw-5LyD-av1c-VFPE-Sc65GM "/dev/sdc8" is a new physical volume of "2.00 GiB" --- NEW Physical volume --- PV Name /dev/sdc8 VG Name PV Size 2.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID KDQjbZ-wqGi-cxBB-mttK-X0ZE-KvDd-KheRR4 "/dev/sdc5" is a new physical volume of "2.00 GiB" --- NEW Physical volume --- PV Name /dev/sdc5 VG Name PV Size 2.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID 7QGfnu-5tFo-bYAj-g3vi-V0Sq-df8S-e3wwja "/dev/sdc7" is a new physical volume of "2.00 GiB" --- NEW Physical volume --- PV Name /dev/sdc7 VG Name PV Size 2.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID rrE1dF-QoEs-d4na-l6Or-gtDu-Jyrf-OjHEJX
實驗第三步:VG階段
我們仍然先看下新建VG和VG相關的命令
·vgcreate:新建VG的命令,記住實驗要求PE的大小是16M,這里需要加上-s選項,指定PE的大小,后面需要跟上VG名稱和PV名稱
具體:vgcreate -s 16M andyvg /dev/sdc{5,6,7}
·vgscan:查找系統上面是否存在VG
·vgs:VG的報表
·vgdisplay:顯示系統上面VG的狀態
·vgextend:在VG內增加額外的PV
具體:vgextend andyvg /dev/sdc8
·vgreduce:在VG內刪除PV
·vgchange:設置VG是否被啟動(active)
·vgremove:刪除一個VG
在這里我們需要注意的是,VG的名稱是我們自己定義的,我們知道PV的名稱實際就是設備文件名,根據實驗要求我們將VG取名為andyvg,下面是我們的創建過程:
[root@centos7 ~ #25]# vgscan Reading all physical volumes. This may take a while... [root@centos7 ~ #26]# vgcreate -s 16M andyvg /dev/sdc{5,6,7} Volume group "andyvg" successfully created [root@centos7 ~ #27]# pvscan PV /dev/sdc5 VG andyvg lvm2 [1.98 GiB / 1.98 GiB free] PV /dev/sdc6 VG andyvg lvm2 [1.98 GiB / 1.98 GiB free] PV /dev/sdc7 VG andyvg lvm2 [1.98 GiB / 1.98 GiB free] PV /dev/sdc8 lvm2 [2.00 GiB] Total: 4 [7.95 GiB] / in use: 3 [5.95 GiB] / in no VG: 1 [2.00 GiB] [root@centos7 ~ #30]# vgs VG #PV #LV #SN Attr VSize VFree andyvg 3 0 0 wz--n- 5.95g 5.95g [root@centos7 ~ #31]# vgdisplay --- Volume group --- VG Name andyvg 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 5.95 GiB PE Size 16.00 MiB Total PE 381 Alloc PE / Size 0 / 0 Free PE / Size 381 / 5.95 GiB VG UUID Mq13Pt-okme-YhVy-yW2M-7TFJ-mefj-lfCWIQ
我們再利用vgextend再額外添加一個PV
[root@centos7 ~ #32]# vgextend andyvg /dev/sdc8 Volume group "andyvg" successfully extended [root@centos7 ~ #34]# vgdisplay --- Volume group --- VG Name andyvg System ID Format lvm2 Metadata Areas 4 Metadata Sequence No 2 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 4 Act PV 4 VG Size 7.94 GiB PE Size 16.00 MiB Total PE 508 Alloc PE / Size 0 / 0 Free PE / Size 508 / 7.94 GiB VG UUID Mq13Pt-okme-YhVy-yW2M-7TFJ-mefj-lfCWIQ
我們發現VG的大小又增加了2G,正是我們額外增加的PV的效果。
實驗第四步:LV階段
創造了VG這個大磁盤后,再來的我們就是需要分區,這個所謂的分區指的就是LV,我們先演示將6G的VG容量丟給LV,然后觀察其效果后,我們再將所有的VG容量全部丟給LV。下面我們先了解下新建LV和其相關的命令:
·lvcreate:新建LV
·lvscan:查閱系統上面的LV
·lvdisplay:顯示系統上面的LV狀態
·lvs:LV的報表
·lvextend:在LV里面增加容量
·lvreduce:在LV里面減少容量
·lvremove:刪除一個LV
·lvresize:對LV進行容量的大小調整
[root@centos7 ~ #35]# lvscan [root@centos7 ~ #36]# lvcreate -n andylv -L 6G andyvg Logical volume "andylv" created. [root@centos7 ~ #37]# ll /dev/andyvg/andylv lrwxrwxrwx. 1 root root 7 Aug 30 03:24 /dev/andyvg/andylv -> ../dm-0 [root@centos7 ~ #38]# lvdisplay --- Logical volume --- LV Path /dev/andyvg/andylv LV Name andylv VG Name andyvg LV UUID fQhokh-cHJJ-uLeL-jFju-XclH-fsTG-Khaflz LV Write Access read/write LV Creation host, time centos7, 2016-08-30 03:24:34 -0400 LV Status available # open 0 LV Size 6.00 GiB Current LE 384 Segments 4 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:0 [root@centos7 ~ #39]# lvextend -l +100%FREE /dev/andyvg/andylv Size of logical volume andyvg/andylv changed from 6.00 GiB (384 extents) to 7.94 GiB (508 extents). Logical volume andylv successfully resized. [root@centos7 ~ #40]# lvdisplay --- Logical volume --- LV Path /dev/andyvg/andylv LV Name andylv VG Name andyvg LV UUID fQhokh-cHJJ-uLeL-jFju-XclH-fsTG-Khaflz LV Write Access read/write LV Creation host, time centos7, 2016-08-30 03:24:34 -0400 LV Status available # open 0 LV Size 7.94 GiB Current LE 508 Segments 4 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:0
我們可以看到先創建了一個6G的LV名稱為/dev/andyvg/andy/lv,后來我們使用邏輯卷擴展命令lvextend將VG里面所有的容量全部耗盡丟給了LV,增加指8G。
實驗第五步:文件系統階段
這個部分非常簡單了,我們直接看操作吧,我們要將LV格式化ext4的文件系統,并且實現開機掛載到/mnt/lvm中。
[root@centos7 ~ #41]# mkfs.ext4 /dev/andyvg/andylv mke2fs 1.42.9 (28-Dec-2013) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 520192 inodes, 2080768 blocks 104038 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2130706432 64 block groups 32768 blocks per group, 32768 fragments per group 8128 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done [root@centos7 ~ #42]# mkdir /mnt/lvm mkdir: cannot create directory ‘/mnt/lvm’: File exists [root@centos7 ~ #43]# rm -fr /mnt/lvm/ [root@centos7 ~ #44]# mkdir /mnt/lvm [root@centos7 ~ #45]# mount /dev/andyvg/andylv /mnt/lvm [root@centos7 ~ #46]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 104806400 7553512 97252888 8% / devtmpfs 919820 0 919820 0% /dev tmpfs 934344 88 934256 1% /dev/shm tmpfs 934344 9280 925064 1% /run tmpfs 934344 0 934344 0% /sys/fs/cgroup /dev/sda5 20961280 140744 20820536 1% /testdir /dev/sda1 201388 143048 58340 72% /boot tmpfs 186872 4 186868 1% /run/user/42 tmpfs 186872 16 186856 1% /run/user/0 /dev/sr0 7587292 7587292 0 100% /run/media/root/CentOS 7 x86_64 /dev/mapper/andyvg-andylv 8061368 36564 7592268 1% /mnt/lvm [root@centos7 ~ #47]# cp -a /etc/* /mnt/lvm
我們發現/etc/目錄的下面的文件會全部拷到/mnt/lvm目錄下,下面我們需要將其寫到/etc/fstab文件里面即可。
[root@centos7 /mnt/lvm #5]# blkid /dev/block/8:2: UUID="bd6898a4-e81d-484f-a98c-bf0db692a30b" TYPE="xfs" /dev/block/8:1: UUID="cfa0ba95-faf2-41ed-a849-70c59f56e00a" TYPE="xfs" /dev/block/8:3: UUID="4c2a179a-61d4-4a7f-91f0-15979fc699f2" TYPE="swap" /dev/sr0: UUID="2015-12-09-22-36-30-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos" /dev/sda5: UUID="b1c4ae19-2384-4e09-bea7-2f1cffaa3dcb" TYPE="xfs" /dev/sda6: LABEL="/home" UUID="2cf5ce7d-46d7-443a-bb1d-3b782bb65200" TYPE="ext4" /dev/sdc1: LABEL="TEST" UUID="1272e17b-eaac-4e68-a57e-96cdee34bb76" TYPE="ext4" /dev/sdb: PTTYPE="dos" /dev/sde: PTTYPE="dos" /dev/sdd: PTTYPE="dos" /dev/sdc5: UUID="7QGfnu-5tFo-bYAj-g3vi-V0Sq-df8S-e3wwja" TYPE="LVM2_member" /dev/sdc6: UUID="7dOEay-UWx3-4jYw-5LyD-av1c-VFPE-Sc65GM" TYPE="LVM2_member" /dev/sdc7: UUID="rrE1dF-QoEs-d4na-l6Or-gtDu-Jyrf-OjHEJX" TYPE="LVM2_member" /dev/sdc8: UUID="KDQjbZ-wqGi-cxBB-mttK-X0ZE-KvDd-KheRR4" TYPE="LVM2_member" /dev/mapper/andyvg-andylv: UUID="23f51195-fabd-4ac2-b1a8-80121283c23b" TYPE="ext4"
[root@centos7 /mnt #63]# umount /mnt/lvm [root@centos7 /mnt #64]# mount -a [root@centos7 /mnt #65]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 104806400 7553104 97253296 8% / devtmpfs 919820 0 919820 0% /dev tmpfs 934344 88 934256 1% /dev/shm tmpfs 934344 9280 925064 1% /run tmpfs 934344 0 934344 0% /sys/fs/cgroup /dev/sda5 20961280 140744 20820536 1% /testdir /dev/sda1 201388 143048 58340 72% /boot tmpfs 186872 4 186868 1% /run/user/42 tmpfs 186872 16 186856 1% /run/user/0 /dev/sr0 7587292 7587292 0 100% /run/media/root/CentOS 7 x86_64 /dev/mapper/andyvg-andylv 8061368 72464 7556368 1% /mnt/lvm
本文僅介紹了LVM的創建流程和基本原理,后續我們還會介紹LVM的擴充和減小容量以及其精華部分的LVM快照的原理,和實現過程。
原創文章,作者:AndyIvanXue,如若轉載,請注明出處:http://www.www58058.com/42191
總結的很不錯,作者很用心,通過自己的語言組織了文字,通讀整篇能學到很多東西,繼續保持。