This tutorial describes migration instruction of Linux machines from anywhere to anywhere. In the example bellow I'm migrating an on-premise VM to AWS EC2. It was shown to me by my friend Sergiu Badan.
1. Check the source operating system distribution and architecture.
Launch an AMI in EC2 of the same distribution and architecture.
Install rsync and screen on both source and destination. We will need screen
because the commands take very long time to execute. You down't want your connection to drop in the middle of the migration.
$ yum -y install rsync screen
2. Check disk requirements
If the source distribution has a total disk size of more than the EC2 AMI storage, you'll need to create EBS drives on the EC2 machine.
Example:
The source system has the following disk space distribution:
/home - 39 GB
/usr - 16
/var - 11
/opt - 430
rest - 5
If the destination has a root partition of 8 GB, you will have to append EBS volumes for /home
(40), /usr
(20), /var
(15), /opt
(440). Format the partitions. See example below, for /home
partition which will be on device /dev/xvdh
on the EC2 in AWS.
Do this for all devices:
$ fdisk -l #(see how they are labeled, like /dev/xvdh or /dev/sdh, or whatever).
mkfs.ext4 /dev/xvdh #(put the proper device name here)
# mount to temporary location
$ mount /dev/xvdh /media
# sync all files from mountpoint to the new device
$ rsync -avz /home/ /media/
# edit /etc/fstab and put the new device name and the mount point:
$ cat /etc/mtab | grep xvdh #or whatever the device is
# append the line to /etc/fstab, but replace /media to the mountpoint. Eg:
/dev/xvdh /home ext4 defaults 0 0
# remount the partition:
$ mount -o remount,rw /home
3. Create keypairs on the source system
Copy the public keys to both source and destination /root/.ssh/authorized_keys.
# on the source:
$ ssh-keygen -t rsa # answer the defaults, put no password.
$ cat /root/.ssh/id_rsa.pub
# append the content to /root/.ssh/authorized_keys on both source and destination server.
# Copy company public key (through which you access the destination server) also to both source and destination in /root/.ssh/authorized_keys.
4. Create a list of files to exclude, on source in /excluded_files
$ vi /excluded_files
# add the following lines
/etc/fstab
/etc/mtab
/etc/sysconfig/network-scripts
/proc
/boot
/sys
/dev
/etc/resolv.conf
/etc/hosts
/etc/conf.d/net
/etc/network/interfaces
/lib/modules
/etc/sysconfig/network
/etc/nsswitch.conf
/etc/lvm
/var/run
5. Execute the first sync
On the source system:
$ screen -R rsync
$ ssh root@$destination_ip_address # answer yes to trust the destination key
$ exit # exit from the remote computer
# rsync <options> <excluded files> <source> <destination>
# Copy everything from SOURCE:/ to DESTINATION:/ exclude the excluded_files
# The --delete option will delete any files in the destination directory if
# they don't exist in the source directory.
$ rsync -avz --progress --delete --exclude-from=/excluded_files / root@$destination_ip_address:/
# to exit the screen press ctrl + a d
# to enter the screen again, type screen -x
6. After first sync finishes, do the second sync
$ screen -x rsync
$ cat /dev/null >/root/.ssh/known_hosts # wipe the known_hosts file, as on the destination the key has changed
$ ssh root@$destination_ip_address # answer yes to trust the destination key
$ exit # exit from the remote server
# stop all important services on the source, like mysql, oracle, apache, nginx, sendmail, postfix, after which do the second rsync:
$ rsync -avz --progress --delete --exclude-from=/excluded_files / root@$destination_ip_address:/
7. Finalise
After the rsync finishes, reboot the remote server, and check that it starts successfully. If there are problems, troubleshoot (check startup logs from EC2 console, eventually umount the /var partition and mount it to other server to check the logs).