Il comando Linux dd è una delle utility più potenti che può essere utilizzata in vari modi. Questo strumento viene utilizzato principalmente per copiare e convertire dati, quindi sta per duplicatore di dati. Questo strumento può essere utilizzato per:
- Backup e ripristino di un intero disco rigido o di una partizione.
- Creazione di file system virtuali e immagini di backup di CD o DVD chiamati file ISO
- Copia regioni di file di dispositivo non elaborati come il backup di MBR (record di avvio principale).
- Conversione di formati di dati come ASCII in EBCDIC.
- Conversione da minuscolo a maiuscolo e viceversa.
Solo il superutente può eseguire questo comando. Dovresti stare molto attento mentre usi questo comando poiché un uso improprio può causare un'enorme perdita di dati. Quindi, alcune persone considerano questo strumento come un distruttore di dati.
Sintassi del comando dd
L'uso di base del comando dd è piuttosto semplice perché richiede solo due argomenti:if =per specificare il file di input e di =per specificare il file di output. Gli argomenti di queste opzioni possono essere file o dispositivi di blocco. Tuttavia, non consiglierei di usare dd per copiare i file perché cp lo fa in un modo molto più semplice. Tuttavia, puoi usarlo per clonare un disco rigido. La sintassi è
dd if=<source file name> of=<target file name> [Options]
Impareremo varie opzioni mentre esamineremo esempi di comandi dd.
1. Backup e ripristino di un intero disco o di una partizione
È possibile salvare tutti i dati da un intero disco/partizione su un altro disco/partizione. Non una semplice copia come comando cp ma una copia in formato blocco.
a. Eseguire il backup dell'intero disco su disco
Puoi copiare tutti i dati (intero disco) dal disco /dev/sda
a /dev/sdb
. dd non sa nulla del filesystem o delle partizioni; copierà semplicemente tutto da /dev/sda
a /dev/sdb
. Devi indicare la dimensione del blocco da copiare alla volta con bs
opzione. Quindi, questo clonerà il disco con gli stessi dati sulla stessa partizione.
# dd if=/dev/sda of=/dev/sdb bs=4096 conv=noerror,sync 97281+0 records in 97280+0 records out 99614720 bytes (100 MB) copied, 2.75838 s, 36.1 MB/s
Funziona solo se il secondo dispositivo è grande quanto o più grande del primo. Altrimenti, ottieni partizioni troncate e inutili sul secondo. Qui, se sta per input file , of sta per output file e bs sta per la dimensione del blocco (numero di byte da leggere/scrivere alla volta). Assicurati di utilizzare le dimensioni dei blocchi in multipli di 1024 byte che equivalgono a 1 KB. Se non specifichi la dimensione del blocco, dd utilizza una dimensione del blocco predefinita di 512 byte. Il conv
parametro valore noerror consente allo strumento di continuare a copiare i dati anche se riscontra errori. L'opzione di sincronizzazione consente di utilizzare l'I/O sincronizzato.
b. Creazione di un'immagine disco dd (immagine del file)
È possibile creare un'immagine di un disco o un'immagine di file. Il backup di un disco su un'immagine sarà più veloce della copia dei dati esatti. Inoltre, l'immagine del disco rende il ripristino molto più semplice.
# dd if=/dev/sda of=/tmp/sdadisk.img
Puoi memorizzare il file di output dove vuoi ma devi dare un nome file che termina con .img
estensione come sopra. Invece di /tmp/sdadisk.img
, potresti salvarlo ad esempio in /sdadisk.img
se vuoi.
c. Creazione di un'immagine disco compressa
Poiché dd crea il contenuto esatto di un intero disco, significa che richiede una dimensione eccessiva. Puoi decidere di comprimere l'immagine del disco con il comando qui sotto
# dd if=/dev/vda | gzip -c >/tmp/vdadisk.img.gz
La pipa | l'operatore fa in modo che l'output del comando di sinistra diventi l'input del comando di destra. Il -c
l'opzione scrive l'output sull'output standard e mantiene invariati i file originali.
d. Eseguire il backup di una partizione o clonare una partizione su un'altra
Invece di un intero disco, puoi eseguire il backup solo di una semplice partizione. Devi solo indicare il nome della partizione nel file di input come di seguito
# dd if=/dev/sda1 of=/dev/sdb1 bs=4096 conv=noerror,sync
Questo sincronizzerà la partizione /dev/sda1
a /dev/sdb1
. Devi verificare che la dimensione di /dev/sdb1
dovrebbe essere maggiore di /dev/sda1
. Oppure puoi creare un'immagine di partizione come di seguito
# dd if=/dev/sda1 of=/tmp/sda1.img
es. Ripristino di un disco o di un'immagine di partizione
Salvare un disco o una partizione aiuta a ripristinare tutti i dati, in caso di problemi con la nostra unità originale. Per ripristinare, è necessario invertire il file di input con il file di output indicato durante l'operazione di backup come di seguito.
# dd if=/tmp/sdadisk.img of=/dev/sda
Recupererai i dati che erano presenti prima dell'operazione di backup e non dopo l'operazione
es. Ripristino dell'immagine compressa
Devi prima indicare il file compresso e il file di output che è il disco compresso prima.
# gzip -dc /tmp/vdadisk.img.gz | dd of=/dev/vda
L'opzione -d qui serve per decomprimere. Nota il file di output. Puoi montare il disco ripristinato per vedere il contenuto. Tieni presente che i dati verranno aggiunti dopo l'ultima operazione di backup di compressione.
2. Creazione di file system virtuale/immagini di backup di CD o DVD come file ISO
Potrebbe essere necessario creare un filesystem virtuale su Linux per alcuni motivi, come la creazione di una macchina virtuale sul tuo host Linux. Puoi anche aver bisogno di creare un'immagine ISO di backup di un CD o DVD
a. Creazione di un filesystem virtuale
Un filesystem virtuale è un filesystem che esiste in un file, che a sua volta esiste su un disco fisico. Può essere necessario per creare, ad esempio, un dispositivo di scambio o loop aggiuntivo o una macchina virtuale. Abbiamo bisogno di /dev/zero
che è un file utilizzato per creare un file senza dati ma con la dimensione richiesta (un file con tutti gli zero). In altre parole, questo creerà un file di dati con tutti gli zeri nel file che darà la dimensione a un file.
# dd if=/dev/zero of=/file bs=1024K count=500 500+0 records in 500+0 records out 524288000 bytes (524 MB) copied, 1.21755 s, 431 MB/s
L'opzione count
si riferisce al numero di blocchi di input da copiare. Combinato con il valore della dimensione del blocco, indica la dimensione totale da copiare. Ad esempio bs=1024k
e count=500
dare una dimensione=1024K*500 =524288000 byte =524MB
Ora controlliamo la dimensione del nostro file
# ls -lh /file -rw-r--r-- 1 root root 500M May 17 18:57 /file
Puoi vedere che abbiamo il nostro filesystem virtuale creato con la dimensione indicata. Ora puoi usarlo per creare un dispositivo loop o un disco virtuale o qualsiasi altra cosa.
b. Modifica i primi 512 byte di un file con dati nulli
Se durante l'operazione indichi un file di output esistente, perderai i suoi dati. Per alcuni motivi, potrebbe essere necessario sostituire una dimensione del blocco del file di output.
dd if=/dev/zero of=file1 bs=512 count=1 conv=notrunc
Il notrunc
opzione si riferisce a non troncare il file, sostituire solo i primi 512 byte, se esiste. Altrimenti, otterrai un file da 512 byte
c. Creazione di un'immagine ISO di backup di CD o DVD
Potresti chiederti perché non copiare semplicemente il contenuto del tuo CD in una directory. Come gestiresti il settore di avvio di un CD? Non puoi trovarlo come file sul dispositivo perché è solo il primo settore. Poiché dd copia settore per settore, d'altra parte, copierà anche quelle informazioni.
# dd if=/dev/cdrom of=/mycd.iso
Devi sapere che devi usare il -o loop
opzione, che ti permette di montare un file come un normale dispositivo. Quindi, per montare /mycd.iso
sul /mnt/cd
directory, fai come sotto
# mount -o loop /mycd.iso /mnt/cd
d) Crea un'unità USB avviabile
Supponiamo di aver scaricato l'immagine iso di centos qui in questa directory "~/Downloads/".
if=~/Downloads/CentOS-8-x86_64-1905-dvd1.iso - il file di input si trova nel percorso '~/Downloads/CentOS-8-x86_64-1905-dvd1.iso'
of=/dev/sdb - il file di output si trova nel percorso '/dev/sdb'
bs=1M - Leggi da '~/Downloads/CentOS-8-x86_64-1905-dvd1.iso' e scrivi in '/dev/sdb' 1 Megabyte di dati alla volta.
# dd if=~/Download/CentOS-8-x86_64-1905-dvd1.iso of=/dev/sdb bs=1M
3. Backup e ripristino di MBR
Il bootloader GRUB è più comunemente memorizzato nell'MBR dell'unità di avvio. L'MBR costituisce i primi 512 byte del disco, consentendo fino a 466 byte di memoria per il bootloader. Lo spazio aggiuntivo verrà utilizzato per archiviare la tabella delle partizioni per quell'unità. Se MBR viene danneggiato, non saremo in grado di avviare Linux.
a. Backup dell'MBR
Poiché l'MBR costituisce i primi 512 byte del disco, dobbiamo solo copiare la dimensione del blocco
# dd if=/dev/sda of=/tmp/sdambr.img bs=512 count=1
Con il count=1
e bs=512
, verranno copiati solo 512 byte che corrispondono alla dimensione del nostro MBR.
Puoi visualizzare l'MBR salvato con il comando od che esegue il dump dei file in ottale e altri formati come di seguito
# od -xa /tmp/sdambr.img 0000000 bf52 81f4 8b66 832d 087d 0f00 e284 8000 R ? t soh f vt - etx } bs nul si eot b nul nul 0000020 ff7c 7400 6646 1d8b 8b66 044d 3166 b0c0 | del nul t F f vt gs f vt M eot f 1 @ 0
-a
l'opzione seleziona i caratteri con nome e -x
seleziona unità esadecimali a 2 byte
b. Backup dei dati di avvio di MBR esclusa la tabella delle partizioni
I dati MBR 512 byte si trovano nel primo settore del disco rigido. Consiste di 446 byte di bootstrap, 64 byte di tabella delle partizioni e 2 byte di firma. Significa che possiamo escludere la tabella delle partizioni e la firma dei byte durante il backup dell'MBR conservando solo una dimensione del blocco uguale alla dimensione del bootstrap.
# dd if=/dev/sda of=/tmp/sdambr2.img bs=446 count=1
c. Ripristino dell'MBR dall'immagine MBR
Puoi ripristinare il tuo MBR come mostrato nei comandi precedenti con
# dd if=/tmp/sdambr.img of=/dev/sda
3. Conversione dei formati di dati
Se un file di input utilizza un set di caratteri che non è il set di caratteri nativo del computer host, l'operatore di importazione deve eseguire una conversione. Ad esempio, se ASCII è il formato nativo per le stringhe sul computer host, ma il file di dati di input rappresenta le stringhe utilizzando EBCDIC, è necessario convertire EBCDIC in ASCII e viceversa.
a. Converti il formato dati di un file da EBCDIC ad ASCII
Se c'è un file ebcdic con te, per lo più recuperato da sistemi mainframe, allora vorresti convertirlo in ASCII per apportare modifiche usando editor di testo su server UNIX
# dd if=textfile.ebcdic of=textfile.ascii conv=ascii
Il conv
il parametro value ora è ascii perché convertiamo da EBCDIC a ASCII
b. Converti il formato dati di un file da ASCII a EBCDIC
Dopo aver modificato la versione ASCII e una volta terminato, puoi riconvertirlo in EBCDIC per essere utilizzato dalla tua applicazione.
# dd if=textfile.ascii of=textfile.ebcdic conv=ebcdic
Il conv
il parametro value ora è e bcdic perché convertiamo da ASCII a EBCDIC. Se stai semplicemente sostituendo un determinato numero di byte con un numero equivalente di byte con caratteri diversi, la conversione sarebbe agevole e l'applicazione che legge il file non dovrebbe avere problemi.
4. Conversione del caso di un file
Il comando DD può essere utilizzato anche per una cosa incredibile. Può convertire tutto il testo (alfabeti) in un file in maiuscolo o minuscolo e viceversa. Per l'esempio seguente, avremo un file per i test.
# cat file10 test dd convert
a. Conversione di un file in maiuscolo
Poiché il nostro esempio di file di testo è in minuscolo, lo convertiremo in maiuscolo
# dd if=~/file10 of=~/file20 conv=ucase
Il comando creerà il nuovo file indicato. Guardalo ora conv
l'opzione richiede ucase valore. Controlliamo il risultato
# cat file20 TEST DD CONVERT
b. Conversione di un file in minuscolo
Ora faremo l'operazione inversa che convertirà in minuscolo
# dd if=~/file20 of=~/file30 conv=lcase
Vedi che utilizziamo lcase di conv
opzione per convertire da maiuscolo a minuscolo.
# cat file30 test dd convert
Il comando dd non converte i nomi dei file, ma solo il suo contenuto.
Conclusione
Il comando dd, sebbene non sia tecnicamente un comando di archiviazione, è simile in qualche modo perché può copiare un'intera partizione o disco in un file e viceversa.