The S.M.A.R.T. monitor has been warning about imminent failure of the hard drive in my mother's laptop, so it was time to exchange it. Since it is running Ubuntu Linux (version 9.10, Karmic Koala), I was looking for ways to create an image of the old hard disk and transfer it to the new hard disk.
My initial googling didn't immediately yield definite results, even though I found some comments mentioning "dd". Therefore I wanted to quickly summarize the steps I have taken in case anybody else looks for something similar.
While I found forum threads recommending a variety of tools, they were usually several years old. Therefore I wasn't sure if the recommended tools are still state of the art. Also I preferred a disk image over using the recovery mechanisms of the backup software (sbackup or rsync), as I wasn't 100% sure if permissions and everything would work out OK on a fresh install of Ubuntu (probably, but a disk image just seemed cleaner).
Then I found this blog article about copying a disk with dd and decided to stick with it. Other than in that article, since I didn't have a way to connect the new hd without installing it in the notebook, I first copied the image to another external hd. Then I exchanged the internal disk and copied the image back onto the new internal disk.
To do the copying, first boot the notebook from the Ubuntu CD ("Ubuntu LiveCD"), to run Ubuntu from the CD and not from the internal hd. That way, the conents of the hd don't change during the copy process. Booted into Ubuntu LiveCD, I quickly changed the keyboard layout in the settings -> keyboard menu (it defaults to US layout, but I have German). Then I mounted the external USB disk by selecting it in "Places" (or clicking on it in Nautilus, the Ubuntu file explorer).
Then open a shell, and create an image of the internal hd by executing
sudo dd if=/dev/sda of=/media/name_of_external_disk/image_name
The sudo might be optional, in my case I needed it because the external hd was only writable for root. If the external hd doesn't have a name yet, you can assign one with GParted or Disk Utility (I forgot which).
This might take a while, depending on the size of the internal hd. The resulting image will be as big as the capacity of the internal hd. dd will copy the whole hd, no matter how much of it is used or not. Also dd does not give any progress reports, so just be patient.
As the article I linked to mentioned, it might be a good idea to check with
sudo fdisk -l /dev/sda that /dev/sda is the right hd (I recognized it because of the size).
Now, power down and exchange the internal hd, then boot up with the Ubuntu LiveCD again. Again, change the keyboard layout (if necessary) and mount the external hd. (I actually rebooted once because at the first time there was a hickup mounting the external hd. After the reboot it worked).
Then write the disk image back using
sudo dd if=/media/name_of_external_disk/image_name of=/dev/sda
(again, checking that sda is the right target with fdisk might be good).
If the new disk is the same size as the old one, that's it. Otherwise, the partitions on the hd can be resized with GParted to make them use the whole disk. GParted can be started from the Ubuntu Administration Menu.
I had only one problem: the hd had a "normal" partition containting the main file system, followed by an extended partition that contained the swap partition. Somehow I couldn't move the extended partition or the swap partition, and therefore I could not resize the main partition either. Eventually I figured that I should first resize the extended partition to fill all the remaining space. Then I could move the swap partition (which is inside the extended partition) to the end of the available space. That done I resized the external partition again to only be as big as the swap partition. After that I could finally resize the main partition to use all the remaining space (OK, except for 8MB that were left over because of alignment with the hd's "Cylinders", not sure if that was necessary or not). Before resizing/moving the swap partition it might be necessary to select "swapoff" for that partition on gparted, if the Ubuntu Live system has decided to use that swap space.
That's it - again a scarily long text to describe a simple procedure.
A downside might be that it copies the whole disk, not just the used parts. Also there has to be enough space left on the external disk. Not sure if copying less could be achieved with some dd magic. I am pretty sure one could just copy individual partitions with dd, but not sure how to copy the disks partition table, master boot record and what not then.