Por que '--modify-window = 1' ao usar o comando 'rsync'?

1

De acordo com a Microsoft ,

When files are copied from NTFS drives to FAT drives, some file time stamp rounding has to occur; the file time stamp is rounded up to the next even second.

(snip)

NTFS time stamp: 7 hours 31 min 0 sec 001.

FAT time stamp becomes 7 hours 31 min 2 sec 000.

No entanto, man rsync diz

--modify-window

When comparing two timestamps, rsync treats the timestamps as being equal if they differ by no more than the modify-window value. This is normally 0 (for an exact match), but you may find it useful to set this to a larger value in some situations. In particular, when transferring to or from an MS Windows FAT filesystem (which represents times with a 2-second resolution), --modify-window=1 is useful (allowing times to differ by up to 1 second).

Eu acho que --modify-window=2 é a opção correta, porque não "arredondamento" é executado, mas "limite máximo" é feito. Alguém poderia me dizer se estou certo?

Informações relevantes ou irrelevantes:

No meu ambiente, a resolução de mtime de arquivos no FAT32 USB é de 1 segundo, e o "flooring" é feito, embora eu não saiba o motivo. O USB está formatado com fdisk e mkfs -t fat -F 32 . Os arquivos são transferidos do Linux Mint para o Volumio. Eu verifico o timestamp, usando date -r +%s.%N .

Suplemento:

Eu encontrei outra informação. Um segmento de e-mail confiável do rsync diz

timestamps will always be a problem on vfat. It has a 1 or 2 second resolution so --modify-window=2 is a common solution.

mas isso contradiz com man rsync e há muitas respostas aceitas no StackExchange que recomendam --modify-window=1 . Agora estou confuso.

    
por ynn 08.08.2018 / 14:58

1 resposta

0

Apenas para evitar qualquer confusão sobre como o modify_window funciona, ele é verificado em qualquer direção. (Se você quiser ler isto no código-fonte, verifique util.c :: cmp_time ().)

Isso significa que

  • se A for mais recente que B, verificará se A ainda é mais recente que B + modify_window.
  • se B for mais recente que A, verifica se B ainda é mais recente que A + modify_window.

Então, digamos que o original A tenha o tempo 123, mas seu sistema de arquivos de backup é ruim, então a cópia B termina com o tempo 122 (tornando A mais recente que B) ou o tempo 124 (tornando B mais recente que A).

O que acontece com modify_window = 1?

  • Se A (123) é mais recente que B (122), verifica se A (123) ainda é mais recente que B (122 + 1 = 123).
  • Se B (124) for mais recente que A (123), ele verifica se B (124) ainda é mais novo que A (123 + 1 = 124).

Em ambos os casos, ele é idêntico, então modify_window = 1 é suficiente para o tempo se desviar em um segundo em qualquer direção.

De acordo com a página de manual do rsync, isso deve ser bom o suficiente (tm) para o FAT32.

De acordo com a documentação que você citou (transformando 122 em 124, o que diabos), não é bom o suficiente.

Então, isso é inconclusivo.

Por experimentação, usando NTFS (-3g) e FAT32 no Linux, modify_window = 1 parece funcionar bem.

Minha configuração de teste foi assim:

truncate -s 100M ntfs.img fat32.img
mkfs.ntfs -F ntfs.img
mkfs.vfat -F 32 fat32.img
mount -o loop ntfs.img /tmp/ntfs/
mount -o loop fat32.img /tmp/fat32/

Portanto, um sistema de arquivos NTFS / FAT32 de 100M.

Crie mil arquivos com vários timestamps:

cd /tmp/ntfs

for f in {000..999}
do
    sleep 0.0$RANDOM # widens the timestamp range
    touch "$f"
done

Por exemplo:

# stat --format=%n:%y 111 222 333
111:2018-08-10 20:19:10.011984300 +0200
222:2018-08-10 20:19:13.553878700 +0200
333:2018-08-10 20:19:17.765753000 +0200

De acordo com você, 20:19:10.011 deve sair como 2018-08-10 20:19:12.000 .

Então vamos ver o que acontece. Primeiro, copie todos esses arquivos para o FAT32.

# rsync -a /tmp/ntfs/ /tmp/fat32/

Em seguida, notei que os timestamps são realmente precisos, até você desmontar e montar novamente:

# umount /tmp/fat32
# mount -o loop fat32.img /tmp/fat32

Compare:

# stat --format=%n:%y /tmp/{ntfs,fat32}/{111,222,333}
/tmp/ntfs/  111:2018-08-10 20:19:10.011984300 +0200
/tmp/fat32/ 111:2018-08-10 20:19:10.000000000 +0200
/tmp/ntfs/  222:2018-08-10 20:19:13.553878700 +0200
/tmp/fat32/ 222:2018-08-10 20:19:12.000000000 +0200
/tmp/ntfs/  333:2018-08-10 20:19:17.765753000 +0200
/tmp/fat32/ 333:2018-08-10 20:19:16.000000000 +0200

Então, isso praticamente parece ter sido chocado para mim. Não sei se o Windows faria da mesma maneira, mas é isso que acontece usando o Linux e o rsync.

O que o rsync faria ao copiar novamente:

# rsync -av --dry-run /tmp/ntfs/ /tmp/fat32
sending incremental file list
./
000
001
002
035
036
...
963
964
997
998
999

Portanto, há algumas lacunas na lista, mas, em geral, ele copia bastante muitos arquivos.

Com --modify-window=1 , a lista está vazia:

# rsync -av --dry-run --modify-window=1 /tmp/ntfs/ /tmp/fat32/
sending incremental file list
./

Então, pelo menos para o Linux, a página man é precisa. O deslocamento parece nunca ser maior que 1. (Bem, uma fração mais, mas isso também é ignorado).

Então, você deveria estar usando --modify-time=2 ? Não até que você possa mostrar experimentalmente que esta é realmente uma condição possível. Mesmo assim, é difícil dizer. Este é um truque horrível em primeiro lugar e quanto maior a janela de tempo, maior a probabilidade de que modificações genuínas sejam perdidas.

Mesmo o --modify-time=1 já ignora as alterações que não podem ser relacionadas à maneira como os carimbos de hora FAT32 são arredondados - já que ele ocorre em ambas as direções, mas o FAT32 é usado apenas em pisos. O rsync ignora isso ao copiar para FAT32 ser mais antigo), e vice-versa ao copiar de FAT32 (arquivos de destino só podem ser mais recentes).

Uma opção para lidar com isso melhor parece não existir.

Eu também tentei rastrear este comportamento nas fontes do kernel, infelizmente os comentários (no linux / fs / fat / misc.c) não dão muito para continuar.

/*
 * The epoch of FAT timestamp is 1980.
 *     :  bits :     value
 * date:  0 -  4: day   (1 -  31)
 * date:  5 -  8: month (1 -  12)
 * date:  9 - 15: year  (0 - 127) from 1980
 * time:  0 -  4: sec   (0 -  29) 2sec counts
 * time:  5 - 10: min   (0 -  59)
 * time: 11 - 15: hour  (0 -  23)
 */

Então, de acordo com isso, o registro de data e hora do FAT usa 5 bits por segundo, portanto, você obtém apenas 32 estados possíveis, dos quais 30 são usados. A conversão é feita com uma simples troca de bits.

em fs / fat / misc.c :: fat_time_unix2fat ()

    /* 0~59 -> 0~29(2sec counts) */
    tm.tm_sec >>= 1;

Então 0 é 0, 1 é 0, 2 é 1, 3 é 1, 4 é 2 e assim por diante ...

em fs / fat / misc.c :: fat_time_fat2unix ()

    second =  (time & 0x1f) << 1;

Inversão do acima, e o 0x1f é o bitmask para pegar apenas os bits 0-4 do tempo FAT que representa 0-29 segundos.

Se isso for diferente do que deveria ser, não há nada nos comentários que eu possa ver.

Uma postagem interessante de Raymond Chen sobre por que o Windows se daria ao trabalho de arredondar os tempos: link

Okay, but why does the timestamp always increase to the nearest two-second interval? Why not round to the nearest two-second interval? That way, the timestamp change is at most one second.

Because rounding to the nearest interval means that the file might go backward in time, and that creates its own problems. (Causality can be such a drag.)

De acordo com isso, a ferramenta xcopy do Windows possui um sinalizador /D que diz "apenas copie os arquivos de origem se forem mais recentes que o arquivo de destino". Basicamente, o que rsync --update ou cp --update faria.

Reduzindo o tempo, fazendo com que os arquivos pareçam ser criados 1 segundo no passado, como acontece no Linux, os arquivos serão copiados novamente toda vez que você executar o comando. O tempo de arredondamento corrige isso.

OTOH, a solução do Windows, causa a mesma dor de cabeça ao copiar esses arquivos de volta. Ele copia arquivos que são feitos para serem mais recentes do que realmente são, e então você precisa ter cuidado para que o ajuntamento não aconteça duas vezes.

Não importa o que você faça, é sempre errado, um sistema de arquivos que não pode armazenar timestamps corretamente é apenas um incômodo.

    
por 10.08.2018 / 20:43

Tags