Às vezes, quando eu escrevo imagens em uma unidade flash, isso acontece:
$ sudo dd if=install57.fs of=/dev/sdc
573440+0 records in
573440+0 records out
293601280 bytes (294 MB) copied, 0.549231 s, 535 MB/s
Basicamente, o Linux armazena em cache tudo, não escreve nada e dd
sai. Depois que eu digito sync
, ele começa a gravar os dados (o LED da unidade flash começa a piscar).
Por que isso acontece?
linux
command-line
dd
jgillich
fonte
fonte
/dev/sdc
é um dispositivo real no seu sistema e não está gravando em um arquivo/dev/sdc
? Faça umls --color /dev
-/dev/sdc
deve ser amarelo se for um dispositivo.Respostas:
Use isto:
Isso chama
fsync()
após todas as chamadas dowrite()
sistema. Isso força add
não armazenar em cache nada. Veja esta parte da página de manual do fsync (man 2 fsync
):Este é o comportamento padrão dos kernels. Os kernels do Linux gerenciam caches de gravação e leitura assim: Quando o
write()
syscall é emitido, os dados são gravados rapidamente no cache e um status de gravação concluída é enviado ao processo. Quando o buffer é necessário ou quando há tempo livre no barramento, os dados são gravados do cache no disco rígido.fonte
conv=fsync
é padrão ao gravar em dispositivos quedd
não armazenam nada em cache? Procurando uma boa resposta para isso: unix.stackexchange.com/questions/312687/…Isso acontece porque o Linux e a maioria dos outros sistemas operacionais armazenam em cache as leituras e gravações. Na maioria dos casos, isso torna seu sistema operacional mais responsivo.
Se você deseja garantir que os dados armazenados em cache foram gravados, use-os
sync
como você sabe. O Linux expõe um número significativo de configurações que você também pode ajustar. Este artigo fornece uma boa visão geral de algumas configurações. Você pode definir o vm.dirty_background_bytes como 0, por exemplo, para garantir que o kernel inicie os encadeamentos de descarga imediatamente.fonte
Nota:
unmount
(ou ejetar) chama automaticamente osync
que "oculta" isso no uso normal do sistema de arquivos.fonte