Bild einer 16-GB-Karte mit unpartitioniertem Speicherplatz am Ende: Abschneiden möglich?

18

Ich wollte eine Distribution für ein paar Freunde vorbereiten.
Da ich sonst nichts herumliegen hatte, verwendete ich eine 16 GB SD-Karte.

Ich habe mit dem Standard-Debian-Weezy-2-GB-Image begonnen und keine Größenänderung vorgenommen.
Nun, da ich fertig bin, wollte ich ein Image von dem erstellen, was ich getan habe, aber ich erhalte eine 16-GB-Datei, die am Ende 14 GB nicht partitionierten (nicht partitionierten und freien) Speicherplatz enthält.

[Ich habe Windows // Win32DiskImager verwendet, da ich im Moment nichts frei habe, um mich in das RPI einzuklinken]

Kann ich dann die Bilddatei direkt hinter dem partitionierten Bereich abschneiden und den führenden Teil auf eine kleinere Karte übertragen?

Nippey
quelle
2
Wenn Sie Zugriff auf einen Linux-Computer haben, führen Sie dd if=/dev/path/to/SD/card of=~/SpecialImage.imgGParted aus, installieren Sie es und führen Sie es aus gparted ~/SpecialImage.img. Sobald GParted Ihre .imgDatei öffnet , ändern Sie einfach die Größe der Partitionen nach Ihren Wünschen! (Beide Befehle müssen als root ausgeführt werden, sudo sudamit Sie das bekommen, was Sie benötigen. Wenn Sie $zu a #wechseln, sind Sie Root. Seien Sie vorsichtig, dies ist das Linux-Äquivalent von God.) GParted ist im Grunde ein GUI-Frontend für das Arcane Partition Management Werkzeuge, die Sie benötigen. Mit GParted wird alles so viel einfacher und erfolgreicher.
JamesTheAwesomeDude
Bitte lies meine Frage sorgfältig durch.
Nippey
Ja, ich habe Ihre Frage gelesen und kann Ihnen sagen, dass es gefährlich ist, ein Image nur abzuschneiden. Sicher, Sie können nur die letzten Bytes eines Bildes abschneiden, aber es gibt keine Garantie, dass Sie nicht versehentlich Dateien abschneiden, besonders da Linux die Dateien absichtlich auslagert . Außerdem könnten am Ende des Dateisystems einige wichtige Metadaten oder ähnliches vorhanden sein. Insgesamt ist es sicherer, die richtigen Dienstprogramme zum Ändern der Dateisystemgröße zu verwenden, als einfach das Ende einer Datei selbst zu entfernen.
JamesTheAwesomeDude
1
Nun, aber ich spreche von nicht partitioniertem Raum. Selbst Linux legt keine Daten auf dem als unpartitioniert gekennzeichneten Speicherplatz ab, sondern verbleibt im Block, wie in der Partitionstabelle angegeben. Meine Sorge wurde durch das Bilddateiformat verursacht: Möglicherweise enthält die Bilddatei Metadaten am Ende der Datei, sodass ich mir Sorgen machte, die Dateiinformationen abzuschneiden. (Hoffe, mein vorheriger Kommentar klang nicht zu hart, sry;)
Nippey
Ohh, ich verstehe, was du jetzt sagst. Wenn Sie sich Sorgen über beschädigten nachgestellten freien Speicherplatz machen, führen Sie GParted für das Image aus, nachdem Sie es abgeschnitten haben. Wahrscheinlich wird der letzte Bereich als "nicht zugeordnet" oder "beschädigt" aufgeführt - erstellen Sie eine neue "unformatierte" Partition in diesem Bereich. Dann haben Sie keine Probleme. :)
JamesTheAwesomeDude

Antworten:

33

Endlich habe ich eine Ressource gefunden, die meine Frage erklärt.

http://softwarebakery.com/shrinking-images-on-linux

Kurz:

Ja, das Abschneiden ist möglich!

Zusammenfassung des Prozesses:

Extrahieren der Partitionsinformationen aus dem Image mit fdisk:

$ fdisk -lu image.img
Disk image.img: 4096 MB, 4096000000 bytes, 8000000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000a1bc7

      Device Boot      Start         End      Blocks   Id  System
image.img1              2048     5872026     5869978    b  W95 FAT32

Wir sehen, dass die Partition eine Größe von ca. 2,8 GB (5872026 * 512) hat, der Rest ist nicht partitioniert .

So kann alles nach dem Ende der Partition entfernt werden.
Dies erfolgt mit dem Tool truncate. Vergessen Sie nicht, die Anzahl der Sektoren um 1 zu erhöhen, da die Blocknummern bei 0 beginnen.

$ truncate --size=$[(5872026+1)*512] image.img


Bearbeiten:

Für diejenigen sein zu faul , um Linux zu wechseln:
Funktioniert auch unter Windows mit Cygwin ‚s fdisk.exeund truncate.exe!

Was ist Cygwin?

Ich kann zitieren: "Cygwin: Holen Sie sich das Linux-Gefühl - unter Windows" ( https://www.cygwin.com/ ).
Es handelt sich um eine Reihe von ausführbaren Programmen, die unter Windows ausgeführt werden können, aber alle Befehlszeilenprogramme enthalten, die Sie normalerweise von Linux kennen. Die Installation von Cygwin kann sehr lange dauern, wenn Sie während der Installation jedes Paket auswählen. Um diesem Beispiel zu folgen, müssen Sie lediglich sicherstellen, dass neben der Standardkonfiguration auch die Pakete util-linux(fdisk) und coreutils(truncate) ausgewählt sind.
Abhängig von Ihrer Umgebung müssen Sie /usr/binund /usr/sbinzu Ihrer hinzufügen $PATH.

Nippey
quelle
1
Welches Paket muss ich installieren, um fdisk.exeund zu bekommen truncate.exe?
PythonNut
1
Hallo @PythonNut, ich habe meine Antwort oben aktualisiert und die erforderlichen Pakete hinzugefügt: o)
Nippey
Was ist, wenn die Partition die Größe der Festplatte hat, auch wenn weniger verwendet wird?
Piegames
5

Ich weiß, dass dies eine alte Frage ist, aber ich möchte zeigen, wie dieser Vorgang auf einem Mac ausgeführt wird, da dies nicht so einfach ist: fdiskKeine -lOption und truncatenicht standardmäßig installiert:

1. Schritt 1: Installieren Sie Truncate unter Mac OS X:

Sie benötigen dafür MacPorts oder Homebrew. Ich benutze MacPorts. Wenn Sie keine haben, installieren Sie diese zuerst. Link zu MacPorts

Jetzt können wir Truncate installieren . Öffne dein Terminal und tippe:

sudo port install truncate

Für die Brauinstallation:

brew install truncate

Das sollte es tun.

2. Verwenden Sie die Festplattendienstprogramme, um unseren IMG anzuhängen, sodass er für den Terminalbefehl diskutil sichtbar ist .

Sie werden gleich sehen, warum wir diesen Schritt brauchen. Öffnen Sie die Festplatten-Dienstprogramm-App. Klicken Sie auf Datei (in der oberen Leiste) -> Disk Image öffnen und wählen Sie Ihre IMG-Datei aus.

3. Überprüfen Sie die Partitionsgröße des IMG und wo es bereitgestellt wird.

Geben Sie auf einem Terminal Folgendes ein:

diskutil list

Und irgendwann sollte es so etwas zeigen:

/dev/disk3 (disk image):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        +16.0 GB    disk3
   1:             Windows_FAT_32 boot                    62.9 MB    disk3s1
   2:                      Linux                         3.9 GB     disk3s2

Wir sehen also, dass ungefähr 12 GB nicht partitioniert sind. Wir müssen diese abschneiden.

Der Grund, warum wir diesen Befehl benötigen, besteht darin, herauszufinden, wo das Festplatten-Image bereitgestellt ist. In meinem Fall ist es unter: / dev / disk3

4. Ermitteln Sie die tatsächliche Partitionsgröße.

3,9 GB und 62,9 MB sind Werte, die beim Abschneiden nicht funktionieren. Wir müssen die Partitionsgrößen in Bytes finden.

5. Führen Sie fdisk aus .

Führen Sie in Ihrem Terminal den folgenden Befehl aus:

   fdisk /dev/diskX

Wobei X die Zahl ist, die Sie im vorherigen Schritt ermittelt haben. Dies sollte ungefähr so ​​aussehen:

         Starting       Ending
 #: id  cyl  hd sec -  cyl  hd sec [     start -       size]
------------------------------------------------------------------------
 1: 0C    0 130   3 -    8  40  32 [      8192 -     122880] Win95 FAT32L
 2: 83    8  40  33 -  478  79  49 [    131072 -    7553024] Linux files*
 3: 00    0   0   0 -    0   0   0 [         0 -          0] unused      
 4: 00    0   0   0 -    0   0   0 [         0 -          0] unused      

6. Zeit zum Abschneiden !

Wechseln Sie auf Ihrem Terminal cdin das Verzeichnis, in dem sich Ihr Bild befindet. Dann schreibe:

truncate FILE SIZE

DATEI ist natürlich Ihre Datei.

GRÖSSE ist die Größe in Bytes. Was habe ich, ist auf die hinzuzufügen Größe Spalte des fdiskBefehls, der Startspalte und multiplizieren mit 512. Also, in meinem Fall SIZE wird: 512 * (7.553.024 + 131.072) = 3934257152 , die etwa 3,9 GB.

Sie benötigen den Start und die Größe der letzten Partition , die von angezeigt wird fdisk. (Nicht unbedingt die größte, aber die am Ende der IMG-Datei)

Ich habe ein wenig experimentiert und immer wenn ich 7553024 * 512 oder (7553024 + 1) * 512 Bytes eingab, war die IMG-Datei beschädigt. Also, nur um sicherzugehen, tun Sie es wie oben angegeben. Es kann mehr hinzufügen, als tatsächlich benötigt wird, ist jedoch eine sichere Option.

7. (Optional) Testen Sie einfach, ob der IMG nicht beschädigt ist.

Rufen Sie das Festplatten-Dienstprogramm erneut auf und versuchen Sie, die neue IMG-Datei wie zuvor zu öffnen. Wenn es montiert ist, können Sie auch die neue (kleinere) Größe sehen. Wenn es nicht steigt, ist etwas schief gelaufen. (Vielleicht versuchen Sie, die Größe im truncateBefehl zu erhöhen )

Dies ist nicht der beste Test, aber es ist eine sichere Methode, um zu überprüfen, ob der neue IMG beschädigt ist oder nicht. Rechnen Sie also nicht wirklich damit, aber es ist den Versuch wert ...

Ich hoffe jemand findet das hilfreich!

ant0nisk
quelle
1
Schön! Danke für die Erweiterung des Wissens :) Gut, dass du darauf hingewiesen hast, dass 512*(Size+1)das nicht funktioniert. Wie Sie sehen, habe ich beide Partitionen verwendet Endund nicht Size, da Sie beide Partitionen beibehalten müssen, wenn es mehr als eine gibt. Also ist using 7553024 + 131072( +1) zu 100% korrekt!
Nippey
1

Der aktuelle Win32DiskImager hat tatsächlich die Option, nur zugewiesene Partitionen in das Festplatten-Image aufzunehmen. Dies erledigt den Zuschnitt mit einem Klick.

Bildbeschreibung hier eingeben

Dmitry Grigoryev
quelle
Hervorragend, macht es unter Windows viel einfacher!
Nippey
0

Nur etwas, das mir kürzlich aufgefallen ist, als ich viele dieser Win32diskimg-Vorgänge durchführe, um meine RPI-Images für die Bereitstellung zu sichern. Ich habe kürzlich damit begonnen, SD-Trimmfunktionen zu testen, um Teile der SD-Karte zu reinigen, die nicht für theoretische Abnutzungskorrekturen verwendet werden. Ich bin mir nicht sicher, welchen Effekt es haben wird, aber ein Nebeneffekt war, als ich die 16-GB-SD-Partition abbildete und sie dann mit 7zip komprimierte. Ich bin von den üblichen 16GB auf 9,5GB auf jetzt eine 2,5GB-Datei umgestiegen. Ich teste jetzt, um sicherzustellen, dass nichts falsch ist, aber es scheint, dass die Verwendung von TRIM, um den nicht verwendeten Raum als 0 zu markieren, die Bildkomprimierung weitaus effizienter macht (was Sinn macht). Ich wollte nur berichten, dass dies super einfach zu bewerkstelligen war und keine Mehrfachschritte.

jctghost
quelle
Obwohl es nicht falsch ist, geht es nicht wirklich um die Frage.
RalfFriedl