Rsync --dry-run não mostrando bytes enviados corretos

2

Estou tentando usar rsyn com a opção --dry-run para ver se há espaço suficiente para a sincronização real. Para fins de teste, estou tentando sincronizar um diretório Documents . O tamanho do diretório é

  x@x:~$ du Documents
  ...
  640760    Documents/

O tamanho do contêiner de arquivos que estou tentando rsync é

  x@x:~$ df /media/veracrypt2
  Filesystem             1K-blocks  Used Available Use% Mounted on
  /dev/mapper/veracrypt2      9928  1191      8737  12% /media/veracrypt2

Em seguida, executo o comando rsync com:

x@x:~$ rsync -ar --dry-run --stats Documents/ /media/veracrypt2

Number of files: 665 (reg: 560, dir: 105)
Number of created files: 664 (reg: 560, dir: 104)
Number of deleted files: 0
Number of regular files transferred: 560
Total file size: 649,731,108 bytes
Total transferred file size: 649,731,108 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 19,429
Total bytes received: 2,115

sent 19,429 bytes  received 2,115 bytes  43,088.00 bytes/sec
total size is 649,731,108  speedup is 30,158.33 (DRY RUN)

Eu não entendo porque houve apenas 19.429 bytes enviados? O container está vazio, então todos os arquivos do diretório Documents devem ser transferidos, totalizando 649,731,108!?

Eu também tentei com um diretório menor Scripts cujo tamanho é

 du -h Scripts/
 32K    Scripts/test/Logs
 56K    Scripts/test
 116K   Scripts/Logs
 264K   Scripts/color_schemes
 580K   Scripts/

Aqui, o diretório inteiro deve poder ser copiado. Ao executar rsync para esse diretório, recebo a saída:

sending incremental file list
./
after_install.sh
install-crafter.sh
install-eclipse.sh
mk_autostart_app.sh
package_backup.sh
pandora.sh
sync_script.sh
trackpoint_speed_sens.sh
wallpaper.sh
Logs/
Logs/LOG_SYNC.log
Logs/LOG_SYNC.log~
Logs/LOG_WALLPAPER.txt
Logs/Log_sync.log
Logs/PANDORA.log
Logs/test
color_schemes/
color_schemes/kile.kateschema
test/
test/sync_script.sh
test/Logs/
test/Logs/Log_sync.log

Number of files: 25 (reg: 20, dir: 5)
Number of created files: 22 (reg: 18, dir: 4)
Number of deleted files: 0
Number of regular files transferred: 18
Total file size: 360,658 bytes
Total transferred file size: 353,166 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 900
Total bytes received: 95

sent 900 bytes  received 95 bytes  1,990.00 bytes/sec
total size is 360,658  speedup is 362.47 (DRY RUN)

Então por que os dados enviados aqui são apenas 928 bytes ?? Esse valor não deve indicar quantos bytes precisam ser copiados para o destino?

    
por wasp256 15.05.2016 / 14:03

1 resposta

2

No modo --dry-run , rsync determina quais arquivos precisam ser transferidos, mas na verdade não transferem seus dados - porque não há nenhum uso para fazer isso, naturalmente. Isto implica que não realiza delta matching - porque faz parte da lógica de transferência de dados.

A razão para os números refletirem que é ... bem ... que o código mostra estatísticas reais , e não algumas estatísticas "possíveis".

Segue-se uma comparação entre rsync -avvv --log-file=rsync.log --no-whole-file --stats doc doc2 para a pasta doc na árvore rsync source, entre --dry-run e sincronização normal (com timestamps despojados, diferenças PID e estatísticas de heap):

 delta-transmission enabled
 recv_generator(doc,1)
 recv_generator(doc,2)
+set modtime of doc to (1463404939) Mon May 16 16:22:19 2016
 recv_generator(doc/README-SGML,3)
 recv_generator(doc/profile.txt,4)
 recv_generator(doc/rsync.sgml,5)
 send_files(2, doc)
 cd+++++++++ doc/
 send_files(3, doc/README-SGML)
+send_files mapped doc/README-SGML of size 672
+calling match_sums doc/README-SGML
+sending file_sum
+false_alarms=0 hash_hits=0 matches=0
+>f+++++++++ doc/README-SGML
+sender finished doc/README-SGML
 send_files(4, doc/profile.txt)
+send_files mapped doc/profile.txt of size 1935
+calling match_sums doc/profile.txt
+sending file_sum
+false_alarms=0 hash_hits=0 matches=0
+>f+++++++++ doc/profile.txt
+sender finished doc/profile.txt
 send_files(5, doc/rsync.sgml)
+send_files mapped doc/rsync.sgml of size 11843
+calling match_sums doc/rsync.sgml
+sending file_sum
+false_alarms=0 hash_hits=0 matches=0
+>f+++++++++ doc/rsync.sgml
+sender finished doc/rsync.sgml
 recv_files(1) starting
 recv_files(doc)
 recv_files(doc/README-SGML)
+got file_sum
+set modtime of doc/.README-SGML.hkH0u5 to (1463404939) Mon May 16 16:22:19 2016
+renaming doc/.README-SGML.hkH0u5 to doc/README-SGML
 recv_files(doc/profile.txt)
+got file_sum
+set modtime of doc/.profile.txt.Wdf4x9 to (1463404939) Mon May 16 16:22:19 2016
+renaming doc/.profile.txt.Wdf4x9 to doc/profile.txt
 recv_files(doc/rsync.sgml)
+got file_sum
+set modtime of doc/.rsync.sgml.JSte5H to (1463404939) Mon May 16 16:22:19 2016
+renaming doc/.rsync.sgml.JSte5H to doc/rsync.sgml
 generate_files phase=1
+set modtime of doc to (1463404939) Mon May 16 16:22:19 2016
 send_files phase=1
 recv_files phase=1
 generate_files phase=2
 send_files phase=2
 send files finished
-total: matches=0  hash_hits=0  false_alarms=0 data=0
+total: matches=0  hash_hits=0  false_alarms=0 data=14450
 Number of files: 4 (reg: 3, dir: 1)
 Number of created files: 4 (reg: 3, dir: 1)
 Number of deleted files: 0
 Number of regular files transferred: 3
 Total file size: 14,450 bytes
 Total transferred file size: 14,450 bytes
-Literal data: 0 bytes
+Literal data: 14,450 bytes
 Matched data: 0 bytes
 File list size: 0
 File list generation time: 0.001 seconds
 File list transfer time: 0.000 seconds
-Total bytes sent: 153
-Total bytes received: 793
-sent 153 bytes  received 793 bytes  378.40 bytes/sec
-total size is 14,450  speedup is 15.27 (DRY RUN)
-[sender] _exit_cleanup(code=0, file=main.c, line=1196): about to call exit(0) (DRY RUN)
+Total bytes sent: 14,723
+Total bytes received: 1,435
+sent 14,723 bytes  received 1,435 bytes  4,616.57 bytes/sec
+total size is 14,450  speedup is 0.89
+[sender] _exit_cleanup(code=0, file=main.c, line=1196): about to call exit(0)

O seguinte é um diff entre o dry run inicial e um dry run depois que eu 1) fiz uma sincronização real, 2) editei um arquivo, rsync.sgml . Isso mostra que o delta matching não é feito em uma execução seca:

 received 3 names
 recv_file_list done
 get_local_name count=4 doc2
-created directory doc2
 delta-transmission enabled
 recv_generator(doc,1)
 recv_generator(doc,2)
 recv_generator(doc/README-SGML,3)
+doc/README-SGML is uptodate
 recv_generator(doc/profile.txt,4)
+doc/profile.txt is uptodate
 recv_generator(doc/rsync.sgml,5)
 send_files(2, doc)
<...>
 Number of files: 4 (reg: 3, dir: 1)
-Number of created files: 4 (reg: 3, dir: 1)
+Number of created files: 0
 Number of deleted files: 0
-Number of regular files transferred: 3
-Total file size: 14,450 bytes
-Total transferred file size: 14,450 bytes
+Number of regular files transferred: 1
+Total file size: 14,476 bytes
+Total transferred file size: 11,869 bytes
 Literal data: 0 bytes
 Matched data: 0 bytes
 File list size: 0
-File list generation time: 0.010 seconds
+File list generation time: 0.001 seconds
 File list transfer time: 0.000 seconds
-Total bytes sent: 153
-Total bytes received: 793
-sent 153 bytes  received 793 bytes  1,892.00 bytes/sec
-total size is 14,450  speedup is 15.27 (DRY RUN)
+Total bytes sent: 157
+Total bytes received: 830
+sent 157 bytes  received 830 bytes  658.00 bytes/sec
+total size is 14,476  speedup is 14.67 (DRY RUN)
 [sender] _exit_cleanup(code=0, file=main.c, line=1196): about to call exit(0) (DRY RUN)

Agora, em relação à sua tarefa - para verificar se há espaço suficiente no destino para a sincronização real.

Como você pode ver no diff,

  • arquivos são copiados um por um,
  • cada arquivo é gravado em um nome temporário e movido sobre o original

Portanto, a quantidade de espaço necessária no destino é:

  • sum( max(existing_size,new_size) for all files to be synced) + max( (new_size) for all files to be synced)

O primeiro termo é o pior cenário para a quantidade de dados "finais" a qualquer momento, o segundo é o espaço para uma cópia temporária.

Cada tamanho de arquivo pode ser preenchido até um múltiplo de um tamanho de unidade de armazenamento para permitir espaço desperdiçado (se aplicável para o FS de destino e a quantidade total esperada é alta o suficiente para fazer a diferença).

    
por 15.05.2016 / 17:34

Tags