Linux LVM 虚拟机分区扩容(同一块硬盘),基于 zStack KVM

实验版本,zstack 3.8.14,企业版 无限期免费试用
https://github.com/zstackio/zstack

zstack 的简单安装记录

  1. 下载 ZStack-x86_64-DVD-3.8.14-c76.iso 刻录到 U 盘,分别在两台机器上安装企业版管理端和计算节点
  2. 登录管理端 IP:5000 ,添加主机和镜像服务器等
  3. 添加一台虚拟机,镜像采用 CentOS-7-x86_64-Minimal-2207-02.iso, legacy, 自动分区

实验步骤

  1. 创建虚拟机的时候,选择 50G 云盘规格
  2. 然后再到 云主机系统扩容 扩容到200G

扩容前后对比,可以看到 /dev/mapper/centos-root 只有50G,而同一块硬盘已经是 214.7 GB

[root@localhost ~]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
devtmpfs                devtmpfs  908M     0  908M    0% /dev
tmpfs                   tmpfs     919M     0  919M    0% /dev/shm
tmpfs                   tmpfs     919M  8.6M  911M    1% /run
tmpfs                   tmpfs     919M     0  919M    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs        47G  1.3G   46G    3% /
/dev/vda1               xfs      1014M  152M  863M   15% /boot
tmpfs                   tmpfs     184M     0  184M    0% /run/user/0
[root@localhost ~]# fdisk -l

磁盘 /dev/vda:214.7 GB, 214748364800 字节,419430400 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000c9885

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200   104857599    51379200   8e  Linux LVM

磁盘 /dev/mapper/centos-root:50.5 GB, 50457477120 字节,98549760 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘 /dev/mapper/centos-swap:2147 MB, 2147483648 字节,4194304 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

[root@localhost ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0  200G  0 disk
├─vda1          252:1    0    1G  0 part /boot
└─vda2          252:2    0   49G  0 part
  ├─centos-root 253:0    0   47G  0 lvm  /
  └─centos-swap 253:1    0    2G  0 lvm  [SWAP]

其中,/dev/vda2 分区是 Linux LVM, /dev/vda2 在 system 一栏中被标记为Linux LVM类型,他们的Id是8e

8e代表Linux LVM, 83代表Linux Native分区。确认分区为LVM,且磁盘空间已经扩容之后,继续我们的扩容工作。

给磁盘扩容的空间分区,并设置为 LVM 类型

[root@localhost ~]# fdisk /dev/vda
vda   vda1  vda2
[root@localhost ~]# fdisk /dev/vda
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

命令(输入 m 获取帮助):n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): p
分区号 (3,4,默认 3):
起始 扇区 (104857600-419430399,默认为 104857600):
将使用默认值 104857600
Last 扇区, +扇区 or +size{K,M,G} (104857600-419430399,默认为 419430399):
将使用默认值 419430399
分区 3 已设置为 Linux 类型,大小设为 150 GiB

命令(输入 m 获取帮助):t
分区号 (1-3,默认 3):
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
正在同步磁盘。

操作过程依次为 n-p-^-^-t-8e-w

注意

如果扩容的是同一块磁盘,会出现磁盘同步成功,但未读取到新的分区表。
如果扩容的是一块新磁盘,则不会有问题。

fdisk -l 中可以看到新分区,而 lsblk 中看不到,也不能执行 pvcreate

[root@localhost ~]# fdisk -l

磁盘 /dev/vda:214.7 GB, 214748364800 字节,419430400 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000c9885

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200   104857599    51379200   8e  Linux LVM
/dev/vda3       104857600   419430399   157286400   8e  Linux LVM

磁盘 /dev/mapper/centos-root:50.5 GB, 50457477120 字节,98549760 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘 /dev/mapper/centos-swap:2147 MB, 2147483648 字节,4194304 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

[root@localhost ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0  200G  0 disk
├─vda1          252:1    0    1G  0 part /boot
└─vda2          252:2    0   49G  0 part
  ├─centos-root 253:0    0   47G  0 lvm  /
  └─centos-swap 253:1    0    2G  0 lvm  [SWAP]

同步分区表

如果出现失败,则需要重启电脑,或者如果你不想重启电脑,也可以使用 partprobe 命令

[root@localhost ~]# partprobe
[root@localhost ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0  200G  0 disk
├─vda1          252:1    0    1G  0 part /boot
├─vda2          252:2    0   49G  0 part
│ ├─centos-root 253:0    0   47G  0 lvm  /
│ └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
└─vda3          252:3    0  150G  0 part
[root@localhost ~]# pvcreate /dev/vda
vda   vda1  vda2  vda3

扩容

查看现有的 vglv,确认vg ID 是 centos,后面扩容需要使用到

[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree
  centos   1   2   0 wz--n- <49.00g 4.00m
[root@localhost ~]# lvs
  LV   VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root centos -wi-ao---- 46.99g
  swap centos -wi-ao----  2.00g
[root@localhost ~]#

查看 centos vg 下创建的逻辑分区,确认要扩容的LV分区路径为 /dev/centos/root,后面需要用到

[root@localhost ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/centos/swap
  LV Name                swap
  VG Name                centos
  LV UUID                cVTTUL-jJa3-NSpI-CIt7-ET0a-07OK-bhmQKH
  LV Write Access        read/write
  LV Creation host, time localhost, 2022-08-31 09:33:36 -0400
  LV Status              available
  # open                 2
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/centos/root
  LV Name                root
  VG Name                centos
  LV UUID                k3k8w1-pRgh-0C9i-aC3n-YUPE-6uWF-cXPU7C
  LV Write Access        read/write
  LV Creation host, time localhost, 2022-08-31 09:33:37 -0400
  LV Status              available
  # open                 1
  LV Size                46.99 GiB
  Current LE             12030
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

扩容 vg,再扩容 lv,同一块磁盘和新磁盘,操作方式一样,只是磁盘分区序号不一样。

[root@localhost ~]# pvcreate /dev/vda3
  Physical volume "/dev/vda3" successfully created.
[root@localhost ~]# vgextend centos /dev/vda3
  Volume group "centos" successfully extended
[root@localhost ~]# lvextend /dev/centos/root /dev/vda3
  Size of logical volume centos/root changed from 46.99 GiB (12030 extents) to <196.99 GiB (50429 extents).
  Logical volume centos/root successfully resized.
[root@localhost ~]# xfs_growfs /dev/centos/root
meta-data=/dev/mapper/centos-root isize=512    agcount=4, agsize=3079680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=12318720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=6015, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 12318720 to 51639296
[root@localhost ~]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
devtmpfs                devtmpfs  908M     0  908M    0% /dev
tmpfs                   tmpfs     919M     0  919M    0% /dev/shm
tmpfs                   tmpfs     919M  8.6M  911M    1% /run
tmpfs                   tmpfs     919M     0  919M    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs       197G  1.3G  196G    1% /
/dev/vda1               xfs      1014M  152M  863M   15% /boot
tmpfs                   tmpfs     184M     0  184M    0% /run/user/0
因为分区的文件系统是 xfs,所以使用 xfs_growfs,如果是 ext4 则需要使用 resize2fs

上述的 /dev/mapper/centos-root/dev/centos/root 是什么关系?

Linux磁盘管理基础知识介绍

物理卷(Physical Volume,PV):就是指硬盘分区,也可以是整个硬盘或已创建的软RAID,是LVM的基本存储设备。

常见命令 pvs, pvscan

卷组(Volume Group,VG):是由一个或多个物理卷所组成的存储池,在卷组上能创建一个或多个逻辑卷。

常见命令 vgs, vgscan, vgextend

逻辑卷(Logical Volume,LV):类似于非LVM系统中的硬盘分区,它建立在卷组之上,是一个标准的块设备,在逻辑卷之上可以建立文件系统。

常见命令 lvs, lvscan, lvcreate, lvextend

Linux下对LVM逻辑卷分区大小调整的命令说明

resize2fs

针对的是ext2、ext3、ext4文件系统

xfs_growfs

针对的是xfs文件系统

1)ext2/ext3/ext4文件系统的调整命令是resize2fs(增大和减小都支持)

lvextend -L 120G /dev/mapper/centos-home     #增大至120G
lvextend -L +20G /dev/mapper/centos-home     #增加20G
lvreduce -L 50G /dev/mapper/centos-home      #减小至50G
lvreduce -L -8G /dev/mapper/centos-home      #减小8G
resize2fs /dev/mapper/centos-home            #执行调整

2)xfs文件系统的调整命令是xfs_growfs(只支持增大)

lvextend -L 120G /dev/mapper/centos-home     #增大至120G
lvextend -L +20G /dev/mapper/centos-home     #增加20G
xfs_growfs /dev/mapper/centos-home           #执行调整

就是说:xfs文件系统只支持增大分区空间的情况,不支持减小的情况(切记!!)。
硬要减小的话,只能在减小后将逻辑分区重新通过mkfs.xfs命令重新格式化才能挂载上,这样的话这个逻辑分区上原来的数据就丢失了。