So debuggen Sie: tar: Ein einzelner Nullblock


8

Wie debugge ich das? Dieses Problem ist in den letzten Tagen plötzlich aufgetreten. Alle Backups einer Website sind beschädigt.

Wenn das Backup nur so belassen wird tar, gibt es keine Probleme, aber sobald der Teer komprimiert ist gzoder xzich sie nicht mehr dekomprimieren kann.

Es gibt viel freie Festplatte

Local disk space    2.68 TB total / 2.26 TB free / 432.46 GB used

Error

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 heißt es Skipping to next header? Das hat es noch nie gemacht. Bei einigen Dateien stimmt etwas nicht.

In den Verzeichnissen befinden sich ca. 15.000 PDF-, JPG- oder PNG-Dateien.

Befehl

pv $backup_file | tar -izxf - -C $import_dir

Es müssen einige 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 bekomme ich folgendes:

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

Wie kann ich herausfinden, welche Dateien tar.gz beschädigen? Ich möchte sie nur löschen.

aktualisieren

Habe jetzt alle Dateien auf einen anderen Server kopiert und ich habe genau das gleiche Problem. Ich kann alles tarieren und ohne Probleme extrahieren, aber sobald ich die Dateien komprimieren möchte, kann ich sie nicht dekomprimieren (gz / xz).


Hat sich ein Dateisystem während der Sicherung gefüllt? Irgendwelche Protokolle von der Sicherung?
Jeff Schaller

Haben Sie Prüfsummen der Dateien oder Dateien auf dem Sicherungslaufwerk? Ram Fehler?
Xen2050

4
Können Sie uns die vollständigen Tar-Befehle (+ Komprimierung) zeigen, mit denen .tar.gz erstellt wurde? und wie heißen sie? Und in dem Befehl extractino, den Sie anzeigen, fügen Sie v hinzu, damit angezeigt wird, welche Dateien extrahiert werden konnten. Auf diese Weise können Sie auch die Dateien ermitteln, die ebenfalls Fehler verursachen
Olivier Dulac,

1
Was passiert dann, wenn Sie tar -cf xxx.tar ... ohne Komprimierung ausgeführt werden gzip xxx.tar? Extrahiert dieser Tarball sauber? Ist pvProbleme verursacht? Was passiert , wenn Sie die Drop - pv ... | ...Leitungen und nur direkt laufen tar -cvzf xxx.tar.gz ...dann tar -xvzf xxx.tar ...?
Andrew Henle

1
Was ist der zugrunde liegende Dateisystemtyp? Was ist die O / S-Version und Größe und MD5-Summe der Binärdateien? Versuchen Sie, die Binärdateien mit und ohne absoluten Pfad aufzurufen pv.
MattBianco

Antworten:


7

Ihre Datei ist entweder abgeschnitten oder beschädigt, sodass xzdas Ende der Daten nicht erreicht werden kann. tarbeschwert sich, weil das Archiv in der Mitte stoppt, was logisch ist, da xzes nicht gelungen ist, die gesamten Daten zu lesen.

Führen Sie die folgenden Befehle aus, um zu überprü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 Sie sich catbeschweren, ist die Datei auf der Festplatte beschädigt und das Betriebssystem hat die Beschädigung festgestellt. Überprüfen Sie die Kernel-Protokolle auf weitere Informationen. Normalerweise muss die Festplatte an dieser Stelle ausgetauscht werden. Wenn Sie sich nur xzbeschweren, hat das Betriebssystem keine Beschädigung festgestellt, die Datei ist jedoch ungültig (entweder beschädigt oder abgeschnitten). In beiden Fällen können Sie diese Datei nicht wiederherstellen. Sie müssen es von Ihren Offline-Backups zurückholen.


Habe meine Frage aktualisiert. Wenn ich die unkomprimierten TAR-Dateien
teste, erhalte

1
@clarkk Dann wurden die Dateien beschädigt, bevor sie gespeichert wurden oder gespeichert wurden (aber unerkannte Fehler sind sehr unwahrscheinlich - bei Speicherfehlern catoder irgendetwas anderem würde gemeldet, dass ein Teil der Datei nicht lesbar ist). Die Dateien wurden möglicherweise abgeschnitten (z. B. weil die Festplatte beim Schreiben voll wurde).
Gilles 'SO - hör auf böse zu sein'

Wenn die Dateien beschädigt waren, bevor sie im Tarball gespeichert wurden. Wie kann ich dann die beschädigten Dateien erkennen?
Clarkk

Die beiden Befehle mit catund xzcatgeben keine Fehler zurück.
Clarkk

@clarkk Das tut es nicht? Das hat es in Ihrer ersten Frage getan. Das Problem könnte ein RAM-Fehler auf Ihrem Computer sein. Führen Sie einen Speichertest durch und schreiben Sie nichts von Ihrem Computer, wenn Sie dies vermeiden können.
Gilles 'SO - hör auf böse zu sein'

1

Ich sehe keine Erwähnung, wie die kaputten TAR-Dateien erstellt werden.

Sie sagen, es handelt sich um Backups von einer Website, aber die Probleme, die Sie anzeigen, treten alle beim Wiederherstellen / Entpacken auf. Dort (in der Quelle) müssen Sie also die Fehlerbehebung durchführen.

Wenn die Dateien nach dem Verschieben der Sicherung auf einen anderen Computer / Speicherort nicht dekomprimiert werden können, müssen sie entweder fehlerhaft erstellt oder beim Transport beschädigt werden.

So lokalisieren Sie die Fehlerquelle:

  • Manuelles Erstellen eines Backups auf dem Webserver (ohne pvund ohne -i)
  • Testen Sie das Backup manuell auf dem Webserver (ohne pvund ohne -i)

Wenn bisher keine Probleme gefunden wurden:

  • Kopieren Sie die Sicherung vom Webserver
  • Testen Sie die kopierte Sicherung auf dem Zielcomputer (ohne pvund ohne -i)

Wenn bisher keine Probleme gefunden wurden, erstellt das Sicherungsskript das Archiv nicht auf die gleiche Weise wie bei der manuellen Ausführung (und sollte wahrscheinlich so geändert werden, dass es manuell ausgeführt wird).

Stellen Sie außerdem sicher, dass Sie die absoluten Pfade aller beteiligten Befehle verwenden. Wenn Sie eine fehlerhafte $PATHund / oder $LD_LIBRARY_PATHVariable und einen Eindringling im System haben, verwenden Sie möglicherweise Trojaner-Binärdateien, die unbeabsichtigte Nebenwirkungen verursachen können.

Es können natürlich auch inkompatible tarVersionen beteiligt sein, es sei denn, beide Systeme sind Debian-Systeme. Sie können versuchen, den POSIX- Modus auf beiden Seiten zu erzwingen .


0

Sie verwenden die Flagge -i, die in ihrer langen Form ist --ignore-zeros. Aus diesem Grund beschwert sich tar nicht über die beschädigten Dateien. Wenn Sie also Ihre TAR-Datei debuggen möchten, entfernen -iSie einfach die Option, und Sie erhalten eine Liste der beschädigten Dateien.

Es gibt auch zwei andere Möglichkeiten, um beschädigte Dateien unter Unix zu finden (im Allgemeinen). Ich zitiere eine Antwort in einer anderen Frage.

rsync kann zum Kopieren von Verzeichnissen verwendet werden und kann die Kopie an dem Punkt neu starten, an dem sie beendet wurde, wenn ein Fehler dazu führt, dass rsync stirbt.

Mit der --dry-runOption von rsync können Sie sehen, was kopiert werden würde, ohne tatsächlich etwas zu kopieren. Die --statsund --progressOptionen wären auch nützlich. und --human-readableoder -hist leichter zu lesen.

z.B

rsync --dry-run -avh --stats --progress / path / to / src / / path / to / destination /

Ich bin nicht sicher, ob rsync unter Mac OS X standardmäßig installiert ist, aber ich habe es auf Macs verwendet, damit ich weiß, dass es definitiv verfügbar ist.

Für eine schnelle und schmutzige Überprüfung, 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 sowieso verworfen wird.

STDOUT wird nach / dev / null umgeleitet, sodass nur Fehler angezeigt werden.

Der einzige Grund, warum ich mich hier für grep entschieden habe, war die -RRekursionsoption. Es gibt viele andere Befehle, die hier anstelle von grep verwendet werden könnten, und noch mehr, wenn sie mit find verwendet werden.

Als Referenz: Beschädigte Dateien finden


0

Die Argumentation von @MattBianco ist die, der ich methodisch folgen würde, um dieses spezielle Problem zu lösen .

Null-Blöcke geben EOF an, dies hängt jedoch vom Blockierungsfaktor ab (der Standardwert ist eine kompilierte Konstante, normalerweise 20). Teers --compare| --diffscheinen implizit mit --ignore-zeros( -i) auszuführen .

In Anbetracht der zusätzliche Komplikation pv, ich vermute , tar -iverursachen Probleme für xz, bei der Suche tar Mann auf Faktor blockiert Ich würde vorschlagen , zuerst zu entfernen-i

Wenn das nicht hilft, ersetzen Sie durch:

--read-full-records --blocking-factor=300

Wenn Sie dies gerade lesen, nachdem Sie "tar: A lone zero block at N" gegoogelt haben und nichts weiterleiten , versuchen Sie es --ignore-zeros.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.