Tenho um problema com os carimbos de data/hora dos arquivos copiados do meu PC ou laptop para unidades USB: a hora da última modificação do arquivo original e a do arquivo copiado são diferentes. Portanto, sincronizar arquivos entre meu PC e minha unidade USB é bastante complicado.
Uma descrição passo a passo
Eu copio um arquivo arbitrário do meu PC/laptop para uma unidade USB usando a GUI ou com o comando
cp -a file.txt /media/gabor/CORSAIR/
Eu verifico a hora da última modificação do arquivo original:
$ ls -l --time-style=full-iso file.txt -rw-rw-r-- 1 gabor gabor 0 2018-09-22 15:09:23.317098281 +0200 file.txt
Eu verifico a hora da última modificação do arquivo copiado:
$ ls -l --time-style=full-iso /media/gabor/CORSAIR/file.txt -rw-r--r-- 1 gabor gabor 0 2018-09-22 15:09:23.000000000 +0200 /media/gabor/CORSAIR/file.txt
Como você pode ver, os segundos na hora da última modificação do arquivo copiado são truncados para zero dígitos decimais. No entanto, se eu digitar o comando
if ! [ file.txt -nt /media/gabor/CORSAIR/file.txt ] && ! [ file.txt -ot /media/gabor/CORSAIR/file.txt ]; then echo "The last modification times are equal."; fi
eu recebo a saídaThe last modification times are equal.
A situação muda se eu desmontar e remontar a unidade USB e executar os dois últimos comandos novamente:
$ ls -l --time-style=full-iso /media/gabor/CORSAIR/file.txt -rw-r--r-- 1 gabor gabor 0 2018-09-22 15:09:22.000000000 +0200 /media/gabor/CORSAIR/file.txt $ if [ file.txt -nt /media/gabor/CORSAIR/file.txt ]; then echo "The file is newer on the PC."; fi The file is newer on the PC.
Portanto, após a remontagem, o horário da última modificação do arquivo copiado é reduzido ainda mais em um segundo. No entanto, a desmontagem e a remontagem adicionais não afetam mais a hora da última modificação. Além disso, o teste nos arquivos agora mostra que o arquivo no PC é mais recente (embora não seja).
A situação é ainda mais complicada pelo fato de que a hora da última modificação dos arquivos é mostrada de forma diferente no meu PC e no meu laptop , sendo a diferença exatamente 2 horas, embora a configuração de data e hora seja a mesma no meu PC e no meu laptop!
Outras informações
Tanto meu PC quanto meu laptop mostram o comportamento descrito acima. Eu tenho o Ubuntu 14.04.5 (trusty) no meu PC e o Ubuntu 16.04.2 (xenial) no meu laptop.
Minhas unidades USB têm sistema de arquivos vfat. A saída de mount | grep CORSAIR
no meu PC é
/dev/sdb1 on /media/gabor/CORSAIR type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2)
A saída de mount | grep CORSAIR
no meu laptop é
/dev/sdb1 on /media/gabor/CORSAIR type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)
Minhas outras unidades USB mostram o mesmo comportamento.
Pergunta
A diferença nos tempos da última modificação pode ser eliminada de alguma forma? Por exemplo, usando outros parâmetros na montagem/desmontagem? Ou é um bug no Ubuntu?
Eu gostaria de conseguir que os carimbos de data e hora dos arquivos originais e copiados sejam exatamente os mesmos, para que a sincronização possa ser feita com mais eficiência. Além disso, gostaria de manter o sistema de arquivos vfat em minhas unidades USB, para que eu também possa usá-las no Windows.
O problema com a alteração dos segundos do carimbo de data/hora vem do fato de que um sistema de arquivos VFAT (sim, até mesmo FAT32) armazena o tempo de modificação com apenas 2 segundos de resolução.
Aparentemente, desde que o sistema de arquivos esteja montado, o driver do sistema de arquivos armazena em cache os carimbos de data e hora com resolução de 1 segundo (provavelmente para satisfazer os requisitos POSIX), mas uma vez que o sistema de arquivos é desmontado, os caches são limpos e você verá o que está realmente gravado no o diretório do sistema de arquivos.
A diferença de duas horas entre o PC e o laptop provavelmente é causada por diferentes configurações de fuso horário e/ou diferentes opções de montagem padrão para o sistema de arquivos VFAT. (Acho que você está localizado em um fuso horário cujo deslocamento UTC é atualmente de 2 horas, positivo ou negativo.)
Internamente, o Linux usa timestamps UTC em sistemas de arquivos no estilo Unix; mas em sistemas de arquivos VFAT, o padrão (atual) é usar a hora local nos registros de data e hora do sistema de arquivos VFAT, porque foi isso que o MS-DOS fez e o Windows ainda faz. Mas há duas opções de montagem que podem afetar isso: você pode especificar a opção de montagem
tz=UTC
para usar carimbos de data e hora baseados em UTC em sistemas de arquivos VFAT ou pode usartime_offset=<minutes>
para especificar explicitamente o deslocamento de fuso horário a ser usado com esse sistema de arquivos específico.Pode ser que as opções de montagem padrão para o VFAT tenham mudado entre o Ubuntu 14.04 e 16.04, seja no kernel ou no
udisks
serviço auxiliar de mídia removível, resultando na diferença de duas horas que você vê.Embora eu tenha escrito na minha pergunta que "gostaria de manter o
vfat
sistema de arquivos em minhas unidades USB", finalmente os formatei novamente parantfs
o sistema de arquivos. Tanto o Linux quanto o Windows podem lidarntfs
e parece não mostrar o estranho fenômeno com os timestamps, descritos acima.