我想将整个文件系统层次结构从一个驱动器复制到另一个驱动器,即每个目录的内容以及 Linux 平台中的常规文件。如果知道使用 Linux 内置函数实现此目的的最佳方法,我将不胜感激。文件系统属于 ext 系列。
答案1
我经常使用
> cp -ax / /mnt
假设 /mnt 是挂载在 /mnt 上的新磁盘,并且 / 上没有其他挂载。
-x 将其保存在一个文件系统上。
当然,这需要以 root 身份或使用 sudo 来完成。
此链接有一些替代方案,包括上面的方案
http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html
答案2
你想要的是同步。
此命令可用于同步文件夹,也可在复制中途中止时恢复复制。复制一张磁盘的命令是:
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 值。
答案3
Michael Aaron Safyan 的回答没有考虑到稀疏文件。-S
选项修复了这个问题。
此外,此变体不会对每个文件的进度进行垃圾邮件发送,也不会进行增量同步,这会在非网络情况下降低性能。
非常适合将文件系统从一个本地驱动器复制到另一个本地驱动器。
rsync -axHAWXS --numeric-ids --info=progress2
答案4
正如 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
注意。这样做可能会对正在运行的应用程序产生一些副作用。例如,如果您的系统上有应用程序需要在您需要克隆时写入此特定分区,则在克隆分区时需要停止这些应用程序。或者,如果这是您自己的应用程序,请重写它以处理这种情况。
克隆具有一个或多个已安装可写分区的磁盘
策略和副作用与克隆已安装的可写分区除了这次对每个可写挂载点重复重新挂载命令。
# 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
最后说明
执行磁盘/分区克隆的首选和推荐方法是在未挂载的系统上执行,因为这样不会产生任何不确定的副作用。对于基于只读挂载概念构建的系统也是如此。
参考