Cloning a computer
Cloning a computer means you have one computer and want to copy the complete harddisk to another. This can mean different things and can have different reasons.
- You want to have a backup of your computer. In this case it is enough to copy every file from hard disk A to hard disk B.
- You want to virtualize your computer. In this case you will have to dump every byte from your source (physical) to your target (virtual) computer.
- You are an administrator and want to deploy many computers with the same configuration.
You can either clone byte-by-byte or file-by-file. The advantages are:
- cloning byte-by-byte will clone the boot sector. The system will stay bootable.
- cloning byte-by-byte will even work on a file system the computer does not understand, e.g. an encrypted Windows partition.
- cloning file-by-file will allow you to deploy the system on a smaller partition
- cloning file-by-file will not clone parts of a disk that are not part of a file
- Compression keeps your backup small in file size. Plus it accelerates your backup procedure if you have a fast processor and a slow hard disk or network.
- Your /boot/grub/menu.lst will list entries for a boot menu to boot from. The root device can be stated there as /dev/sda, /dev/by-id/whatever, /dev/by-uuid/whatever, /dev/mapper/whatever or some other ways to name the disk. The way that is optimal for cloning is to use the /dev/disk/by-uuid name because this name will be cloned with the disk and be the same even if deployed on another harddisk.
- You may be using more than one partition or harddisk during normal operations. In this case you may want to clone all harddisks/partitions.
Over the network
To store a backup of one computer on the other via network, use the command:
cd / tar -cvz $(ls | grep -v proc) | ssh email@example.com "cat >slash.tar.gz"
To clone a computer over the network, say:
cd / tar -cv $(ls | grep -v proc) | ssh firstname.lastname@example.org "(cd /public/ubunturoot; tar xv )"
Afterwards you may want to change
- IP address, netmask, gateway, name server, time server, hostname
- /etc/fstab to contain generic device names like /dev/sda1 instead of /dev/disk/by-uuid/7e9e1890-312e-43eb-8ebb-82fe03b62732
- /boot/grub/menu.lst to contain generic device names
This is how you can clone the harddisk of any computer, even if it is an encrypted Windows computer. Boot the computer from Knoppix, open a console, enter
dd if=/dev/sdx | bzip2 -z | ssh email@example.com "(cat >backup-sdx.bz2)"
Be sure to replace /dev/sdx by the harddisk you want to clone and 192.168.0.5 by your target computer's IP.
Local cloning is e.g. to a USB disk to make a USB disk bootable. In this case we assume the target disk is /dev/sdx2. To clone your harddisk:
- make sure there is no DVD, CD, network drive and other things mounted
- mount the target harddisk to /mnt:
mount /dev/sdx2 /mnt
- issue the commands
cd / tar -cv $(ls | grep -v proc | grep -v sys | grep -v mnt) | ( cd /mnt; tar xv ) mkdir /mnt/proc /mnt/sys /mnt/mnt
This is how you can clone the harddisk of any computer locally (e.g. to a USB drive), even if it is an encrypted Windows computer.
- boot the computer from Knoppix
- open a console
- mount the USB disk, e.g.
mount /dev/sdz1 /mnt/usb
dd if=/dev/sdx | bzip2 -z | cat >/mnt/usb/backup-sdx.bz2
Be sure to replace /dev/sdx by the harddisk you want to clone.
Post cloning steps
- If you are cloning one harddisk to another byte-by-byte to boot from the other harddisk, make sure the harddisk's ID (/dev/disk/by-id) is not in /boot/grub/menu.lst. Rather, the harddisk's UUID should be there because this will be cloned with the other data.
- change hostname
- change IP address
- under some distributions, e.g. SUSE you have to re-configure networking. The IP address will be bound to an unknown network device.
- change /etc/hosts so the computer can ping itself
- consider changing the ssh keys ~/.ssh/id_*sa*
Your computer does not boot
If you have cloned a harddisk byte-by-byte and now booting from it does not work, check the device name you are booting from in /boot/grub/menu.lst. The device ID of your harddisk will change, but the UUID will come with the image. So make sure you boot from the device under /dev/disk/by-uuid.