Ich habe mit der Wiederherstellung begonnen, /dev/sdq1
als ich noch nicht mit der Festplattenwiederherstellung vertraut war. Nun, ich war vorsichtig genug und konnte in etwa 500 Durchläufen 85 % wiederherstellen.
Danach habe ich herausgefunden, dass ich /dev/sdq
(ohne 1) Inhalte tatsächlich brauche, um sie nach .vhd
mit zu konvertieren VBoxManage convertdd z:\fixed.vdi d:\disc.vhd --format VHD
und danach kann ich das .vhd
in Windows anhängen und lesen, weil VBoxManage
nicht unterstütztPartitionKonvertierung und erfordertvolle FestplatteRohdaten als Eingabe. Das bedeutet, ich hätte ddrescue mit /dev/sdq
und nicht mit starten sollen /dev/sdq1
.
Ich habe mit fdisk herausgefunden, dass der Inhalt /dev/sdq1
bei 32256 Byte beginnt /dev/sdq
. Ich dd
habe diese Bytes am Anfang in eine separate Datei eingefügt begin.raw
und führe sie jetzt aus, cat ./rescue/begin.raw ./rescue/fixed.vdi > ./sdq.raw
um sie den wiederhergestellten Daten von voranzustellen /dev/sdq1
.
ddrescue
Gibt es eine einfachere Möglichkeit, mit dem alten Rettungsprotokoll neue Läufe fortzusetzen ./sdq.raw
? Ich bin nicht sicher, ob das --output-position
hier passt. (Und wie funktioniert es genau? – Aus den Dokumenten geht nicht hervor, welchen output-position
Einfluss es auf die Interpretation des Rettungsprotokolls hat.) Ich möchte nicht jedes Mal 500 GB kopieren, wenn ich meine abrufen möchte ./sdq.raw
.
Unten ist mein Skript, das ich zur Datenwiederherstellung verwende. Manchmal musste ich die Festplatte physisch trennen, da mein USB-Hub kein vollständiges Ausschalten seiner Ports unterstützt.
#!/bin/bash
function run {
ddrescue -T 5s --max-error-rate=10MB --skip-size=512KiB,10MiB \
--direct -vv -P /dev/sdq1 ./fixed.vdi ./rescue.log
}
while true; do
run &
JOBPID=$!
while true; do
dmesg | tail -1 | grep 'reset high-speed USB device number' > /dev/null
CODE=$?
if [ $CODE -eq 0 ]; then
break
fi
kill -0 "$JOBPID" > /dev/null
CODE=$?
if [ $CODE -ne 0 ]; then
break
fi
sleep 3
done
./uhubctl -i -a 2 -p 1 -l 1
wait $JOBPID
echo "MSG: waiting for re-attach"
until dmesg | tail -1 | grep 'Attached SCSI disk'; do sleep 1; done
sleep 5
done
Danke!
PS: Ich habe einen Logitech USB 2.0-Hub, aber dieser unterstützt auch kein vollständiges Ausschalten der Ports uhubctl
. Vielleicht gibt es ein anderes Tool, das damit funktioniert?
Antwort1
Unabhängig davon, ob --output-position
es die richtige ddrescue
Option ist oder nicht,Ich stelle die allgemeine Linux-Methode zum Verketten zweier Dateien vor, ohne das Ergebnis auf die Festplatte zu schreiben.
Das Tool heißt dmsetup
. Es ist im dmsetup
Paket in meinem Kubuntu enthalten, dasselbe gilt für Debian.
Wir haben begin.raw
die Größe 32256 B
und fixed.vdi
entsprechend der Partition der Größe <X>
(ungefähr 500 GB
, der genaue Wert ist mir unbekannt). Wir müssen die Größen in 512 B
Einheiten ausdrücken; die Ergebnisse sind 63
bzw. <Y>
. Im folgenden Code müssen Sie <Y>
durch den berechneten Wert ersetzen, kopieren Sie ihn also nicht gedankenlos.
# Creating loop devices and storing their names.
BEGIN_LOOP=$(sudo losetup -f --show begin.raw)
FIXED_LOOP=$(sudo losetup -f --show fixed.vdi)
# Creating a map to feed to `dmsetup` later.
# !!! REPLACE <Y> WITH THE PROPER VALUE !!!
echo "0 63 linear $BEGIN_LOOP 0" > whole.map
echo "63 <Y> linear $FIXED_LOOP 0" >> whole.map
# Creating a concatenated "file".
sudo dmsetup create whole.raw < whole.map
ln -s /dev/mapper/whole.raw
Sie können jetzt whole.raw
als Image der gesamten Festplatte verwenden ddrescue
und dabei weiterhin mit arbeiten fixed.vdi
. Jeder E/A-Vorgang auf whole.raw
wird auf begin.raw
und abgebildet fixed.vdi
.
Beachten Sie, dass diese Zuordnung nicht dauerhaft ist. Nach einem Neustart müssen Sie den gesamten Vorgang mit Ausnahme wiederholen ln -s
.
Um dieses Setup ohne Neustart zu bereinigen, rufen Sie Folgendes auf:
rm whole.raw # removes the symlink
sudo dmsetup remove whole.raw # removes /dev/mapper/whole.raw
sudo losetup -d $FIXED_LOOP # removes /dev/loop1 (or so)
sudo losetup -d $BEGIN_LOOP # removes /dev/loop0 (or so)
Wenn Sie die Variablen irgendwie verlieren (z. B. durch Schließen des Terminalemulators), untersuchen Sie die Ausgabe losetup -a
und gehen Sie sudo losetup -d /dev/loopX
entsprechend vor.