Precisa de sync ao escrever diretamente em dispositivos de bloco?
É comum, em tutoriais sobre como escrever imagens ISOHybrid em pendrives, a recomendação:
# dd if=xxx.iso of=/dev/sdx bs=1M status=progress # sync
(bs= variando dependendo do gosto do freguês)
  Esse sync após o dd, apesar de muito difundido,
  acredito não ter efeito. O manual da chamada de sistema
  sync() diz claramente que aplica-se apenas a sistemas de
  arquivos. O dispositivo de bloco bruto não é um sistema de arquivos. Portanto,
  o que faz efeito é adicionar a opção conv=fsync ao
  dd: quando a escrita termina no destino, chama
  fsync() no descritor de arquivo associado ao dispositivo, que o
  kernel traduz num comando adequado para os dados atingirem a mídia, como
  ATA_CMD_FLUSH, SYNCHRONIZE_CACHE, etc.
  Observando o comportamento do kernel através do strace, estou
  convicto que, quando o dd chama close() no descritor
  de arquivo do dispositivo, o kernel automaticamente garante que os dados
  chegaram na mídia quando a função retorna, não sendo necessário usar
  conv=fsync; mal não faz, contudo.
  O dd tentará truncar o arquivo de destino, via
  open(…, …|O_TRUNC) ou, caso seek= esteja presente,
  ftruncate(). O kernel ignora essa requisição nos dispositivos de
  bloco. Por boa prática, adicionamos notrunc. Cuide que, ao usar
  arquivos regulares como destino, a truncagem quase sempre é requerida.
Então, apenas dd conv=fsync,notrunc … basta.
Comentários
Postar um comentário