Por que o dd às vezes não espera até que os dados sejam gravados?

20

À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 ddsai. 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?

jgillich
fonte
3
Você tem certeza de que /dev/sdcé um dispositivo real no seu sistema e não está gravando em um arquivo /dev/sdc? Faça um ls --color /dev- /dev/sdcdeve ser amarelo se for um dispositivo.
LawrenceC

Respostas:

21

Use isto:

sudo dd if=install57.fs of=/dev/sdc conv=fsync

Isso chama fsync()após todas as chamadas do write()sistema. Isso força a ddnão armazenar em cache nada. Veja esta parte da página de manual do fsync ( man 2 fsync):

fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache 
pages for) the file referred to by the file descriptor fd to the disk device (or other 
permanent storage device) where that file resides. The call blocks until the device reports 
that the transfer has completed. It also flushes metadata information associated with the 
file (see stat(2)).

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.

caos
fonte
11
Gosto que sua resposta e a minha abranjam abordagens quase inteiramente diferentes. Bom, +1.
ChrisInEdmonton
11
@ChrisInEdmonton aqui +1
caos
todas as respostas são boas nesta pergunta.
Francisco Tapia
Apenas para esclarecer: Este é o comportamento padrão dos kernels. -Você quer dizer que isso conv=fsyncé padrão ao gravar em dispositivos que ddnão armazenam nada em cache? Procurando uma boa resposta para isso: unix.stackexchange.com/questions/312687/…
Jonathan Komar
10

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

ChrisInEdmonton
fonte
7

sync (8) - página de manual do Linux :

O kernel mantém os dados na memória para evitar leituras e gravações em disco (relativamente lentas). Isso melhora o desempenho, mas se o computador travar, os dados podem ser perdidos ou o sistema de arquivos corrompido como resultado. sincronização garante que tudo na memória seja gravado no disco.

Nota: unmount(ou ejetar) chama automaticamente o syncque "oculta" isso no uso normal do sistema de arquivos.

Steven
fonte