I want to copy Windows from an old 150GB 7200RPM hard drive to a new 1TB solid
state drive (the rad Samsung EVO 850).
I keep the old drive in the computer, for now.
I boot into a Linux Live USB flash drive.
I connect the new drive to the computer's fastest USB port (a USB 2.0 port) with a SATA-to-USB cable.
Checking dmesg | tail
tells me that the new drive is called sdc
.
Checking df -h
tells me that Linux is running on /dev/sdb
.
Windows, therefore, is on /dev/sda
.
You'll want to check all of the above carefully. Moving stuff to the wrong
places will DESTROY EVERYTHING.
Note that in the following I don't worry too much about differing sector sizes.
That's because it didn't really occur to me until later. Nonetheless, everything
worked. Perhaps a positive indication that things'll be okay is if the amount of
space allocated to each partition is the same on both the old and new drives.
Running:
shows me my old partition table:
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 2459647 2457600 1.2G 7 HPFS/NTFS/exFAT
/dev/sda2 2459648 292098039 289638392 138.1G 7 HPFS/NTFS/exFAT
/dev/sda3 292098048 312578047 20480000 9.8G 7 HPFS/NTFS/exFAT
I save the partition table:
sudo sfdisk -d /dev/sda > part_table
And copy it to the new drive:
sudo sfdisk /dev/sdc < part_table
Let's talk about what these partitions are for a moment:
Device Size Purpose
/dev/sdc1 1.2G Boots Windows up, contains other low-level stuff
/dev/sdc2 138.1G Windows installation, all user files, all programs
/dev/sdc3 9.8G Recovery partition with a back-up of Windows
So we're going to want to enlarge /dev/sdc2
. In order to do so, we'll need to
move /dev/sdc3
closer to the end of the drive.
Run:
Delete partition 3:
Make a new partition:
Make it a primary partition:
Make it partition number 3:
This shows the following output:
First sector (292098040-1953525167, default 292098048):
The number 1953525167
here is the last sector. Note, above, that the partition
is 20480000
sectors large.
One place you might think we should put things would be at
1953525167-20480000
. However, this will raise a warning saying:
Partition 3 does not start on physical sector boundary.
To remedy this, we'll ensure that the start of the sector is a multiple of 512
and place it at (1953525167-20480000)-(1953525167-20480000)%512
(you may need
to choose a value other than 512 depending on your specific situation):
We need 20480000
sectors, so put the end sector at:
Here's my new partition table
Device Boot Start End Sectors Size Id Type
/dev/sdc1 * 2048 2459647 2457600 1.2G 7 HPFS/NTFS/exFAT
/dev/sdc2 2459648 292098039 289638392 138.1G 7 HPFS/NTFS/exFAT
/dev/sdc3 1933044736 1953524735 20480000 9.8G 7 HPFS/NTFS/exFAT
Note that each partition has the same number of sectors, the same type, and the
same bootable properties as before. Additionally, partitions 1 and 2 are in the
same locations. Partition 3 has been moved to the end of the drive.
Now, copy the partitions, one at at a time. Save the big one for last so you can
go take a coffee break:
sudo dd if=/dev/sda1 of=/dev/sdc1 conv=notrunc status=progress bs=15M
sudo dd if=/dev/sda3 of=/dev/sdc3 conv=notrunc status=progress bs=15M
sudo dd if=/dev/sda2 of=/dev/sdc2 conv=notrunc status=progress bs=15M
If you were to restart the computer now and boot into the new hard drive, you
would seek a black screen with a blinking cursor in the upper left-hand corner.
This probably means that the Master Boot Record (MBR) is not present. And,
indeed, we have not created it. Let us do so now.
We'll need ms-sys
to do this. Install it like so:
sudo add-apt-repository ppa:lenski/ms-sys
sudo apt-get update
You can also download it and build from
source.
Now, create the Windows 7 MBR:
At this point, I shut down the computer, swapped the new hard drive into the
case, and booted. Everything was fine and beautiful.
But there's one more step!
You'll need to extend the main windows partition, like
so. The extension should complete immediately and now you have a
faster, larger hard drive to play with.