81

I am doing a dd on two identical drives with this command:

 dd if=/dev/sda of=/dev/sdb bs=4096

Both hard drives are the exact same model number, and both have 1TB of storage space. /dev/sda uses a blocksize of 4096. /dev/sda is a local drive and /dev/sdb is a remote caddy. I might be able to use the following protocols:

  • USB2.0 HighSpeed (Currently the plan)
  • Gigabit Over-The-Network clone (Really do not want to even try this)
  • USB3.0 (If I find my other drive caddy)
  • eSATA (If I find/buy a cable)
  • SATA (If I find/buy a cable, gotta love laptop CD drives)

Is there a way to run this drive copy that takes less that 96 hours? I am open to using tools other than dd.

I need to clone the following partitions (including UUIDs)

  • Fat32 EFI Partition (*)
  • NTFS Windows Partition (*)
  • HFS+ OSX Partition
  • EXT4 Ubuntu Partition (*)
  • Swap Partition (*)

* Supported by Clonezilla


I have tried Clonezilla (and it was MUCH faster), but it does not support HFS+ smart copying, which I need. Maybe the newest version supports this?

When I made my first clone, I did all of the partitions except HFS+ and it went very quickly. (No more than 3 hours total)

Kaz Wolfe
  • 34,122
  • 21
  • 114
  • 172
  • 1
    You are probably better off using something like clonezilla. dd copies everything, including free space. The disadvantages become extremely apparent when you have large disks that aren't completely full. – Boris the Spider Sep 12 '14 at 07:06
  • 1
    Is buying a SATA cable and temporarily attaching the external drive to a SATA port on the motherboard possible? – Mark Plotnick Sep 12 '14 at 07:42
  • Perhaps someone could elaborate on the following: How about cloning the partition table (using either clonezilla or dd), using Clonezilla to clone all partitions except the HFS+, and use dd for that one partition? Would this be feasible? – Alexander Sep 12 '14 at 10:29
  • @Alexander That's how I made my first clone. – Kaz Wolfe Sep 12 '14 at 17:23
  • 1
    @MarkPlotnick It's a laptop. – Kaz Wolfe Sep 12 '14 at 17:23
  • You could try cp --sparse=always to copy the raw HFS+ partition, assuming the partition you're copying it to has absolutely nothing on it already. – Mark Plotnick Sep 13 '14 at 23:24
  • Finishing some tests that I am sure you will find very informative. Give me time to post it as an answer. – Luis Alvarado Sep 15 '14 at 21:55
  • 1
    @LuisAlvarado I just started the clone, man! – Kaz Wolfe Sep 16 '14 at 00:56
  • The bs option is independent of the physical blocksize of the disk, but controls the amount of data read/written at a time. Try a much larger clock size. – Charles Green Oct 07 '14 at 12:24
  • The SATA cable suggestion can work on a laptop. Google for an external SATA docking station and a male-female SATA extension cable. – Ray Woodcock Aug 20 '21 at 20:10

11 Answers11

99

In my experience, I don't think there is something faster in the command line as dd. Adjusting the bs parameter can increase the speed, for example, I have 2 HDD that I know have a read/write speed greater than 100 MB/s so I do this:

dd if=/dev/sda of=/dev/sdb bs=100M

There is also pv (Needs to be installed first) that checks for the fastest speed on both drives and then proceeds on cloning. This has to be done of course from root:

pv < /dev/sda > /dev/sdb

With PV I got 156 MB/s

The nice thing about pv apart from the speed is that it shows the progress, current speed, time since it began and ETA. In regards to HFS+ I would not know, am just trying to help on the "speed" part. With pv or a very optimized bs parameter, you can do a 4 TB drive in less than 7 Hours (6 Hours 50 Minutes at a current speed of 150 MB/s).

enter image description here

I did a couple of tests with the connection types you were using and others I had available. I was using the Asus Z87 Pro and the Intel DZ68DP. This were my results, but first we need to know that the theoretical speeds for many transfer rates (Raw speeds) are just that, theory. Doing real tests revealed they are between 40% to 80% of that raw speed. This tests can change depending on Device used, connection type, motherboard, type of connecting cable, filesystem type and more. With that in mind, this is what I got (I only tested Write speed to the Device, read is typically higher):

Connected Device  -  Connection Type  -  Speed (Write Speed)
  USB 2.0                 USB 2.0              25 MB/s
  USB 3.0                 USB 2.0              35 MB/s
  USB 3.0                 USB 3.0              73 MB/s
  eSata                   eSata                80 MB/s
  Sata 2G HDD             Sata 2G              120 MB/s
  Sata 3G HDD             Sata 2G              140 MB/s
  Sata 3G HDD             Sata 3G              190 MB/s
  Sata 2G SDD             Sata 2G              170 MB/s
  Sata 3G SDD             Sata 2G              210 MB/s
  Sata 3G SDD             Sata 3G              550 MB/s 
Luis Alvarado
  • 211,503
  • 5
    send USR1 signal, to get dd's progress. The disadvantage of dd is that it copies free space. – jfs Sep 12 '14 at 04:03
  • That's 152MB/sec. – Kaz Wolfe Sep 12 '14 at 05:06
  • 1
    In my experience, adjusting the bs parameter can make dd as fast as cat. You might as well use cat in the first place. – Gilles 'SO- stop being evil' Sep 12 '14 at 12:47
  • Hmm. I like the look of this. I'll either use a combination of Clonezilla/pv or just pv alone. – Kaz Wolfe Sep 15 '14 at 17:36
  • 4
    pv by itself works very very well. – Kaz Wolfe Sep 16 '14 at 04:24
  • 13
    You can use dd to do the work but insert pv in the chain to monitor transfer rate like this: dd if=/dev/sda1 | pv | dd of=/dev/sdb1 – thomasrutter Dec 21 '14 at 12:09
  • 6
    I've always used pv in between dds. Never knew it could be used stand-alone! – korylprince Feb 10 '15 at 17:03
  • I would seriously recommend oflag=direct when doing these things. – JamesTheAwesomeDude Feb 05 '16 at 17:24
  • pv is amazing. I'm getting 100GB in 45 minutes (over USB3) which is lightning fast compared to dd, and yes it gives you exactly the stats you want: a) Total GBs transferred, total time running and rate. – Sridhar Sarnobat Jun 27 '18 at 03:21
  • Why not just set a really large block size equal to your memory size. It would probably depend on the underlying disk block size. But really what's the harm in just creating 1GiB block sizes? – CMCDragonkai Dec 17 '18 at 09:51
  • 2
    In order to monitor dd's progress, in recent versions, status=progress can be used. – Marcus Dec 22 '19 at 14:52
  • Can I do pv < /dev/zero > /dev/disk2? – alper May 02 '21 at 13:05
  • Where did you get that pv checks for the fastest speed on both drives ? I can't seem to find anything about that online. I'd be interested about the details. – Sindarus Aug 13 '23 at 19:00
  • I mainly used books at the time. But pretty sure you look fot pv linux on Google chatgpt or bard and it should show something. – Luis Alvarado Aug 14 '23 at 00:35
  • ok thanks. Well I should've read the manpage entirely. About the -B option, it reads "The default buffer size is the block size of the input file's filesystem multiplied by 32 (512KiB max), or 400KiB if the block size cannot be determined." So pv uses this approach to determine the buffer size it uses. I guess in theory you could use the same buffer size with dd using the "bs" option and get the same throughput. (Although I agree that pv is definitely nicer to use) – Sindarus Aug 22 '23 at 23:05
15

To copy a partition wholesale, use cat instead of dd. I ran benchmarks a while ago, copying a large file rather than a partition, between two disks (on the same disk, relative timings are different):

dd bs=64M    51.3
dd bs=1M     41.8
dd bs=4k     48.5
dd bs=512    48.9
cat          41.7
cp           45.3

The conclusion from this benchmark is that the choice of block size for dd matters (but not that much), and cat automatically finds the best way to make a fast copy: dd can only slow you down. With a small block size, dd wastes time making lost of tiny reads and writes. With a large block size, one disk remains idle while the other is reading or writing. The optimal rate is achieved when one disk reads while the other disk writes.

To copy a partition, it may be faster to copy the files with cp -a. This depends on how many files there are and how much of the filesystem is free space. Copying files has an overhead that's roughly proportional to the number of files, but on the other hand copying free space wastes time.

The maximum data rate for USB2 is a little under 50 MB/s which works out to 6–7 hours to transfer 1TB. This assumes a hard disk that's fast enough to saturate the USB bus; I think the faster 7200 rpm drives can do it but 5900rpm might not be that fast (maybe they are for linear writes?).

If either disk is in use in parallel, this can slow down the copy considerably as the disk heads will need to move around.

  • I'm trying to copy an entire disk though. – Kaz Wolfe Sep 12 '14 at 17:39
  • I expect the difference to be of the same order, but run a benchmark on your system to get more reliable data. – Gilles 'SO- stop being evil' Sep 12 '14 at 19:54
  • Can cat be used for dd if=ubuntu.iso of=/dev/usb? dd's speed for doing this to either USB2 or USB3 is frustratingly slow. – Oxwivi Sep 16 '14 at 05:53
  • 2
    @Oxwivi Yes, cat ubuntu.iso >/dev/usb is exactly equivalent. There is no magic in dd, it's just a tool to copy its input to its output. – Gilles 'SO- stop being evil' Sep 16 '14 at 06:04
  • The cat command given above didnt work on a mac. I tried sudo cat linuxmint-17.3-cinnamon-64bit.iso >/dev/disk1 Gave back "-bash: /dev/disk1: Permission denied" – Nay Jan 25 '16 at 06:54
  • 1
    @NickYeates That's not any of the commands given here. Your command because the redirection is performed by the shell that launches sudo, not by a process launched by sudo. You can use sudo sh -c 'cat linuxmint-17.3-cinnamon-64bit.iso >/dev/disk1' or <linuxmint-17.3-cinnamon-64bit.iso sudo tee /dev/disk1 >/dev/null – Gilles 'SO- stop being evil' Jan 25 '16 at 08:11
12

The problem is your connection type, and block size. For the fastest results your block size should be half the lowest write speed you typically receive. This will give you a safe margin, but still allow for a large number; of course you need to have enough ram to hold the data too.

Usb 2.0 is 12 megabits per second (Mbps), Usb 2.0 High Speed is 480 Mbps. This is of course the raw speed; with 8 bits in a byte and framing overhead, the usable speed in MB/s is usually a decimal place over. So for example 480 raw, becomes 48MBs usable. Keep in mind that this is the mathematical best, in the real world it will be a bit lower. For usb 2.0 high speed connections you should expect somewhere around 30-35 MBs max write speed, provided the actual storage device can equate or surpass the connection speeds.

Damian Yerrick
  • 197
  • 1
  • 14
Fellow
  • 221
  • 7
    Unit nitpicking: USB2.0 High Speed is 480 Mbit/s = 60 MByte/s, raw speed. The usable speed is not a decimal place over, but rather some 80% of the raw speed. The rule-of-thumb "actual speed in MByte/s is 1/10 of raw speed in Mbit/s" is valid though. – jpa Sep 12 '14 at 06:40
10

I agree that raw speed of a well tuned dd ('pv') or 'cat' command is tough to beat, but if there is any problem with the copy (bad sector, power failure, user error, etc) then you have to start over.

I'd like to suggest ddrescue - a FOSS tool that has all the speed of dd but it will work around disk errors, and resume at a later point if there is a failure.

dan_linder
  • 1,000
3

I'm moving Windows 7 from an HDD to SSD and found this and some other answers... Something I learned which might help others. In my case, the source drive is bigger, else I would have worked at the /dev/sda -> /dev/sdb device level.

Win7 and its 3 partitions... I used Xbuntu 14.04 live cd on a usb. Popped out the win computer's DVD and put the SSD in its place. Installed partclone and tried this:

partclone.ntfs -b -N -s /dev/sda3 -o /dev/sdb3

Partclone puked on the ntfs needing chkdisk run in Windows, so a quick fix got partclone happy:

ntfsfix -b /dev/sda3
ntfsfix -d /dev/sda3

All commands run as root. Partclone's ncurses UI (the -N option) said the transfer was 7GB/min and ended up at 5GB/min, which equates to 83MB/sec. The great part is partclone doesn't copy unused space, so this made the clone remarkably fast.

Additional potential gotchyas:

  • if the drive you are transferring to was previously used, it might have remnants of a GPT. Windows 7 factory installs are usually msdos/mbr partition tables. You'll need to remove the GPT fragments from the destination drive. This Unix & Linux QA helped me with this. You have to use gdisk on the device, use x then z and yes to zap GPT data and make sure you KEEP the MBR.

  • And don't forget if you don't do a device level dd, you'll need to copy the MBR using
    dd if=/dev/sdb of=/dev/sda bs=446 count=1
    where sdb is source or old drive and sda is destination or new drive (source)

Krista K
  • 343
2
dd if=/dev/sda of=/dev/sdb bs=100M status=progress

I managed to get 430 MB/s when I was making an image from a SATA SSD to a NVME SSD

Gryu
  • 7,559
  • 9
  • 33
  • 52
1

For anyone finding this thread, it is much easier and faster to just use a tool designed for data recovery like ddrescue. It tries to rescue the good parts first in case of read errors. Also you can interrupt the rescue at any time and resume it later at the same point.

Run it twice:

First round, copy every block without read error and log the errors to rescue.log.

sudo ddrescue -f -n /dev/sdX /dev/sdY rescue.log

Second round, copy only the bad blocks and try 3 times to read from the source before giving up.

sudo ddrescue -d -f -r3 /dev/sdX /dev/sdY rescue.log

Now you can mount the new drive and check the file system for corruption.

More info:
https://www.gnu.org/software/ddrescue/manual/ddrescue_manual.html

goetz
  • 275
0

mbuffer is fastest. It is highly optimized, reads and writes in separate threads, uses an explicit buffer, and has other features like working over a network or calculating a checksum. I also use it when piping between, eg btrfs send and receive, to speed things up (via buffering) and see progress.

sudo mbuffer -i /dev/sda -o /dev/sdb -m 1G --hash crc32
0

I've been recently creating an image of 100GB partition (HDD) and write it to the new SSD disk.

Here's a tip that can drastically speed up the process :)

Split file into smaller parts (the bigger the file is, the slower it works)

sudo dd if=/dev/sda3 conv=sync,noerror bs=2M | split -a 3 -d -b 1G - /maindisk.img

During the process, you can check the speed using (in separate terminal)

pgrep -l '^dd$' #to find PROCESSID
kill -USR1 PROCESSID #to check the speed

Then, when you have a directory full of result files (maindisk.img000, maindisk.img001, and so on...) use

sudo cat maindisk.img* | sudo dd of=/dev/sda1

to 'burn' the image into the new partiton of SSD (parition must be the same size as the old one)

To me it worked a loooot faster than usual way (without splitting). Average speed of creating the image was ~13MB/s. When I use the 'normal' way it starts with ~15MB/s and then decreasing to 1MB/s.

Kaz Wolfe
  • 34,122
  • 21
  • 114
  • 172
0

Id recommend the input/read - file/disk to be on SATA to boost read speeds. The USB 2.0 High speed is good too as I am getting average speeds of 33816 kb/s with ddrescue compared to when the setting was USB 2.0 to SATA at 2014 kb/s

0

Use a different block size. It's the amount of data that dd reads at a time. If reading too little, a greater share of time is spent on the program logic and if read too much, much time is spent moving the large data around.

To measure the speed at different block sizes, use the following bash script:

  • set $dev to the device
  • fix cbtotal to be at least 5x your expected read speed
    (set -o errexit; skip=0; cbtotal=$((120*1024**2)); bs=256;
    for power in `seq 10`; do
      bs=$((bs*2)); skip=$((skip/2)); count=$((cbtotal/bs));
      if [ "$count" -lt 1 ]; then break; fi;
      echo $bs;
      dd if=$dev of=/dev/null skip=$skip bs=$bs count=$count
      skip=$((skip+count))
    done)

The result may be biased towards a larger size due to the disk reading ahead - that's why it's important to set cbtotal large enough.

ivan_pozdeev
  • 101
  • 2