Forza dd per non memorizzare nella cache o non leggere dalla cache


22

Sto lavorando su un sistema incorporato con la versione busybox di dd. Sto provando a testare una cancellazione sull'unità da qualche utility esterna, tuttavia dd non legge più dal disco dopo la cancellazione, ma mi mostra i dati memorizzati nella cache.

L'ho ristretto a dd come quando eseguo un dd iniziale, vedo i dati, riavvio il sistema per svuotare la cache, ho fatto la cancellazione e poi ho eseguito di nuovo dd è venuto fuori con tutti gli zeri.

Tuttavia, se eseguo le impostazioni di fabbrica, cancello l'unità e lo faccio di nuovo senza riavviare, non mi mostrerà tutti gli zeri fino al riavvio.

Ho letto nella manpage GNU che dd supporta iflag opt, con un flag nocache, ma busybox non supporta quell'opzione, quindi è fuori discussione.

La mia domanda è: come posso forzare dd a leggere di nuovo dal disco piuttosto che dalla cache?


2
Potenziale nitpicking, ma ... dd non lo memorizza nella cache. Lo fa il sistema kernel / disco. Questo è il motivo per cui il comando di Frostschutz (che non viene inviato a dd) funziona.
Hennes,

Ho bisogno di questo per mantenere il disco sveglio invece di aspettare di girare.
neverMind9

Risposte:


11

Potresti provare

sync
echo 3 > /proc/sys/vm/drop_caches

che rilascia ogni tipo di cache.

Per i dettagli vedere /usr/src/linux/Documentation/sysctl/vm.txtsu drop_caches.

(Nota: la domanda era su busybox dd che ad oggi non supporta ancora iflag=direct.)


1
Solo una nota: funziona solo con Linux. Inoltre, il /procfile system è disabilitato in alcune configurazioni integrate di Linux.

@EvanTeitelman Giusto, sembra funzionare qui, quindi ho intenzione di votare e accettare questa risposta.
ardente

2
Mi chiedevo se questo ha un effetto una tantum o è in corso. Secondo questo , l'effetto è una tantum.
Craig McQueen,

Questo lascerà cadere le cache, ma non fa nulla per impedire dddi distruggerle nel processo se trasferisce una grande quantità di dati.
Jan Hudec,

9

Basato sulla risposta di @ sendmoreinfo:

dd if=/dev/device iflag=direct bs=1M

Non influisce sulla lettura-cache.


Funziona, ma non memorizza nella cache ciò che viene letto?
neverMind9

1
Corretta. Questo è l'obiettivo.
Ole Tange,

8

L'I / O diretto (modalità aperta O_DIRECT) dovrebbe funzionare, ma il kernel e / o ddpotrebbe non supportarlo.


4
Questa è la risposta giusta: dd if = / dev / device iflag = direct bs = 1M; non influenza la cache di lettura.
Ole Tange,

1
@OleTange: Perché non pubblichi questo come tua risposta allora? Questo è l'hit numero 1 su google per "dd no cache" e la risposta corretta effettiva è in un commento a una risposta non accettata ...
mic_e

5

Un piccolo fiorire all'iflag = risposta diretta; fornire anche una barra di avanzamento:

dd iflag=direct if=~/source.iso | pv | dd oflag=direct of=/dev/sdb bs=8M

Senza iflag / oflag il pv segnala che è finito e quindi sembra sospeso; ma il dd per il dispositivo sta ancora lavorando nella cache.

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.