Perché a volte dd non aspetta che i dati vengano scritti?


20

A volte, quando scrivo immagini su un'unità flash, questo accade:

$ 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

Fondamentalmente, Linux memorizza nella cache tutto, non scrive nulla ed ddesce. Dopo aver digitato sync, inizia a scrivere i dati (il LED dell'unità flash inizia a lampeggiare).

Perché succede?


3
Sei sicuro che /dev/sdcsia un dispositivo reale sul tuo sistema e non stai scrivendo su un file /dev/sdc? Fai un ls --color /dev- /dev/sdcdovrebbe essere giallo se è un dispositivo.
LawrenceC,

Risposte:


21

Usa questo invece:

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

Questo chiama il fsync()dopo ogni write()chiamata di sistema. Questo costringe a ddnon memorizzare nulla nella cache. Vedi questa parte della manpage di 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)).

Questo è il comportamento predefinito dei kernel. I kernel Linux gestiscono le cache di scrittura e lettura in questo modo: quando write()viene emessa la syscall, i dati vengono rapidamente scritti nella cache e uno stato completato dalla scrittura viene inviato al processo. Quando è necessario il buffer o quando c'è tempo libero sul bus, i dati vengono scritti dalla cache sul disco rigido.


1
Mi piace che la tua risposta e la mia coprano approcci quasi completamente diversi. Bello, +1.
ChrisInEdmonton,

1
@ChrisInEdmonton dito +1
caos

tutte le risposte sono buone in questa domanda.
Francisco Tapia,

@chaos Solo per chiarire: questo è il comportamento predefinito dei kernel. -Vuoi dire che conv=fsyncè predefinito quando si scrive per bloccare i dispositivi in ​​modo tale che ddnon memorizzi nulla nella cache? Alla ricerca di una buona risposta a questo: unix.stackexchange.com/questions/312687/…
Jonathan Komar,

10

Ciò accade perché Linux e la maggior parte degli altri sistemi operativi memorizzano nella cache sia le letture che le scritture. Nella maggior parte dei casi, ciò rende il sistema operativo più reattivo.

Se vuoi assicurarti che i dati memorizzati nella cache siano stati scritti, vuoi usarli sync, come sai. Linux espone anche un numero significativo di impostazioni che è possibile ottimizzare. Questo articolo offre una buona panoramica di alcune impostazioni. È possibile impostare vm.dirty_background_bytes su 0, ad esempio, per assicurarsi che il kernel inizi immediatamente i thread di flusher.


7

sync (8) - Pagina man di Linux :

Il kernel mantiene i dati in memoria per evitare di fare (relativamente lentamente) letture e scritture del disco. Ciò migliora le prestazioni, ma se il computer si arresta in modo anomalo, i dati potrebbero andare persi o il file system potrebbe danneggiarsi di conseguenza. la sincronizzazione garantisce che tutto ciò che è in memoria sia scritto sul disco.

Nota: unmount(o espulsione) chiama automaticamente syncchi "nasconde" questo nel normale utilizzo del filesystem.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.