Perché l'opzione di sincronizzazione è usata con il comando `dd`?


13

Seguendo le istruzioni in questa pagina, la pagina mostrava un ddcomando e syncun'opzione alla fine. Il comando è il seguente:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M sync

So cos'è dde come funziona ma non ne ho mai sentito parlare o usato l' syncopzione e la sua immissione manuale è simile a:

sync   pad every input block with NULs to  ibs-size;  when  used  with
       block or unblock, pad with spaces rather than NULs

Che cos'è NULe perché viene imbottito ibs-sizee perché preoccuparsi di riempire i blocchi di dati e utilizzare l' syncopzione con il ddcomando? Perché non mantenerlo semplice e facile?

Quando provo a eseguire syncil comando così com'è con la posizione e i valori appropriati, ottengo il seguente errore:

dd: unrecognized operand ‘sync’
Try 'dd --help' for more information. 

Risposte:


21

Stai leggendo male il comando. Suo:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M 
sync

syncè un comando separato, qui. Vedi man 1 sync:

NAME
       sync - flush file system buffers

SYNOPSIS
       sync [OPTION]

DESCRIPTION
       Force changed blocks to disk, update the super block.

Chiaramente perché viene utilizzato quando si pensa alla memorizzazione nella cache.

Per quanto riguarda l' ddopzione che leggi, è un valore per l' convopzione :

Each CONV symbol may be:
   ascii  from EBCDIC to ASCII
   ...
   sync   pad every input block with NULs  to  ibs-size;  when  used  with
          block or unblock, pad with spaces rather than NULs

Se fosse usato (cosa che non lo è), sarebbe usato così:

dd ... conv=sync

3
Buona risposta, molto dettagliata. Bello che tu abbia persino descritto l' dd ... conv=syncargomento.
Byte Commander

Non lasciarti deridere! ;-) Buona risposta: hai individuato il problema che non avevo nemmeno visto. > :-) +1
Fabby

1
Anche dalla descrizione conv=syncdell'opzione sembra abbastanza chiaro perché non viene utilizzato per questo. Nella migliore delle ipotesi non farebbe nulla, nella peggiore delle ipotesi danneggerebbe l'immagine durante la copia.
Kasperd,

5
In realtà le istruzioni dovrebbero richiedere l'opzione dd oflag=fsync(che scarica l'output che ha scritto dd) invece di un synccomando (che scarica tutto sul sistema.
psusi

Questa risposta è fuorviante. Con dd, syncè un argomento per entrambe conve le opzioni iflago oflag.
Dan Loewenherz,

3

Per impostazione predefinita, dd leggerà nei dati un blocco alla volta, possibilmente leggendo in un blocco più corto di quello specificato dall'utente, alla fine del file o a causa del comportamento del dispositivo sorgente; questo si chiama record parziale . Scriverà quindi un blocco della stessa dimensione della quantità che legge.

Dd lo ripeterà fino al raggiungimento del conteggio specificato, oppure vedrà eof sull'input o errore sull'input o sull'output. Al termine, dd riporta il numero di record completi e parziali letti e scritti.

Questo comportamento va bene per la copia di un normale file all'interno di un filesystem o su una connessione di rete TCP, poiché è considerato un flusso di byte. Ma altri oggetti del filesystem, come i DVD non elaborati e il nastro magnetico, richiedono dimensioni di scrittura che rientrano in determinati intervalli e siano un multiplo circolare di una certa quantità (come 512 o 2048 byte). Ad esempio, se si dispone di un'immagine del disco che è 255 tracce di 63 settori da 512 byte e si desidera scrivere su un nastro che richiede una dimensione del blocco di 1024 byte, è necessario fare qualcosa di simile

dd if=disk.img of=/dev/rmt0 bs=1k conv=sync

per assicurarsi che dd non tenti di scrivere un blocco da 512 byte alla fine. Il blocco più corto alla fine sarà riempito con zero o spazi vuoti. L'imbottitura con zero è una scelta sicura e comune. L'opzione per dd da riempire con spazi vuoti è utile in una situazione diversa: convertire un file che ha linee di lunghezza variabile in uno con linee di lunghezza fissa.


0

Ho scoperto che il sistema Linux, non dd, memorizza nella cache i buffer. Pertanto, quando il comando dd è stato completato, eseguo sync as

sudo dd if=my.downloaded.iso of=/dev/sd(?) bs=1M && sync

Non ho usato alcuna opzione dd interna per causare lo svuotamento del buffer. In genere, tuttavia, quando creo una versione USB di una distribuzione, sono l'unica sul computer, quindi non ho scrupoli sul fatto che il mio comando postato danneggi. Da quando eseguo la sincronizzazione come &&, la sincronizzazione viene eseguita con i diritti sudo e sono sicuro che l'USB che creo sia completa.


0

È possibile utilizzare l' syncopzione per l'output, inclusa in ddcomando, dal oflagsimbolo:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M oflag=sync
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.