我想将整个文件系统层次结构从一个驱动器复制到另一个驱动器。即每个目录的内容以及Linux平台中的常规文件。非常高兴知道最好的Linux内置函数实现方法。文件系统是ext系列。

评论

嗯...对dd的爱在哪里? dd if = / dev / sda1 of = / dev / sdb1 bs = 4096

@juniorRubyist +1为dd。我总是用那个。但是要使用哪些标志?我使用conv = notrunc,noerror,sync。

-1表示dd的原因有两个:首先对已挂载的文件系统执行块级复制(/是这种情况)是个坏主意,其次dd不会从文件系统中挂载的源(如/)复制数据引导和/ home。

-1表示dd也是因为源上发生的任何碎片也会被复制;并且无法自动处理其他大小的目的地

#1 楼

我经常使用

> cp -ax / /mnt


假定/ mnt是/ mnt上安装的新磁盘,而/。上没有其他安装。- x将其保存在一个文件系统上。

这当然需要以root用户或使用sudo来完成。 >
http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html

评论


尽管这是一个古老的答案,但仍然值得注意的是,您通常不希望复制/中存在的所有内容,但不包括/ dev,/ sys,/ proc等。因此,在发布cp之前,我建议您寻求更好的方法(也使用rsync)

– Marcin Orlowski
19年6月13日在8:17

@MarcinOrlowski WolfJM使用-x标志意味着将不会复制您提到的综合文件系统。

– Jim L.
19年7月31日在21:37

#2 楼

您想要的是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),以避免计算文件的增量/差异。当将源和目标都指定为本地路径时,这是默认设置,因为rsync的增量传输算法的真正好处是减少了网络使用。按用户/组名称。

评论


天才,谢谢。顺便说一句,我最终使用了rsync -avxHAWX --numeric-ids --progress / mnt /,但是我应该完成rsync -avxHAWX --numeric-ids --progress / mnt />〜/ rsync.out。我怀疑将输出倒入终端会减慢该过程。 :D

–克里斯K
2014年1月15日上午10:15

--info = progress2而不是--progress对于大型传输很有用,因为它提供了总体进度,而不是单个文件(数百万行)。

–弗洛里安
2015年9月27日在8:43

我必须用E替换X和A,因为扩展的属性和ACL被Mac上的E覆盖了。已测试:rsync版本2.6.9协议版本29

–乔纳森·科玛(Jonathan Komar)
16-8-4在5:17



除了>〜/ rsync.out外,2>〜/ rsync.err还将所有错误保存在单独的文件中。

–内饰
17 Mar 5 '17 at 0:45

如果要从/以外的其他文件夹复制文件,请注意,在源目录上使用斜杠(或不使用斜杠)会有所不同:rsync source / dest /将source /内部的所有内容复制到dest /,而rsync source dest /复制文件夹源以及其中的所有内容都放入dest /。

–半外部
17 Mar 20 '17在8:22



#3 楼

Michael Aaron Safyan的答案不代表稀疏文件。 -S选项可解决此问题。用于将文件系统从一个本地驱动器复制到另一本地驱动器。

rsync -axHAWXS --numeric-ids --info=progress2


评论


惊人。这真的很好

– Gildas
18年7月26日在8:13

这应该是公认的答案,效果很好。示例55,431,669,792 57%97.47MB / s 0:06:56 xfr#2888,ir-chk = 5593/8534)

–提请
18年8月4日在3:11



<3这是完美的

–蒂姆·斯特赖德霍斯特(Tim Strijdhorst)
19年1月21日在15:10

#4 楼

对于从一个驱动器到另一个驱动器的一次快照本地副本,我猜想cp足以满足上面Wolfmann所述。

对于较大的工作,例如本地或远程备份,最好是rsync。

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

为什么rsync:
br)将驱动器A的全部或一部分复制到
驱动器B,并具有许多选项,例如

中排除某些目录(例如/ proc)。
另一个很大的优势是,该工具可以监视文件的传输。例如,对于大规模传输,如果连接中断,它将从断点继续。 。
最后但并非最不重要的一点是,rsync使用
ssh连接,因此,您可以
实现远程同步受保护的
“副本”。看看手册的
页面
以及这里的一些
示例。


#5 楼

就像上面的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
 


#6 楼

“ rsync


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


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

此处的手册页

#7 楼

如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

克隆已安装的可写分区
克隆可读写的已安装分区的关键是将其重新安装为只读。然后进行克隆,最后再次将其重新安装为可写。
# mount -o remount,ro /path/to/mount_point
# dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync status=progress
# mount -o remount,rw /path/to/mount_point

注意。这样做可能会对正在运行的应用程序产生一些副作用。例如。如果您的系统中的应用程序需要在克隆时精确地写入此特定分区,则在克隆分区时必须停止这些应用程序。或者,如果您自己的应用程序将其重写以处理这种情况。
克隆具有一个或多个已挂载可写分区的磁盘
策略和副作用与克隆已挂载可写分区的策略和副作用相同。这次对每个可写的安装点重复执行重新安装命令。不会有任何不确定的副作用。基于只读安装的概念的系统也是如此。
参考文献

https://wiki.archlinux.org/index.php/disk_cloning

>

评论


dd是一个非常糟糕的主意,原因有两个:首先,对已安装的文件系统执行块级复制(/的情况),很可能会导致目标文件系统错误,其次,dd不会从安装在文件系统内的源代码,例如/ boot和/ home。您的链接对磁盘克隆有效,而不对“文件层次结构”克隆有效

–埃里克
19年8月16日在10:42



@Eric我可能在这里做了一些假设。首先,我假设“将整个文件系统层次结构从一个驱动器复制到另一个驱动器”。等同于“如何克隆磁盘”,因为“文件层次结构克隆”仅在克隆磁盘的子集时才有用。其次,我假设这是用于存储的磁盘,而不是用于当前正在运行的系统的磁盘。但是,仅挂载系统并不意味着文件系统错误。这取决于其挂载,只读挂载是否完全适合克隆。

– RikardSöderström
20 Dec 16'在13:42

随便你的船

–埃里克
20 Dec 17 '14:22

#8 楼

在线程re rsync上添加两个有用的位:更改密码,并使用--update

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

但是,rsync也很棒。除了Michael的回答-W之外,更改密码还可以加快处理速度(不过,请阅读有关任何安全方面的信息)。围绕着缓慢的CPU是实际的瓶颈,但是当计算机加载完成其他并发操作时,它确实对我有帮助。

在较大的范围内使用rsync的另一个重要原因是,像这样的递归复制是由于-u开关(或--update)。如果在复制过程中出现问题,则可以对其进行修复,然后rsync将在中断的地方进行恢复(我认为scp对此没有帮助)。在本地执行,cp也具有-u开关。

(我不确定--update和--whole-file的含义是什么,但在这种任务中它们似乎总是很适合我)

我意识到这不是有关rsync功能的主题,但是我为此使用的最常见的一些方法是:



--delete-after等(如Michael在后续文章中所述),如果您想将新系统同步回原始位置或类似位置。而且,

-排除-用于跳过目录/文件,例如在跳过用户主目录等情况下将目录复制/创建新系统到新位置(例如,您要从其他地方安装房屋,创建新用户等)。

顺便说一句,如果我不得不使用Windows,我会使用cygwin的rsync来进行大型递归副本,因为资源管理器有点脑筋急转,想从头开始(尽管我发现Finder是OS X更糟的是

#9 楼

我尝试了此处提出的rsync命令,但最终使用partclone获得了更清晰,更快的结果。卸载源分区和目标分区,然后运行以下命令:

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


这将执行以下步骤:


克隆(仅分区的使用过的部分
确保文件系统正常(resize2fs强制执行此步骤)
将分区的大小调整为新的文件系统

如果目标分区的大小等于或大于源分区的大小,则上述操作有效。如果目标小于源(但适合所有数据),请执行以下操作:

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)
在克隆数据之前,将文件系统缩小到最小大小。 br />
请注意,大多数系统默认未安装resize2fs -M。使用像clonezilla这样的实时发行版,或从发行版数据包管理器安装partclone(基于debian的系统上为partclone)。

#10 楼

'dd'很棒,但是ddrescue(apt install gddrescue)更好。如果dd被中断,则无法重启(使用rsync的另一个很好的理由)。当您将ddrescue与日志文件一起使用时,它会跟踪已复制了哪些块。和dd表示MBR。 (我没有尝试过使用GPT / UEFI备份双引导系统。)控制字符。这使得映像不能直接挂载,但只能与所包含的数据一样大。

#11 楼

rsync是如上所述的完美解决方案。

如果要复制docker devicemapper卷或类似文件,我只是将-S添加到“有效处理稀疏文件”。