在很多时候,随着业务的增加,原规划的磁盘分区大小可能无法满足,这时候就需要进行扩容操作,下面介绍如何通过LVM实现扩容

环境信息

root@lvm:~# lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                  8:0    0   20G  0 disk
├─sda1               8:1    0  487M  0 part /boot
├─sda2               8:2    0    1K  0 part
└─sda5               8:5    0 19.5G  0 part
  ├─lvm--vg-root   254:0    0 18.6G  0 lvm  /
  └─lvm--vg-swap_1 254:1    0  980M  0 lvm  [SWAP]
sr0                 11:0    1  3.6G  0 rom
nvme0n1            259:0    0    5G  0 disk
root@lvm:~#

场景设计

由于lvm--vg-root分区无法满足需求,现需把nvme0n1设备的全部磁盘容量扩展到lvm--vg-root

扩展盘配置

分区

使用下面的命令进入分区操作

 fdisk /dev/nvme0n1

分区帮助

进入fdisk程序之后,通过输入m获取使用帮助

root@lvm:~# fdisk /dev/nvme0n1

Welcome to fdisk (util-linux 2.36.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x985ce025.

Command (m for help): m

Help:

  DOS (MBR)
   a   toggle a bootable flag
   b   edit nested BSD disklabel
   c   toggle the dos compatibility flag

  Generic
   d   delete a partition
   F   list free unpartitioned space
   l   list known partition types
   n   add a new partition
   p   print the partition table
   t   change a partition type
   v   verify the partition table
   i   print information about a partition

  Misc
   m   print this menu
   u   change display/entry units
   x   extra functionality (experts only)

  Script
   I   load disk layout from sfdisk script file
   O   dump disk layout to sfdisk script file

  Save & Exit
   w   write table to disk and exit
   q   quit without saving changes

  Create a new label
   g   create a new empty GPT partition table
   G   create a new empty SGI (IRIX) partition table
   o   create a new empty DOS partition table
   s   create a new empty Sun partition table


Command (m for help):

分区过程

创建gpt分区并规划大小

Command (m for help): g
Created a new GPT disklabel (GUID: 67C1E069-6405-3C42-BE61-D115D319D2EB).

Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-10485726, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-10485726, default 10485726):

Created a new partition 1 of type 'Linux filesystem' and of size 5 GiB.

Command (m for help): p
Disk /dev/nvme0n1: 5 GiB, 5368709120 bytes, 10485760 sectors
Disk model: VMware Virtual NVMe Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 67C1E069-6405-3C42-BE61-D115D319D2EB

Device         Start      End  Sectors Size Type
/dev/nvme0n1p1  2048 10485726 10483679   5G Linux filesystem

此时成功创建了一个5Gb的分区

设置分区类型lvm

Command (m for help): t

Selected partition 1
Partition type or alias (type L to list all): 30
Changed type of partition 'Linux LVM' to 'Linux LVM'.

Command (m for help):

保存更改

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

root@lvm:~#

查看分区

root@lvm:~# lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                  8:0    0   20G  0 disk
├─sda1               8:1    0  487M  0 part /boot
├─sda2               8:2    0    1K  0 part
└─sda5               8:5    0 19.5G  0 part
  ├─lvm--vg-root   254:0    0 18.6G  0 lvm  /
  └─lvm--vg-swap_1 254:1    0  980M  0 lvm  [SWAP]
sr0                 11:0    1  3.6G  0 rom
nvme0n1            259:0    0    5G  0 disk
└─nvme0n1p1        259:2    0    5G  0 part

此时可以看到,有一个nvme0n1p1分区了

格式化

格式化之前,需要先查看需要扩容的分区当前属于哪种文件系统

root@lvm:~# df -hT
文件系统                 类型      容量  已用  可用 已用% 挂载点
udev                     devtmpfs  958M     0  958M    0% /dev
tmpfs                    tmpfs     195M  736K  195M    1% /run
/dev/mapper/lvm--vg-root ext4       19G  1.4G   16G    9% /
tmpfs                    tmpfs     975M     0  975M    0% /dev/shm
tmpfs                    tmpfs     5.0M     0  5.0M    0% /run/lock
/dev/sda1                ext2      470M   85M  361M   19% /boot
tmpfs                    tmpfs     195M     0  195M    0% /run/user/0
tmpfs                    tmpfs     195M     0  195M    0% /run/user/1000
root@lvm:~#

可以看到,当前/使用的文件系统类型是ext4,所以我们在格式化的时候也是需要使用这个格式

执行命令

mkfs.ext4 /dev/nvme0n1p1

执行效果

root@lvm:~# mkfs.ext4 /dev/nvme0n1p1
mke2fs 1.46.2 (28-Feb-2021)
Creating filesystem with 1310459 4k blocks and 327680 inodes
Filesystem UUID: caadad9d-34a2-4058-99e5-de133935a959
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

root@lvm:~#

至此,物理卷创建完成,然后开始配置lvm

LVM配置

获取当前VG名称

执行下面的命令

vgdisplay

效果

root@lvm:~# vgdisplay
  --- Volume group ---
  VG Name               lvm-vg
  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.52 GiB
  PE Size               4.00 MiB
  Total PE              4997
  Alloc PE / Size       4997 / <19.52 GiB
  Free  PE / Size       0 / 0
  VG UUID               XVVOI3-kdhu-xYUd-cCwS-s92f-MOOe-Vg31th

结果中可以得到,当前/分区使用的vg名称是lvm-vg,记住这个名称,继续

创建PV

语法

pvcreate <分区>

所以需要执行的是

pvcreate /dev/nvme0n1p1

执行之后会提示删除这个分区的数据

WARNING: ext4 signature detected on /dev/nvme0n1p1 at offset 1080. Wipe it?

警告:在偏移量为1080的/dev/nvme0n1p1上检测到ext4签名。擦干净?

这里选择y,注意,执行这个操作会删除该分区的数据,请谨慎操作

创建过程

root@lvm:~# pvcreate /dev/nvme0n1p1
WARNING: ext4 signature detected on /dev/nvme0n1p1 at offset 1080. Wipe it? [y/n]: y
  Wiping ext4 signature on /dev/nvme0n1p1.
  Physical volume "/dev/nvme0n1p1" successfully created.

此时,PV创建成功了,然后查询当前pv列表

root@lvm:~# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda5
  VG Name               lvm-vg
  PV Size               19.52 GiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              4997
  Free PE               0
  Allocated PE          4997
  PV UUID               af50QU-qih4-hV68-ZJ32-vA3E-H64Z-M7mNRv

  "/dev/nvme0n1p1" is a new physical volume of "<5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/nvme0n1p1
  VG Name
  PV Size               <5.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               YrejbH-1UNn-h0HG-c7YJ-89QT-RJ1F-5yoerz

向卷组增加物理卷

语法

vgextend <卷组> <物理卷>
  • 卷组: 指的是需要扩容的卷VG Name,在这里则是lvm-vg
  • 物理卷: 指的是新增的物理卷,在这里则是/dev/nvme0n1p1

所以需要执行的命令就是

vgextend lvm-vg /dev/nvme0n1p1

执行效果

root@lvm:~# vgextend lvm-vg /dev/nvme0n1p1
  Volume group "lvm-vg" successfully extended

提示: 卷组“lvm vg”已成功扩展

验证

root@lvm:~# vgdisplay
  --- Volume group ---
  VG Name               lvm-vg
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               <24.52 GiB
  PE Size               4.00 MiB
  Total PE              6276
  Alloc PE / Size       4997 / <19.52 GiB
  Free  PE / Size       1279 / <5.00 GiB
  VG UUID               XVVOI3-kdhu-xYUd-cCwS-s92f-MOOe-Vg31th

此时可以看到,当前的VG Size变成了24G了,说明逻辑卷扩展完成了,然后我们开始分配空间

语法

lvextend -L <调整大小> <卷组>

大小不得大于实际空间

实践

root@lvm:~# lvextend -L +4G /dev/lvm-vg/root
  Size of logical volume lvm-vg/root changed from 18.56 GiB (4752 extents) to 22.56 GiB (5776 extents).
  Logical volume lvm-vg/root successfully resized.

但是使用df -h命令查看显示还是之前的大小

root@lvm:~# df -h
文件系统                  容量  已用  可用 已用% 挂载点
udev                      958M     0  958M    0% /dev
tmpfs                     195M  736K  195M    1% /run
/dev/mapper/lvm--vg-root   19G  1.4G   16G    9% /
tmpfs                     975M     0  975M    0% /dev/shm
tmpfs                     5.0M     0  5.0M    0% /run/lock
/dev/sda1                 470M   85M  361M   19% /boot
tmpfs                     195M     0  195M    0% /run/user/0
tmpfs                     195M     0  195M    0% /run/user/1000

这是因为我们没有刷新这信息,系统还没更新,下面开始刷新

语法

resize2fs 逻辑卷名

实际操作

root@lvm:~# resize2fs /dev/mapper/lvm--vg-root
resize2fs 1.46.2 (28-Feb-2021)
Filesystem at /dev/mapper/lvm--vg-root is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 3
The filesystem on /dev/mapper/lvm--vg-root is now 5914624 (4k) blocks long.

执行完成之后,再次查看挂载信息

root@lvm:~# df -h
文件系统                  容量  已用  可用 已用% 挂载点
udev                      958M     0  958M    0% /dev
tmpfs                     195M  736K  195M    1% /run
/dev/mapper/lvm--vg-root   23G  1.5G   20G    7% /
tmpfs                     975M     0  975M    0% /dev/shm
tmpfs                     5.0M     0  5.0M    0% /run/lock
/dev/sda1                 470M   85M  361M   19% /boot
tmpfs                     195M     0  195M    0% /run/user/0
tmpfs                     195M     0  195M    0% /run/user/1000

此时,/分区已经变成23GB了,说明扩容已经完成了