Contents

Linux - 邏輯卷冊管理 LVM

LVM ( Logical Volume Management ) 這管理工具可以更容易且有效的管理硬碟空間,可以任意組合多顆硬碟成為一個分割槽,也能任意的擴充放大透過 LVM 掛載的目錄及分割槽 。

1. LVM 介紹

LVM 是個非常好用的硬碟空間管理工具,藉由軟體模擬出多個邏輯卷,以達到任意擴充硬碟也能增加其分割槽空間,架構如下圖所示。

https://i.imgur.com/t456hCH.png
From access.redhat.com

LVM 架構說明 :

  1. Physical Volumes ( PV ) : 為 LVM 最底層單位,可以將一整個物理設備組成一個 PV。
  2. Volume Group ( VG ) : 將多個 PV 組成一個 Group 就成為 VG。
  3. Logical Volume ( LV ) : LV 就是一個完整的分割槽,透過 PG 的空間切割出來。

2. 創建 LVM

2.1 創建 PV

創建 PV 需透過 parted 工具先將硬碟設備建立分割表並決定要使用多少的硬碟空間來當作 pv ,一般全部使用是沒有問題的。

  1. 使用 parted 工具將 vdb ( 200M )及 vdc ( 300M ) 設備創建分割槽
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[root@serverc ~]#  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
 
 [root@serverc ~]#  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
  1. 創建 pv

使用 pvcreate 工具創建 pv

1
pvcreate <devices>
1
2
3
[root@serverc ~]# 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
[root@serverc ~]# vgcreate vg0 /dev/vdc1 /dev/vdb1 
  Volume group "vg0" successfully created
Note

vg 在創建時預設使用 4 MiB 為一個 PE size,如果要指定 PE Size 可以加上 -s 參數並指定 PE size

https://i.imgur.com/QgNhoJi.png
From wikipedia.org

2.3 創建 lv

使用 lvcreate 工具創建 lv

1
lvcreate -n <lv-name> -L <size> <vg-name>
1
2
3
[root@serverc ~]# 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
[root@serverc ~]# 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.
[root@serverc ~]# mkdir -v /lv0
mkdir: created directory '/lv0'
[root@serverc ~]# mount /dev/vg0/lv0 /lv0/
[root@serverc ~]# 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

  1. 移除 lv 前,如果有掛載目錄,需先 umount 移除
1
[root@serverc ~]# umount /lv0
  1. 使用 lvremove 工具移除 lv
1
2
3
[root@serverc ~]# 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

1
2
[root@serverc ~]# vgremove vg0 
  Volume group "vg0" successfully removed

3.3 移除 pv

使用 pvremove 工具移除 pv

1
2
3
[root@serverc ~]# 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
[root@serverc ~]# pvcreate  /dev/vdb1 
  Physical volume "/dev/vdb1" successfully created.
[root@serverc ~]# 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
[root@serverc ~]# vgcreate vg0 /dev/vdb1
  Volume group "vg0" successfully created
[root@serverc ~]# 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
[root@serverc ~]# lvcreate -n lv0 -L 150Mib vg0
  Rounding up size to full physical extent 152.00 MiB
  Logical volume "lv0" created.
[root@serverc ~]# 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
[root@serverc ~]# 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
[root@serverc ~]# 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
[root@serverc ~]# pvcreate /dev/vdc1 
  Physical volume "/dev/vdc1" successfully created.
[root@serverc ~]# vgextend vg0 /dev/vdc1
  Volume group "vg0" successfully extended
[root@serverc ~]# 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
[root@serverc ~]# 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.
[root@serverc ~]# 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
[root@serverc ~]# df -h /lv0
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/vg0-lv0  147M  8.9M  138M   7% /lv0
[root@serverc ~]# 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
[root@serverc ~]# 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

練習環境
可以使用 HowHow 的創建 Lab 練習環境,操作錯誤導致系統失敗可以直接重置還原,使用方式請參閱 HowHow 網站

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
[root@serverc ~]# 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

[root@serverc ~]# 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
[root@serverc ~]# vgcreate -s 8MiB qagroup /dev/vdd1
  Volume group "qagroup" successfully created
[root@serverc ~]# 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
[root@serverc ~]# lvcreate -n qa -L 225MiB qagroup 
  Rounding up size to full physical extent 232.00 MiB
  Logical volume "qa" created.
[root@serverc ~]# 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 

[root@serverc ~]# mkdir -v /ext3
mkdir: created directory '/ext3'
[root@serverc ~]# cat >> /etc/fstab << EOL
> /dev/qagroup/qa  /ext3  ext3  defaults  0  0
> EOL
[root@serverc ~]# mount -a
[root@serverc ~]# 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 。



如果你還沒有註冊 Like Coin,你可以在文章最下方看到 Like 的按鈕,點下去後即可申請帳號,透過申請帳號後可以幫我的文章按下 Like,而 Like 最多可以點五次,而你不用付出任何一塊錢,就能給我寫這篇文章的最大的回饋!