zondag 18 februari 2024

Disk images verkleinen

Dit artikel is gebaseerd op dit artikel.

Soms heb je van je Raspberry een schijfkopie gemaakt van een SD-kaart en wil je die afbeelding op een andere SD-kaart plaatsen. Wat kun je doen als deze andere SD-kaart net iets kleiner is dan de originele afbeelding. Je zou het kleiner moeten maken. Gelukkig is dit op Ubuntu niet moeilijk. We hebben het disk-image bestand nodig (in mijn voorbeeld Raspberry.img) en wat software.

Er zijn twee manieren:
Handmatig en via een script.

Handmatige verkleining van Disk-image bestanden

Installeer de software in een terminal:

sudo apt install gparted coreutils

om de software te installeren.

Loopback-apparaat maken

GParted werkt op apparaten, niet op eenvoudige bestanden zoals disk-images die we willen verkleinen. Daarom moeten we eerst een device voor de disk-image maken. Dit doen we met behulp van de loopback-functionaliteit van Linux. Voer de terminal in de map in waar het img-bestand zich bevindt.

Eerst zullen we loopback inschakelen als dit nog niet was ingeschakeld:

sudo modprobe loop


Nu kunnen we een nieuw (vrij) loopback-apparaat aanvragen:

sudo lostup -f

Hierdoor wordt het pad gegeven naar een vrij loopback-apparaat. In dit voorbeeld is dit /dev/loop4.

Vervolgens maken we een device van de disk-image:

sudo lostup /dev/loop4 Raspberry.img

Nu hebben we een apparaat /dev/loop4 dat Raspberry.img vertegenwoordigt. We willen toegang krijgen tot de partities die op de image staan, dus we moeten de kernel vragen deze ook te laden:

sudo partprobe /dev/loop4

Dit zou ons het apparaat /dev/loop4p2 moeten opleveren, dat de grotere partitie in Raspberry.img vertegenwoordigt. Wij hebben dit apparaat niet direct nodig, maar GParted heeft het wel nodig.
Wijzig de grootte van de partitie met GParted

Vervolgens kunnen we het apparaat laden met GParted:

sudo gparted /dev/loop4

Let nu op een paar dingen:

  • Er zijn twee partities. p1 en p2
  • De partities wijzen bijna de gehele schijf/apparaat/image toe.
  • De grotere partitie is maar gedeeltelijk gevuld.


We willen het formaat van deze grotere partitie aanpassen, zodat deze bij de inhoud past, maar niet meer dan dat.

Selecteer de partitie en klik op Formaat wijzigen/Verplaatsen.

Sleep de rechterbalk zoveel mogelijk naar links.

Houd er rekening mee dat GParted soms een paar MB extra nodig heeft om bestandssysteemgerelateerde gegevens te plaatsen. U kunt hiervoor een paar keer op de pijl-omhoog bij het vakje Nieuw formaat drukken. Ik heb er bijvoorbeeld 10 keer op gedrukt (=10MiB) om FAT32 te laten werken. Voor NTFS is dit misschien helemaal niet nodig. Het bestandssysteem is waarschijnlijk Linux en niet NTFS, aangezien dat alleen door Windows wordt gebruikt en niet door de Raspberry PI.

Druk ten slotte op Formaat wijzigen/Verplaatsen. U keert terug naar het GParted-venster.

Merk op dat een deel van de schijf niet is toegewezen. Dit deel van de schijf zal niet door de partitie worden gebruikt, dus we kunnen dit deel later van de image afscheren. GParted is een hulpmiddel voor schijven, dus het verkleint geen disk-images, alleen partities, we moeten het verkleinen van de afbeelding zelf doen.

Druk op Toepassen in GParted. Het zal nu bestanden verplaatsen en uiteindelijk de partitie verkleinen, dus het kan een minuut of twee duren, maar meestal is het snel klaar.

Nu kunt u Gparted sluiten of gebruiken om de gegevens te extraheren die nodig zijn om het daadwerkelijke img-bestand in te korten.

Zoek de werkelijke grootte van de afbeelding met Gparted

In Gparted kunt u de grotere partitie met aangepaste grootte selecteren. Kies informatie en zoek naar Laatste sector.



Noteer dat nummer, want dat hebben we nodig. (in dit voorbeeld (Laatste sector))

Activeer nu de informatie over de afbeelding en zoek naar Sectorsize (in het Nederlands Sectorgrootte), wat in dit voorbeeld 512 is

Noteer dat nummer en u kunt GParted sluiten.

Nu hebben we het loopback-apparaat niet meer nodig, dus verwijder het:

sudo lostup -d /dev/loop4

Nu kunt u naar het laatste hoofdstuk gaan en het formaat van de afbeelding wijzigen.

Zoek de werkelijke grootte van de afbeelding met behulp van fdisk

Als het vinden van de informatie in Gparted niet werkte, kunt u in plaats daarvan de opdrachtregel gebruiken met fdisk:

fdisk -l myraspbianimage.img

Hier zullen we een uitvoer zien die lijkt op het volgende:

Let op twee dingen in de uitvoer:

De partitie eindigt op blok 59553791 (weergegeven onder Einde, End in het Engels)

De blokgrootte is 512 bytes (weergegeven als sectoren van 1 * 512)

We zullen deze getallen in de rest van het voorbeeld gebruiken. De blokgrootte (512) is vaak hetzelfde, maar het eindblok (59553791) zal voor u verschillen. De cijfers betekenen dat de partitie eindigt op byte 59553791 * 512 van het bestand. Na die byte komt het niet-toegewezen deel. Alleen de eerste 59553791 * 512 bytes zijn nuttig voor onze afbeelding.

Het formaat van de afbeelding wijzigen

Vervolgens verkleinen we het afbeeldingsbestand tot een formaat dat net de partitie kan bevatten. Hiervoor gebruiken we het commando truncate. Bij het commando truncate moeten we de grootte van het bestand in bytes opgeven. Het laatste blok was 59553791 en bloknummers beginnen bij 0. Dat betekent dat we (59553791+1)*512 bytes nodig hebben. Dit is belangrijk, anders past de partitie niet in de afbeelding. Dus nu gebruiken we truncate bij de berekeningen:

truncate --size=$[(9181183+1)*512] myimage.img

Kopieer nu de nieuwe afbeelding naar uw microSD-kaart, waar deze precies hetzelfde zou moeten werken als de oude/grote afbeelding.

PiShrink

PiShrink is een bash-script dat automatisch een pi-image verkleint, dat vervolgens bij het opstarten wordt aangepast aan de maximale grootte van de SD-kaart. Hierdoor wordt de afbeelding geplaatst

Zet het sneller terug op de SD-kaart en de gekrompen afbeeldingen worden beter gecomprimeerd.
Gebruik:

sudo pishrink.sh [-s] imagefile.img [newimagefile.img]

Als de optie -s wordt gegeven, slaat het script het automatisch uitvouwende deel van het proces over. Als u de parameter newimagefile.img opgeeft, maakt het script een kopie van imagefile.img en werkt daarmee. Als u deze optie wilt gebruiken, heeft u voldoende ruimte nodig om een volledige kopie van de afbeelding te maken.
Vereisten

Als u een NOOBS-afbeelding probeert te verkleinen, zal dit waarschijnlijk mislukken. Dit komt doordat de NOOBS-partitionering aanzienlijk verschilt van die van Raspian. Hopelijk kan PiShrink NOOBS in de nabije toekomst ondersteunen.

Als u Ubuntu 16.04 of eerder gebruikt, ziet u waarschijnlijk een foutmelding dat e2fsck verouderd is en metadata_csum. De eenvoudigste oplossing hiervoor is om Ubuntu 16.10 en hoger te gebruiken, omdat dit u op de lange termijn veel gedoe zal besparen.

Installatie

wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh chmod +x pishrink.sh sudo mv pishrink.sh /usr/local/bin

Download from this blog

Voorbeeld uitvoer:

[user@localhost PiShrink]$ sudo pishrink.sh pi.img e2fsck 1.42.9 (28-Dec-2013) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/loop1: 88262/1929536 files (0.2% non-contiguous), 842728/7717632 blocks resize2fs 1.42.9 (28-Dec-2013) resize2fs 1.42.9 (28-Dec-2013) Resizing the filesystem on /dev/loop1 to 773603 (4k) blocks. Begin pass 2 (max = 100387) Relocating blocks             XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Begin pass 3 (max = 236) Scanning inode table          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Begin pass 4 (max = 7348) Updating inode references     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX The filesystem on /dev/loop1 is now 773603 blocks long.  Shrunk pi.img from 30G to 3.1G 

Geen opmerkingen:

Een reactie posten

Opmerking: Alleen leden van deze blog kunnen een reactie posten.

Terminal met een standaard boodschap beginnen.

Soms is het handig om de terminal te starten met een standaard boodschap om bijvoorbeeld instructies te geven. Iedere gebruiker kan dat voor...