在 KVM 虚拟化系统下,给现有虚拟机扩充硬盘空间

2021-07-19
6分钟阅读时长

经常会遇到,运行中虚拟主机遇到了硬盘空间不足的问题,那么,如何在现有的 KVM 系统下,为虚拟主机扩充硬盘空间呢。本文即为大家介绍操作的方法。

基本思路

在开始添加前,先要捋一下基本思路。为虚拟主机扩充硬盘,有两个方面,一方面是扩充虚拟主机的磁盘文件的大小,另外一个,就是在虚拟主机的主机系统中,识别并利用上扩充的磁盘空间。

扩充虚拟主机的磁盘文件,有两种做法,一个是直接扩大文件,还有一个,就是添加一个新的磁盘镜像文件。

而在虚拟主机的主机系统中,对扩充的磁盘空间进行识别并利用,主要用到了分区工具和 LVM 的扩充功能,如果虚拟主机中,没用使用 LVM ,那就只能使用直接加载硬盘分区的方式来扩充硬盘了。

本文以下的方法,主要讲述的是,在直接扩大虚拟主机磁盘镜像文件的基础上,借助虚拟主机系统(CentOS 7)的 LVM 功能的扩充功能,在不改变主机文件系统目录结构的情况下,扩充主机的磁盘空间。

扩大虚拟主机的磁盘镜像文件

  1. 先查看下目标虚拟主机当前的磁盘情况
# virsh domblklist <虚拟机名称>

该命令会列出目标虚拟机当前使用的磁盘镜像文件情况。

  1. 在宿主机查看虚拟机磁盘镜像文件的情况
# qemu-img info /data/kvm/images/vm1.img

示例:

[root@kvm002 images]# qemu-img info test_vm3.img
image: test_vm3.img
file format: raw
virtual size: 50G (53687091200 bytes)
disk size: 2.3G
  1. 关闭虚拟机
# virsh shutdown <虚拟机名称>
  1. 扩大镜像文件的容量(扩大 50G 的容量)
# qemu-img resize /data/kvm/images/vm1.img +50G

示例:

[root@kvm002 images]# qemu-img resize test_vm3.img +50G
Image resized. #扩容成功
  1. 查看是否成功
# qemu-img info /data/kvm/images/vm1.img

示例:

[root@kvm002 images]# qemu-img info test_vm3.img
image: test_vm3.img
file format: raw
virtual size: 100G (107374182400 bytes)
disk size: 2.3G

扩大虚拟主机系统中的硬盘空间

  1. 启动虚拟主机
# virsh start <虚拟机名称>
  1. 连接进入虚拟机,查看系统中的磁盘信息

使用 ssh 或者通过控制台的方式,进入虚拟机系统后,查看系统的磁盘信息。

# lsblk

示例:

[admin@localhost ~]$ lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0  100G  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]

查看命令的输出,会发现,磁盘块存在未使用的空间。

  1. 对未使用的磁盘空间进行分区
# fdisk /dev/vda

进入磁盘分区的交互界面后,依次执行以下命令:

m - 打印命令菜单
p - 打印分区表
n - 添加一个新的分区
p - 分区类型选择主分区(primary)
t - 修改分区的系统类型(更改为 Linux LVM)
l - 列出所有的分区类型的代码(8e 为 Linux LVM)
8e - 将分区类型修改为 Linux LVM
p - 打印分区表
w - 将分区表的修改写入并退出

示例:

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

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


命令(输入 m 获取帮助):m
命令操作
 a   toggle a bootable flag
 b   edit bsd disklabel
 c   toggle the dos compatibility flag
 d   delete a partition
 g   create a new empty GPT partition table
 G   create an IRIX (SGI) partition table
 l   list known partition types
 m   print this menu
 n   add a new partition
 o   create a new empty DOS partition table
 p   print the partition table
 q   quit without saving changes
 s   create a new empty Sun disklabel
 t   change a partition's system id
 u   change display/entry units
 v   verify the partition table
 w   write table to disk and exit
 x   extra functionality (experts only)

命令(输入 m 获取帮助):p

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

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

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

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

 0  空              24  NEC DOS         81  Minix / 旧 Linu bf  Solaris
 1  FAT12           27  隐藏的 NTFS Win 82  Linux 交换 / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 隐藏的 C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux 扩展      c7  Syrinx
 5  扩展            41  PPC PReP Boot   86  NTFS 卷集       da  非文件系统数据
 6  FAT16           42  SFS             87  NTFS 卷集       db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux 纯文本    de  Dell 工具
 8  AIX             4e  QNX4.x 第2部分  8e  Linux LVM       df  BootIt
 9  AIX 可启动      4f  QNX4.x 第3部分  93  Amoeba          e1  DOS 访问
 a  OS/2 启动管理器 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad 休 eb  BeOS fs
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT
 f  W95 扩展 (LBA)  54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC
11  隐藏的 FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor
12  Compaq 诊断     5c  Priam Edisk     a9  NetBSD          f4  SpeedStor
14  隐藏的 FAT16 <3 61  SpeedStor       ab  Darwin 启动     f2  DOS 次要
16  隐藏的 FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS
17  隐藏的 HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE
18  AST 智能睡眠    65  Novell Netware  b8  BSDI swap       fd  Linux raid 自动
1b  隐藏的 W95 FAT3 70  DiskSecure 多启 bb  Boot Wizard 隐  fe  LANstep
1c  隐藏的 W95 FAT3 75  PC/IX           be  Solaris 启动    ff  BBT
1e  隐藏的 W95 FAT1 80  旧 Minix
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):p                 ###   打印分区表

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

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200   104857599    51379200   8e  Linux LVM
/dev/vda3       104857600   209715199    52428800   8e  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)
正在同步磁盘。
  1. 刷新虚拟机系统中的分区
# partprobe

将新创建的分区加入逻辑卷中

  1. 将新添加的分区做成物理卷(PV)
# pvcreate /dev/vda3

添加成功后,可使用 pvdisplay 命令查看一下。

示例:

[root@localhost admin]# pvcreate /dev/vda3
Physical volume "/dev/vda3" successfully created.

[root@localhost admin]# pvs
  PV         VG     Fmt  Attr PSize   PFree
  /dev/vda2  centos lvm2 a--  <49.00g  4.00m
  /dev/vda3         lvm2 ---   50.00g 50.00g
  1. 将新创建的物理卷(PV)合并到要扩容的卷组(VG)中
# vgextend centos /dev/vda3

其中,“centos” 为卷组名,执行成功后,可通过 vgdisplay 命令查看一下情况

[root@localhost admin]# vgextend centos /dev/vda3
Volume group "centos" successfully extended

[root@localhost admin]# vgs           # 查看卷组
VG     #PV #LV #SN Attr   VSize  VFree
centos   2   2   0 wz--n- 98.99g 50.00g
  1. 将需要扩容的逻辑卷进行扩容

在扩容前,可使用 lvdisplay 查看下现有的逻辑卷,确定需要扩容的逻辑卷名,及所在的卷组。

# lvextend -l +100%FREE /dev/mapper/centos-root

以上命令,将卷组所有的剩余可用空间都扩充到 /dev/mapper/centos-root 这个逻辑卷了。可使用 lvdisplay 再次查看一下。

示例:

[root@localhost admin]# lvextend -l +100%FREE /dev/mapper/centos-root
Size of logical volume centos/root changed from 46.99 GiB (12030 extents) to 96.99 GiB (24830 extents).
Logical volume centos/root successfully resized.
  1. 同步文件系统
# xfs_groufs /dev/mapper/centos-root

centos 7 默认是使用 xfs 文件系统。

至此,虚拟主机的硬盘空间扩容完成。

示例:

[root@localhost admin]# xfs_growfs /dev/mapper/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 25425920
Avatar

JeffWu Author

数十年互联网从业经验,互联网全栈开发工程师,资深技术管理人员,资深游戏开发工程师。具有丰富的搭建海量数据处理系统的经验,大容量、高并发、高可靠线上运营系统的搭建和维护的丰富经验。