Por que a sincronização é tão importante ao criar um pendrive linux usb inicializável?

15

No Wiki do Arch Linux: https://wiki.archlinux.org/index.php/USB_flash_installation_media

# dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress && sync

[...] Do não perder sincronização para completar antes de puxar o drive USB.

Eu gostaria de saber

  • O que isso faz?
  • Que consequências existem se deixadas de fora?

Notas

ddcomando usado com opcional status=progress:

tar -xzOf archlinux-2016-09-03-dual.iso | dd of=/dev/disk2 bs=4M status=progress && sync

Ou usando pvpara progredir

tar -xzOf archlinux-2016-09-03-dual.iso | pv | dd of=/dev/disk2 bs=4M && sync
Jonathan Komar
fonte

Respostas:

19

Como ddnão ignora os caches de disco do kernel quando ele grava em um dispositivo, algumas partes dos dados ainda não foram gravadas no USBstick após a ddconclusão. Se você desconectar o USBstick nesse momento, o conteúdo USBdele será inconsistente. Assim, seu sistema pode até falhar ao inicializar a partir deste USBstick.

Sync envia todos os dados ainda em cache para o dispositivo.

Em vez de invocar, syncvocê pode usar fdatasync dda opção de conversão de:

fdatasync

gravar fisicamente os dados do arquivo de saída antes de terminar

No seu caso, o comando seria:

tar -xzOf archlinux-2016-09-03-dual.iso | \
dd of=/dev/disk2 bs=4M status=progress conv=fdatasync

As conv=fdatasyncmarcas ddefetivamente chamar fdatasync()chamada de sistema no final da transferência, pouco antes ddsaídas (eu verifiquei isso com ddfontes 's).

Isso confirma que ddnão ignoraria nem liberaria os caches, a menos que explicitamente instruído a fazê-lo.

Sarja
fonte
Obrigado pela sua contribuição, no entanto não estou certo de que esta afirmação está correta A ddnão ignora as caches de disco do kernel quando se escreve para um dispositivo . Ao gravar em um arquivo (sobre a camada do sistema de arquivos do kernel), as coisas são armazenadas em cache. No entanto, estou preocupado com a gravação em dispositivos. Forneça uma fonte para essa declaração, se puder, porque esse é o ponto principal desta questão. Se verdadeiro, forneceria um motivo válido para a execução syncapós uma operação no dddispositivo .
Jonathan Komar 28/09
Sim, é armazenado em cache. O armazenamento em cache ocorre dentro da infraestrutura do dispositivo de bloco do kernel. As operações do arquivo em si não são armazenadas em cache. a interface do dispositivo de bloco subjacente é descontada. fonte: lxr.free-electrons.com/source/block/blk-flush.c
Serge
@ macmadness86 ver a resposta atualizados
Serge
7
Como prefiro usar oflag=sync, o progresso gera a velocidade real de transferência, e não a armazenada em cache (indo 10MB / s em vez de um segundo 100MB / se 10 segundos de estol).
precisa saber é o seguinte
A gravação em um dispositivo de bloco ignora completamente o VFS. Em outras palavras: a gravação em um arquivo pode ser armazenada em cache pelo kernel (e geralmente é), mas a gravação em um dispositivo nunca é armazenada em cache pelo kernel (e não pode).
Eric
0

Na página de manual do sync (1): "sync - Sincronize gravações em cache no armazenamento persistente". Basicamente, syncgarante que todos os seus dados sejam gravados no stick do cache.

Schaiba
fonte
Não vejo onde na sua pergunta aparece a parte sobre a luz estar acesa.
schaiba