Wie ändere ich ddrescue von „/dev/sdq1“ auf „/dev/sdq“, wenn ich bereits Daten von „/dev/sdq1“ gesichert habe?

Wie ändere ich ddrescue von „/dev/sdq1“ auf „/dev/sdq“, wenn ich bereits Daten von „/dev/sdq1“ gesichert habe?

Ich habe mit der Wiederherstellung begonnen, /dev/sdq1als 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 .vhdmit zu konvertieren VBoxManage convertdd z:\fixed.vdi d:\disc.vhd --format VHDund danach kann ich das .vhdin Windows anhängen und lesen, weil VBoxManagenicht unterstütztPartitionKonvertierung und erfordertvolle FestplatteRohdaten als Eingabe. Das bedeutet, ich hätte ddrescue mit /dev/sdqund nicht mit starten sollen /dev/sdq1.

Ich habe mit fdisk herausgefunden, dass der Inhalt /dev/sdq1bei 32256 Byte beginnt /dev/sdq. Ich ddhabe diese Bytes am Anfang in eine separate Datei eingefügt begin.rawund führe sie jetzt aus, cat ./rescue/begin.raw ./rescue/fixed.vdi > ./sdq.rawum sie den wiederhergestellten Daten von voranzustellen /dev/sdq1.

ddrescueGibt es eine einfachere Möglichkeit, mit dem alten Rettungsprotokoll neue Läufe fortzusetzen ./sdq.raw? Ich bin nicht sicher, ob das --output-positionhier passt. (Und wie funktioniert es genau? – Aus den Dokumenten geht nicht hervor, welchen output-positionEinfluss 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-positiones die richtige ddrescueOption 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 dmsetupPaket in meinem Kubuntu enthalten, dasselbe gilt für Debian.

Wir haben begin.rawdie Größe 32256 Bund fixed.vdientsprechend der Partition der Größe <X>(ungefähr 500 GB, der genaue Wert ist mir unbekannt). Wir müssen die Größen in 512 BEinheiten ausdrücken; die Ergebnisse sind 63bzw. <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.rawals Image der gesamten Festplatte verwenden ddrescueund dabei weiterhin mit arbeiten fixed.vdi. Jeder E/A-Vorgang auf whole.rawwird auf begin.rawund 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 -aund gehen Sie sudo losetup -d /dev/loopXentsprechend vor.

verwandte Informationen