Ich möchte eine Datei absichtlich beschädigen, um die Behauptungen zu testen , dass btrfs sich selbst heilen kann . In dem Artikel geht es darum, das Dateisystem zu entfernen, ein Foto zu beschädigen, indem ein einzelnes Bit "umgedreht" und dann wieder angehängt wird. In älteren Dateisystemen wäre dies nur beschädigt, aber es soll sich in btrfs selbst beheben. Theoretisch ist das sinnvoll, aber ich möchte es unbedingt testen.
Das Problem ist, dass der Artikel nicht erklärt, wie man das macht.
Wie gehe ich vor, um ein einzelnes Bit in einem bestimmten Teil eines Dateisystems zu ändern?
Ich möchte auch darauf hinweisen , dass dies muss auf einem Offline - Dateisystem durchgeführt werden , so dass Btrfs nicht meine Schreib als intentionale sehen.
Bearbeiten: Während die Frage (und Diskussion) viel über btrfs spricht, würde ich gerne wissen, ob es dateisystemunabhängige Methoden gibt, um diese Art von Beschädigung zu implementieren (damit sie über verschiedene RAID-Typen / Controller / usw. hinweg verglichen werden können).
quelle
filefrag -v
von herausfinden, wo sich eine Datei genau befindet.Antworten:
Ich bin kein Experte, aber das
btrfs-progs
Paket enthält tatsächlich ein spezielles Tool, obwohl Sie möglicherweise aus dem Quellcode erstellen müssen. In jedem Fall sollten Sie nach der Installation oder Erstellungbtrfs-progs
das Tool verwenden könnenbtrfs-corrupt-block
, das von den btrfs-Entwicklern zum Testen des Dateisystems verwendet wird.Wie ich bereits sagte, hatte ich nicht viel Zeit, um mit btrfs herumzuspielen, daher kenne ich die genaue Verwendung dieses Tools nicht. Damit sollten Sie jedoch in der Lage sein, ein Offlinedateisystem zu beschädigen, das beim Lesen der beschädigten Datei behoben wird (vorausgesetzt, Sie haben RAID oder etwas anderes eingerichtet, damit eine andere Kopie verwendet werden kann).
quelle
btrfs-corrupt-block
tatsächlich ein echter Test und kein "Trick" der btrfs-Entwickler ist, sollte dies genau in die Rechnung passen.btrfs-corrupt-block
wird von den Entwicklern verwendet, also wäre es nicht sehr nützlich, wenn es ein Trick wäre :)btrfs-corrupt-block
kein aufrichtiger Test ist, da dies sehr schnell von jemandem herausgefunden werden würde, der an der Quelle herumstochert und als negative PR gegen Oracle verwendet wird (zumindest; ebenso wie alle anderen BTRFS-Entwickler / Mitwirkenden). Es war nur ein kurzer Kommentar.Ermitteln Sie den Wert eines einzelnen Sektors auf dem Blockgerät (z. B.
/dev/sda1
) mit einem Versatz von 1 Million Sektoren (nur ein Beispiel):Dieser willkürlich gewählte Versatz von 1M * 512 Bytes soll nur sicherstellen, dass Sie sich nicht im Metadatenteil des Dateisystems befinden und sich tatsächlich in einem Sektor befinden, der Daten enthält.
Bearbeiten Sie die Rohdaten des Sektors, indem Sie den Inhalt mit einem Hex-Editor ändern. Siehe zum Beispiel Brauchen Sie einen guten Hex-Editor für Linux .
Setzen Sie den Sektor mit den umgekehrten Argumenten
if
und wieder auf das Laufwerkof
:quelle
@Oli - hi, ich bin Jim Salter, der Typ, der den Artikel tatsächlich geschrieben hat. Ich arbeitete mit einer virtuellen Maschine, was die Sache einfacher machte. Ich habe mit einer JPEG-Datei begonnen und sie in einem Hex-Editor geöffnet. Das besondere, das ich verwendet habe, war Bless, das Sie in Ubuntu mit einem einfachen apt-get install bless installieren können .
Nachdem ich das JPEG in Bless geöffnet hatte, blätterte ich ein paar Mal nach unten, um mich mit dem "Fleisch" des JPEG vertraut zu machen. Dann wurden nur Daten im Wert von etwa fünfzig Bytes hervorgehoben und kopiert und in einen Texteditor eingefügt (in meinem Fall gEdit). Das gab mir etwas zu suchen.
Jetzt habe ich das JPEG in jedem Array auf der VM gespeichert. Der Speicher hinter den Arrays bestand aus einer Reihe von .qcow2-Dateien. Sobald ich das JPEG in den Arrays gespeichert hatte, konnte ich die mit jedem Array verknüpften .qcow2-Dateien in Bless laden und sie - sie waren nicht sehr groß, da es sich nur um das JPEG und einige Metadaten handelte - nach diesem 50-Byte-Muster durchsuchen Ich hatte aus dem JPEG hervorgehoben und kopiert. Voila, ich hatte den Block zu korrumpieren! Zu diesem Zeitpunkt konnte ich einzelne Bytes des JPEGs, wie sie auf der virtuellen Festplatte der VM gespeichert sind, mit Bless manuell bearbeiten - und zwar auf genau dieselbe Weise für jedes Array.
Der einzige Nachteil ist, dass ich bei dem im Artikel getesteten RAID5-Array sicherstellen musste, dass ich die tatsächliche Kopie der Daten im Streifen bearbeitet habe und nicht die Parität für den Streifen selbst - es war ein kleines Bild auf einem Andernfalls ist das Array leer, sodass im FOLLOWING-Block im Stripe keine Daten vorhanden sind, sodass der Paritätsblock die Daten enthält, die nicht vom Datenblock geändert wurden. Wenn ich versehentlich den Paritätsblock anstelle des Datenblocks bearbeitet hätte, wäre das Bild unverändert angezeigt worden.
Eine letzte Anmerkung: Sie BRAUCHEN keine virtuellen Maschinen, um dies zu tun. Mit Bare Metal können Sie die gleichen Dinge auf die gleiche Weise tun. Es wäre nur eine größere Belastung, weil Sie mit ganzen Raw-Laufwerken anstatt mit netten kleinen .qcow2-Dateien arbeiten müssten und entweder die Laufwerke ziehen und sie in einen anderen Computer stecken müssten, oder Starten Sie eine Live-Umgebung (oder eine alternative Umgebung), um sich mit ihnen herumzuschlagen. (Ich habe das Heilen von ZFS-Daten genau auf diese Weise getestet, aber auf echten Bare-Metal-Rechnern vor sieben Jahren, als ich mich zum ersten Mal für Dateisysteme der nächsten Generation interessierte.)
Hoffe das hilft!
quelle
Sie könnten ein kleines Programm ausprobieren, das mit der geöffneten Datei funktioniert.
FIBMAP
ioctl(2)
Durch schnelle Websuche fand ich diesen Blog-Beitrag http://smackerelofopinion.blogspot.tw/2009/06/fibmap-ioctl-file-system-block-number.html , der genau beschreibt, wie das geht - es wird sogar einen Link geben zu einem Beispielprogramm, das Sie selbst kompilieren und ausführen können.
Genau so wird
hdparm --fibmap
(von @falconer erwähnt) implementiert.Nachdem Sie die Blocknummern gefunden haben, können Sie
dd
die Datei mit Gongfu ändern, wie in @gertvdijk skizziert. Oder Sie können dasfibmap.c
obige Programm einfach ändern , um die Bitumkehrung für Sie durchzuführen, indem Sie direkt in die Gerätedatei schreiben und dabei die Dateisystemschicht umgehen (drei Parameter für das Programm: 1. den Pfad zur Datei, 2. die Gerätedatei, die die Datei enthält System, 3. Offset und Bit, die Sie ändern möchten).( Disclaimer: Ich habe nicht getestet und kann nicht garantiert werden, dass die
FIBMAP
ioctl(2)
für eine Datei im Loopback - Device oder Btrfs - Dateisystem arbeiten, aber ich würde es tut stark erwarte ich bin. Erratenhdparm
des Gerätetyp überprüfen , bevor die Durchführungioctl(2)
auf der Datei und ist daher Versagen.)quelle
gibt Ihnen die LBAs, in denen sich die Datei befindet. Danach können Sie die Antwort von @gertvdijk verwenden.
quelle
0,39: device not found in /dev
Entweder weil es btrfs ist oder (wahrscheinlicher) weil ich es für Loopback-Dateien verwende. Ich werde versuchen, dies mit einer "richtigen" VM zu erledigen.hdparm
funktioniert auf jedem Dateisystem, aber vielleicht ist es nicht so.