|
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...
|
|