teilweise überschriebenes Band aus tar -c wiederherstellen

teilweise überschriebenes Band aus tar -c wiederherstellen

Ich habe ein Problem. Ich sollte tar -x ausführen, um eine Tar-Datei von einem Band wiederherzustellen, aber ich habe „c“ gedrückt und vergessen, das Band schreibgeschützt zu machen. Die Datei war an FSF-Position 23, aber das Band hatte 27 Dateien. Ich weiß, dass Datei 23 verloren ist, aber da ich Strg+C gedrückt habe, um den Tar-Befehl abzubrechen, kann ich immer noch hoffen, die anderen Tar-Dateien irgendwie wiederherzustellen? Ich habe FSF über Datei 23 hinaus versucht und bekomme nur einen Eingabe-/Ausgabefehler.

Ich dachte, ich könnte vielleicht mit dd einen Dump von Datei 23 machen und dann diese Datei abrufen und ein Tool zur Wiederherstellung von Signaturdateien wie Photorec verwenden. Ist das machbar?

Antwort1

Diese Frage ist vollständig gerätespezifisch und hängt von der Laufwerkshardware und dem zugehörigen Treiber ab.

Wenn Sie Bandoperationen verpfuschen (z. B. einen Schreibvorgang unterbrechen), können Sie leicht ein nicht lesbares Symbol oder sogar einen nicht lesbaren Abschnitt auf dem Band erstellen. Sie haben bereits gezeigt, dass Ihr Treiber nicht in der Lage ist, über den Müll hinaus zu lesen, den Ihr abgebrochener Schreibvorgang hinterlassen hat, da er mt fsfeinfach ein ioctl ausgibt, das den Treiber auffordert, einfach zur nächsten EOF-Markierung zu springen. Da der Treiber EIO zurückgibt, werden Sie ihn wahrscheinlich nicht dazu bringen können, es besser zu machen.

Je nachdem, wie wichtig dieses Band für Sie ist, besteht der nächste Schritt wahrscheinlich darin, es an eine forensische Wiederherstellungsfirma zu senden, die sich mit der Kunst der Magnetbänder auskennt. Ihre Daten sind wahrscheinlich noch da, aber die meisten Fahrer wissen nicht, wie sie mit dem von Ihnen verursachten Markierungsdefekt umgehen sollen.

Antwort2

Versuchen Sie, die Lesevorgänge vom anderen Ende des Bandes aus durchzuführen:

#! /bin/sh
set -e
TAPE=/dev/... # change me, you must use a non-rewinding device.
export TAPE

# Wind to the end of the tape.
mt eod

# Rewind to the beginning of the last file and then list it.
# It's possible I misunderstood the way end-of-data is signaled
# on the tape and if so perhaps this command should be mt bsfm 2,
# in which case you can just combine this with the loop below.
# For context here you can look at the entry for MT_ST_TWO_FM
# in "man st".
mt bsfm 1
tar -f "$TAPE" -t

# We just read a file so we're  going to need to rewind over it
# and then rewind more to get to the beginning of the previous file.
# I forget whether tar leaves the tape at EOF or just after it. I'm
# assuming here just after, but if it leaves the tape at the EOF
# mark, the 2 on the next line would need to be a 1.
while mt bsfm 2 
do
  tar -f "$TAPE" -t
done

Das würdeListeder Inhalt aller Tar-Archive, die wir vom Ende des Bandes aus erreichen können. Natürlich gibt es auch Archive am Anfang des Bandes, aber diese kann man sich viel einfacher auflisten lassen:

while tar -f "$TAPE" -t
do
  true
done

Der mt eodVorgang fordert den Treiber auf, an das Bandende zu spulen, indem er an Dateimarkierungen vorbeispult. Dies sollte einwandfrei funktionieren, wenn Sie zum Unterbrechen des Bandschreibens lediglich den Tar-Prozess mit SIGINT (Strg-C) beendet haben. Aus Sicht des SCSI-Bandtreibers sieht dies lediglich so aus, als ob das Userspace-Programm den Dateideskriptor geschlossen hätte, sodass an dieser Stelle eine EOF-Markierung vorhanden sein sollte, aber kein tatsächlicher „Schaden“.

Wenn hier jedoch etwas anderes passiert und/oder der obige Ansatz nicht funktioniert, können Sie möglicherweise ein anderes Ergebnis erzielen, indem Sie den Bandtreiber auffordern, bis zum Ende des Mediums zu speichern, indem Sie einen SCSI-Befehl an das Bandlaufwerk senden und es dazu auffordern. Dies ist nicht dasselbe wie das Standardverhalten (das darin besteht, dass der Bandtreiber Dateien vorwärts speichert, damit er die aktuelle Dateinummer verfolgen kann (um in Vorgängen wie mt statusund zu berichten mt tell). Um dies zu konfigurieren, würden Sie ioctl verwenden MT_ST_FAST_EOM. Ich weiß nicht, wie man das über die Befehlszeile einstellt, Sie müssen möglicherweise ein kleines C-Programm erstellen, etwa so:

#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/mtio.h>

int main(int argc, char *argv[]) {
  (void)argc;
  (void)argv;
  struct mtop mt_cmd;
  mt_cmd.mt_op = MTSETDRVBUFFER;
  mt_cmd.mt_count = MT_ST_BOOLEANS | MT_ST_FAST_MTEOM;
  if (0 != ioctl(1, MTIOCTOP, &mt_cmd)) {
    perror("MTSETDRVBUFFER on stdout");
    return 1;
  }
  return 0;
}

Um Standardtext zu sparen, bin ich davon ausgegangen, dass das Bandgerät für dieses Programm bereits auf stdout geöffnet ist (d. h. Sie führen es folgendermaßen aus: ./myprog >"$TAPE").

Ich habe diesen Code nicht getestet, bitte verwenden Sie ihn mit Vorsicht. Wenn er Ihren Kindern sagt, dass sie einen Welpen haben können, geben Sie mir nicht die Schuld. Sie können ein anderes C-Programm verwenden, um die Einstellung rückgängig zu machen, aber Sie können den Computer genauso gut einfach neu starten, wenn die fortgesetzte Verfügbarkeit des Dienstes kein Problem darstellt.

verwandte Informationen