Wednesday, February 15, 2012

Swapping your linux boot drive

My main home server's drive had been giving me SMART errors for a while.
It's a Samsung 1TB disk that I've been using for a couple of year, so it was time to change it

This server runs my MythTV backend, and various services that I've talked about here (most important being my energy monitor: http://htpc.avenard.org/power). It is powered by Linux Ubuntu 10.04 LTS

So after considering the issue, I decided to replace it with an Intel 520 60GB SSD drive.

Changing your hard drive is usually not a too complex task, you plug the new hard drive in, copy the file across with your tool of choice, re-install the GRUB boot loader, disconnect the old drive, put the new one instead. Reboot

Unfortunately here, my PC has *only* 8 SATA ports, 1 for the boot disk, and 6 used for the RAID5 array (made of 6, 2TB disks), and one use for the Bluray optical disk.

So where am I going to connect my new SSD drive. I could use a USB caddy, but that would be slow as.

I had a spare PC, so I connected the disk on the spare PC.

Using gparted I created a GPT partition format (my PC BIOS is an EFI one).
I created a partition taking the whole disk, aligned to 1MB start.
This was a mistage, as I found out later, as to install GRUB boot loader on the disk, you need space at the beginning of the disk.

So if using GPT, create a partition at least 1MB in size, that you mark in GRUB as boot_grub, and another ext4 (or ext3 your choice) partition taking the remaining space (also aligned to 1MB)

I then mounted the new ext4 partition on /ssd as follow:

sudo mkdir /ssd
sudo mount /dev/sdd1 /ssd


/dev/ssd1 is the device for the big partition I created above, you can see what device to use in gparted.

I used rsync to copy all the files from my boot disk on the server into the new disk
the copy the file across
sudo rsync --archive --stats --numeric-ids --delete-during --partial --inplace --hard-links --compress --exclude-from=exclude.default.linux --rsh="/usr/bin/ssh -i /home/jyavenard/.ssh/id_rsa" --log-file=sync.log root@htpc:/ /ssd/


/home/jyavenard/.ssh/id_rsa is the path to my RSA private key that I use to login into my server: htpc
Make sure that root login is allowed on the server you want to clone, so is defined in /etc/ssh/sshd_config and add or uncomment the line:
PermitRootLogin yes

the file exclude.default.linux contains the list of all the directories and file I do not want to copy (mainly temporary files, cache, and /data which is where the RAID array is mounted)

The content of the file is as follow:

/sys/*
/proc/*
*mozilla/firefox/*/Cache/**
/var/lib/vservers/vs1/home/*
*/.googleearth/Cache/**
*/.googleearth/Cache/temp/**
/var/spool/squid/**
/backup/*
/var/spool/cups/**
/var/log/**.gz
*/cache/apt/archives/**
/var/lib/vservers/vs1/var/tmp/**
/home/programs/tmp/**
/home/programs/vmware/**
/home/**/.thumbnails/**
/home/**/.java*/deployment/cache/**
/home/**/profile/**
/home/**/.local/Trash/**
/home/**/.macromedia/**
/export/*
**.core
/usr/ports/**
/dev/**
/usr/compat/linux/proc/**
/pool/**
/data/**
/.amd_mnt/*
/.Spotlight-V100/**
/Network/Servers/**
/export/shares/**


Note that at no time during rsync was htpc offline. It was still doing his duty in the mean time.

Once rsync had finished, I rebooted htpc in single user mode and started networking.

I re-ran the rsync on the remote PC once again, so make sure I had all the latest changes.

Once it was completed, I unmounted the SSD from the remote PC, disconnected it and then shut down the server.
Removed the boot disk, and installed the new SSD.

Now as it is, this new setup will not boot. There aren't any bootloader installed.
I had a copy of the MythBunutu LiveCD handy, so I booted htpc with it.

To install the bootloader, I needed grub2 as my disk is using GPT.
So I mounted the SSD with:
sudo mount /dev/sda1 /mnt
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/dev

The commands above make sure the device directory and proc can be seen on the mnt mount point.
/dev/sda1 is the device for the new partition


chroot /mnt
grub-install /dev/sda
grub-mkconfig --output=/boot/grub/grub.cfg
That last line is important as your existing grub.cfg from the previous disk wouldn't work. Most Linux distribution use the disk UUID to identify a partition. That UUID is invalid on the new disk.

Before I could update, I had to make sure /etc/fstab was correct ; you should normally only have to edit the line where it mount the / root directory
For me I changed it from:
/dev/sda1 / ext3 rw,relatime,errors=remount-ro 0 0
to
/dev/disk/by-uuid/d62feed7-8003-4be7-9eae-8a24a83beb6f / ext4 rw,relatime,errors=remount-ro,barrier=1,data=ordered 0 0


To find out what the line should be, look into:
/proc/mount
and check where / is mounted.

Now we're all done and you can enjoy your new faster disk

If you had a spare SATA port on the PC you want to clone, a very similar approach could have been taken, it would only have been much faster.
You would have mounted the disk to /ssd using the same command as before; add /ssd/** to the exclude.default.linux file and run the command:

sudo rsync --archive --stats --numeric-ids --delete-during --partial --inplace --hard-links --exclude-from=exclude.default.linux / /ssd/
You could also install grub without using the LiveCD too.

Copying a disk with rsync is the fastest way of doing it, it only copies what needs to be copied, it can be interrupted and resumed at any time.