Kehren Sie die Erweiterungswurzel FS um

7

Bei der Installation von Raspbian müssen Sie zunächst das Dateisystem so erweitern, dass es sich über die gesamte SD-Karte erstreckt. Funktioniert super. Aber was ist, wenn ich beim Erstellen eines Disk-Images Speicherplatz sparen möchte? Kann ich die Erweiterung rückgängig machen und ein kleines Disk-Image erhalten, mit dem ich mein System auf andere SD-Karten kopieren und dann auf diesen erneut erweitern kann?

Paolo Vacirca
quelle
1
~ " Du sollst es tun ". Von wem erzählt?
Igor Ganapolsky

Antworten:

9

[Wenn Sie nur die Partition auf der Karte verkleinern möchten, gibt es eine einfachere Möglichkeit als hier beschrieben, indem Sie zuerst resize2fsdas Dateisystem verwenden und dann fdiskdie Partition verkleinern. Es sollte online viele Beispiele dafür geben, z. B. unter Unix und Linux . Bei der folgenden Methode wird ein neues, kleineres Kartenbild erstellt. In beiden Fällen können Sie dies nicht mit einem laufenden System tun.]

Sie können ein Geräte-Image nicht verkleinern (obwohl Sie ein einzelnes Dateisystem mit verkleinern können resize2fs), aber Sie können eines von beliebiger Größe erstellen und den Inhalt eines anderen duplizieren. Ich werde dies in Bezug auf Raspbian diskutieren, aber es ist das gleiche für jedes andere GNU / Linux-System.

Ein Geräte-Image ist für unsere Zwecke eine vollständige Byte-für-Byte-Kopie eines bootfähigen Gerätemediums wie einer SD-Karte, die keine oder mehrere Dateisystempartitionen enthalten kann. Dies unterscheidet sich von einem Dateisystem-Image , bei dem es sich um eine Byte-für-Byte-Kopie einer einzelnen Partition handelt. Weitere Informationen zu diesen wichtigen Unterscheidungen finden Sie hier.

In dieser Antwort wird beschrieben, wie Sie ein Geräte-Image mit darin enthaltenen Dateisystempartitionen erstellen. Diese Partitionen sind jedoch leer. Sie müssen dann den Inhalt jeder Partition gemäß meiner anderen Antwort hier kopieren . Dies ist die flexibelste Methode.

Einige dieser Befehle müssen root ausgeführt werden, daher empfehle ich Ihnen nur su root. Sie können das pi selbst verwenden, um dies zu tun, wenn Sie Speicher haben, der groß genug ist.

Das Raspbian-Image enthält zwei Partitionen, die erste kleine Boot-Partition und das zweite größere Root-Dateisystem. Es gibt auch eine Partitionstabelle, auch bekannt als. der Master Boot Record (MBR), da dies ein Geräte- Image ist. Der MBR ist kritisch und belegt die ersten 512 Bytes im Bild.

Ein Gerätebild beginnt als leere Datei. Sie müssen entscheiden, wie groß es sein soll. du -hund dfkann in dieser Hinsicht nützlich sein (siehe man duund man df; alle Befehle unten haben auch Manpages, die mindestens einen Blick wert sind).

Ich werde ein kleines als Beispiel verwenden.

dd if=/dev/zero of=test.img bs=4096 count=10240

Das sind ~ 40 MiB; Die Gesamtgröße wird durch bs* bestimmt count, die Standardeinheit ist Bytes. Diese leere Datei kann jetzt als Gerät behandelt werden.

fdisk test.img

Fdisk ist interaktiv und wird feststellen, dass das "Gerät keine erkannte Partitionstabelle enthält". Das erste, was Sie tun müssen, ist eine zu erstellen. Ein MBR-formatiertes Gerät verwendet eine DOS-Partitionstabelle und den fdiskBefehl zum Erstellen o.

Command (m for help): o
Created a new DOS disklabel with disk identifier 0xe7a0dfdf.

Sie können die leere Tabelle mit sehen p. Wir müssen jetzt die beiden neuen Partitionen mit erstellen n.

Command (m for help): n

Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-79999, default 2048): 8192

Hinweis Ich habe den Standardwert nicht verwendet. 8192 wird in den tatsächlichen Raspbian-Bildern verwendet und scheint bei SD-Karten üblich zu sein. 1 Im Raspbian-Image ist diese Partition ~ 56 MB groß und endet daher bei Sektor 122879. Sie muss nicht so groß sein, aber Sie können das Muster auch duplizieren. In diesem Beispiel ist jedoch nicht genügend Speicherplatz vorhanden, sodass ich 10 MB verwendet habe:

Last sector, +sectors or +size{K,M,G,T,P} (8192-79999, default 79999): +10M

Standardmäßig ist der Partitionstyp "Linux". Das müssen wir ändern.

Command (m for help): t

Selected partition 1
Hex code (type L to list all codes): c

Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'.

Nun die zweite Partition.

Command (m for help): n

Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): 

Using default response p.
Partition number (2-4, default 2): 2
First sector (2048-79999, default 2048): 28672

Beachten Sie erneut, dass ich die Standardeinstellung nicht verwendet habe. Da wir am Anfang leeren Raum gelassen haben, möchte fdisk ihn weiterhin verwenden. Stattdessen habe ich die Nummer für Sektor 2 nach dem letzten Sektor der ersten Partition verwendet, die Sie in der Partitionstabelle finden (es ist die End).

Für den letzten Sektor habe ich den höchstmöglichen Wert (79999) gewählt, um die gesamte Bilddatei zu füllen.

Sobald dies erstellt ist, sieht die Tabelle folgendermaßen aus:

Device    Boot     Start       End Blocks  Id System
test.img1           8192     28671  10240   c W95 FAT32 (LBA)
test.img2          28672     79999  25664  83 Linux

Das ist alles, was wir hier brauchen, aber um sich gegen Fehler abzusichern, tut fdisk nichts, bis Sie drücken w. An diesem Punkt wird die neue Tabelle ausgeschrieben und beendet. Überprüfen:

> file test.img 
test.img: ; partition 1 : ID=0xc, start-CHS (0x0,130,3), end-CHS     (0x1,200,7), startsector 8192, 20480 sectors; partition 2 : ID=0x83, start-CHS (0x1,200,8), end-CHS (0x4,249,53), startsector 28672, 51328 sectors

Es wird als Gerät mit Dateisystempartitionen erkannt. Diese müssen formatiert werden. Dazu müssen wir dem Betriebssystem die entsprechenden Bereiche der Image-Datei als Dateisysteme angeben. Zuerst:

losetup -o 4194304 /dev/loop1 ./test.img
losetup -o 14680064 /dev/loop2 ./test.img

Diese Offset ( -o) -Werte sind die StartZahlen aus der Partitionstabelle 8192 und 28672 multipliziert mit der Einheitengröße (512). Jetzt haben wir Gerätepartitionen, die formatiert werden können:

> mkfs.vfat -F32 /dev/loop1
mkfs.fat 3.0.27 (2014-11-12)
Loop device does not match a floppy size, using default hd params
> mkfs.ext4 /dev/loop2

Diese Warnung zur Diskettengröße kann ignoriert werden. Der zweite Befehl erzeugt mehr Ausgabe, es sollten jedoch keine Fehler gemeldet werden. Wir können jetzt die Dateisysteme überprüfen; Verwerfen Sie zuerst die Loop-Geräte mit losetup -D, und erstellen Sie dann einige Verzeichnisse und mountdie Image-Partitionen dort:

mkdir one; mkdir two
mount -o offset=4194304 -t vfat test.img one
mount -o offset=14680064 -t ext4 test.img two

Dies sollte keine Fehler melden (wenn Sie eine "überlappende Schleife" erhalten, lesen Sie hier und suchen Sie auf der Seite nach "überlappender Schleife"). onewird leer sein und twosollte ein lost+foundVerzeichnis enthalten.

Sie können nun kopieren , was Sie wollen in diese Mount - Punkte, zum Beispiel, können Sie einen pi mit duplizieren könnte rsync, gemäß dem anderen Q & A früher verknüpft . Wenn Sie fertig sind, können Sie umountdie Verzeichnisse und ddtest.img auf eine SD-Karte übertragen und verwenden.


1. Wenn Sie versuchen, ein anderes Bild / eine andere Karte als eine Raspbian-Karte zu duplizieren, können Sie diese Zahlen erhalten, indem Sie die Partitionstabelle des Bildes / der Karte auf die gleiche Weise wie mit betrachten fdisk.

2. Im Allgemeinen werden die von fdisk verwendeten Einheiten angezeigt, wenn Sie die Partitionstabelle anzeigen (z. B. Units: sectors of 1 * 512 = 512 bytes). Beachten Sie jedoch, dass Blocksin der Tabelle (wie oben) möglicherweise auch 1 KB angegeben werden. Dies kann verwirrend sein, da die Zahlen Startund nicht in "Blöcken", sondern in oben angegebenen Einheiten angegeben sind. Hier sind das 1/2 KiB, daher ist der Abstand zwischen diesen Figuren doppelt so groß wie . Nicht alle Versionen tun dies, einige berichten , was sinnvoller ist.EndBlocksfdiskSectors

Goldlöckchen
quelle