This article is to show how easy is to grow the size of QEMU virtual disk and its partitions (along with ext4 file system). Of course, you can use this article as an example of expanding the partitions of a physical disk.
Our setup is a QEMU virtual server using a raw image of 20G and the steps are as follow:
- Stop the virtual server
- Resize with qemu-img the raw image of the virtual server
- Start the virtual server
- Get a root ssh shell (probably by using openssh)
- Use parted to resize the partition (and fix the GPT of the disk – not the disk is larger, so the GPT table need fixing).
- Use resize2fs to resize the
STEP 1) Power off your virtual server.
The best way is to power it off within the server with the “poweroff” command. Be careful to check whether the host server killed the QEMU process. It is almost certain if the VNC port is released, the QEMU process has been exited.
If you use virsh (i.e. libvirt), you may execute:
virsh shutdown my-private-vm-01 virsh destroy my-private-vm-01
The destroy command ensures there is no QEMU process, which still operates over the image disk file. But it is dangerous for your data if you issue it on a running virtual server, because it may lose the unsaved data.
If you use QEMU manually wait for the process to exit or if you have enabled the management console connect to it using telnet and just quit – this will destory the QEMU virtual server process – again be careful with unsaved data.
[root@lsrv1 ~]# ps axuf|grep qemu root 15575 2.3 50.1 13061032 8112212 ? Sl May08 1522:27 qemu-system-x86_64 -enable-kvm -smp 4,maxcpus=8 -daemonize -vnc :30 -cdrom /mnt/vm/isos/CentOS-7-x86_64-Minimal-1810.iso -drive file=/mnt/vm/images/templatesrv-wordpress.bin,cache=none,aio=threads,if=virtio -boot c -net nic,model=virtio,macaddr=00:00:00:00:00:30 -net tap,ifname=tap30,script=no,downscript=no -balloon virtio -m 8144 -monitor telnet:127.0.0.1:5830,server,nowait [root@srv-host ~]# telnet 127.0.0.1 5830 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. QEMU 2.0.0 monitor - type 'help' for more information (qemu) q Connection closed by foreign host.
If you use a web interface (for example WebVirtMgr) check whether the virtual server is in power-off state.
STEP 2) Resize the image file of the virtual server.
Find where are located the virtual servers’ image files in your installation and use qemu-img. We want to increse the size with 174GB to 200GB.
qemu-img resize my-private-vm-01.img +174GB
STEP 3) Start your server.
Start your server by issuing a command with virsh or QEMU (qemu-system-x86_64) or from a web interface if use one (like WebVirtMgr).
*virsh and libvirt:
virsh start my-private-vm-01
*Manual start of QEMU emulator – qemu-system-x86_64:
qemu-system-x86_64 -enable-kvm -smp 4,maxcpus=8 -daemonize -vnc :30 -cdrom /mnt/vm/isos/CentOS-7-x86_64-Minimal-1810.iso -drive file=/mnt/vm/images/templatesrv-wordpress.bin,cache=none,aio=threads,if=virtio -boot c -net nic,model=virtio,macaddr=00:00:00:00:00:30 -net tap,ifname=tap30,script=no,downscript=no -balloon virtio -m 8144 -monitor telnet:127.0.0.1:5830,server,nowait
Or just use the web browser and start the virtual server from WebVirtMgr if it is what you use.
STEP 4) Open a shell to your server.
We use openssh client to connect to our server.
STEP 5) Use parted to resize the partition.
The program “parted” will report that the partition table does not use the whole available disk, which is perfectly normal because we’ve just increased the disk size. Just confirm to fix the GPT partition table:
parted /dev/vda GNU Parted 3.2 Using /dev/vda Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) p Warning: Not all of the space available to /dev/vda appears to be used, you can fix the GPT to use all of the space (an extra 367001600 blocks) or continue with the current setting? Fix/Ignore? Fix Model: Virtio Block Device (virtblk) Disk /dev/vda: 215GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 2097kB 1049kB bios_grub 2 2097kB 4096MB 4094MB linux-swap(v1) 3 4096MB 24.0GB 19.9GB ext4 (parted) resizepart 3 -1 Warning: Partition /dev/vda3 is being used. Are you sure you want to continue? parted: invalid token: -1 Yes/No? Yes End? [24.0GB]? -1 (parted) p Model: Virtio Block Device (virtblk) Disk /dev/vda: 215GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 2097kB 1049kB bios_grub 2 2097kB 4096MB 4094MB linux-swap(v1) 3 4096MB 215GB 211GB ext4 (parted) q Information: You may need to update /etc/fstab.
There is a warning the partition is in use but it is perfectly OK to continue.
*parted: reports “invalid token: -1”, but it is accepted for the “End” parameter.
STEP 6) Resize the ext4 file system online
Use the tool resize2fs to resize EXT4.
resize2fs /dev/vda3 resize2fs 1.42.13 (17-May-2015) Filesystem at /dev/vda3 is mounted on /; on-line resizing required old_desc_blocks = 2, new_desc_blocks = 13 The filesystem on /dev/vda3 is now 51428620 (4k) blocks long.
To check the resize operation:
srv1-vm ~ # dmesg|grep EXT4 [ 449.330140] EXT4-fs (vda3): resizing filesystem from 4859392 to 51428620 blocks [ 449.936044] EXT4-fs (vda3): resized filesystem to 51428620 srv1-vm ~ # df -h Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 798M 3.6M 795M 1% /run /dev/vda3 193G 5.7G 180G 4% / tmpfs 3.9G 196K 3.9G 1% /dev/shm
Output log of the whole resize operation
srv-vm1 ~ # parted /dev/vda GNU Parted 3.2 Using /dev/vda Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) p Model: Virtio Block Device (virtblk) Disk /dev/vda: 26.8GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 2097kB 1049kB bios_grub 2 2097kB 4096MB 4094MB linux-swap(v1) 3 4096MB 24.0GB 19.9GB ext4 (parted) q srv-vm1 ~ # poweroff Connection to srv-vm1 closed by remote host. Connection to srv-vm1 closed. myuser@gw1:~$ sshh srv1-host srv1-host ~ # cd /mnt/vm/images srv1-host images # qemu-img resize srv-vm1.img +174GB Image resized. srv1-host images # logout Connection to srv1-host closed. myuser@gw1:~$ sshh srv-vm1 srv-vm1 ~ # df -h Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 798M 3.5M 795M 1% /run /dev/vda3 19G 5.7G 12G 33% / tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup tmpfs 798M 0 798M 0% /run/user/0 srv-vm1 ~ # parted /dev/vda GNU Parted 3.2 Using /dev/vda Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) p Warning: Not all of the space available to /dev/vda appears to be used, you can fix the GPT to use all of the space (an extra 367001600 blocks) or continue with the current setting? Fix/Ignore? Fix Model: Virtio Block Device (virtblk) Disk /dev/vda: 215GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 2097kB 1049kB bios_grub 2 2097kB 4096MB 4094MB linux-swap(v1) 3 4096MB 24.0GB 19.9GB ext4 (parted) q Information: You may need to update /etc/fstab. srv-vm1 ~ # parted /dev/vda GNU Parted 3.2 Using /dev/vda Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) resizepart 3 -1 Warning: Partition /dev/vda3 is being used. Are you sure you want to continue? parted: invalid token: -1 Yes/No? Yes End? [24.0GB]? -1 (parted) p Model: Virtio Block Device (virtblk) Disk /dev/vda: 215GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 2097kB 1049kB bios_grub 2 2097kB 4096MB 4094MB linux-swap(v1) 3 4096MB 215GB 211GB ext4 (parted) q Information: You may need to update /etc/fstab. srv-vm1 ~ # resize2fs /dev/vda3 resize2fs 1.42.13 (17-May-2015) Filesystem at /dev/vda3 is mounted on /; on-line resizing required old_desc_blocks = 2, new_desc_blocks = 13 The filesystem on /dev/vda3 is now 51428620 (4k) blocks long. srv-vm1 ~ # dmesg|grep EXT4 [ 449.330140] EXT4-fs (vda3): resizing filesystem from 4859392 to 51428620 blocks [ 449.936044] EXT4-fs (vda3): resized filesystem to 51428620 srv-vm1 ~ # touch /forcefsck srv-vm1 ~ # reboot
We rebooted the virtual machine with force check for precaution, but it is not reqiured.
Bonus – physical disks setup
Probably you would need an additional first step of copying your old disk to the new disk – basically, there are two ways to do it:
- blind copy everything with a hardware or the Linux “dd” command.
- use gparted to copy the GPT table and the partitions to the new disk