我可以通过一次读取同时将文件复制到两个驱动器吗?(在一次操作中复制一对二,最好在 rsync 中)

我可以通过一次读取同时将文件复制到两个驱动器吗?(在一次操作中复制一对二,最好在 rsync 中)

我经常需要将源磁盘备份到多个目标磁盘。目前的工作流程是rsync来源目标1然后dd克隆目标1目标2
如果我rsync能从来源目标1+目标2在同一读取操作中顺序执行,以大大加快速度。将文件一次读入内存,然后同步写入两个单独的硬盘。
有没有办法将rsync文件读入内存并同时将输出传送到两个写入操作?没有但那rsync会更受欢迎。

答案1

综合来自多个来源的信息,有几种选择。

结论是,只有命令parallel您可能会得到您想要的,请参见下文。

重要笔记:

  1. 我已经对复制进行了测试cp。您还应该考虑使用rsyncvscp或其他替代命令与 结合获得的速度提升(或降低!) parallel
  2. 我已经测试过只复制一个文件。如果复制多个文件(例如,根据需要将几个大文件与许多其他小文件和子目录合并),结果可能会发生变化。

对于每个选项,我都测试了
time <option #N, copying to one target>
time <option #N, copying to two targets>

进行比较,文件大小为 1.2Gb。此外,在某些情况下,我测试了两到三次相同的命令,以评估结果的分散性。我没有计算平均值和标准差,但结果很明显。

这是我在上述测试条件下得到的结果,并附有简短注释。我将多个测试的结果(只要可用)串联在一行中。

基本情况

$ time cp -p source/file1 target1/

real    0m0,846s    0m0,680s    0m0,659s
user    0m0,000s    0m0,001s    0m0,016s
sys     0m0,777s    0m0,662s    0m0,643s

复制选项

  1. 选项 parallel

    $ parallel cp -p source/file1 ::: target1/
    real    0m0,745s    0m0,740s
    user    0m0,121s    0m0,108s
    sys     0m0,609s    0m0,619s
    
    $ parallel cp -p source/file1 ::: target1/ target2/
    real    0m0,794s    0m0,860s
    user    0m0,116s    0m0,134s
    sys     0m1,300s    0m1,380s
    
  2. 选项 tee(附加> /dev/null以避免输出到stdout

    $ tee target1/file1 < source/file1 > /dev/null
    real    0m0,874s    0m1,040s    0m1,028s
    user    0m0,160s    0m0,172s    0m0,137s
    sys     0m0,714s    0m0,868s    0m0,887s
    
    $ tee target1/file1 target2/file1 < source/file1 > /dev/null
    real    0m1,802s    0m1,680s    0m1,833s
    user    0m0,136s    0m0,212s    0m0,197s
    sys     0m1,642s    0m1,468s    0m1,619s
    

    复制到两个targets 大约会使复制到一个 s 的时间翻倍target,这比复制到另一个 s 的时间略大一些。基本情况

  3. 选项 xargs

    $ echo target1 | xargs -n 1 cp -p source/file1
    real    0m0,666s
    user    0m0,021s
    sys     0m0,646s
    
    $ echo target1 target2 | xargs -n 1 cp -p source/file1
    real    0m1,197s
    user    0m0,018s
    sys     0m1,173s
    

    复制到两个targets 大约会使复制到一个 s 的时间翻倍target,这与复制到基本情况

  4. 选项 find

    $ find target1 -exec cp -p source/file1 {} \;
    real    0m2,167s
    user    0m0,017s
    sys     0m1,627s
    
    $ find target1 target2 -exec cp -p source/file1 {} \;
    real    0m3,905s
    user    0m0,020s
    sys     0m3,185s
    

    复制到两个targets 大约会使复制到一个 s 的时间翻倍target,这比复制到另一个 s 的时间要大得多。基本情况...明显的失败者。

“多次复制”的来源

  1. https://www.cyberciti.biz/faq/linux-unix-copy-a-file-to-multiple-directories-using-cp-command/
  2. 如何使用命令行将文件复制到多个文件夹?
  3. https://stackoverflow.com/questions/195655/how-to-copy-a-file-to-multiple-directories-using-the-gnu-cp-command

性能cp与来源rsync

  1. https://unix.stackexchange.com/questions/91382/rsync-is-very-slow-factor-8-to-10-compared-to-cp-on-copying-files-from-nfs-sha
  2. https://lwn.net/Articles/400489/
  3. https://superuser.com/questions/1170636/why-is-there-a-write-speed-difference-between-dd-cp-rsync-and-macos-finder-to
  4. ` cp ` 和 ` rsync ` 有什么区别?

答案2

rsync有一个批处理模式您可以尝试一下。当您执行时,rsync --write-batch=foo from to它将执行常规复制,但也会将指令和数据复制到文件中foo。如果这不是文件,而是 fifo,您可以并行使用第二个 rsync 来读取 fifo 并对不同的目标执行新的 rsync。显然,新目标必须与原始目标足够相似才有意义。

例如,通过网络,你可以尝试

mkfifo myfifo
ssh remotec 'rsync -av --read-batch=- destc' <myfifo &
sleep 1
rsync -av --write-batch=myfifo srca/ remoteb:destb

--read-batch不能与样式目标一起使用remote:destc

相关内容