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

Jug*_*ler 130 linux filesystems

我想将整个文件系统层次结构从一个驱动器复制到另一个驱动器......即每个目录的内容以及 Linux 平台中的常规文件。很高兴知道使用可能的 Linux 内置函数来做到这一点的最佳方法。文件系统是一个 ext 系列。

Mic*_*yan 254

你想要的是rsync

此命令可用于同步文件夹,也可在中止时恢复复制。复制一张磁盘的命令是:

rsync -avxHAX --progress / /new-disk/
Run Code Online (Sandbox Code Playgroud)

选项是:

-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)
Run Code Online (Sandbox Code Playgroud)

要提高复制速度,请添加-W( --whole-file),以避免计算文件的增量/差异。当源和目标都指定为本地路径时,这是默认设置,因为 rsync 的增量传输算法的真正好处是减少网络使用。

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

  • `--info=progress2` 而不是 `--progress` 对于大型传输很有用,因为它提供整体进度,而不是(数百万行)单个文件。 (43认同)
  • 如果你从 `/` 以外的其他文件夹复制,请注意在源目录上有一个斜杠(或没有)会有所不同:`rsync source/ dest/` 将 `source/` 中的所有内容复制到 `dest/ `,而`rsync source dest/` 将文件夹`source` 和里面的所有内容复制到`dest/` 中。 (7认同)
  • 我不得不用 `E` 替换 `X` 和 `A`,因为扩展属性和 ACL 在我的 mac 上被 `E` 覆盖。测试:`rsync 版本 2.6.9 协议版本 29` (4认同)
  • 天才,谢谢你。顺便说一句,我最终使用了“rsync -avxHAWX --numeric-ids --progress / mnt/”,但我应该做“rsync -avxHAWX --numeric-ids --progress / mnt/> ~/rsync.out”。我怀疑将输出倒入终端会减慢该过程。:D (3认同)
  • `-S, --sparse 有效处理稀疏文件` (3认同)

Ili*_*nko 102

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

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

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

rsync -axHAWXS --numeric-ids --info=progress2
Run Code Online (Sandbox Code Playgroud)

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

小智 37

我经常用

> cp -ax / /mnt
Run Code Online (Sandbox Code Playgroud)

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

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

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

此链接有一些替代方案,包括上面的一个

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

  • @MarcinOrlowski WolfJM 使用 `-x` 标志意味着您提到的合成文件系统不会被复制。 (8认同)

Dan*_*Dan 8

就像上面的 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
Run Code Online (Sandbox Code Playgroud)


Rik*_*röm 7

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

克隆分区

# dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync status=progress
Run Code Online (Sandbox Code Playgroud)

克隆整个磁盘

# dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync status=progress
Run Code Online (Sandbox Code Playgroud)

克隆已挂载的可写分区

克隆以可读写方式挂载的分区的关键是将其重新挂载为只读。然后进行克隆,最后再次重新挂载为可读写。

# 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
Run Code Online (Sandbox Code Playgroud)

笔记。这样做可能会对正在运行的应用程序产生一些副作用。例如,如果您的系统有一些应用程序需要在您需要克隆该特定分区时准确写入该分区,则在克隆分区时需要停止这些应用程序。或者,如果它是您自己的应用程序,请重新编写它来处理这种情况。

克隆具有一个或多个已安装可写分区的磁盘

策略和副作用与克隆已安装的可写分区相同,只不过这次对每个可写安装点重复重新安装命令。

# mount -o remount,ro /path/to/writeable_mount_point1
# mount -o remount,ro /path/to/writeable_mount_point..
# mount -o remount,ro /path/to/writeable_mount_pointN
# dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync status=progress
# mount -o remount,rw /path/to/writeable_mount_point1
# mount -o remount,rw /path/to/writeable_mount_point..
# mount -o remount,rw /path/to/writeable_mount_pointN
Run Code Online (Sandbox Code Playgroud)

最后的笔记

执行磁盘/分区克隆的首选和推荐方法是在未安装的系统上执行此操作,因为这不会产生任何不确定的副作用。对于基于只读安装概念构建的系统也是如此。

参考

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

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

小智 6

对于从一个驱动器到另一个驱动器的一次性本地复制,我想cp就足够了,正如上面 Wolfmann 所描述的那样。

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

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

为什么 rsync :

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

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

  • 最后但并非最不重要的是,rsync 使用 ssh 连接,因此这允许您实现远程同步的安全“副本”。查看手册页 以及这里的一些示例