LVM ( Logical Volume Management ) 這管理工具可以更容易且有效的管理硬碟空間,可以任意組合多顆硬碟成為一個分割槽,也能任意的擴充放大透過 LVM 掛載的目錄及分割槽 。
1. LVM 介紹
LVM 是個非常好用的硬碟空間管理工具,藉由軟體模擬出多個邏輯卷,以達到任意擴充硬碟也能增加其分割槽空間,架構如下圖所示。
From access.redhat.com
LVM 架構說明 :
Physical Volumes ( PV ) : 為 LVM 最底層單位,可以將一整個物理設備組成一個 PV。
Volume Group ( VG ) : 將多個 PV 組成一個 Group 就成為 VG。
Logical Volume ( LV ) : LV 就是一個完整的分割槽,透過 PG 的空間切割出來。
2. 創建 LVM
2.1 創建 PV
創建 PV 需透過 parted 工具先將硬碟設備建立分割表並決定要使用多少的硬碟空間來當作 pv ,一般全部使用是沒有問題的。
使用 parted 工具將 vdb ( 200M )及 vdc ( 300M ) 設備創建分割槽
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[[email protected] ~]# parted -s /dev/vdb mklabel msdos mkpart primary 2048s 100% set 1 lvm on print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 210MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 210MB 209MB primary lvm, lba
[[email protected] ~]# parted -s /dev/vdc mklabel msdos mkpart primary 2048s 100% set 1 lvm on print
Model: Virtio Block Device (virtblk)
Disk /dev/vdc: 315MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 315MB 314MB primary lvm, lba
創建 pv
使用 pvcreate 工具創建 pv
1
2
3
[[email protected] ~]# pvcreate /dev/vdb1 /dev/vdc1
Physical volume "/dev/vdb1" successfully created.
Physical volume "/dev/vdc1" successfully created.
2.2 創建 vg
使用 vgcreate 工具創建 vg
1
vgcreate <vg-name> <pv-devices>
1
2
[ [email protected] ~] # vgcreate vg0 /dev/vdc1 /dev/vdb1
Volume group "vg0" successfully created
Note
vg 在創建時預設使用 4 MiB 為一個 PE size,如果要指定 PE Size 可以加上 -s 參數並指定 PE size
From wikipedia.org
2.3 創建 lv
使用 lvcreate 工具創建 lv
1
lvcreate -n <lv-name> -L <size> <vg-name>
1
2
3
[ [email protected] ~] # lvcreate -n lv0 -L 250Mib vg0
Rounding up size to full physical extent 252.00 MiB
Logical volume "lv0" created.
2.4 lv 格式化檔案系統並掛載
創建好的 lv 就可以像一般的分割槽直接使用 mkfs 來指定所要的檔案系統
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[ [email protected] ~] # mkfs.xfs /dev/vg0/lv0
meta-data= /dev/vg0/lv0 isize = 512 agcount = 4, agsize = 16128 blks
= sectsz = 512 attr = 2, projid32bit = 1
= crc = 1 finobt = 1, sparse = 1, rmapbt = 0
= reflink = 1
data = bsize = 4096 blocks = 64512, imaxpct = 25
= sunit = 0 swidth = 0 blks
naming = version 2 bsize = 4096 ascii-ci= 0, ftype = 1
log = internal log bsize = 4096 blocks = 1368, version = 2
= sectsz = 512 sunit = 0 blks, lazy-count= 1
realtime = none extsz = 4096 blocks = 0, rtextents = 0
Discarding blocks...Done.
[ [email protected] ~] # mkdir -v /lv0
mkdir: created directory '/lv0'
[ [email protected] ~] # mount /dev/vg0/lv0 /lv0/
[ [email protected] ~] # df -h /lv0/
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg0-lv0 247M 15M 233M 6% /lv0
3. 移除 LVM
移除 LVM 就等於把創建 LVM 步驟反過來即可
3.1 移除 lv
移除 lv 前,如果有掛載目錄,需先 umount 移除
使用 lvremove 工具移除 lv
1
2
3
[ [email protected] ~] # lvremove /dev/vg0/lv0
Do you really want to remove active logical volume vg0/lv0? [ y/n] : y
Logical volume "lv0" successfully removed.
3.2 移除 vg
使用 vgremove 工具移除 vg
3.3 移除 pv
使用 pvremove 工具移除 pv
1
2
3
[ [email protected] ~] # pvremove /dev/vdb1 /dev/vdc1
Labels on physical volume "/dev/vdb1" successfully wiped.
Labels on physical volume "/dev/vdc1" successfully wiped.
4. 查看已經創建的 LVM
4.1 查看 PV 詳細資訊
使用 pvdisplay 工具可以查看創建的 pv 詳細資訊
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[ [email protected] ~] # pvcreate /dev/vdb1
Physical volume "/dev/vdb1" successfully created.
[ [email protected] ~] # pvdisplay /dev/vdb1
"/dev/vdb1" is a new physical volume of "199.00 MiB"
--- NEW Physical volume ---
PV Name /dev/vdb1
VG Name
PV Size 199.00 MiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID Yp887I-KTUb-HBs4-TXmU-2xZZ-t1TW-ziqE3V
4.2 查看 vg 詳細資訊
使用 vgdisplay 工具可以查看創建的 vg 詳細資訊
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[ [email protected] ~] # vgcreate vg0 /dev/vdb1
Volume group "vg0" successfully created
[ [email protected] ~] # vgdisplay vg0
--- Volume group ---
VG Name vg0
System ID
Format lvm2
Metadata Areas 1
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 1
Act PV 1
VG Size 196.00 MiB
PE Size 4.00 MiB
Total PE 49
Alloc PE / Size 0 / 0
Free PE / Size 49 / 196.00 MiB
VG UUID UT3zNx-B2MV-JMgu-REpC-3IA6-ApjM-6S1Ayg
4.3 查看 lv 詳細資訊
使用 lvdisplay 工具可以查看創建的 lv 詳細資訊
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[ [email protected] ~] # lvcreate -n lv0 -L 150Mib vg0
Rounding up size to full physical extent 152.00 MiB
Logical volume "lv0" created.
[ [email protected] ~] # lvdisplay /dev/vg0/lv0
--- Logical volume ---
LV Path /dev/vg0/lv0
LV Name lv0
VG Name vg0
LV UUID XJ0WoQ-o7em-m16x-DMdU-OfNf-9oj9-XnQNQb
LV Write Access read/write
LV Creation host, time serverc, 2022-03-22 22:01:10 +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
5 擴展 lv 空間及 xfs 檔案系統
/dev/vg0/lv0 size 為 152 MiB 並掛載於 /lv0 目錄下,要擴展到 400 Mib的空間
1
2
3
[[email protected] ~]# lsblk -ap /dev/vg0/lv0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/mapper/vg0-lv0 253:2 0 152M 0 lvm /lv0
5.1. 查看 vg 目前還有多少空間可以分出來
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[ [email protected] ~] # vgdisplay vg0
--- Volume group ---
VG Name vg0
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 196.00 MiB
PE Size 4.00 MiB
Total PE 49
Alloc PE / Size 38 / 152.00 MiB
Free PE / Size 11 / 44.00 MiB
VG UUID UT3zNx-B2MV-JMgu-REpC-3IA6-ApjM-6S1Ayg
5.2. 囿於 VG Free 空間只剩下 44 MiB ,再添加 PV 至 VG 內
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[[email protected] ~]# pvcreate /dev/vdc1
Physical volume "/dev/vdc1" successfully created.
[[email protected] ~]# vgextend vg0 /dev/vdc1
Volume group "vg0" successfully extended
[[email protected] ~]# vgdisplay vg0
--- Volume group ---
VG Name vg0
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 3
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 492.00 MiB
PE Size 4.00 MiB
Total PE 123
Alloc PE / Size 38 / 152.00 MiB
Free PE / Size 85 / 340.00 MiB
VG UUID UT3zNx-B2MV-JMgu-REpC-3IA6-ApjM-6S1Ayg
5.3. lv 擴展至 400 Mib 需增加 250 Mib
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[ [email protected] ~] # lvextend -L +250Mib /dev/vg0/lv0
Rounding size to boundary between physical extents: 252.00 MiB.
Size of logical volume vg0/lv0 changed from 152.00 MiB ( 38 extents) to 404.00 MiB ( 101 extents) .
Logical volume vg0/lv0 successfully resized.
[ [email protected] ~] # lvdisplay /dev/vg0/lv0
--- Logical volume ---
LV Path /dev/vg0/lv0
LV Name lv0
VG Name vg0
LV UUID XJ0WoQ-o7em-m16x-DMdU-OfNf-9oj9-XnQNQb
LV Write Access read/write
LV Creation host, time serverc, 2022-02-15 22:01:10 +0800
LV Status available
# open 1
LV Size 404.00 MiB
Current LE 101
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
5.4. 使用 xfs_growfs 擴展 xfs 檔案系統
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[ [email protected] ~] # df -h /lv0
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg0-lv0 147M 8.9M 138M 7% /lv0
[ [email protected] ~] # xfs_growfs /lv0/
meta-data= /dev/mapper/vg0-lv0 isize = 512 agcount = 4, agsize = 9728 blks
= sectsz = 512 attr = 2, projid32bit = 1
= crc = 1 finobt = 1, sparse = 1, rmapbt = 0
= reflink = 1
data = bsize = 4096 blocks = 38912, imaxpct = 25
= sunit = 0 swidth = 0 blks
naming = version 2 bsize = 4096 ascii-ci= 0, ftype = 1
log = internal log bsize = 4096 blocks = 1368, version = 2
= sectsz = 512 sunit = 0 blks, lazy-count= 1
realtime = none extsz = 4096 blocks = 0, rtextents = 0
data blocks changed from 38912 to 103424
[ [email protected] ~] # df -h /lv0
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg0-lv0 399M 12M 388M 3% /lv0
Tip
LVM 是可以縮容的,不過無法使用在 XFS 檔案系統上,可以再 ext 系列,先將掛載目錄 umount ,再使用 lvreduce 就可以減少 lv 空間,最後使用 resize2fs 將 ext 系列檔案系統改變大小掛載即可。
6. LAB 練習
6.1 LAB
lv 名為 qa
, vg 屬於 qagroup
,另 lv 空間為 225 MiB ,vg qagroup
的 PE size 應為 8 MiB
,並使用 ext3
檔案格式掛載至 /ext3 ,另確保開機後自動掛載。
6.2 LAB 解答
6.2.1 創建 pv
1
2
3
4
5
6
7
8
9
10
11
12
[ [email protected] ~] # parted -s /dev/vdd mklabel msdos mkpart primary ext3 2048s 251Mib set 1 lvm on print
Model: Virtio Block Device ( virtblk)
Disk /dev/vdd: 524MB
Sector size ( logical/physical) : 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 263MB 262MB primary ext3 lvm, lba
[ [email protected] ~] # pvcreate /dev/vdd1
Physical volume "/dev/vdd1" successfully created.
6.2.2 創建 vg 名為 qagroup 且 PE size 等於 8 Mib
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[ [email protected] c ~] # vgcreate -s 8MiB qagroup /dev/vdd1
Volume group "qagroup" successfully created
[ [email protected] ~] # vgdisplay qagroup
--- Volume group ---
VG Name qagroup
System ID
Format lvm2
Metadata Areas 1
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 1
Act PV 1
VG Size 248.00 MiB
PE Size 8.00 MiB
Total PE 31
Alloc PE / Size 0 / 0
Free PE / Size 31 / 248.00 MiB
VG UUID rLY7hW-LnNR-RIUx-dEZP-HzRW-SeSD-PfSbmg
6.2.3 創建 lv 名為 qa , size 為 225 MiB ,並以 ext3 格式掛至 /ext3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[ [email protected] ~] # lvcreate -n qa -L 225MiB qagroup
Rounding up size to full physical extent 232.00 MiB
Logical volume "qa" created.
[ [email protected] ~] # mkfs.ext3 /dev/qagroup/qa
mke2fs 1.45.6 ( 20-Mar-2020)
Discarding device blocks: done
Creating filesystem with 237568 1k blocks and 59392 inodes
Filesystem UUID: ff4948a5-415b-4566-988d-904a5c6d2335
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185
Allocating group tables: done
Writing inode tables: done
Creating journal ( 4096 blocks) : done
Writing superblocks and filesystem accounting information: done
[ [email protected] ~] # mkdir -v /ext3
mkdir: created directory '/ext3'
[ [email protected] ~] # cat >> /etc/fstab << EOL
> /dev/qagroup/qa /ext3 ext3 defaults 0 0
> EOL
[ [email protected] ~] # mount -a
[ [email protected] ~] # df -h /ext3/
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/qagroup-qa 221M 2.1M 208M 1% /ext3
6.2.4. reboot 重新開機
確保重新開機後,所有目錄都正常掛載。
Tip
如果無法正常開機,表示 /etc/fstab 中有錯誤,可以至 bastion 機器執行 rht-vmctl reset serverc 重置 serverc 回初始設定。
7. 小結
LVM 比原生的分割槽來的彈性且好用,使用的指令也不多大多數都是重複的,聚焦在 pv、 vg 、 lv 這三個項目,並配合 create 、 display 、 remove 就可以組合出 LVM 。