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


95

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


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

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

-1的dd原因有两个:首先,对已安装的文件系统执行块级复制(这是的一个好主意/),其次,它dd不会从文件系统中安装的源(如/boot和)复制数据/home
埃里克

Answers:


33

我经常用

> cp -ax / /mnt

假定/ mnt是/ mnt上安装的新磁盘,/上没有其他安装。

-x将其保留在一个文件系统上。

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

此链接有一些替代方法,包括上面的一种

http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html


虽然这是死老的回答还是值得指出的是,你通常不想要复制所有的东西呈现/,排除即/dev/sys/proc等等。因此发出之前cp我建议您寻找更好的方法(也使用rsync)
马辛ORLOWSKI

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

192

您想要的是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的增量传输算法的真正好处是减少了网络使用量。

还应考虑添加--numeric-ids以避免按用户/组名称映射uid / gid值。


1
天才,谢谢。顺便说一句,我最终使用了,rsync -avxHAWX --numeric-ids --progress / mnt/但我应该这样做rsync -avxHAWX --numeric-ids --progress / mnt/ > ~/rsync.out。我怀疑将输出倒入终端会减慢该过程。:D
克里斯K

28
--info=progress2--progress对于大型传输,它不是有用,因为它可以提供整体进度,而不是单个文件(数百万行)。
弗洛里安2015年

3
我不得不更换XA使用E,因为扩展属性和ACL是由覆盖E在我的Mac。经过测试:rsync version 2.6.9 protocol version 29
乔纳森·科玛

1
除之外> ~/rsync.out2> ~/rsync.err还将所有错误保存在单独的文件中。
Aneel'3

2
如果要从其他文件夹复制文件/,请注意,在源目录上使用斜杠(或不使用斜杠)会有所不同:将rsync source/ dest/内部的所有内容复制source/dest/,同时rsync source dest/将文件夹source和内部的所有内容复制到dest/
半外星人

45

Michael Aaron Safyan的答案并未说明稀疏文件。-S选项可以解决该问题。

同样,此变体不会随着每个文件的进行而发送垃圾邮件,也不会进行增量同步,这会在非网络情况下降低性能。

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

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

1
惊人。这确实做得很好
Gildas

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

1
<3,这很完美
Tim Strijdhorst

6

对于从一个驱动器到另一个驱动器的一次快照本地副本,我想cp就足够了,正如上文Wolfmann所述。

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

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

为什么rsync:

  • 这样,您可以使用许多选项将驱动器A的全部或部分复制(同步复制)到驱动器B,例如,从副本中排除某些目录(例如,排除/ proc)。

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

  • 最后但并非最不重要的一点是,rsync使用ssh连接,因此,您可以实现远程同步的安全“副本”。请参见手册页 以及此处的一些示例


4

就像上面的迈克尔·萨夫扬(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

向线程re rsync添加两个有用的位:更改密码,并使用--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来进行大型的递归副本,因为资源管理器的大脑有点死了,想从头开始(尽管我发现Finder的OS X更加糟糕)。



2

如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

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

1

'dd'很棒,但是ddrescue(apt install gddrescue)更好。如果dd被中断,则无法重启(使用rsync的另一个很好的理由)。当您将ddrescue与日志文件一起使用时,它会跟踪已复制的块。

备份双引导Windows / Linux系统时,我将ntfsclone用于Windows分区,将ddrescue用于Linux分区,将dd用于MBR。(我没有尝试使用GPT / UEFI备份双引导系统。)

我很想看到一个ddrescue工具,它可以创建ntfsclone之类的文件,其中未分配的空间用控制字符标记。这使得映像不能直接安装,但只能与所包含的数据一样大。

有人请拿出ntfsclone“特殊图像格式”作为ddrescue ...



0

我尝试了此处提出的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这样的实时发行版,或从您的发行版数据包管理器(apt-get install partclone在基于debian的系统上)安装partclone 。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.