
Wie kann ich das debuggen? Dieses Problem ist in den letzten Tagen plötzlich aufgetreten. Alle Backups einer Website sind beschädigt.
Wenn das Backup einfach als belassen wird tar
, gibt es keine Probleme, aber sobald das Tar als komprimiert ist gz
oder xz
kann ich es nicht mehr entpacken.
Es gibt viel freien Speicherplatz
Local disk space 2.68 TB total / 2.26 TB free / 432.46 GB used
Fehler
tar: Skipping to next header[===============================> ] 39% ETA 0:01:14
tar: A lone zero block at 2291466===============================> ] 44% ETA 0:01:13
tar: Exiting with failure status due to previous errors
878MiB 0:00:58 [15.1MiB/s] [===================================> ] 44%
Und warum steht da Skipping to next header
? Das ist noch nie passiert. Mit einigen Dateien stimmt etwas ganz und gar nicht.
In den Verzeichnissen befinden sich etwa 15.000 PDF-, JPG- oder PNG-Dateien.
Befehl
pv $backup_file | tar -izxf - -C $import_dir
Es müssen Daten vorhanden sein, die die Komprimierung beschädigen.
Ich habe auch versucht, den Zustand der Festplatte folgendermaßen zu überprüfen:
# getting the drives
lsblk -dpno name
smartctl -H /dev/sda
smartctl -H /dev/sdb
Auf beiden Laufwerken erhalte ich Folgendes:
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
Wie kann ich herausfinden, welche Dateien das Tar.gz beschädigen? Ich möchte sie einfach löschen.
aktualisieren
Habe nun alle Dateien auf einen anderen Server kopiert und habe genau das gleiche Problem. Ich kann alles problemlos tarnen und extrahieren, aber sobald ich die Dateien komprimieren möchte, kann ich sie nicht dekomprimieren (gz/xz).
Antwort1
Ihre Datei ist entweder abgeschnitten oder beschädigt, sodass xz
Sie nicht ans Ende der Daten gelangen. tar
beschwert sich, weil das Archiv in der Mitte stoppt, was logisch ist, da xz
es nicht gelungen ist, die gesamten Daten zu lesen.
Führen Sie die folgenden Befehle aus, um zu prüfen, wo das Problem liegt:
cat /var/www/bak/db/2017-05-20-1200_mysql.tar.xz >/dev/null
xzcat /var/www/bak/db/2017-05-20-1200_mysql.tar.xz >/dev/null
Wenn cat
es eine Fehlermeldung gibt, ist die Datei auf der Festplatte beschädigt und das Betriebssystem hat die Beschädigung erkannt. Weitere Informationen finden Sie in den Kernel-Protokollen. Normalerweise muss die Festplatte an diesem Punkt ausgetauscht werden. Wenn es nur xz
eine Fehlermeldung gibt, hat das Betriebssystem keine Beschädigung erkannt, aber die Datei ist trotzdem ungültig (entweder beschädigt oder abgeschnitten). In beiden Fällen können Sie diese Datei nicht wiederherstellen. Sie müssen sie aus Ihren Offline-Backups zurückholen.
Antwort2
Ich sehe keine Erwähnung, wie die beschädigten TAR-Dateien erstellt werden?
Sie sagen, es handelt sich um Backups von einer Website, aber die von Ihnen angezeigten Probleme treten alle beim Wiederherstellen/Entpacken auf, Sie müssen also dort (an der Quelle) Ihre Fehlerbehebungsbemühungen ansetzen.
Wenn die Dateien nach dem Verschieben des Backups auf einen anderen Rechner/Standort nicht dekomprimiert werden können, müssen sie entweder fehlerhaft erstellt oder beim Transport beschädigt worden sein.
So finden Sie die Fehlerquelle:
- manuelles Erstellen eines Backups auf dem Webserver (mit
pv
und ohne-i
) - manuelles Testen des Backups auf dem Webserver (mit
pv
und ohne-i
)
Wenn bisher keine Probleme gefunden wurden:
- Kopieren Sie das Backup vom Webserver
- Testen des kopierten Backups auf der Zielmaschine (mit
pv
und ohne-i
)
Wenn bisher keine Probleme gefunden wurden, erstellt das Sicherungsskript das Archiv nicht auf dieselbe Weise wie beim manuellen Erstellen (und sollte wahrscheinlich so geändert werden, dass es das tut, was Sie manuell erstellt haben).
Stellen Sie außerdem sicher, dass Sie die absoluten Pfade aller beteiligten Befehle verwenden. Wenn Sie eine fehlerhafte $PATH
und/oder $LD_LIBRARY_PATH
Variable und einen Eindringling im System haben, verwenden Sie möglicherweise mit einem Trojaner infizierte Binärdateien, die unbeabsichtigte Nebeneffekte verursachen können.
Es könnten natürlich auch inkompatible tar
Versionen beteiligt sein, es sei denn, beide Systeme sind Debian. Sie könnten versuchen,POSIX-Modus auf beiden Seiten.
Antwort3
Sie verwenden das Flag -i
, das in seiner Langform lautet --ignore-zeros
. Aus diesem Grund beschwert sich Tar nicht über beschädigte Dateien. Wenn Sie also Ihre Tar-Datei debuggen möchten, entfernen Sie einfach die -i
Option und Sie erhalten die Liste der beschädigten Dateien.
Es gibt auch zwei andere Möglichkeiten, beschädigte Dateien unter Unix (im Allgemeinen) zu finden. Ich zitiere eine Antwort aus einer anderen Frage.
Mit rsync können Verzeichnisse kopiert werden. Wenn rsync durch einen Fehler abstürzt, kann der Kopiervorgang an der Stelle neu gestartet werden, an der er beendet wurde.
Mit der Option von rsync
--dry-run
können Sie sehen, was kopiert werden würde, ohne tatsächlich etwas zu kopieren. Die Optionen--stats
und--progress
wären ebenfalls nützlich. und--human-readable
oder-h
ist leichter zu lesen.z.B
rsync --dry-run -avh --stats --progress /Pfad/zur/Quelle/ /Pfad/zum/Ziel/
Ich bin nicht sicher, ob rsync unter Mac OS X standardmäßig installiert ist, aber ich habe es auf Macs verwendet, also weiß ich, dass es definitiv verfügbar ist.
Um schnell und einfach zu prüfen, ob Dateien in einem Unterverzeichnis gelesen werden können oder nicht, können Sie verwenden
grep -r XXX /path/to/directory/ > /dev/null
. Der Such-Regexp spielt keine Rolle, da die Ausgabe ohnehin verworfen wird.STDOUT wird zu /dev/null umgeleitet, daher werden Ihnen nur Fehler angezeigt.
Der einzige Grund, warum ich hier grep gewählt habe, war die
-R
Rekursionsoption. Es gibt viele andere Befehle, die man hier anstelle von grep verwenden könnte, und noch mehr, wenn man sie mit find verwendet.
Als Referenz:Beschädigte Dateien finden
Antwort4
Die Argumentation in der Antwort von @MattBianco ist das, was ich methodisch verfolgen würde, umlösendieses spezielle Problem.
Auf Null gesetzte Blöcke zeigen EOF an, aber das hängt vom Blockierungsfaktor ab (der Standardwert ist eine kompilierte Konstante, normalerweise 20). Tars --compare
| --diff
scheint implizit mit --ignore-zeros
( -i
) ausgeführt zu werden.
Angesichts der zusätzlichen Komplikation von pv
, die meiner Meinung nach tar -i
Probleme verursacht xz
, wenn man sich ansiehtTeermann über BlockierungsfaktorIch würde vorschlagen, zuerst zu entfernen-i
Wenn das nicht hilft, ersetzen Sie es durch:
--read-full-records --blocking-factor=300
Wenn Sie dies gerade lesen, nachdem Sie gegoogelt haben"tar: Ein einsamer Nullblock bei N", und nichts weiterleiten, dann versuchen Sie es mit --ignore-zeros
.