admin 发表于 2022-4-11 17:19:46

virsh blockresize 命令,扩容kvm虚机磁盘大小

# virsh blockresize rhel-server-7.9 /var/lib/libvirt/images/rhel-server-7.9.qcow2 20G
Block device '/var/lib/libvirt/images/rhel-server-7.9.qcow2' is resized

# lsblk
NAME          MAJ:MIN RMSIZE RO TYPE MOUNTPOINT
sr0            11:0    1 1024M0 rom
vda         252:0    0   40G0 disk
├─vda1      252:1    0    1G0 part /boot
└─vda2      252:2    0   19G0 part
├─rhel-root 253:0    0   17G0 lvm/
└─rhel-swap 253:1    0    2G0 lvm
loop0         7:0    03.6G0 loop /mnt/6.8
loop1         7:1    03.6G0 loop /mnt/6.10
loop2         7:2    04.2G0 loop /mnt/7.8
# growpart /dev/vda 2
CHANGED: partition=2 start=2099200 old: size=39843807 end=41943007 new: size=81786847 end=83886047
# lsblk
NAME          MAJ:MIN RMSIZE RO TYPE MOUNTPOINT
sr0            11:0    1 1024M0 rom
vda         252:0    0   40G0 disk
├─vda1      252:1    0    1G0 part /boot
└─vda2      252:2    0   39G0 part
├─rhel-root 253:0    0   17G0 lvm/
└─rhel-swap 253:1    0    2G0 lvm
loop0         7:0    03.6G0 loop /mnt/6.8
loop1         7:1    03.6G0 loop /mnt/6.10
loop2         7:2    04.2G0 loop /mnt/7.8



# lsblk
NAME          MAJ:MIN RMSIZE RO TYPE MOUNTPOINT
sr0            11:0    1 1024M0 rom
vda         252:0    0   40G0 disk
├─vda1      252:1    0    1G0 part /boot
└─vda2      252:2    0   39G0 part
├─rhel-root 253:0    0   17G0 lvm/
└─rhel-swap 253:1    0    2G0 lvm
loop0         7:0    03.6G0 loop /mnt/6.8
loop1         7:1    03.6G0 loop /mnt/6.10
loop2         7:2    04.2G0 loop /mnt/7.8

# pvresize /dev/vda2
Physical volume "/dev/vda2" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
# pvresize /dev/vda2 40
Failed to find device for physical volume "40".
Physical volume "/dev/vda2" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized

# lvextend -l +100%FREE /dev/mapper/rhel-root
Size of logical volume rhel/root changed from 16.99 GiB (4350 extents) to 36.99 GiB (9470 extents).
Logical volume rhel/root successfully resized.


# df -TH
Filesystem            Type      SizeUsed Avail Use% Mounted on
devtmpfs            devtmpfs952M   0952M   0% /dev
tmpfs               tmpfs   964M   0964M   0% /dev/shm
tmpfs               tmpfs   964M9.1M955M   1% /run
tmpfs               tmpfs   964M   0964M   0% /sys/fs/cgroup
/dev/mapper/rhel-root xfs      19G   18G338M99% /
/dev/vda1             xfs       1.1G157M907M15% /boot
tmpfs               tmpfs   193M   0193M   0% /run/user/0
/dev/loop0            iso9660   3.9G3.9G   0 100% /mnt/6.8
/dev/loop1            iso9660   3.9G3.9G   0 100% /mnt/6.10
/dev/loop2            iso9660   4.6G4.6G   0 100% /mnt/7.8

# resize2fs -f /dev/mapper/rhel-root
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block while trying to open /dev/mapper/rhel-root
Couldn't find valid filesystem superblock.
# pvresize /dev/vda
vda   vda1vda2
# pvresize /dev/vda
vda   vda1vda2
# pvresize /dev/vda2
Physical volume "/dev/vda2" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
# pvscan
PV /dev/vda2   VG rhel            lvm2 [<39.00 GiB / 0    free]
Total: 1 [<39.00 GiB] / in use: 1 [<39.00 GiB] / in no VG: 0
# vgscan
Reading volume groups from cache.
Found volume group "rhel" using metadata type lvm2

# lvscan
ACTIVE            '/dev/rhel/root' inherit
ACTIVE            '/dev/rhel/swap' inherit
# df -TH
Filesystem            Type      SizeUsed Avail Use% Mounted on
devtmpfs            devtmpfs952M   0952M   0% /dev
tmpfs               tmpfs   964M   0964M   0% /dev/shm
tmpfs               tmpfs   964M9.1M955M   1% /run
tmpfs               tmpfs   964M   0964M   0% /sys/fs/cgroup
/dev/mapper/rhel-root xfs      19G   18G338M99% /
/dev/vda1             xfs       1.1G157M907M15% /boot
tmpfs               tmpfs   193M   0193M   0% /run/user/0
/dev/loop0            iso9660   3.9G3.9G   0 100% /mnt/6.8
/dev/loop1            iso9660   3.9G3.9G   0 100% /mnt/6.10
/dev/loop2            iso9660   4.6G4.6G   0 100% /mnt/7.8

# lvextend -l +100%FREE /dev/mapper/rhel-root
New size (9470 extents) matches existing size (9470 extents).


# df -TH
Filesystem            Type      SizeUsed Avail Use% Mounted on
devtmpfs            devtmpfs952M   0952M   0% /dev
tmpfs               tmpfs   964M   0964M   0% /dev/shm
tmpfs               tmpfs   964M9.1M955M   1% /run
tmpfs               tmpfs   964M   0964M   0% /sys/fs/cgroup
/dev/mapper/rhel-root xfs      19G   18G338M99% /
/dev/vda1             xfs       1.1G157M907M15% /boot
tmpfs               tmpfs   193M   0193M   0% /run/user/0
/dev/loop0            iso9660   3.9G3.9G   0 100% /mnt/6.8
/dev/loop1            iso9660   3.9G3.9G   0 100% /mnt/6.10
/dev/loop2            iso9660   4.6G4.6G   0 100% /mnt/7.8




# resize2fs -f /dev/mapper/rhel-root
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block while trying to open /dev/mapper/rhel-root
Couldn't find valid filesystem superblock.

# growpart /dev/vda 2
NOCHANGE: partition 2 is size 81786847. it cannot be grown
# pvresize/dev/vda2
Physical volume "/dev/vda2" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
# xfs_growfs /dev/mapper/rhel-root
meta-data=/dev/mapper/rhel-rootisize=512    agcount=32, agsize=140544 blks
         =                     sectsz=512   attr=2, projid32bit=1
         =                     crc=1      finobt=0 spinodes=0
data   =                     bsize=4096   blocks=4454400, imaxpct=25
         =                     sunit=0      swidth=0 blks
naming   =version 2            bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                     sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 4454400 to 9697280

admin 发表于 2022-4-11 17:33:21

以使用如下命令

qemu-img snapshot -l /var/lib/libvirt/images/kvm1.qcow2
磁盘镜像如果有快照,无法进行扩容

再次确认,已经备份了需要扩容的磁盘,然后开始操作,此处以kvm4为例,从宿主机可以看到,目前kvm4已经启动

# virsh list --all
Id Name State
----------------------------------------------------
4 kvm4 running
- kvm1 shut off
- kvm2 shut off
- kvm3 shut off
- kvm5 shut off
- kvm6 shut off
登录kvm4,查看虚拟机磁盘状态,如下

# fdisk -l

Disk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000b9417

Device Boot Start End Blocks Id System
/dev/vda1 * 2048 2099199 1048576 83 Linux
/dev/vda2 2099200 10227711 4064256 82 Linux swap / Solaris
/dev/vda3 10227712 104857599 47314944 83 Linux
#
#
#
# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.5M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/vda3 46G 1.3G 44G 3% /
/dev/vda1 1014M 142M 873M 14% /boot
tmpfs 379M 0 379M 0% /run/user/0
从上述信息可以看出,目前kvm4虚拟机只有一块vda磁盘,有三个分区,/dev/vda1分区是boot分区,/dev/vda2是swap分区,/dev/vda3是根文件系统,根的大小是46G,44G可用,此处假设,根分区已经沾满了,我们需要扩容根分区,虽然最终目标是扩容根分区,但是需要先在宿主机上,为kvm4的磁盘进行扩容,扩容完磁盘后,再扩容分区的文件系统。
在宿主机上确认kvm4的磁盘镜像路径,如下:

# virsh domblklist kvm4
Target Source
------------------------------------------------
vda /var/lib/libvirt/images/kvm4.qcow2
hda -
可以看到,kvm4的磁盘镜像路径是/var/lib/libvirt/images/kvm4.qcow2,对应挂载到了kvm4的vda磁盘,先看一下目前磁盘镜像的大小

# qemu-img info /var/lib/libvirt/images/kvm4.qcow2
image: /var/lib/libvirt/images/kvm4.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 1.5G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
如上所示,磁盘虚拟大小为50G,目前占用宿主机1.5G空间,磁盘格式是一个qcow2的磁盘。
现在,我们要扩容这个磁盘镜像,增容20G的空间,但是在操作之前,请先停止虚拟机,虽然不停止也可以增容成功,但是会报错,目前还不清楚,错误是否会对虚拟机以后的运行产生影响,保险起见,先停止虚拟机,然后再执行如下命令对磁盘镜像进行扩容。
停止虚拟机后,执行如下命令

# qemu-img resize /var/lib/libvirt/images/kvm4.qcow2 +20G
Image resized.
增容后,再次查看磁盘镜像信息,如下,磁盘的virtual size已经从50G变成了70G

# qemu-img info /var/lib/libvirt/images/kvm4.qcow2
image: /var/lib/libvirt/images/kvm4.qcow2
file format: qcow2
virtual size: 70G (75161927680 bytes)
disk size: 2.5G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
磁盘扩容成功后,启动kvm4虚拟机,登录到虚拟机内,再次查看磁盘信息,发现已经变成了75G

# fdisk -l

Disk /dev/vda: 75.2 GB, 75161927680 bytes, 146800640 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000b9417

Device Boot Start End Blocks Id System
/dev/vda1 * 2048 2099199 1048576 83 Linux
/dev/vda2 2099200 10227711 4064256 82 Linux swap / Solaris
/dev/vda3 10227712 104857599 47314944 83 Linux
但是,根分区和对应的文件系统还没有扩容,如下,可以看到/dev/vda3分区仍然识别为48G,根文件系统仍然识别为46G。

# fdisk -lu /dev/vda3

Disk /dev/vda3: 48.5 GB, 48450502656 bytes, 94629888 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

#
#
#
# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.5M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/vda3 46G 1.3G 44G 3% /
/dev/vda1 1014M 142M 873M 14% /boot
tmpfs 379M 0 379M 0% /run/user/0
我们现在的目标就是扩容根分区和文件系统。
此处可以参考阿里云的文档进行扩容操作,链接如下:
https://help.aliyun.com/document_detail/113316.html?spm=5176.21213303.J_6028563670.36.241a3edapvGQJG&scm=20140722.S_help

我的虚拟机操作系统是centos7,分区是MBR分区,不是GPT分区,文件系统是xfs,所以,我的扩容过程可能跟实际遇到的情况不太一样,这里需要以实际情况为准,参考上面的文档,做出不同的细节处理,生产环境中最好提前克隆出一个机器或者做一个测试机进行模拟。

首先,在虚拟机中安装cloud-utils-growpart工具(如果是GPT分区,先安装gdisk),对分区进行扩容,centos7中命令如下

yum install -y cloud-utils-growpart
安装完成后,执行如下命令扩容对应分区,我需要扩容vda3,所以命令中是vda 3,vda和3中间有空格

# growpart /dev/vda 3
CHANGED: partition=3 start=10227712 old: size=94629888 end=104857600 new: size=136572895 end=146800607
可以看到,分区的大小已经改变,使用命令确认,vda3分区的大小已经识别为69.9G

# fdisk -lu /dev/vda3

Disk /dev/vda3: 69.9 GB, 69925322240 bytes, 136572895 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
如果扩容完成后,再次执行扩容命令,会提示NOCHANGE…it cannot be grown,这是因为,分区已经扩展完成了,没有富裕的空间可供扩展了,其实,还有一种情况也会报如下错误,导致无法扩容分区,我们一会儿再聊,先把一整套扩容流程走完,此处重复执行如下命令不会影响扩容。

# growpart /dev/vda 3
NOCHANGE: partition 3 is size 136572895. it cannot be grown
vda3分区扩容完成后,需要扩容分区对应的文件系统,此处文件系统是xfs,所以执行xfs_growfs命令即可,如果是ext文件系统,需要使用resize2fs命令,此处运行的命令为xfs_growfs /dev/vda3
如下:

# xfs_growfs /dev/vda3
meta-data=/dev/vda3 isize=512 agcount=4, agsize=2957184 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=11828736, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=5775, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 11828736 to 17071611
再次查看磁盘使用情况,可以看到,根分区已经从之前的46G扩容到了66G,如下

# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.5M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/vda3 66G 1.4G 64G 3% /
/dev/vda1 1014M 142M 873M 14% /boot
tmpfs 379M 0 379M 0% /run/user/0
至此,整个扩容操作已经完成了。

此处有一个坑,刚才已经提到过,在扩容分区时,我们使用了growpart命令,如果重复执行此命令,会提示NOCHANGE…it cannot be grown,这是因为已经没有更多空间可供分区扩容了,但是,在某些特殊情况下,磁盘明明还有很多空间,在第一次执行growpart命令时就会提示it cannot be grown,现在咱们就来聊聊这种特殊情况。

如果磁盘有很多富裕空间可供分区扩容,但是每次执行growpart命令就提示it cannot be grown,很有可能是因为,你要扩容的分区不是磁盘的最后一个分区,上例中,我要扩容的vda3就是vda磁盘的最后一个分区,如下图,可以通过分区号或者分区区间很明显的看出,vda3就是vda的最后一个分区

这种情况下,第一次执行growpart命令扩容分区时,应该是可以正常执行的。
但是,如果你遇到的分区是下面的情况,而你想要扩容的分区恰巧不是磁盘的最后一个分区,则无法扩容成功,会直接提示it cannot be grown

# fdisk -l

Disk /dev/vda: 536.9 GB, 536870912000 bytes, 1048576000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000ac5a2

Device Boot Start End Blocks Id System
/dev/vda1 * 2048 2099199 1048576 83 Linux
/dev/vda2 2099200 1044367359 521134080 83 Linux
/dev/vda3 1044367360 1048561663 2097152 82 Linux swap / Solaris
#
#
# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 909M 0 909M 0% /dev
tmpfs 919M 0 919M 0% /dev/shm
tmpfs 919M 8.6M 911M 1% /run
tmpfs 919M 0 919M 0% /sys/fs/cgroup
/dev/vda2 497G 1.3G 496G 1% /
/dev/vda1 1014M 142M 873M 14% /boot
tmpfs 184M 0 184M 0% /run/user/0
如上,vda一共有三个分区,根对应的分区是vda2,即使vda磁盘有很多富裕空间,如果想要使用growpart命令扩容vda2,也是不行的,会直接提示it cannot be grown,因为上例中,vda2后面还有一个vda3分区,而上例中的情况比较好处理,因为最后一个分区是swap分区,我们只需要删除这个分区,然后再扩容vda2就好了,扩容完成后,再单独挂载一个磁盘作为swap分区或者使用文件作为swap分区,所以,在做模板机的时候要避开这个坑,别问我怎么知道的。
页: [1]
查看完整版本: virsh blockresize 命令,扩容kvm虚机磁盘大小