De acordo com a Microsoft ,
Quando os arquivos são copiados de unidades NTFS para unidades FAT, alguns arredondamentos de carimbo de data/hora do arquivo precisam ocorrer; o carimbo de hora do arquivo é arredondado para o próximo segundo par.
(recorte)
Carimbo de hora NTFS: 7 horas 31 min 0 seg 001.
O carimbo de hora FAT torna-se 7 horas 31 min 2 seg 000.
No entanto, man rsync
diz
--modificar-janela
Ao comparar dois carimbos de data/hora, o rsync trata os carimbos de data/hora como sendo iguais se eles diferirem não mais do que o valor da janela de modificação. Normalmente é 0 (para uma correspondência exata), mas pode ser útil definir isso para um valor maior em algumas situações. Em particular, ao transferir para ou de um sistema de arquivos MS Windows FAT (que representa os tempos com uma resolução de 2 segundos), --modify-window=1 é útil (permitindo que os tempos diferem em até 1 segundo).
Eu acho que --modify-window=2
é a opção correta, porque não é executado o "arredondamento" e sim o "teto". Alguém poderia me dizer se estou certo?
Informações relevantes ou irrelevantes:
No meu ambiente, a resolução de mtime dos arquivos em FAT32 USB é de 1 segundo, e o "piso" está feito, embora eu não saiba o motivo. O USB é 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:
Encontrei outra informação. Um thread de e-mail confiável de rsync diz
timestamps sempre serão um problema no vfat. Tem uma resolução de 1 ou 2 segundos, então --modify-window=2 é uma solução comum.
mas isso contradiz man rsync
e há muitas respostas aceitas no StackExchange que recomendam --modify-window=1
. Agora estou confuso.
Apenas para evitar qualquer confusão sobre como o modify_window funciona, ele é verificado em qualquer direção. (Se você quiser ler isso no código-fonte, verifique util.c :: cmp_time().)
Que significa,
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 novo que B) ou 124 (tornando B mais novo que A).
O que acontece com modify_window = 1?
Em ambos os casos, é idêntico, portanto, modify_window = 1 é suficiente para que o tempo se desvie 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 FAT32.
De acordo com a documentação que você citou (transformando 122 em 124, 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 ficou assim:
Portanto, um sistema de arquivos NTFS/FAT32 de 100M.
Crie mil arquivos com uma variedade de carimbos de data/hora:
Por exemplo:
De acordo com você,
20:19:10.011
deve sair como2018-08-10 20:19:12.000
.Então vamos ver o que acontece. Primeiro, copie todos esses arquivos para FAT32.
Então notei que os timestamps são realmente precisos, até que você desmonte e remonte:
Comparar:
Então, isso parece que ficou no chão para mim. Não sei se o Windows faria da mesma maneira, mas é isso que acontece usando Linux e rsync.
O que o rsync faria ao copiar novamente:
Portanto, existem algumas lacunas na lista, mas, em geral, seria copiado novamente muitos arquivos.
Com
--modify-window=1
, a lista está vazia:Portanto, pelo menos para 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ê deve usar
--modify-time=2
mesmo assim? Não até que você possa mostrar experimentalmente que esta é realmente uma condição possível. Mesmo assim, é difícil dizer. Este é um hack terrível em primeiro lugar e quanto maior a janela de tempo, maior a probabilidade de que modificações genuínas sejam perdidas.Mesmo
--modify-time=1
já ignora as alterações que não podem estar relacionadas à maneira como os carimbos de data e hora do FAT32 são arredondados - uma vez que vai nas duas direções, mas o FAT32 apenas pisos, e o rsync ignora isso ao copiar para FAT32 (os arquivos de destino só podem ser mais antigos) e vice versa ao copiar do FAT32 (os arquivos de destino só podem ser mais recentes).Uma opção para lidar melhor com isso parece não existir.
Eu também tentei rastrear esse comportamento nas fontes do kernel, infelizmente os comentários (em linux/fs/fat/misc.c) não dão muito para continuar.
Então, de acordo com isso, o timestamp FAT usa 5 bits por segundos, então você obtém apenas 32 estados possíveis, dos quais 30 são usados. A conversão é feita com um simples deslocamento de bits.
em fs/fat/misc.c :: fat_time_unix2fat()
Então 0 é 0, 1 é 0, 2 é 1, 3 é 1, 4 é 2, e assim por diante...
em fs/fat/misc.c :: fat_time_fat2unix()
Reverso do acima, e
0x1f
é a máscara de bits 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 sobre isso nos comentários que eu pudesse ver.
Um post interessante de Raymond Chen sobre por que o Windows se daria ao trabalho de arredondar os tempos: https://blogs.msdn.microsoft.com/oldnewthing/20140903-00/?p=83
xcopy
De acordo com isso, a ferramenta do Windows possui um/D
sinalizador que diz "somente copie os arquivos de origem se forem mais recentes que o arquivo de destino". Basicamente o quersync --update
oucp --update
faria.Arredondar o tempo para baixo, fazendo com que os arquivos pareçam ter sido criados 1 segundo no passado, como acontece no Linux, faria com que os arquivos fossem copiados novamente toda vez que você executasse o comando. O arredondamento do tempo corrige isso.
OTOH a solução Windows apenas lhe dá a mesma dor de cabeça ao copiar esses arquivos de volta. Ele copiaria arquivos que são feitos para serem mais novos do que realmente são, e então você tem que ter cuidado para que o roundup não aconteça duas vezes.
Não importa o que você faça, está sempre errado, um sistema de arquivos que não pode armazenar registros de data e hora corretamente é apenas um incômodo.
Toda a matemática acima prova que, se sua partição fat32 arredondar/truncs/ceils para 1 segundo,
--modify-window=1
é a resposta correta. No entanto: na minha partição fat32, não consigo encontrar nenhum arquivo com segundos ímpares ...:enquanto:
mostra que há muitos arquivos lá.
eu fico com:
--modify-window=2