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