Ich erstelle ein Disk-Image für ein eingebettetes System (das auf einer 4-GB-SD-Karte gespeichert werden soll). Ich möchte, dass das System zwei Partitionen hat. Eine 'Root'-Partition (200 MB) und eine' Data'-Partition (800 MB).
Ich erstelle eine leere 1 GB Datei mit dd. Dann benutze ich parted, um die Partitionen einzurichten. Ich montiere sie jeweils in einem Loop-Gerät und formatiere sie dann. ext2 für 'Root' ext4 für 'Data'. Fügen Sie mein Root-Dateisystem zur 'Root'-Partition hinzu und lassen Sie' Data 'leer.
Hier liegt das Problem. Ich habe jetzt ein 1-GB-Bild mit nur 200 MB Daten. Sollte ich theoretisch nicht in der Lage sein, das Image auf 201 MB zu kürzen und das Dateisystem trotzdem einbindbar zu machen? Leider habe ich dies nicht festgestellt.
Ich erinnere mich, dass ich in der Vergangenheit eine Build-Umgebung von Freescale verwendet habe, in der 30-MB-Images erstellt wurden, die Partitionen für die Verwendung einer gesamten 4-GB-SD-Karte enthält. Leider kann ich zu diesem Zeitpunkt nicht herausfinden, wie sie das gemacht haben.
Ich habe das Format auf der Festplatte für das ext-Dateisystem gelesen, und wenn nach dem ersten Superblock keine Daten mehr vorhanden sind (außer Backup-Superblöcken und nicht verwendeten Blocktabellen), dachte ich, ich könnte dort abschneiden.
Wenn ich das mache, flippt das Montagesystem leider aus. Ich kann dann FSCK ausführen, die Superblöcke und Blocktabellen wiederherstellen und es dann problemlos bereitstellen. Ich denke einfach nicht, dass das notwendig sein sollte.
Vielleicht könnte ein anderes Dateisystem funktionieren? Irgendwelche Ideen?
Vielen Dank,
bearbeiten
Partition geändert, um Dateisystem zu lesen. Die Partition ist noch vorhanden und ändert sich nicht, aber das Dateisystem wird nach dem Abschneiden des Images zerstört.
bearbeiten
Ich habe festgestellt, dass das Dateisystem, wenn ich die Datei auf eine Größe abschneide, die nur größer ist als der erste Satz von 'Daten'-Partitions-Superblock- und Inode / Block-Tabellen (irgendwo im Datenblock-Bereich), ohne dass dies möglich ist ein fsck, um den Rest der Superblöcke und Block / Inode-Tabellen wiederherzustellen
quelle
parted
- bei diesem Programm geht es nicht um Partitionstabellen, sondern um ein seltsames Zusammenspiel von Partitionstabellen + Dateisystemen. Im Allgemeinen ist der Versuch, beide zu kombinieren, schlecht. Partitionstabellen und Dateisysteme existieren völlig unabhängig voneinander.wipefs
und abrufen unddd
einfachtar
die fs-Daten oder was auch immer aktualisieren und beim Erstellen des Images entpacken.Antworten:
Zum einen wird eine spärliche Bild auf eine Festplatte zu schreiben nicht in irgendetwas , sondern die Gesamtheit der Größe dieser Bilddatei führen - Löcher und alle - für den Datenträger. Dies liegt daran , Handhabung von Dateien mit geringer Dichte ist eine Qualität des Dateisystems - und ein Raw - Gerät (wie dem, an das Sie das Bild schreiben) hat keine solche Sache noch . Eine Datei mit geringer Dichte kann gespeichert von einem Dateisystem gesteuert sicher und sicher auf einem Medium , das versteht Sparse - Dateien (wie ein ext4 - Gerät) , aber sobald Sie es schreiben , es wird alles einhüllen , dass Sie es wollen. Sie sollten also entweder Folgendes tun:
Speichern Sie es einfach auf einem fs, das spärliche Dateien versteht, bis Sie bereit sind, es zu schreiben.
Machen Sie es zwei Schichten tief ...
Das heißt, schreiben Sie Ihr Hauptbild in eine Datei, erstellen Sie ein anderes übergeordnetes Bild mit einem fs, das spärliche Dateien versteht, und kopieren Sie dann Ihr Bild in das übergeordnete Bild und ...
Wenn es Zeit ist, das Bild zu schreiben, schreiben Sie zuerst Ihr übergeordnetes Bild und dann Ihr Hauptbild.
So geht's 2:
Erstellen Sie eine 1 GB Sparse-Datei ...
Schreiben Sie zwei
ext4
Partitionen in die Partitionstabelle: 1 200 MB, 2 800 MB ...Erstellen Sie zwei
ext4
Dateisysteme auf einem-P
Gerät mit künstlicher Schleife und legen Sie eine Kopie des zweiten auf das erste ...Das ist eine Menge Ausgabe - meistens von
mkfs.ext4
- aber beachten Sie besonders diels
Bits unten.ls -s
zeigt die tatsächliche-s
Größe einer Datei auf der Festplatte an - und sie wird immer in der ersten Spalte angezeigt.Jetzt können wir unser Image grundsätzlich nur auf die erste Partition reduzieren ...
Dort
fdisk
erfahren wir, dass sich in der ersten Partition vonimg
... 411647 +1 512-Byte-Sektoren befinden.Dadurch wird die
img
Datei nur auf ihre erste Partition gekürzt. Sehen?... aber wir können diese Partition trotzdem mounten ...
... und hier sind die Inhalte ...
Und wir können das gespeicherte Image der zweiten Partition an die erste anhängen ...
Jetzt ist unsere
img
Datei gewachsen : Sie ist nicht mehr spärlich ...... aber das zu entfernen ist beim zweiten Mal genauso einfach wie beim ersten natürlich ...
quelle
dd
Blockgrößen ein wenig optimieren . Bei der Kürzung spielt es keine Rolle -dd
sucht sofort nach dem Versatz und schneidet die Datei genau dort ab. Beim Anhängen ist die Blockgröße von 512 Byte jedoch ziemlich langsam. Eigentlich wahrscheinlich der schnellste Weg , es zu tun ist , damitdd
zuseek
und erlaubencat
zu schreiben.{ dd if=/dev/null seek=411648; cat; } <part2 1<>/dev/mmcblk1
oder so, wenn du meinen Drift bekommst.Der einfachste Weg, dies zu tun, besteht darin, Ihre Sicherungsdatei als Sparse-Datei zu erstellen. das heißt, machen Sie es 1 GB mit
truncate -s 1G disk.img
anstelle vondd if=/dev/zero bs=1048576 count=1024 of=disk.img
(oder was auch immer). Schön,truncate
ist auch viel schneller.Wenn Sie eine
ls -l
Datei bearbeiten, wird sie als 1 GB angezeigt - dies ist jedoch nur die scheinbare Größe.du disk.img
gibt die tatsächliche Größe an.(Hinweis: Sie müssen Ihr Image auf einem Dateisystem haben, das Dateien mit geringer Dichte unterstützt. Alle gängigen Unix-Dateien funktionieren. Ext2 / 3/4 alle tun dies. FAT32 nicht. HFS + auch nicht.)
HINWEIS: Sparse-Dateien haben logischerweise immer noch die volle Größe. Nur die nie geschriebenen Abschnitte werden nicht physisch auf der Festplatte gespeichert. Der nicht tatsächlich gespeicherte Teil ist größtenteils vor Programmen verborgen. Einige Dienstprogramme unterstützen dies jedoch. (ZB
dd conv=sparse
,cp --sparse=auto/always
usw.). Ein tatsächlicher USB-Stick kann nicht spärlich sein. Und wenn Sie esdd conv=sparse
zum Schreiben verwenden, wird es wahrscheinlich viel schneller sein, aber Sie werden alle Daten dort belassen, die zuvor vorhanden waren, anstatt der erwarteten Blöcke voller NULs (0x00). Sollte gut funktionieren (als freier Speicherplatz), hinterlässt aber alte Daten auf dem USB-Stick - möglicherweise ein Sicherheitsrisiko.quelle
/dev/zero
nicht null schreiben . Hoppla! Wird behoben.fallocate -l... img
,truncate -s... img
,dd seek=... of=img </dev/null
, sind , von denen alle äquivalent.Möchten Sie dieses Bild mit 800 MB Speicherplatz erstellen, damit Sie es auf SD-Karten kopieren können? Aber Sie möchten beim Speichern des Bildes keinen Platz verschwenden. Wenn ja, kann ich eine Komprimierung vorschlagen, wie z
bzip
. Dies hängt jedoch davon ab, dass nicht verwendete Blöcke auf Null initialisiert werden.quelle
Hoffe ich verstehe die Frage richtig:
Verkleinern eines Dateisystems und einer Partition. Verwenden Sie
gparted
.quelle