My root (“/”) partition filled up nearly to the brim recently on one of my test servers, so I decided it was time to move it elsewhere… but how?
You can’t normally just add another disk and copy files over – there’s a bit of jiggery-pokery to be done… but it’s not all that difficult. I’d recommend doing this at least once on a test system before ever needing to do it on bare a metal install…
What you will need:
- a LiveCD of your operating system
- about 20 minutes of work
- some time for copying
- A BACKUP OF YOUR DATA – in case things go horribly wrong
- a note of which partition maps to what mount point
For note, I had my partitions such initially:
/dev/sda1 : /boot /dev/sda3 : / /dev/sda5 : /home
I then added a new disk to my machine
In this walk-through, I will refer to your target PC, the one whose “/” needs moving, as “your PC” from now on. If you’re using a VM that’s the one I am referring to – you needn’t do anything in the host.
Note that in my setup, the “/boot” and “/home” directories are on their own partitions. If you don’t have this as your standard setup, I highly recommend you look at partitioning in this way now – it helps massively when doing long-term maintenance, such as this!
1/ Boot your PC from the LiveCD.
I recommend you use the same CD as from where you installed the OS initially, but probably any Linux with the same architecture will do (x86_32, AMD64, ARM, etc)
Once the Live environment is started, open a command line, and switch to root, or make sure you can use sudo.
2/ Prepare the new root
Use lsblk to identify all currently attached block devices.
I am assuming that /dev/sdb is the new disk. Adjust these instructions accordingly of course.
You want to first partition the new drive: run the command `fdisk /dev/sdb` as root
Type `o` to create a new partition table – you will be asked for details, adjust as you wish or accept the defaults
Type `n` to create a new partition. Adjust at will or accept the defaults
Type `w` to write the changes to disk.
As root, run `mkfs.ext4 /dev/sdb1`
Your new drive is ready to accept files…
3/ Copy the files
Make directories for the old and new roots, and copy the files over
mkdir newroot mkdir oldroot sudo mount /dev/sda3 oldroot sudo mount /dev/sdb1 newroot sudo rsync -av oldroot/ newroot/
Note: in the rsync command, specifically add the slashes at the end: “oldroot/ newroot/” and not “oldroot newroot” !!
Go do something worthwhile – this copy may take some time, depending on how full the partition was…
4/ Modify fstab
Run the following command to get the UUID of the new drive:
sudo blkid /dev/sdb1
Keep a copy of that UUID
Edit your fstab file
sudo vim newroot/etc/fstab
Keep a note of the old UUID
Change the UUID of the line for your old / partition to the new UUID you just got; and save.
5/ Edit the grub.cfg
Mount your old /boot partition into the *new* location
sudo mount /dev/sda1 newroot/boot
Now we edit newroot/boot/grub/grub.cfg
sudo vi newroot/boot/grub/grub.cfg
Locate instances of the old UUID and change them to the new UUID
Quick way: instead of using `vi` you could use `sed` instead
sudo sed -e 's/OLD-UUID-FROM-BEFORE/NEW-UUID-ON-NEW-DISK/g' -i newroot/boot/grub/grub.cfg
Of course, adjust the UUID strings appropriately. If you have never used sed before, read up on it. Keep a copy of the original grub.cfg file too, in case you mess it up first time round.
In the above command, the “-e” option defines a replacement pattern ‘s/ORIGINAL/REPLACEMENT/g’ (where ‘g’ means ‘globally’, or in the entire file); the “-i” option indicates that the file specified should be modified, instead of writing the changes to stdout and leaving the file unmodified. Using the “-r” option, you can also make use of Perl-style regular expressions, including capturing groups.
After making the change, reboot. Remember to start from the hard disk, remove the Live CD from the slot.
6/ Reboot, and rebuild grub.cfg
If all has gone well, you should now find your Ubuntu install rebooting fine. Open a terminal and run
See that your root is now mounted from the new disk, with the extra space!
There’s just one more thing to do – make the grub.cfg changes permanent. Run the following:
This will update the grub config file with relevant info from the new setup.
You have successfully moved your “/” partition to a new location. Enjoy the extra space!