Cloning a UEFI/GPT Windows 10 installation from HDD to SSD using SystemRescueCD
So, I had an interesting problem at hand – to transfer a completely working Windows 10 installation from a 1 TB HDD to a 1 TB NVME SSD (Samsung 970 EVO Plus). As someone who has done something of that sort many times, but with Linux based OSes my first thought was if I could do some sort of stuff with a SystemRescueCD running from a USB pen drive – as I wasn’t willing to use any Windows based backup solution since I had no idea how they work, or whether they work at all. To those who don’t know, SystemRescueCD is a kind of Swiss knife Linux distribution you can use to do all kinds of disk and OS recovery tasks. You usually don’t need to install any extra packages, etc.
If you are following this post, read it completely before attempting anything. This is not a step-by-step guide. Also you may need to adjust the commands to suit your system to select the correct drive and/or partition when copying partitions.
So the first try was using a block to block copy, using ddrescue. But copying 1 TB from a HDD which reads at max 100 MB/s to a SSD which can write at almost 1500 MB/s is surely an extremely slow job. That too when the total data in the HDD is around 200 GB combined – OS (C drive) and Data (D drive).
ddrescue was showing estimated time as 17 hours!!!
Then I started looking for NTFS cloning tools – turns out ntfs-3g has a utility called ntfsclone which does exactly that – it copies just the data, not complete blocks. That’s exactly what I needed. But before doing ntfsclone it is necessary to have a duplicate partition table of the HDD on the SSD. Since this is was a GPT/UEFI based installation, I used sgdisk to do this:
sgdisk -R /dev/nvme0n1 /dev/sda
This will copy the partition table from
/dev/nvme0n1 without changing the GPT UUID. It is possible to generate a new GPT UUID using
sgdisk but that might break something in the boot process when booting from SSD, so I decided not to that. This also means that the HDD must be disabled from BIOS/UEFI settings before booting from SSD, otherwise the operating system (Windows) and BIOS itself will see two disks with exactly same GPT UUID, possibly leading to errors.
Now that the partition table has been cloned, it’s time to copy the data using
ddrescue. There were 5 partitions on the HDD, as seen in
fdisk -l /dev/sda:
/dev/sda2– EFI System Partition
/dev/sda3– Some other Recovery
/dev/sda4– C drive (NTFS)
/dev/sda5– D drive (NTFS)
ddrescue to copy the partitions
ddrescue -v -f /dev/sda1 /dev/nvme0n1p1 ddrescue -v -f /dev/sda2 /dev/nvme0n1p2 ddrescue -v -f /dev/sda3 /dev/nvme0n1p3
Then to copy the NTFS partitions:
ntfsclone -O /dev/nvme0n1p4 /dev/sda4 ntfsclone -O /dev/nvme0n1p5 /dev/sda5
Note: it may be necessary to you turn off fast startup option in Windows 10 power options before rebooting into SystemRescueCD – because ntfs-3g often complains about that, I did that before doing it. I have no idea if this process would have been successful with that option enabled.
Now reboot to UEFI/BIOS and disable the HDD, then reboot. Now there are two possibilities that will happen: either you will be able to boot into your Windows 10 installation from SSD, or it will give you a BSOD with an error code
0xc00000e. If you get the error code, you need a Windows 10 recovery disk or the installation media to fix this. I did not know this beforehand but I had my Windows machine, using which I prepared a Windows recovery disk.
Boot using the Windows 10 recovery disk or installation media and head to the command prompt. In the command prompt:
DISKPART LIST DISK LIST PARTITION
Note the disk which is your SSD – usually it is disk number 0.
SELECT DISK 0 SELECT PARTITION 2 ASSIGN LETTER=M EXIT
Note – in the above commands, you have to assign the drive letter
M to the EFI system partition. In my case it was the second partition, so I did
SELECT VOLUME 2. Then format the EFI system partition using FAT32:
FORMAT M: /FS:FAT32
BCDBOOT C:WINDOWS /s M: /f UEFI
That’s it, now reboot the system and you should be able to boot into Windows from the SSD. Optionally, if you are going to retain the HDD (because why not, extra storage is always good), enable to HDD and boot to SystemRescueCD once again and clear the partition tables using
sgdisk -Z /dev/sda
Reboot into Windows 10 then you can partition the HDD using Disk Management to your heart’s content.