Cerca nel sito:
ricerca
avanzata

Frasi Celebri...

Paradosso di Trischmann: Una pipa da' al saggio tempo per riflettere, all'idiota qualcosa da mettere in bocca.

Anonimo 

Sondaggio:

A tuo giudizio, riaprire le "casechiuse" ?...

Un modo per combattere la criminalit?
Un insulto alle donne
Una cosa da fare al pi? presto
L'ennesima stupidaggine di questo governo
Una cosa che non mi interessa

visualizza risultati


 

dd, il duplicatore di dati

La leggenda narra che all'inizio dei tempi, quando fu creato il primo UNIX, i suoi sviluppatori avevano bisogno di un comando a basso livello per copiare i dati tra dispositivi. Dato che avevano molta fretta, decisero di prendere in prestito la sintassi usata dalle macchine IBM-360, e di sviluppare in seguito un'interfaccia consistente con quella degli altri comandi. Il tempo passò, e tutti si erano talmente abituati allo strano modo di usare il comando dd che rimase com'era. Non so se è vero, ma è una bella storia.

A dire la verità, dd non è proprio diverso dagli altri comandi Unix: è un filtro, che legge per default dall'input standard e scrive sull'output standard. Così, se digitate semplicemente dd al terminale, resta in silenzio aspettando dell'input, e Ctrl+C è l'unica cosa sensata da digitare. La sintassi del comando è la seguente:

dd [if=file] [of=file] [ibs=byte] [obs=byte] [bs=byte] [cbs=byte] [skip=blocchi] [seek=blocchi] [count=blocchi] [conv={ascii, ebcdic, ibm, block, unblock,
lcase, ucase, swab, noerror, notrunc, sync}]

Tutte le opzioni hanno la forma opzione=valore. Non sono permessi spazi né prima né dopo il segno di uguale; disturbava, dato che la shell in una situazione del genere non espandeva un nome di file, quindi non ve ne dovete preoccupare. È anche importante ricordare che tutti i valori sotto forma di numeri (byte e blocchi qui sopra) possono essere seguiti da un moltiplicatore. Le possibili scelte sono b per blocchi, che moltiplica per 512, k per kilobyte (1024), w per parole (2) e xm moltiplica per m.

La spiegazione delle opzioni è data qui sotto.

  • if=filein e of=fileout dicono a dd rispettivamente di leggere da filein e scrivere su fileout. Nell'ultimo caso, il file di output viene troncato al valore dato a seek, o, se la parola chiave non è presente, a 0 (cioè viene cancellato), prima di fare l'operazione. Ma date un'occhiata all'opzione notrunc.

  • ibs=nn e obs=nn specificano quanti byte devono essere letti o scritti alla volta. Credo che il default sia 1 blocco, cioè 512 byte, ma non ne sono molto sicuro: quello che è sicuro è che funziona in quel modo con i file semplici. Questi parametri sono molto importanti quando si usano device speciali come input o output; ad esempio, leggere dalla rete dovrebbe impostare ibs a 10k, mentre un floppy da 3.5'' ad alta densità ha la sua naturale grandezza di blocchi a 18k. Non impostare questi valori può non solo aumentare il tempo di compimento del comando, ma anche portare ad errori di timeout, quindi state attenti.

  • bs=nn legge e scrive nn byte alla volta. Supera le parole chiave ibs e obs.

  • cbs=nn imposta i buffer di conversione a nn byte. Questi buffer vengono usati quando si traduce da ASCII a EBCDIC o da un dispositivo senza blocchi ad uno che li ha. Ad esempio, i file creati sotto VMS hanno spesso blocchi di 512 byte, cosicché bisogna impostare cbs a 1b quando si legge un nastro VMS. Spero che non dobbiate mai lottare con questo tipo di cose!

  • skip=nbl e seek=nbl dicono al programma di saltare nbl blocchi rispettivamente all'inizio dell'input ed all'inizio dell'output. Naturalmente il secondo caso ha senso se si dà la conversione notrunc (vedere sotto). Le dimensioni di ogni blocco sono il valore di ibs (obs). Attenzione: se non avete impostato ibs e scrivete skip=1b state in realtà saltando 512x512 byte, cioè 256KB. Non è precisamente quello che volevate, no?

  • count=nbl copia solo nbl blocchi dall'input, ognuno delle dimensioni date da ibs. Questa opzione, insieme alla precedente, rimane utile se per esempio avete un file corrotto e volete recuperarne il più possibile: saltate le parti illeggibili e prendete quello che resta.

  • conv=conversione,[conversione...] converte il file come specificato dall'argomento. Le conversioni possibili sono ascii, che converte da EBCDIC ad ASCII, ebcdic e ibm, che fanno entrambe una conversione inversa (sì, non c'è un'unica conversione da EBCDIC ad ASCII! La prima è quella standard, ma la seconda funziona meglio se dovete stampare i file su una stampante IBM), block, che porta linee che finiscono con un carattere di newline alla lunghezza di cbs, sostituendo la newline con degli spazi, unblock, che fa l'opposto (elimina gli spazi in fondo alla linea, e li sostituisce con un carattere di newline), lcase e ucase, per convertire il testo da maiuscole a minuscole e viceversa, swab, che scambia ogni coppia di byte di input (ad esempio ne avete bisogno per usare un file contenente degli interi corti scritto su una macchina 680x0 con una macchina Intel), noerror, per continuare ad agire su un file anche dopo aver incontrato errori, e sync, che porta i blocchi di input alla dimensione di ibs aggiungendo dei caratteri NUL alla fine.

Facciamo alcuni esempi dell'utilizzo di dd. L'esempio classico è quello in cui siete incappati quando avete provato a creare il primo dischetto Linux: come scrivere su un floppy senza un filesystem MS-DOS?. La soluzione è semplice:

% dd if=disk.img of=/dev/fd0 obs=18k count=80

Ho deciso di non usare ibs perché non so qual'è la grandezza di blocchi migliore per un hard disk, ma in questo caso non avrei fatto nessun danno se al posto di obs avessi usato bs (potrebbe anche essere stato leggermente più veloce). Notate l'esplicitazione del numero di settori da scrivere (18KB vengono occupati da un settore, quindi count viene impostato a 80) e l'uso del nome a basso livello del dispositivo floppy.

Un'altra applicazione utile di dd è legata al backup su rete. Supponiamo di essere sulla macchina alfa, e che sulla macchina beta ci sia l'unità a nastro /dev/rst0, con un file tar che ci interessa prendere. Abbiamo gli stessi privilegi su entrambe le macchine, ma non c'è spazio su beta per mettere il file tar. In questo caso, possiamo scrivere

% rsh beta 'dd if=/dev/rst0 ibs=8k obs=20k' | tar xvBf -

per fare l'intera operazione in un solo passo.
In questo caso, abbiamo usato le possibilità date da rsh di leggere dal nastro. Le dimensioni di input ed output sono impostate al default per questa operazione, cioè 8KB per leggere dal nastro e 20KB per scrivere sulla ethernet; dal punto di vista dell'altro estremo del tar, c'è lo stesso flusso di byte che si può prendere dal nastro, eccetto per il fatto che arriva in maniera non costante, ed è necessaria l'opzione B.

Dimenticavo: non credo proprio che dd sia un acronimo per "duplicatore dati", ma almeno è un buon modo per ricordarsi il suo significato...

 

successivo
–«  INDICE  »–

 

 

 

 
Powered by paper&pencil (carta&matita ) - Copyright © 2001-2022 Cataldo Sasso