Resizing Boot Partition for VirtualBox Machine
The VM I use for development ran out of room on the boot partition. Here is how I fixed that.
The VM actually has two drives - an 8G swap drive and then a larger 25G drive that has the following partitions:
- 1Meg BIOS Boot
- 100Meg BOOT image (ext2)
- 24+G ROOT disk (/, /home, etc) (ext4)
The 100M boot partition turned out to be too small as linux images keep getting bigger. I was having trouble during upgrades.
The plan then, is to reproduce this same configuration, but with the boot partition increased to 1G and also increasing the root partition because - well - why not?
Note that while the exact commands below are specific to the VirtualBox hosted Arch Linux environment I am upgrading, the ideas will work for anything - including changing out physical disks.
Create new disk
Make sure the VM is not running and use the storage settings to create a new
VDI storage and attach it. I chose to make the new disk 100G. Since I already
had the root/boot disk and the swap disk, this new storage wound up in slot 3.
This means it would be seen as
/dev/sdc inside the VM.
Fire up the VM’s console and use fdisk to validate that the new storage shows up.
Partition the disk
We have our raw storage, now to carve it up into separate filesystems.
parted /dev/sdc mklabel gpt mkpart 'bios boot' 0.0 1M set 1 bios_grub on mkpart 'BOOT images' 1M 1G mkpart 'ROOT' 1G -1s
After these commands, the following devices will be available.
- /dev/sdc1 - the bios boot partition
- /dev/sdc2 - the boot images
- /dev/sdc3 - the root partition.
Normally, we would now need to use
mkfs to create the filesystems on the
partitions, but instead will use
dd to copy the current data.
dd ifs=/dev/sda2 ofs=/dev/sdc2 bs=1M dd ifs=/dev/sda3 ofs=/dev/sdc3 bs=1M
Since dd copies the partition exactly - including the superblock layout,
etc., the new partitions will wind up looking the same size as the originals.
resize2fs will take care of that.
resize2fs /dev/sdc2 resize2fs /dev/sdc3
To install the bootloader, we must first let grub install its boot code in that bios boot partition and then update its config to point to the new devices.
The first part is simple
The second part will require that we actually mount our new filesystems and chroot.
mkdir /mnt/newd mount /dev/sdc3 /mnt/newd mount /dev/sdc2 /mnt/newd/boot chroot /mnt/newd
/dev/sdc3 is a copy of the current root, all our tools will be
grub-mkconfig -o /boot/grub/grub.cfg
Last steps. Shutdown the VM and head back to the storage settings. Make it so the new device is attached into slot 0 as the old one was.
Reboot - and voila! Done
If you find yourself in grub rescue mode. Here is the set of commands that will help get things going again.
set root=(hd0,gpt3) set prefix=(hd0,gpt2)/grub insmod normal normal