dd in esecuzione oltre la fine del dispositivo di input

Aug 18 2020

Sto cercando di utilizzare ddper clonare un disco rigido che ho riparato. Sto cercando di ddcopiare i dati dall'unità in blocchi da 10 GB, tuttavia sta trasferendo più dati di quelli che l'unità dovrebbe contenere. L'unità stessa funziona e la partizione su di essa può essere montata.

Utilizzando df -hho ottenuto che la dimensione dell'unità sia 1000204886016 byte (unità da 1 TB).

Inizialmente ho provato:

sudo dd if=/dev/sdb of=/dev/sdd status=progress

Tuttavia, ciò è rallentato fino a diventare una scansione dopo circa 300 GB e alla fine non è riuscito a causa di un errore di lettura. Ho deciso di provare a copiarlo in blocchi da 10 GB. Ho calcolato che la lettura di 10 GB con una dimensione di blocco di 128 kByte richiede la copia di 78125 blocchi.

Per fare questo sto usando:

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=n

ddsegnalava che ogni volta venivano trasferiti 10240000000 byte. Per calcolare il valore di ricerca per ogni iterazione ho aggregato i byte trasferiti e ho sottratto 1 GB per assicurarmi che ci fosse una certa sovrapposizione. La sequenza risultante è:

seek=0
seek=9240000000
seek=18480000000
seek=27720000000
seek=36960000000
...
seek=1071840000000

Li ho scritti in uno script di shell con comandi dd discreti e l'ho eseguito. Ho lasciato l'ultima iterazione libera di copiare tutti i dati necessari.

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=0
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=9240000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=18480000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=27720000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=36960000000
    ...
sudo dd if=/dev/sdb of=/dev/sdd bs=128k status=progress oflag=seek_bytes seek=1071840000000

Sarebbe dovuto andare ben oltre la fine del disco per quell'ultima iterazione, tuttavia è andato avanti. Il clone si monta, ma è chiaramente danneggiato e manca di dati.

  1. C'è qualcosa che non va nella mia matematica o negli argomenti con cui ho usato dd?
  2. C'è un modo migliore per scrivere un comando "dd" per ottenere i dati in blocchi da 10 GB?

Risposte

3 thatotherguy Aug 18 2020 at 02:31

Il problema è che stai assumendo che seekprenda un valore di byte, quando in realtà richiede un conteggio di blocchi. Si deve usare seek=0, 78125, 156250, etc.

Tuttavia, puoi semplificarlo molto eliminando dd:

split -b 10G < /dev/sdd
3 roaima Aug 18 2020 at 06:36

Sto cercando di utilizzare dd per clonare un disco rigido che ho riparato

Non farlo.

Usa ddrescueinvece, che gestisce bene i blocchi illeggibili e altri errori multimediali.

2 alphasierra Aug 21 2020 at 03:06

Ho scoperto che il motivo per cui la mia soluzione non è riuscita era il fraintendimento di ciò che faceva il flag di ricerca. Stava solo spostando la posizione di scrittura sull'unità di output. Quindi lo script stava semplicemente copiando i primi 10 GB più e più volte sull'output. Non raggiungerebbe mai la fine del dispositivo.

Per spostare l'input è necessario utilizzare anche il flag di salto:

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress skip=n seek=n

L'impostazione oflag=seek_bytese iflag=skip_bytesconsentirà di eseguire la matematica in byte anziché in blocchi.

Tuttavia, le opzioni presentate da roaima (usa ddrescue) e da quell'altro ragazzo ( split -b 10G < /dev/sdd) sono un modo migliore per recuperare unità danneggiate ed eseguire rispettivamente trasferimenti segmentati.