Copy entire file system hierarchy from one drive to another
What you want is rsync.
This command can be used to synchronize a folder, and also resume copying when it's aborted half way. The command to copy one disk is:
rsync -avxHAX --progress / /new-disk/
The options are:
-a : all files, with permissions, etc..
-v : verbose, mention files
-x : stay on one file system
-H : preserve hard links (not included with -a)
-A : preserve ACLs/permissions (not included with -a)
-X : preserve extended attributes (not included with -a)
To improve the copy speed, add -W
(--whole-file
), to avoid calculating deltas/diffs of the files. This is the default when both the source and destination are specified as local paths, since the real benefit of rsync's delta-transfer algorithm is reducing network usage.
Also consider adding --numeric-ids
to avoid mapping uid/gid values by user/group name.
Michael Aaron Safyan's answer doesn't account for sparse files. -S
option fixes that.
Also this variant doesn't spam with the each file progressing and doesn't do delta syncing which kills performance in non-network cases.
Perfect for copying filesystem from one local drive to another local drive.
rsync -axHAWXS --numeric-ids --info=progress2
I often use
> cp -ax / /mnt
Presuming /mnt is the new disk mounted on /mnt and there are no other mounts on /.
the -x keeps it on the one filesystem.
This of course needs to be done as root or using sudo.
This link has some alternatives, including the one above
http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html