将整个文件系统的层次结构从一个驱动器复制到另一个驱动器上
我想把整个文件系统的层次结构从一个驱动器复制到另一个驱动器……即每个目录的内容以及Linux平台上的常规文件。如果能知道用可能的Linux内置功能来做这件事的最佳方法,将不胜感激。文件系统是一个ext家族。
我想把整个文件系统的层次结构从一个驱动器复制到另一个驱动器……即每个目录的内容以及Linux平台上的常规文件。如果能知道用可能的Linux内置功能来做这件事的最佳方法,将不胜感激。文件系统是一个ext家族。
你要的是 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值。
Michael Aaron Safyan的答案没有考虑到稀疏文件。-S
选项可以解决这个问题。
另外这个变体不会因为每个文件的进度而产生垃圾,也不会做delta同步,这在非网络情况下会扼杀性能。
非常适合将文件系统从一个本地驱动器复制到另一个本地驱动器。
rsync -axHAWXS --numeric-ids --info=progress2
我经常使用
> cp -ax / /mnt
假设/mnt是挂载在/mnt上的新磁盘,并且在/上没有其他的挂载。
-x将它保持在一个文件系统上。
当然,这需要以root或使用sudo来完成。
这个链接有一些替代方案,包括上面的 http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html 。
就像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
在线程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 功能的线程,但我最常用的一些功能是。
顺便说一下,如果我不得不使用windows,我就会使用cygwin的rsync来做大型递归拷贝,因为explorer有点脑残地想从头开始(虽然我发现Finder在OS X上更糟糕)。
rsync
“这种方法被认为比用dd进行磁盘克隆要好,因为它允许使用不同大小、分区表和文件系统,也比用cp -a进行复制要好,因为它允许对文件权限、属性、访问控制列表(ACL)和扩展属性进行更大的控制。”
来自: https://wiki.archlinux.org/index.php/Fullsystembackupwithrsync
Man Page Here
正如 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
参考文献
dd'是很棒的,但ddrescue(apt install gddrescue)更好。如果 dd 被中断,就无法重新启动(这也是使用 rsync 的另一个好理由)。当你使用 ddrescue 和日志文件时,它会跟踪哪些块被复制了。
当备份Windows/Linux双启动系统时,我用ntfsclone备份Windows分区,用ddrescue备份Linux分区,用dd备份MBR。(我还没有尝试过使用 GPT/UEFI 备份双启动系统。)
我希望看到的是一个 ddrescue 工具,它可以创建像 ntfsclone 一样的文件,其中未分配的空间用控制字符标记。这使得镜像不能直接挂载,但允许它的大小与包含的数据一样大。
谁能拿出ntfsclone “特殊镜像格式 "给ddrescue……
我尝试了这里提出的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
)。
rsync
就是上面解释的完美解决方案。
我就在"高效处理稀疏文件“中加上-S
,以防有docker devicemapper卷或类似的文件要复制。