AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 461283
Accepted
ynn
ynn
Asked: 2018-08-09 04:58:16 +0800 CST2018-08-09 04:58:16 +0800 CST 2018-08-09 04:58:16 +0800 CST

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

  • 772

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 rsyncdiz

--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 fdiske 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 rsynce há muitas respostas aceitas no StackExchange que recomendam --modify-window=1. Agora estou confuso.

rsync
  • 2 2 respostas
  • 6802 Views

2 respostas

  • Voted
  1. Best Answer
    frostschutz
    2018-08-11T10:43:12+08:002018-08-11T10:43:12+08:00

    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,

    • se A for mais novo que B, verifica se A ainda é mais novo que B + modify_window.
    • se B for mais novo que A, verifica se B ainda é mais novo 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 novo que B) ou 124 (tornando B mais novo que A).

    O que acontece com modify_window = 1?

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

    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:

    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 uma variedade de carimbos de data/hora:

    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.011deve sair como 2018-08-10 20:19:12.000.

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

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

    Então notei que os timestamps são realmente precisos, até que você desmonte e remonte:

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

    Comparar:

    # 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 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:

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

    Portanto, existem algumas lacunas na lista, mas, em geral, seria copiado novamente 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
    ./
    

    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=2mesmo 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=1já 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.

    /*
     * 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 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()

        /* 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;
    

    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

    Ok, mas por que o timestamp sempre aumenta para o intervalo de dois segundos mais próximo? Por que não arredondar para o intervalo de dois segundos mais próximo? Dessa forma, a alteração do carimbo de data/hora é de, no máximo, um segundo.

    Porque arredondar para o intervalo mais próximo significa que o arquivo pode voltar no tempo e isso cria seus próprios problemas. (A causalidade pode ser um empecilho.)

    xcopyDe acordo com isso, a ferramenta do Windows possui um /Dsinalizador que diz "somente copie os arquivos de origem se forem mais recentes que o arquivo de destino". Basicamente o que rsync --updateou cp --updatefaria.

    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.

    • 11
  2. Dieter Hug
    2020-01-07T13:05:31+08:002020-01-07T13:05:31+08:00

    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 ...:

    ls -Rla --time-style=full-iso | grep '[13579]\.000000000 ' | wc -l
    

    enquanto:

    ls -Rla --time-style=full-iso | grep '[02468]\.000000000 ' | wc -l
    

    mostra que há muitos arquivos lá.

    eu fico com:--modify-window=2

    • 2

relate perguntas

  • rsync - movendo todos os arquivos JPG/jpg de um disco rígido para um único diretório com um script de shell

  • diretório tar para enviar apenas blocos modificados de arquivos

  • Como faço uma duplicata de uma árvore de diretórios com links simbólicos duplicados relativamente?

  • Problemas de exclusão de Rsync

  • rsync porta 22 e 873 uso

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve