.. _libvirt_lvm_pool_resize_vm_disk:
===========================================
在libvirt LVM卷管理存储池中扩展虚拟机磁盘
===========================================
我在 :ref:`libvirt_lvm_pool` 中部署的虚拟机,初始都采用较小的容量,实际运行时,需要根据需求调整磁盘容量:
- 对于Host主机,每个VM实际就是一个LVM卷,所以Host物理主机可以直接调整VM的磁盘大小 - 并且可以在线调整
- 虚拟机内部使用了简单的XFS文件系统,支持在线扩容,所以可以直接在虚拟机内部实现 :ref:`xfs_growfs`
- 虚拟机内部我没有使用LVM卷,主要是简化运维;不过即使虚拟机内部使用LVM卷,也可以通过将新扩容的空白vm磁盘部分创建新的 ``pv`` ,然后通过 ``vgextend`` 扩展到新的 ``vg`` 上实现 ``vg`` 扩容,最后通过 ``lvresize`` 实现 LVM 卷扩容,最后再使用文件系统对应工具来扩展文件系统
环境检查
==========
:ref:`libvirt_lvm_pool` 创建了使用LVM卷的虚拟机,例如 ``z-dev``
- 检查虚拟机::
virsh dumpxml z-dev
可以看到磁盘部分::
- 这个VM的虚拟磁盘在Host主机上就是 ``/dev/vg-libvirt/z-dev`` ,所以在Host主机上我们检查这个LVM卷::
sudo lvs /dev/vg-libvirt/z-dev
可以看到::
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
z-dev vg-libvirt -wi-ao---- 6.00g
- 检查vg::
sudo vgdisplay
可以看到VG是有充足空间的::
--- Volume group ---
VG Name vg-libvirt
System ID
Format lvm2
...
VG Size <258.08 GiB
PE Size 4.00 MiB
Total PE 66068
Alloc PE / Size 15360 / 60.00 GiB
Free PE / Size 50708 / <198.08 GiB
...
物理机上操作
----------------------------------
- 和 :ref:`kvm_vdisk_live` 案例相似, ``virsh blockresize`` 支持虚拟机镜像在线调整,也支持 :ref:`libvirt_lvm_pool`
注意,这里必须指定Host主机上设备文件路径 ``--path /dev/vg-libvirt/z-dev``
想要将 16G 扩展成 32G 使用相似命令::
sudo virsh blockresize z-dev --path /dev/vg-libvirt/z-dev --size 32G
出现报错::
error: Failed to resize block device '/dev/vg-libvirt/z-dev'
error: internal error: unable to execute QEMU command 'block_resize': Cannot grow device files
检查了存储池::
virsh pool-info images_lvm
显示空还有剩余::
Name: images_lvm
UUID: 11d759bf-32ad-4a4a-a137-d5d3bef0b2cf
State: running
Persistent: yes
Autostart: yes
Capacity: 258.08 GiB
Allocation: 92.00 GiB
Available: 166.08 GiB
.. note::
使用 ``lvresize`` 命令可以在Host主机上调整VM的卷大小,但是虚拟机不重启无法在guest内部刷新磁盘大小。所以要结合使用 ``virsh blockresize`` 命令,可以在线同步修改虚拟机磁盘大小,也支持 :ref:`libvirt_lvm_pool` 的LVM卷
参考 `Extend KVM Volume `_ 分为2步完成:
- 先使用系统级命令 ``lvresize`` 修改LVM卷大小
- 然后再使用 ``virsh blockresize`` 修订则成功
.. literalinclude:: libvirt_lvm_pool_resize_vm_disk/lvresize_32g
:language: bash
:caption: 修订z-dev虚拟机的LVM卷到32G容量
提示信息::
Size of logical volume vg-libvirt/z-dev changed from 16.00 GiB (4096 extents) to 32.00 GiB (8192 extents).
Logical volume vg-libvirt/z-dev successfully resized.
.. literalinclude:: libvirt_lvm_pool_resize_vm_disk/virsh_blockresize_32g
:language: bash
:caption: virsh blocksize命令刷新z-dev虚拟机libvirt卷容量
提示信息::
Block device '/dev/vg-libvirt/z-dev' is resized
虚拟机内部操作
----------------
- 完成后在虚拟机 ``z-dev`` 内部检查::
lsblk
可以看到 ``vda`` 磁盘已经增长到16G::
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 252:0 0 16G 0 disk
├─vda1 252:1 0 256M 0 part /boot/efi
└─vda2 252:2 0 15.7G 0 part /
注意,此时由于GPT分区没有扩展,所以使用 ``fdisk -l /dev/vda`` 会提示分区表的备份(位于设备末尾)没有正确位于设备末尾(最前面2行提示)::
GPT PMBR size mismatch (33554431 != 67108863) will be corrected by write.
The backup GPT table is not on the end of the device.
Disk /dev/vda: 32 GiB, 34359738368 bytes, 67108864 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
Disklabel type: gpt
Disk identifier: 8A2359A8-F37E-405B-AD00-8036DCC8E610
Device Start End Sectors Size Type
/dev/vda1 2048 526335 524288 256M EFI System
/dev/vda2 526336 33554398 33028063 15.7G Linux filesystem
- 安装 ``cloud-utils-growpart`` (提供 ``growpart`` 工具):
.. literalinclude:: libvirt_lvm_pool_resize_vm_disk/dnf_install_cloud-utils-growpart
:language: bash
:caption: RedHat系虚拟机内部通过dnf安装cloud-utils-growpart
如果使用 debian/ubuntu ,则安装 ``cloud-guest-utils`` 来获得 ``growpart`` :
.. literalinclude:: libvirt_lvm_pool_resize_vm_disk/apt_install_cloud-guest-utils
:language: bash
:caption: Debian/Ubuntu系虚拟机内部通过apt安装cloud-guest-utils
- 扩展分区:
.. literalinclude:: libvirt_lvm_pool_resize_vm_disk/growpart_vda2
:language: bash
:caption: 在虚拟机内部通过growpart命令扩展分区2
提示信息::
CHANGED: partition=2 start=526336 old: size=33028063 end=33554399 new: size=66582495 end=67108831
- 使用 :ref:`xfs_growfs` 在线扩展XFS文件系统:
.. literalinclude:: libvirt_lvm_pool_resize_vm_disk/xfs_growfs_root_fs
:language: bash
:caption: 在虚拟机内部通过XFS的维护命令xfs_growfs将根目录分区扩展
提示信息::
meta-data=/dev/vda2 isize=512 agcount=11, agsize=376704 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=4128507, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log 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 4128507 to 8322811
此时检查 ``df -h`` 可以看到根分区已经扩展到最大32GB::
...
/dev/vda2 32G 15G 17G 47% /
...
如果VM内部使用了LVM
=======================
如果虚拟机内部使用了LVM,最简单的方法是使用 :ref:`kvm_libguestfs` 工具对应的 ``virt-resize`` ,可以将容器内部的磁盘文件系统或者LVM卷大小进行调整,详细案例可以参考:
- `virt-resize - Resize a virtual machine disk `_
- `Resizing a KVM disk image on LVM, The Easy Way `_
参考
=========
- `Resizing a KVM disk image on LVM, The Hard Way `_ 和 `Resizing a KVM disk image on LVM, The Easy Way `_ 注意,这两个文档原文是虚拟机内部使用了LVM卷管理,当扩展虚拟机磁盘之后,如何在虚拟机内部调整guest操作系统LVM,和我的案例不同,但是思路可以参考