Adding disk space to a Linux VM can be a lot more complex than expected. Please find below an explanation on how to extend the size of the root partition of a Photon OS VM running on vSphere. The resize is done without unmounting the partition (but there is a reboot done initially). This is made possible in part because the filesystem is Ext4. The VM does need to be rebooted after changing the disk size in vSphere however. Otherwise it won’t realize it now has a larger disk.
Process
- Increase size of disk in vSphere
- Reboot the VM so it recognizes the new disk size
- Use fdisk to delete and re-create the root partition
- Use resize2fs to expand the partition size
- Update fstab and grub with the new partition ID (or the VM won’t boot)
For Photon OS this process is extra easy as the root partition is at the end of the filesystem table and it doesn’t use an “Extended” partition. It’s possible to resize partitions with an Extended partition as well, but it takes a bit more work.
Note: These commands can easily break your system. Don’t try it on a machine where you value the data unless you have a solid backup of everything before attempting a resize.
Video covering the steps shown below
Step one is to change the disk size in vCenter
Reboot
In order for the Linux VM to recognize that it has a larger disk it needs to be rebooted.
root@stress-vm-01 [ ~ ]# reboot
Prior to modifying the partitions, verify which disk to modify
After rebooting, log back into the VM. We want to modify the root “/” partition and with “lsblk” we can verify that it is labeled “sda3”
root@stress-vm-01 [ ~ ]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 375G 0 disk ├─sda1 8:1 0 4M 0 part ├─sda2 8:2 0 10M 0 part /boot/efi └─sda3 8:3 0 80G 0 part /
Launch fdisk
We use “fdisk” to modify the partitions and tell it to look at “/dev/sda” rather than “/dev/sda3”. This is because we want to see the entire disk, not just the partition we will modify
root@stress-vm-01 [ ~ ]# fdisk /dev/sda Welcome to fdisk (util-linux 2.36). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. GPT PMBR size mismatch (167772159 != 786431999) will be corrected by write. Command (m for help):
Print partition information
We can see that the partition we want to modify (“/dev/sda3”) is at the end of the partition table. This makes it easy as we don’t have to shift any other partitions around to make space for the new, larger partition.
Command (m for help): p Disk /dev/sda: 375 GiB, 402653184000 bytes, 786432000 sectors Disk model: Virtual disk 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: 2C13B474-2D24-4FE6-9905-D3A52DB28C9E Device Start End Sectors Size Type /dev/sda1 2048 10239 8192 4M BIOS boot /dev/sda2 10240 30719 20480 10M EFI System /dev/sda3 30720 167772126 167741407 80G Linux filesystem Command (m for help):
Delete the last partition (number 3)
Command (m for help): d Partition number (1-3, default 3): Partition 3 has been deleted. Command (m for help):
Recreate the partition
Here we use “n” to create a new partition, starting it at the exact same place as the old partition: “307020”. Fdisk will automatically suggest we end the new partition at the end of the disk: “786431966”. Pressing enter will accept this value and create the partition.
We can also see that the partition contains an ext4 signature – this is why we can resize the partition while it still is mounted.
Command (m for help): n Partition number (3-128, default 3): First sector (30720-786431966, default 30720): Last sector, +/-sectors or +/-size{K,M,G,T,P} (30720-786431966, default 786431966): Created a new partition 3 of type 'Linux filesystem' and of size 375 GiB. Partition #3 contains a ext4 signature. Do you want to remove the signature? [Y]es/[N]o: N Command (m for help):
Print the updated partition table
Note that it is not yet written to disk, this is just a preview
Command (m for help): p Disk /dev/sda: 375 GiB, 402653184000 bytes, 786432000 sectors Disk model: Virtual disk 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: 2C13B474-2D24-4FE6-9905-D3A52DB28C9E Device Start End Sectors Size Type /dev/sda1 2048 10239 8192 4M BIOS boot /dev/sda2 10240 30719 20480 10M EFI System /dev/sda3 30720 786431966 786401247 375G Linux filesystem Command (m for help):
Writing the partition table to disk
Command (m for help): w The partition table has been altered. Syncing disks.
Verifying the current size of the root “/” partition
root@stress-vm-01 [ ~ ]# df -h . Filesystem Size Used Avail Use% Mounted on /dev/sda3 79G 1.1G 74G 2% / root@stress-vm-01 [ ~ ]#
Resizing on the fly (without unmounting)
root@stress-vm-01 [ ~ ]# resize2fs /dev/sda3 resize2fs 1.45.6 (20-Mar-2020) Filesystem at /dev/sda3 is mounted on /; on-line resizing required old_desc_blocks = 10, new_desc_blocks = 47 The filesystem on /dev/sda3 is now 98300155 (4k) blocks long.
Verifying the new partition size
root@stress-vm-01 [ ~ ]# df -h . Filesystem Size Used Avail Use% Mounted on /dev/sda3 369G 1.1G 352G 1% /
Verify the new partition ID (“PARTUUID”)
root@stress-vm-01 [ ~ ]# blkid /dev/sda2: SEC_TYPE="msdos" UUID="53EC-9755" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="0a2847cf-9e9d-4d1a-9393-490e1b2459bf" /dev/sda3: UUID="9cb30e86-d563-478d-8eeb-16f2449cb608" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="5e0b1089-595c-4f42-8d4b-4b06220cd6c7" /dev/sda1: PARTUUID="d2bf275a-1df1-4aa6-adbf-8b5f6c4cac3a"
Update /etc/fstab and /boot/grub/grub.conf
Use your favorite editor (vi / vim / nano). Look for the partition UUID and update to match the new partition ID. Note that grub.conf may have a slightly different name or location if you aren’t using Photon OS.
root@stress-vm-01 [ ~ ]# vi /etc/fstab
root@stress-vm-01 [ ~ ]# vi /boot/grub/grub.cfg