Raspberry Pi booten naar USB-stick

De Pi gebruikt een SD-kaart als opslag medium. Helaas is gebleken dat deze wel eens crash gevoelig kunnen zijn, zeker als de stroom ineens wegvalt terwijl er op de SD-kaart informatie wordt weggeschreven. In dat geval zou helemaal opnieuw moeten beginnen, tenzij je een image gemaakt hebt van de SD-kaart nadat je alles geinstalleerd hebt zodat je die kunt terugzetten.

Om de kansen op deze crashes te verkleinen gaan we de Pi laten booten naar een USB-stick. De Pi start altijd met de SD-kaart. Tijdens de opstart cyclus laad de Pi het filesysteem van de tweede partitie die op de SD-kaart staat. Na het opstarten wordt alleen deze partitie nog gebruikt. Wat we gaan doen is de configuratie van deze opstart cyclus aanpassen, zodat de Pi een partitie van de USB-stick laad als filesysteem. Dat zorgt er dus voor dat er na het opstarten alleen nog gebruikt gemaakt wordt van de USB-stick, en niet meer van de SD-kaart.

In het kort doen we de volgende stappen:
      1. De USB-stick aansluiten en gereed maken voor gebruik;
      2. De tweede partitie van de SD-kaart kopieren naar de de USB-stick;
      3. De opstart configuratie aanpassen;     
      4. De Pi herstarten en controleren of deze inderdaad de USB-stick gebruikt.

Ik ga er even vanuit dat de Pi al opgestart is en dat je ingelogd bent via SSH. Voor dat laatste gebruik ik Mobaxterm. Zorg ervoor dat er geen andere opslag apparaten zijn aangesloten op de Pi, anders dan de SD-kaart. Sluit de USB-stick aan op de Pi en voer het volgende commando uit op de commandline:

$ sudo mount

Je krijgt dan een overzicht te zien. Zoek in het overzicht naar /dev/sdaX, waarbij de X voor een cijfer staat. Als je dat ziet staan, en je hebt geen andere opslag apparaten aangesloten, dan weet je dat de USB-stick aangesloten en zichtbaar is voor de Pi. De Pi kent de USB-stick onder de naam /dev/sda. Nu gaan we de USB-stick gereed maken voor gebruikt. LET OP: alles wat op de USB-stick staat gaat hiermee verloren. Eerst installeren we software waarmee we partities kunnen verwijderen en maken op de USB-stick. Zorg dat de Pi is aangesloten op het internet.

$ sudo apt-get install gdisk

Gdisk wordt nu geïnstalleerd. Toets “y” als er gevraagd wordt of je door wilt gaan. Nadat de installatie is afgerond (je krijgt weer je commandline terug) gaan we de USB-stick opnieuw partitioneren.

$ sudo gdisk /dev/sda

Toets daarna “p” om een overzicht te krijgen van welke partities er op de USB-stick staan. Verwijder ze allemaal. Om een partitie te verwijderen toets je “d” en dan “Enter”. Doe dit totdat ze allemaal weg zijn. Daarna gaan we een nieuwe partitie aanmaken. Toets daarvoor “n” en druk op enter voor elke vraag die je krijgt. Daarna zie je dat de partitie wordt aangemaakt. Als dat klaar is toets je “w” om de configuratie op te slaan en het programma af te sluiten.

Herstart de Pi en log opnieuw in wanneer de pi opnieuw opgestart is:

$ sudo reboot

Nadat de Pi opnieuw opgestart is unmounten we de USB-stick, maken we een filesysteem aan op de USB-stick, en mounten we de USB-stick weer:

$ sudo umount /dev/sda
$ sudo mke2fs -t ext4 -L rootfs /dev/sda1
$ sudo mount /dev/sda1 /mnt

Even een korte uitleg. Met het eerste commando koppelen we als het ware de USB-stick af. Jij kunt deze dan niet meer bereiken. Met het volgende commando maken we een filesysteem aan (mke2fs) van het type ext4 (-t ext4) met als label rootfs (-L rootfs) op de partitie /dev/sda1 (/dev/sda1). Met het derde commando koppelen we de USB-stick weer zodat we deze weer kunnen gebruiken. We  geven daarbij op dat we deze willen kunnen benaderen via /mnt.

Nu gaan we ons huidige file systeem (die van de SD-kaart) kopiëren naar de USB-stick. Hiervoor gebruiken we een programma rsync geheten. In ons geval staat deze al op de Pi. Mocht dat toch nog niet het geval zijn dan kun je ze deze installeren met het commando:

$ sudo apt-get install rsync

Voor dat we gaan kopiëren gaan we eerst even er voor zorgen dat er wat minder gekopieerd hoeft te worden. De wolfram engine staat namelijk standaard geinstalleerd op deze image van raspbian en neemt een halve GB aan data in. We gaan deze verwijderen met het volgende commando, toets “y” als er een vraag gesteld wordt:

$ sudo apt-get purge wolfram-engine

Nu gaan we het gehele filesysteem overzetten naar de USB-stick.  Dus vanaf / naar /mnt. Dit kan even duren, dus even geduld!

$ rsync -axv / /mnt

Nu dat gebeurd is moeten we de opstart configuratie gaan aanpassen zodat de Pi het filesysteem van de USB-stick laad en die blijft gebruiken. De opstart configuratie staat in een txt bestand. Dit txt bestand staat in /boot. Om deze te editen gaan we nano gebruiken. Dit is een text-based editor die vaak gebruikt wordt binnen linux om tekst bestanden aan te passen. Normaal gebruik ik vi hiervoor, maar vi gedraagt zich op de raspbian image iets anders dan ik gewend ben binnen linux. Bekijk de inhoud van het bestand met:

$ sudo cat /boot/cmdline.txt

Je zult zien dat dit bestand 1 tekstregel heeft:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

Het gaat ons om de parameter “root=”. Hier geef je op waar de root is. In windows taal geef je hier op waar C:/ is. Nu zie je dat dit naar mmcblk0p2 wijst. Dit is de tweede partitie van de SD-kaart. Die wil je dus aanpassen naar de partitie waar we zojuist het hele filesysteem naar toe gekopieerd hebben. En jij denkt waarschijnlijk al: dat is /dev/sda1, want je hebt zojuist gezegd dat dat de naam is waar de Pi onze USB-stick mee kent. Je hebt gelijk… en toch gaan we dat niet zo doen.

Het punt is: linux wijst deze naam toe aan de USB-stick terwijl deze opstart. De eerste schijf krijgt /dev/sda, als onze externe HD er zo aanhangt krijgt deze /dev/sdb als naam. De volgende zou sdc krijgen. Valt het je op hoe de laatste letter steeds 1 plekje opschuift in het alfabet? Probleem is echter dat Linux deze naamgeving niet altijd in dezelfde volgorde doet. Dus de volgende keer is misschien onze externe HD /dev/sda en onze USB-stick /dev/sdb. Zo lang je 1 USB-stick gebruikt in de Pi kun je rustig /dev/sda1 gebruiken. Maar zodra je er meer dan 1 gebruikt geeft die naam geen zekerheid meer. Gelukkig zijn er meer methodes om aan te geven welke partitie we willen gebruiken. Partities hebben altijd unieke ID’s. De UUID is er 1 en een andere is de PARTUUID. De UUID kunnen we niet gebruiken hier in dit configuratie bestand, maar de PARTUUID wel. Om uit te vinden welke PARTUUID onze partitie op de USB-stick heeft toets je:

$ sudo blkid

Je krijgt nu een lijst van alle opslag media die de Pi heeft met daarachter de PARTUUID. Noteer (of kopieer) de PARTUUID die achter /dev/sda1 staat. Open het bestand /boot/cmdline.txt in nano met:

$ sudo nano /boot/cmdline.txt

Pas “root=/dev/mmcblk0p2” aan naar “root=PARTUUID=[de partuuid die je gekopieerd hebt]”. Verder voegen we aan het eind van de regel nog toe: “rootdelay=5” Dit laatste doen we omdat het soms even kan duren voordat de USB-stick gereed is voor gebruik tijdens het booten. Om te voorkomen dat de Pi dan crasht, laten we deze even maximaal 5 seconden wachten zodat de USB-stick de tijd heeft om zich gereed te maken. Zodra de USB-stick gereed is wordt deze geladen.

Sla het bestand op met “control-x”, “y” en dan “enter”. We zijn nu bijna klaar. De laatste stap die we moeten doen is de configuratie van het nieuwe filesysteem recht trekken. In /etc/fstab kan aangegeven worden hoe je opslagmedia gekoppeld wilt hebben. Nu staat er nog in dat bestand dat de SD-kaart als root(/) geladen dient te worden, maar wij hebben ingesteld dat dat de USB-stick moet zijn. Dus trekken we dat nog even recht in het nieuwe filesysteem. Deze hebben we gekopieerd naar /mnt, dus /etc/fstab wordt dan: /mnt/etc/fstab. We gaan hier de UUID gebruiken van de partitie. Zoek deze weer op met het commando “blkid” en kopieer deze (of noteer het). Open nu het configuratie bestand met:

$ sudo nano /mnt/etc/fstab

Je ziet dan de volgende regel tussen de regels staan:

/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1

Hier zie je staan dat /dev/mmcblk0p2 als root(/) gemount wordt. Dit staat nog fout en gaan we corrigeren door de UUID van onze nieuwe partitie op te geven in de plaats van /dev/mmcblk0p2. De regel komt er dan zo uit te zien:

/dev/disk/by-uuid/[UUID die je gekopieerd hebt]        /               ext4    defaults,noatime  0       1

Sla het bestand op met “control-x”, “y” en dan “enter”. Om alles te effectief te laten worden gaan we de pi herstarten.

$ sudo reboot

Als de Pi opnieuw opgestart is en je weer ingelogd gaan we kijken of alles inderdaad zo draait als we opgegeven hebben.

$ sudo mount

Als het goed is zie je nu dat /dev/sda1 als / gemount is. Omdat we nu dus volledig op de USB-stick draaien kun je als ultieme test de SD-kaart uit de pi halen nadat deze opgestart is. Als het goed is draait de Pi nu gewoon verder. Om te testen kun je even kijken hoeveel vrije ruimte je nog op de USB-stick hebt:

$ sudo df -m

Als de Pi inmiddels niet meer reageert, dan is er ergens iets niet goed gegaan tijdens de configuratie en raad ik je aan het opnieuw te doen. Als alles gewoon nog werkt: gefeliciteerd, je Pi draait nu vanaf je USB-stick.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *