Moving Ubuntu to a Bigger Disk


Moving to a Bigger Disk

As time moves on and storage becomes bigger and cheaper it's quite common to want to replace the disks in your MythTV box. There are a few options. You can add more disks, but this is restricted by the number of SATA connectors on your motherboard. You can replace your disk and reinstall, but if you have a working installation, why go to the trouble? The option I chose recently was to take a system with one 80GB disk (OS) and one 1.5TB disk (recordings) and replace the 80GB disk with a new 2TB one. That involved copying the smaller disk onto the new one and creating a new partition on the remaining space.

The procedure detailed here will obviously work on any Linux box. It has nothing specifically to do with MythTV.

Procedure Overview

The basic procedure involves installing the old and new disks into the chassis, booting from an Ubuntu Live CD and copying the raw data across. We will use the ddrescue utility to do this. This will copy the entire disk, regardless of how much of it is used. Once this is done, the new disk should boot up as an exact replacement of the old one. We will then create a new partition on the remaining free space. I ended up with a new OS disk with a 72MB partition and a 1.8TB partition, plus the old 1.5TB storage disk.

Procedure - Cloning an Ubuntu Install Onto a Bigger Disk

Boot From a Live CD

It's not a good idea to clone a partition which is in use, so we will boot from a Live CD. This will give us a fully working Ubuntu system with access to all disks in the PC.

Download an Ubuntu Live CD image and burn it. You can also use a USB image if you don't have have a CD drive.

Power down your PC and remove all drives apart from the old OS disk (what we will call the source disk). Install the new empty disk (which we will call the target), then boot from the CD.

Identity Which Disks are Present

This is VERY IMPORTANT! We must identify the device numbers of the source and targets disks. Running the following command will give us this information:

sudo fdisk -l | grep Disk
Disk /dev/sda: 80.4 GB
Disk /dev/sdb: 2000.4 GB

As you can see above, the small 80GB source drive in my system is /dev/sda and the target 2TB drive is /dev/sdb. The rest of the commands in these instructions will use these device names. Make sure you change these if your system is different!

If you are still unsure, the following command will give you some more information on the drives present:

sudo lshw -C disk

Write Empty Partition Table onto the New Disk

Now we will create an empty partition table on the new disk:

sudo cfdisk -z /dev/sdb
W (write empty partition table)

Install ddrescue

It is possible to do the disk copy using the simple dd utility. However, it does no error checking. The ddrescue utility is much better for this activity as it will not copy any bad sectors to the new disk. It also gives a better indication of what's going on. We will need to install ddrescue on the temporary Live CD version of Ubuntu we are running. Ubuntu makes this very easy.

First, enable the universe repositiory by uncommenting the entries in /etc/apt/sources.list

sudo nano /etc/apt/sources.lst

Remove the hash from the start of each line containing the word universe, eg:

deb http://archive.ubuntu.com/ubuntu maverick universe
deb-src http://archive.ubuntu.com/ubuntu maverick universe
deb http://archive.ubuntu.com/ubuntu maverick-updates universe
deb-src http://archive.ubuntu.com/ubuntu maverick-updates universe
deb http://security.ubuntu.com/ubuntu maverick-security universe
deb-src http://security.ubuntu.com/ubuntu maverick-security universe

Update the repository index and install the package:

sudo apt-get update
sudo apt-get install ddrescue

Clone the Disk

Here we will use ddrescue to make an exact copy of the first disk on the second. Again, make sure your device names are correct (see above). An 80GB disk takes about an hour to copy.

sudo ddrescue -v /dev/sda /dev/sdb

Test the New Disk

Once ddrescue has done its stuff, the new disk should work exactly like the old one. Shut down the system and remove the boot CD. I recommend taking the original drive out and trying to boot from the new one. Hopefully, your Linux install should function exactly as it did before, except you now have plenty unused space ready for a new partition and filesystem.

Create Additional Partition

Now we will use the cfdisk utility to create an ext4 partition on the free space of the new drive (which is now /dev/sda):

sudo cfdisk /dev/sda

Once that is done, you will need to create a filesystem on the new partition and mount it before it can be used. We first use fdisk again to get the partition number.

sudo fdisk -l

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        9541    76638051   83  Linux
/dev/sda2            9542        9729     1510110    5  Extended
/dev/sda3            9730      243201  1875363840   83  Linux
/dev/sda5            9542        9729     1510078+  82  Linux swap / Solaris

On my system, it's the big /deb/sda3 partition.

You may now create a Linux ext4 filesystem (again, make sure you change the device name to match your system!):

sudo /sbin/mke2fs -t ext4 /dev/sda3

Get UUID of new partition

OK, we're nearly there. The last step is to set the system up to mount the disk every time it boots. Ubuntu no longer uses device names for this, is uses the unique ID of the partition. This is so that the system still works as intended if the device names change for any reason. Run the following to get the UUID of the disks on your system:

ls /dev/disk/by-uuid -alh
lrwxrwxrwx 1 root root  10 2011-05-05 22:28 3317c035-c5f9-4f92-95ef-6d0afe8cb59f -> ../../sdb2
lrwxrwxrwx 1 root root  10 2011-05-09 07:15 73b51bb7-c8c3-438f-99f2-05c7ff3471b0 -> ../../sda3
lrwxrwxrwx 1 root root  10 2011-05-05 22:28 ad739750-08bc-46f4-8cdf-12d7bbb0798d -> ../../sda1
lrwxrwxrwx 1 root root  10 2011-05-05 22:28 b6dae2c7-49f3-441f-8123-64a4603ae379 -> ../../sda5
lrwxrwxrwx 1 root root  10 2011-05-05 22:28 fff90199-0b52-47d2-97c8-0bf85577c3cc -> ../../sdb1

/dev/sda3 on my system has UUID 73b51bb7-c8c3-438f-99f2-05c7ff3471b0

Create a directory as the mount point for the partiton. I will be using /mnt/store2

sudo mkdir /mnt/store2

Edit the /etc/fstab file:

sudo nano /etc/fstab

Add the following line (replace the UUID of the partition and the mount directory with the ones for your system, see above):

UUID=73b51bb7-c8c3-438f-99f2-05c7ff3471b0 /mnt/store2 ext4 defaults,errors=remount-ro,relatime 0 1

To test it, either reboot or run the command:

sudo mount /mnt/store2

Conclusion

That's it. It's a fairly simple procedure once you've got your head around Linux disk device naming and UUIDs etc. Good luck and, most of all, be careful! If all goes well you should have bags more space to waste on recordings and films you'll never watch ;-)

Comments, Questions and Feedback

You can post comments about this page on my blog:

Alternatively, feel free to drop an email to Garry if you have any comments, suggestions or just want to chat. Cheers.