2011-07-07 03:30:57 +0000 2011-07-07 03:30:57 +0000
100
100

将整个文件系统的层次结构从一个驱动器复制到另一个驱动器上

我想把整个文件系统的层次结构从一个驱动器复制到另一个驱动器……即每个目录的内容以及Linux平台上的常规文件。如果能知道用可能的Linux内置功能来做这件事的最佳方法,将不胜感激。文件系统是一个ext家族。

答案 (11)

208
208
208
2011-07-07 03:36:43 +0000

你要的是 rsync .

这个命令可以用来同步一个文件夹,也可以在半途中止时继续复制。复制一个磁盘的命令是:

rsync -avxHAX --progress / /new-disk/

选项是。

-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)

为了提高复制速度,加上-W (--whole-file),以避免计算文件的deltas/diffs。当源文件和目标文件都被指定为本地路径时,这是默认的,因为rsync的delta-transfer算法的真正好处是减少网络使用。

也可以考虑添加--numeric-ids来避免通过用户/组名来映射uid/gid值。

56
56
56
2017-03-05 10:42:04 +0000

Michael Aaron Safyan的答案没有考虑到稀疏文件。-S选项可以解决这个问题。

另外这个变体不会因为每个文件的进度而产生垃圾,也不会做delta同步,这在非网络情况下会扼杀性能。

非常适合将文件系统从一个本地驱动器复制到另一个本地驱动器。

rsync -axHAWXS --numeric-ids --info=progress2
35
35
35
2011-07-07 03:42:40 +0000

我经常使用

> cp -ax / /mnt

假设/mnt是挂载在/mnt上的新磁盘,并且在/上没有其他的挂载。

-x将它保持在一个文件系统上。

当然,这需要以root或使用sudo来完成。

这个链接有一些替代方案,包括上面的 http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html

6
6
6
2011-07-07 20:53:25 +0000

对于从一个硬盘到另一个硬盘的一次性本地复制,我想cp就足够了,就像上面Wolfmann所描述的那样。

对于更大的工作,比如本地或远程备份,最好的是rsync

当然,rsync的使用要复杂得多。

为什么要使用rsync:

  • 这允许你将A盘的全部或部分复制到B盘,有很多选项,比如从复制中排除一些目录(比如排除/proc)。

  • 另一个大的优势是,这个本地工具可以监控文件传输:例如,对于大规模的传输,如果连接被中断,它将从断点处继续。

  • 最后但并非最不重要的是,rsync使用ssh连接,所以这允许你实现远程同步的安全 “副本"。请看man page以及这里有一些例子

5
5
5
2014-02-06 06:11:42 +0000

就像Michael Safyan上面建议的那样,我已经用rsync来达到这个目的。我建议使用一些额外的选项来排除那些你可能不想复制的目录。

这个版本对基于Gnome和Debian/Ubuntu的系统相当特殊,因为它包括了Gnome特有的用户主目录的子目录,以及APT包缓存。

最后一行将排除任何名为cache/Cache/.cache的目录,这对某些用途来说可能过于激进。

rsync -WavxHAX --delete-excluded --progress \
  /mnt/from/ /mnt/to/
  --exclude='/home/*/.gvfs' \
  --exclude='/home/*/.local/share/Trash' \
  --exclude='/var/run/*' \
  --exclude='/var/lock/*' \
  --exclude='/lib/modules/*/volatile/.mounted' \
  --exclude='/var/cache/apt/archives/*' \
  --exclude='/home/*/.mozilla/firefox/*/Cache' \
  --exclude='/home/*/.cache/chromium'
  --exclude='home/*/.thumbnails' \
  --exclude=.cache --exclude Cache --exclude cache
2
2
2
2012-03-19 23:53:05 +0000

在线程re rsync中添加两个有用的位:改变cypher,和使用--update

根据Wolfman的帖子,cp -ax很优雅,而且对于本地的东西来说很酷。

然而,rsync也很不错。除了 Michael 关于 -W 的回答之外,改变密码也可以加快速度 (阅读任何安全影响)。

rsync --progress --rsh="ssh -c blowfish" / /mnt/dest -auvx

一些讨论(和基准)关于慢的CPU是真正的瓶颈的地方,但它似乎确实帮助我当机器加载了其他并发的事情。

在这样的大型递归拷贝中使用rsync的另一个重要原因是由于-u开关(或–update)。如果在复制过程中出现问题,你可以修复它,然后rsync就会从原来的地方接手(我觉得scp没有这个功能)。在本地做,cp也有一个-u开关。

(我不确定 –update 和 –whole-file 一起使用会有什么影响,但在这种任务中,它们似乎总是能合理地工作)

我意识到这不是一个关于 rsync 功能的线程,但我最常用的一些功能是。

  • –delete-after 等(如Michael在后续提到的),如果你想把新系统同步回原来的地方或类似的东西。
  • –exclude - 用于跳过目录/文件,比如复制/创建一个新系统到一个新的地方,同时跳过用户主目录等(要么你从其他地方挂载主目录,要么创建新用户等)。

顺便说一下,如果我不得不使用windows,我就会使用cygwin的rsync来做大型递归拷贝,因为explorer有点脑残地想从头开始(虽然我发现Finder在OS X上更糟糕)。

2
2
2
2015-05-18 15:45:08 +0000

rsync

“这种方法被认为比用dd进行磁盘克隆要好,因为它允许使用不同大小、分区表和文件系统,也比用cp -a进行复制要好,因为它允许对文件权限、属性、访问控制列表(ACL)和扩展属性进行更大的控制。”

来自: https://wiki.archlinux.org/index.php/Fullsystembackupwithrsync

Man Page Here

2
2
2
2018-06-14 17:30:20 +0000

正如 juniorRubyist 在评论中提到的,这里首选的方法应该是使用 dd。主要原因是性能,它是逐块复制,而不是逐文件复制。

克隆一个分区

# dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync status=progress

克隆整个磁盘

# dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync status=progress

参考文献

  1. https://wiki.archlinux.org/index.php/disk_cloning
1
1
1
2019-01-27 21:53:49 +0000

dd'是很棒的,但ddrescue(apt install gddrescue)更好。如果 dd 被中断,就无法重新启动(这也是使用 rsync 的另一个好理由)。当你使用 ddrescue 和日志文件时,它会跟踪哪些块被复制了。

当备份Windows/Linux双启动系统时,我用ntfsclone备份Windows分区,用ddrescue备份Linux分区,用dd备份MBR。(我还没有尝试过使用 GPT/UEFI 备份双启动系统。)

我希望看到的是一个 ddrescue 工具,它可以创建像 ntfsclone 一样的文件,其中未分配的空间用控制字符标记。这使得镜像不能直接挂载,但允许它的大小与包含的数据一样大。

谁能拿出ntfsclone “特殊镜像格式 "给ddrescue……

1
1
1
2019-07-31 21:30:35 +0000

我尝试了这里提出的rsync命令,但最终我用 partclone 得到了更干净、更快速的结果。卸载源分区和目标分区,然后运行以下命令。

partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
e2fsck -f /dev/sd(target)
resize2fs /dev/sd(target)

这将执行以下步骤:

1.克隆(只克隆使用过的部分)分区 2.确保文件系统没问题(resize2fs强制执行这一步) 3.调整分区大小到新的文件系统

上述步骤在目标分区与源分区大小相同或更大的情况下有效。如果你的目标分区比源分区小(但能容纳所有数据),那么请执行以下步骤。

e2fsck -f /dev/sd(target)
resize2fs -M /dev/sd(target)
partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
resize2fs /dev/sd(target)

resize2fs -M 在克隆数据之前,将文件系统收缩到最小大小。

请注意,大多数系统默认没有安装partclone。使用像 clonezilla 这样的实时发行版,或者从你的发行版包管理器中安装 partclone (在基于 debian 的系统上安装 apt-get install partclone)。

0
0
0
2015-08-07 18:04:55 +0000

rsync就是上面解释的完美解决方案。

我就在"高效处理稀疏文件“中加上-S,以防有docker devicemapper卷或类似的文件要复制。