Perché la sincronizzazione è così importante quando si crea una chiavetta USB Linux avviabile?


15

Dal Wiki di Arch Linux: https://wiki.archlinux.org/index.php/USB_flash_installation_media

# dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress && sync

[...] Do non perdere la sincronizzazione per completare prima di tirare il drive USB.

Mi piacerebbe sapere

  • Che cosa fa?
  • Quali sono le conseguenze se lasciate fuori?

Appunti

ddcomando utilizzato con facoltativo status=progress:

tar -xzOf archlinux-2016-09-03-dual.iso | dd of=/dev/disk2 bs=4M status=progress && sync

O usando pvper il progresso

tar -xzOf archlinux-2016-09-03-dual.iso | pv | dd of=/dev/disk2 bs=4M && sync

Risposte:


19

Questo ddnon bypassa le cache del disco del kernel quando scrive su un dispositivo, quindi alcune parti dei dati potrebbero non essere ancora state scritte sullo USBstick al ddcompletamento. Se scolleghi la USBlevetta in quel momento, il contenuto della USBlevetta sarebbe incoerente. Pertanto, il tuo sistema potrebbe anche non riuscire ad avviarsi da questo USBstick.

Sync scarica tutti i dati ancora nella cache sul dispositivo.

Invece di invocare syncpotresti usare fdatasync ddl'opzione di conversione:

fdatasync

scrivere fisicamente i dati del file di output prima di terminare

Nel tuo caso, il comando sarebbe:

tar -xzOf archlinux-2016-09-03-dual.iso | \
dd of=/dev/disk2 bs=4M status=progress conv=fdatasync

Le conv=fdatasyncmarche ddchiamano in modo efficace fdatasync()chiamata di sistema al termine del trasferimento prima di dduscite (ho controllato questo con dd's fonti).

Ciò conferma che ddnon aggirerebbe né svuoterebbe le cache se non esplicitamente richiesto di farlo.


Grazie per il tuo contributo, ma non sono sicuro che questa affermazione è corretta Il ddnon lo fa bypass le cache del disco del kernel quando si scrive a un dispositivo . Quando si scrive su un file (sopra il livello del file system del kernel), le cose vengono memorizzate nella cache. Tuttavia, sono preoccupato per la scrittura su dispositivi. Se possibile, fornire una fonte per tale affermazione, poiché questa è la chiave di volta di questa domanda. Se vero, fornirebbe un motivo valido per l'esecuzione syncdopo un'operazione ddda dispositivo a dispositivo .
Jonathan Komar,

Sì, è memorizzato nella cache. La memorizzazione nella cache avviene all'interno dell'infrastruttura dei dispositivi a blocchi del kernel. Le operazioni sui file non vengono memorizzate nella cache. l'interfaccia del dispositivo a blocchi sottostante esegue l'incasso. fonte: lxr.free-electrons.com/source/block/blk-flush.c
Serge

@ macmadness86 vedi la risposta aggiornata
Serge,

7
Preferisco usare oflag=sync, quindi i progressi generano la velocità di trasferimento reale e non quella memorizzata nella cache (andando così a 10 MB / s costanti invece di un secondo 100 MB / se poi 10 secondi di stallo).
Bart Polot,

La scrittura su un dispositivo a blocchi ignora del tutto VFS. In altre parole: la scrittura su un file può essere memorizzata nella cache dal kernel (e di solito lo è) ma la scrittura su un dispositivo non viene mai memorizzata nella cache dal kernel (e non può).
Eric

0

Dalla pagina del manuale sync (1): "sync - Sincronizza le scritture memorizzate nella cache nella memoria permanente". Fondamentalmente syncassicurati che tutti i tuoi dati siano scritti sul bastone dalla cache.


Non vedo dove appare nella tua domanda la parte sulla luce accesa.
schaiba,
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.