LVM相關概念和機制
LVM(Logical Volume Manager)可以讓分區變得彈性,可以隨時隨地的擴大和縮小分區大小,前提是該分區是LVM格式的。
lvm需要使用的軟件包為lvm2,一般在CentOS發行版中都已經預安裝了。
- PV(Physical Volume)即物理卷
硬盤分區后(還未格式化為文件系統)使用pvcreate命令可以將分區創建為pv,要求分區的system ID為8e,即為LVM格式的系統標識符。
- VG(Volume Group)即卷組
將多個PV組合起來,使用vgcreate命令創建成卷組,這樣卷組包含了多個PV就比較大了,相當於重新整合了多個分區后得到的磁盤。雖然VG是整合多個PV的,但是創建VG時會將VG所有的空間根據指定的PE大小划分為多個PE,在LVM模式下的存儲都以PE為單元,類似於文件系統的Block。
- PE(Physical Extend)
PE是VG中的存儲單元。實際存儲的數據都是存儲在這里面的。
- LV(Logical Volume)
VG相當於整合過的硬盤,那么LV就相當於分區,只不過該分區是通過VG來划分的。VG中有很多PE單元,可以指定將多少個PE划分給一個LV,也可以直接指定大小(如多少兆)來划分。划分為LV之后就相當於划分了分區,只需再對LV進行格式化即可變成普通的文件系統。
通俗地講,非LVM管理的分區步驟是將硬盤分區,然后將分區格式化為文件系統。而使用LVM,則是在硬盤分區為特定的LVM標識符的分區后將其轉變為LVM可管理的PV,其實PV仍然類似於分區,然后將幾個PV整合為類似於磁盤的VG,最后划分VG為LV,此時LV就成了LVM可管理的分區,只需再對其格式化即可成為文件系統。
- LE(logical extent)
PE是物理存儲單元,而LE則是邏輯存儲單元,也即為lv中的邏輯存儲單元,和pe的大小是一樣的。從vg中划分lv,實際上是從vg中划分vg中的pe,只不過划分lv后它不再稱為pe,而是成為le。
LVM之所以能夠伸縮容量,其實現的方法就是將LV里空閑的PE移出,或向LV中添加空閑的PE。
LVM的寫入機制
LV是從VG中划分出來的,LV中的PE很可能來自於多個PV。在向LV存儲數據時,有多種存儲機制,其中兩種是:
- 線性模式(linear):先寫完來自於同一個PV的PE,再寫來自於下一個PV的PE。
- 條帶模式(striped):一份數據拆分成多份,分別寫入該LV對應的每個PV中,所以讀寫性能較好,類似於RAID 0。
盡管striped讀寫性能較好也不建議使用該模式,因為lvm的着重點在於彈性容量擴展而非性能,要實現性能應該使用RAID來實現,而且使用striped模式時要進行容量的擴展和收縮將比較麻煩。默認的是使用線性模式。
LVM實現圖解
LVM常用命令匯總
任務 |
PV階段 |
VG階段 |
LV階段 |
查找(scan) |
pvscan |
vgscan |
lvscan |
新建(create) |
pvcreate |
vgcreate |
lvcreate |
顯示(display) |
pvdisplay |
vgdisplay |
lvdisplay |
增加(extend) |
|
vgextend |
lvextend(lvresize) |
減少(reduce) |
|
vgreduce |
lvreduce(lvresize) |
刪除(remove) |
pvremove |
vgremove |
lvremove |
改變容量(resize) |
|
|
lvresize |
改變屬性(attribute) |
pvchange |
vgchange |
lvchange |
LVM的實現
1、准備物理磁盤。
[root@localhost ~]# fdisk -l 磁盤 /dev/sda:21.5 GB, 21474836480 字節,41943040 個扇區 Units = 扇區 of 1 * 512 = 512 bytes 扇區大小(邏輯/物理):512 字節 / 512 字節 I/O 大小(最小/最佳):512 字節 / 512 字節 磁盤標簽類型:dos 磁盤標識符:0x0005b35c 設備 Boot Start End Blocks Id System /dev/sda1 * 2048 616447 307200 83 Linux /dev/sda2 616448 41943039 20663296 8e Linux LVM 磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區 Units = 扇區 of 1 * 512 = 512 bytes 扇區大小(邏輯/物理):512 字節 / 512 字節 I/O 大小(最小/最佳):512 字節 / 512 字節 磁盤 /dev/sdc:21.5 GB, 21474836480 字節,41943040 個扇區 Units = 扇區 of 1 * 512 = 512 bytes 扇區大小(邏輯/物理):512 字節 / 512 字節 I/O 大小(最小/最佳):512 字節 / 512 字節 磁盤 /dev/sdd:21.5 GB, 21474836480 字節,41943040 個扇區 Units = 扇區 of 1 * 512 = 512 bytes 扇區大小(邏輯/物理):512 字節 / 512 字節 I/O 大小(最小/最佳):512 字節 / 512 字節 磁盤 /dev/mapper/cl-root:20.1 GB, 20107493376 字節,39272448 個扇區 Units = 扇區 of 1 * 512 = 512 bytes 扇區大小(邏輯/物理):512 字節 / 512 字節 I/O 大小(最小/最佳):512 字節 / 512 字節 磁盤 /dev/mapper/cl-swap:1048 MB, 1048576000 字節,2048000 個扇區 Units = 扇區 of 1 * 512 = 512 bytes 扇區大小(邏輯/物理):512 字節 / 512 字節 I/O 大小(最小/最佳):512 字節 / 512 字節
我們從空的硬盤sdb上創建兩個分區sdb1 5G,sdb2 5G為接下來做LVM做准備,注意的是我們在創建分區是需要設定分區的類型Linux LVM的分區類型為8e,並且這些分區要被內核識別,通過cat /proc/partions進行查看,若沒有顯示,則需要讓內核重新進行探測
[root@localhost ~]# fdisk /dev/sdb 歡迎使用 fdisk (util-linux 2.23.2)。 更改將停留在內存中,直到您決定將更改寫入磁盤。 使用寫入命令前請三思。 Device does not contain a recognized partition table 使用磁盤標識符 0x4822aff9 創建新的 DOS 磁盤標簽。 命令(輸入 m 獲取幫助):p 磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區 Units = 扇區 of 1 * 512 = 512 bytes 扇區大小(邏輯/物理):512 字節 / 512 字節 I/O 大小(最小/最佳):512 字節 / 512 字節 磁盤標簽類型:dos 磁盤標識符:0x4822aff9 設備 Boot Start End Blocks Id System 命令(輸入 m 獲取幫助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p 分區號 (1-4,默認 1):1 起始 扇區 (2048-41943039,默認為 2048): 將使用默認值 2048 Last 扇區, +扇區 or +size{K,M,G} (2048-41943039,默認為 41943039):+5G 分區 1 已設置為 Linux 類型,大小設為 5 GiB 命令(輸入 m 獲取幫助):p 磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區 Units = 扇區 of 1 * 512 = 512 bytes 扇區大小(邏輯/物理):512 字節 / 512 字節 I/O 大小(最小/最佳):512 字節 / 512 字節 磁盤標簽類型:dos 磁盤標識符:0x4822aff9 設備 Boot Start End Blocks Id System /dev/sdb1 2048 10487807 5242880 83 Linux 命令(輸入 m 獲取幫助):t 已選擇分區 1 Hex 代碼(輸入 L 列出所有代碼):8e 已將分區“Linux”的類型更改為“Linux LVM” 命令(輸入 m 獲取幫助):p 磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區 Units = 扇區 of 1 * 512 = 512 bytes 扇區大小(邏輯/物理):512 字節 / 512 字節 I/O 大小(最小/最佳):512 字節 / 512 字節 磁盤標簽類型:dos 磁盤標識符:0x4822aff9 設備 Boot Start End Blocks Id System /dev/sdb1 2048 10487807 5242880 8e Linux LVM
命令(輸入 m 獲取幫助):n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p 分區號 (2-4,默認 2):2 起始 扇區 (10487808-41943039,默認為 10487808): 將使用默認值 10487808 Last 扇區, +扇區 or +size{K,M,G} (10487808-41943039,默認為 41943039):+5G 分區 2 已設置為 Linux 類型,大小設為 5 GiB 命令(輸入 m 獲取幫助):p 磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區 Units = 扇區 of 1 * 512 = 512 bytes 扇區大小(邏輯/物理):512 字節 / 512 字節 I/O 大小(最小/最佳):512 字節 / 512 字節 磁盤標簽類型:dos 磁盤標識符:0x4822aff9 設備 Boot Start End Blocks Id System /dev/sdb1 2048 10487807 5242880 8e Linux LVM /dev/sdb2 10487808 20973567 5242880 83 Linux 命令(輸入 m 獲取幫助):t 分區號 (1,2,默認 2):2 Hex 代碼(輸入 L 列出所有代碼):8e 已將分區“Linux”的類型更改為“Linux LVM” 命令(輸入 m 獲取幫助):p 磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區 Units = 扇區 of 1 * 512 = 512 bytes 扇區大小(邏輯/物理):512 字節 / 512 字節 I/O 大小(最小/最佳):512 字節 / 512 字節 磁盤標簽類型:dos 磁盤標識符:0x4822aff9 設備 Boot Start End Blocks Id System /dev/sdb1 2048 10487807 5242880 8e Linux LVM /dev/sdb2 10487808 20973567 5242880 8e Linux LVM
命令(輸入 m 獲取幫助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盤。
[root@localhost ~]# fdisk -l /dev/sdb 磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區 Units = 扇區 of 1 * 512 = 512 bytes 扇區大小(邏輯/物理):512 字節 / 512 字節 I/O 大小(最小/最佳):512 字節 / 512 字節 磁盤標簽類型:dos 磁盤標識符:0x4822aff9 設備 Boot Start End Blocks Id System /dev/sdb1 2048 10487807 5242880 8e Linux LVM /dev/sdb2 10487808 20973567 5242880 8e Linux LVM [root@localhost ~]# cat /proc/pa pagetypeinfo partitions [root@localhost ~]# cat /proc/partitions major minor #blocks name 8 0 20971520 sda 8 1 307200 sda1 8 2 20663296 sda2 8 16 20971520 sdb 8 17 5242880 sdb1 8 18 5242880 sdb2 8 32 20971520 sdc 8 48 20971520 sdd 11 0 4277248 sr0 253 0 19636224 dm-0 253 1 1024000 dm-1
創建物理卷
將新創建的兩個分區/dev/sdb1 /dev/sdb2創建成物理卷:所用的命令為pvcreate /dev/adb{1,2} 當然也可以分開進行設定
[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdb2 Physical volume "/dev/sdb1" successfully created. Physical volume "/dev/sdb2" successfully created.
[root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 cl lvm2 a-- 19.70g 0 /dev/sdb1 lvm2 --- 5.00g 5.00g /dev/sdb2 lvm2 --- 5.00g 5.00g /dev/sdc lvm2 --- 20.00g 20.00g /dev/sdd lvm2 --- 20.00g 20.00g
通過pvs 和pvdisplay可以查看物理卷的信息,后面也可以指定特定的物理磁盤,查看某一個物理卷的信息
[root@localhost ~]# pvdisplay --- Physical volume --- PV Name /dev/sda2 VG Name cl PV Size 19.71 GiB / not usable 3.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 5044 Free PE 0 Allocated PE 5044 PV UUID uTbh7P-pmtL-KRqx-uAys-fxUA-PdUa-LIpvOX "/dev/sdb1" is a new physical volume of "5.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb1 VG Name PV Size 5.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID UFLcKK-XrDv-1wZi-FYIL-FDSW-Bsn0-Xy1Era "/dev/sdc" is a new physical volume of "20.00 GiB" --- NEW Physical volume --- PV Name /dev/sdc VG Name PV Size 20.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID gHJF8r-cqBO-EV3L-yxD9-3CaA-K3OR-jcFDtU "/dev/sdb2" is a new physical volume of "5.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb2 VG Name PV Size 5.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID 9Y3f1L-3M35-lAHU-27xd-XpvI-ptOT-bRekUW "/dev/sdd" is a new physical volume of "20.00 GiB" --- NEW Physical volume --- PV Name /dev/sdd VG Name PV Size 20.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID IKH97P-igyp-aaC7-bw2h-tQOF-gjXy-2pc9z0
創建卷組
物理卷pv創建好之后,才可以創建卷組,創建卷組則用命令vgcreate,並將剛才創建的兩個物理卷加入該卷組,其中PE的默認大小為4MB,PE是卷組的最小存儲單位,可以通過-s選項指定PE的大小,可以通過vgs或者vgdisplay來查看創建的卷組
[root@localhost ~]# vgcreate myvg /dev/sdb1 /dev/sdb2 Volume group "myvg" successfully created [root@localhost ~]# vgs VG #PV #LV #SN Attr VSize VFree cl 1 2 0 wz--n- 19.70g 0 myvg 2 0 0 wz--n- 9.99g 9.99g [root@localhost ~]# vgdisplay --- Volume group --- VG Name cl System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 2 Open LV 2 Max PV 0 Cur PV 1 Act PV 1 VG Size 19.70 GiB PE Size 4.00 MiB Total PE 5044 Alloc PE / Size 5044 / 19.70 GiB Free PE / Size 0 / 0 VG UUID AbayDZ-NRTB-EILO-IjLH-kHji-Ixek-LI1Kdx --- Volume group --- VG Name myvg 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 9.99 GiB PE Size 4.00 MiB Total PE 2558 Alloc PE / Size 0 / 0 Free PE / Size 2558 / 9.99 GiB VG UUID bRctGj-xKXV-C2pw-hzqk-KSyI-h5mR-BATF9A
創建邏輯卷
卷組VG創建好之后,才可以創建邏輯卷LV,邏輯卷的創建命令為lvcreate,創建好之后可以通過lvs或者lvdisplay開查看創建的邏輯卷,需要說明的是在創建lv的時候需要指定其大小,選項為-L,邏輯卷的名字選項-n,也可以指定PE的個數選項-l
[root@localhost ~]# lvcreate -L 5G -n textlv myvg Logical volume "textlv" created. [root@localhost ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root cl -wi-ao---- 18.73g swap cl -wi-ao---- 1000.00m textlv myvg -wi-a----- 5.00g [root@localhost ~]# lvdisplay --- Logical volume --- LV Path /dev/cl/swap LV Name swap VG Name cl LV UUID Y06H4S-vcF7-GIAf-AV1U-0TlK-yR39-FiR7bD LV Write Access read/write LV Creation host, time localhost.localdomain, 2019-12-08 20:41:35 +0800 LV Status available # open 2 LV Size 1000.00 MiB Current LE 250 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:1 --- Logical volume --- LV Path /dev/cl/root LV Name root VG Name cl LV UUID L9AAAm-gjjC-dF5S-fOyd-XOTG-fxBC-CI0j2Y LV Write Access read/write LV Creation host, time localhost.localdomain, 2019-12-08 20:41:36 +0800 LV Status available # open 1 LV Size 18.73 GiB Current LE 4794 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:0 --- Logical volume --- LV Path /dev/myvg/textlv LV Name textlv VG Name myvg LV UUID LhE6yQ-t3cn-BmwW-css0-dvua-CvCO-pSf2pe LV Write Access read/write LV Creation host, time localhost.localdomain, 2019-12-26 21:41:01 +0800 LV Status available # open 0 LV Size 5.00 GiB Current LE 1280 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:2
創建文件系統
邏輯卷textlv創建好之后,就可以在上面創建文件系統,以ext3文件系統為例,應該注意的是邏輯卷的引用需要邏輯卷的設備文件,邏輯卷的設備文件有兩種書寫方式
/dev/VG_NAME/LV_NAME
/dev/mapper/VG_NAME-LV_NAME
以我們做的為例邏輯卷的設備文件為
/dev/myvg/textlv或者是/dev/mapper/myvg-textlv
[root@localhost ~]# mkfs -t ext4 /dev/myvg/textlv mke2fs 1.42.9 (28-Dec-2013) 文件系統標簽= OS type: Linux 塊大小=4096 (log=2) 分塊大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 327680 inodes, 1310720 blocks 65536 blocks (5.00%) reserved for the super user 第一個數據塊=0 Maximum filesystem blocks=1342177280 40 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Allocating group tables: 完成 正在寫入inode表: 完成 Creating journal (32768 blocks): 完成 Writing superblocks and filesystem accounting information: 完成
掛載
將創建好的文件系統/dev/myvg/textlv掛載到/mnt上,若實現以后服務器重啟自動掛載,需要將創建好的文件系統掛載到配置文件/etc/fstab里面
[root@localhost ~]# mount /dev/myvg/textlv /mnt
[root@localhost ~]# mount |tail -1 /dev/mapper/myvg-textlv on /mnt type ext4 (rw,relatime,seclabel,data=ordered)
[root@localhost ~]# vi /etc/fstab # # /etc/fstab # Created by anaconda on Sun Dec 8 20:41:38 2019 # # 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=d6e819c3-6d45-4b79-8179-746c005bf567 /boot xfs defaults 0 0 /dev/mapper/cl-swap swap swap defaults 0 0 /dev/myvg/textlv /mnt ext4 defaults 0 0
為了查看/etc/fstab/是否正確,可以先卸載邏輯卷textlv,然后使用mount –a是內核重新讀取/etc/fstab,看是否能夠自動掛載
[root@localhost ~]# umount /dev/myvg/textlv [root@localhost ~]# mount -a [root@localhost ~]# mount |tail -1 /dev/mapper/myvg-textlv on /mnt type ext4 (rw,relatime,seclabel,data=ordered)