Migrate from a HDD to a SSD hard disk

# hardware connect
I plugged my new SDD (256G) through a USB-SATA adapter to my running Unbuntu system.
After that, I checked if the system recognizes the new hardware:

	$ dmesg | grep sd[a-z]	# assuming SATA

In my case it was the third SATA device "sdc"

# partitioning and file system creation
The next steps can be done manually with fdisk and mkfs, but if you have gparted installed I recommend to use it:

	$ sudo gparted /dev/sdc		# replace "sdc" with your recognized hardware

My old running Ubuntu system has a dedicated /boot partition - I decided against this in my new environment.
I create one big root partition (labeled as SSD) and a 4G swap partition within gparted.
The recommended root filesystem for SSD devices in Linux is ext4 (Nov 2013), because of its implemented ATA Trim features.
You can check your SSD for ATA Trim support with hdparm:

	$ sudo hdparm -I /dev/sdc | grep TRIM
           *    Data Set Management TRIM supported (limit 16 blocks)
           *    Deterministic read ZEROs after TRIM

Finally my SSD device partition table looks this:	

	$ sudo fdisk -l /dev/sdc
	Disk /dev/sdc: 256.1 GB, 256060514304 bytes [...]
	Gerät    boot.     Anfang        Ende      Blöcke   Id  System
	/dev/sdc1            2048   491728895   245863424   83  Linux
	/dev/sdc2       491728896   500117503     4194304   82  Linux Swap / Solaris

# mounting the SSD

	$ sudo mkdir /mnt/ssd
	$ sudo mount /dev/sdc1 /mnt/ssd/

# initial sync
Before an initial sync, I recommend to do some cleanup work. 
This may include deleting unneccessary files, folders, test-, temp- or cache files.
In my case, I had to remove some "bind" mounts from other file systems.

rsync is the tool of my choice to sync data from a running linux system to the SSD.
It is important to exclude some system folders. 
I do rsync with the "-a" (archive mode) and the "-P" (--partial --progress) option, 
my running root as source and /mnt/ssd/ as destination:

	$ rsync --exclude="mnt" --exclude="lost+found" --exclude="sys" --exclude="proc" --exclude="cdrom" -aP / /mnt/ssd/

This can take a while, depending on HDD size and performance.
I transfered approximatly 20GB.

	# create system directories
	$ mkdir /mnt/ssd/{mnt,proc,sys}

After this, I did a break and continued one or two days later.

As I plugged in my SSD, Ubuntu OS recognized and mounted the file system automatically.
Attention: Ubuntu's default mount directory is /media, so I had to exclude it in my next last sync too:

	# final sync
	$ rsync --exclude="mnt" --exclude="media" --exclude="lost+found" --exclude="sys" --exclude="proc" --exclude="cdrom" -aP / /media/SSD/

# prepare /etc/fstab
You can build your new /etc/fstab file with /dev/sdX entries or you can use universally unique identifiers (UUIDs).
I decided to use UUIDs - a more robust way to name devices, that works even if disks are added and removed. See fstab(5). 
To get your new UUIDs from your SSD, you can do the following:

	$ sudo blkid /dev/sdc1		# for root partition
	$ sudo blkid /dev/sdc2		# for swap

It is recommended to modify the mount options for SSDs.
To enable TRIM you have to set the "discard" option.
It is also recommended to disable read-logging by appand the options "noatime" and "nodiratime".

My /etc/fstab looks like this:

	$ head /etc/fstab
	# file system		mount point	type  	options						dump	pass
	proc			/proc           proc    nodev,noexec,nosuid				0       0
	UUID=5d8[...]abe	/               ext4    discard,noatime,nodiratime,errors=remount-ro	0       1
	UUID=a01[...]4cc	none            swap    sw						0       0
In a next step, some system directores have to be mounted:

	$ sudo mount -o bind /dev	/media/SSD/dev 
	$ sudo mount -o bind /sys 	/media/SSD/sys 
	$ sudo mount -t proc /proc	/media/SSD/proc 

Because we want to install Grub on the SSD, we have to provide an up-to-date /etc/mtab file:

	$ sudo cp /proc/mounts /media/SSD/etc/mtab 

The next step is very usual for gentoo linux user, because they need it for installing a gentoo base system -
also Unix/Linux veterans will know about it. Modern Ubuntu users are likely not very familiar with this process.
Enter the new system on the SSD by doing a change root command:

	$ sudo chroot /media/SSD /bin/bash 

Now Grub should be installed on the SSD:

	$ grub-install /dev/sdc
	$ grub-install --recheck /dev/sdc		# only in case of errors in the step before

	$ update-grub 

It's done! With Ctrl-D the chroot environment can be left now.

Finally stop your system, install your SSD in your computer and modify your BIOS (change boot order) to boot from your SSD.

Voila! Now, open a beer and enjoy your new system!!

by Markus Sesser