Die übliche Antwort darauf ist, die ISO-Datei zu entpacken, zu ändern und erneut zu packen. Es sieht so aus, als wäre "ISO Master", wie in der Antwort von dv3500ea erwähnt, ein gutes Frontend, um dies zu tun.
Ob:
- Sie haben nicht genug Platz dafür
- Sie möchten nur eine chirurgische Modifikation vornehmen, anstatt das Ganze neu zu schreiben
- Sie möchten ein Speichergerät ändern, das ein isofs-Dateisystem (aka iso9660) enthält, ohne das gesamte Gerät zu kopieren, oder
- wenn Sie denken, dass dieses Auspacken / Umpacken einfach nicht hackig genug ist
Dann ist diese Antwort für Sie!
Zusammenfassend werden wir eine vorhandene Datei im isofs-Dateisystem durch unsere gewünschte Datei ersetzen. Unsere gewünschte Datei muss kleiner sein als die vorhandene (Ziel-) Datei, und abschließende Whitespaces (oder Garbages) müssen akzeptabel sein. Dies erfordert eigentlich nur zwei Befehle, aber seien Sie vorsichtig: Ein Tippfehler kann das Zieldateisystem vollständig zerstören oder sogar die Quelldatei überschreiben. Backups sind dein Freund!
In meinem Fall wollte ich ein Skript in einem Live-Boot speichern, damit ich es nicht jedes Mal neu eingeben muss. Das Skript ist auf script.py
und mein Ziel (ein USB-Stick) ist auf /dev/sdc
. Die Größe des Skripts beträgt 202 Bytes. In unserem ersten Schritt suchen wir eine Datei, die größer als 202 Bytes ist, damit wir sie überschreiben können. Nachdem /mnt
ich es bei gemountet hatte , fand ich eine passende Datei bei /mnt/info.txt
.
Wir können info.txt
den Mountpoint nicht einfach überschreiben , er wird sich beschweren, dass es sich um ein schreibgeschütztes Dateisystem handelt. Wir sind Root, also zeigen wir ihnen, was das bedeutet! Wir müssen herausfinden, wo info.txt
sich das Dateisystem befindet. Hier finden Sie einige Zeichenfolge, die (wahrscheinlich) ist einzigartig info.txt
, zum Beispiel This is the official distribution CD of X.
, und suchen Sie sie auf der Festplatte:
$ sudo strings -a -t d /dev/sdc | grep 'CD of X.'
2573588480 This is the official distribution CD of X. See INSTALL for how to [...]
Alternativ kann dies auch mit grep erfolgen, was viel schneller ist, aber dann müssen Sie es von Anfang an fest: $ sudo grep -oba 'This is ...' /dev/sdc
.
Jetzt, wo wir wissen, wo es ist, müssen wir nur diese Bytes durch unsere Datei ersetzen:
$ sudo dd if=script.py of=/dev/sdc conv=notrunc bs=1 seek=2573588480 count=202
Diese Linie:
- kopiert Bytes von der Eingabedatei (
if
) in die Ausgabedatei ( of
), und es ist egal, dass die Ausgabedatei tatsächlich ein Gerät ist, da "alles eine Datei ist".
conv=notrunc
weist es an, die Ausgabedatei nicht zu kürzen, da wir nur einige Bytes überschreiben möchten und die Datei ab einem bestimmten Punkt nicht mehr überschreiben möchten.
bs=1
Setzt die Blockgröße auf 1. Normalerweise möchten Sie eine Blockgröße von 4 KB oder höher, aber dies vermeidet, dass (Inline-) Berechnungen durchgeführt werden müssen, und lässt uns die Position genau auf das Byte festlegen.
seek=N
sucht bis zu einem gewissen Punkt in der Ausgabedatei (beachten Sie, dass seek=N
von dem unterscheidet, skip=N
da skip
springt aus der Eingabedatei Bytes!). Wir legen natürlich fest, wo sich der Zieltext befindet.
count=N
Kopieren Sie nur so viele Bytes. Ich denke, dies kann weggelassen werden, da es das Ende der Eingabedatei bemerkt, aber ich habe es nur zur Sicherheit belassen.
Und voila, die Datei wird überschrieben!
Aber warten Sie, die Zieldatei war größer als unser Skript. Auf dem USB-Stick lautet die Datei nun etwa "while do if run () blah; blah (); yright 2007 X Inc.". Es gibt Müll. Zwei Möglichkeiten, dies zu beheben: Verlängern Sie die Eingabedatei (fügen Sie Leerzeichen hinzu) oder fügen Sie am Ende ein Kommentarsymbol hinzu. Beachten Sie, dass viele Redakteure eine neue Zeile am Ende hinzufügen, damit Sie festlegen möchten vielleicht count=
zu N-1
Bytes (wenn die Datei 203 Bytes ist jetzt, und Sie feststellen , dass das letzte Byte ist ein Newline - Set Zählung 202). Sie können eine Datei auf Zeilenumbrüche xxd script.py | tail
prüfen, indem Sie das letzte Byte verwenden und prüfen 0a
(oder in seltsamen Fällen 0d
).
Der Vorgang ist für eine .iso
Datei identisch , nur mental ersetzen /dev/sdc
durch your.iso
.
Wenn Sie das Ziel in Ihrem Mountpoint überprüfen, um festzustellen, ob es funktioniert hat, müssen Sie es möglicherweise strings
erneut verwenden (diesmal nach Ihrem Skript suchen), da sich die Datei wahrscheinlich noch im Lesecache befindet.