Tips en Trucs 2016

Raspberry Pi systeem op een SD kaart manipuleren

Als leerkracht Raspberry Pi is het handig dat je snel van een basissysteem een gepersonaliseerd systeem kunt maken. Dit is nodig om de Raspberry Pi's zowel op Linux, Apple en Windows systemen in een netwerk te herkennen en de bereiken. Elke Raspberry Pi krijgt daarvoor een unieke netbiosnaam en hostname. Daarenboven vertrek ik van een geprepareerd systeem waarop samba en VNC geïnstalleerd en geconfigureerd werd. Dit kan enkel op een systeem met 5 GB opslagruimte. Dit 5 GB basisimage wordt daarna op 8 GB SD kaarten geplaatst waardoor de 5 GB naar 8 GB moet worden uitgebreid. We gebruiken geen 8 GB basisimages omdat dit langer duurt om op een SD kaart te schrijven en niet elke 8 GB SD kaart heeft merkwaardig genoeg dezelfde capaciteit.

Beschikbare SD kaart opslagruimte zelf instellen

Voor het aanmaken van het basis systeem vertrekken we van de originele gedownloade Raspbian Jessie with Pixel versie. Deze schrijven we op een 8 GB SD kaart.

Met het volgende script passen we het systeem op de SD kaart aan zodat de automatische expansie van de opslagruimte bij de eerste start wordt uitgeschakeld. Daarna expanderen we de opslagruimte naar 5 GB.

#!/bin/bash
# Automatisch expansie uitschakelen en manueel expanderen naar 5 GB

# Controleer of het script door de systeembeheerder werd gestart
if [[ ! $(whoami) =~ "root" ]]; then
  echo ""
  echo "************************************"
  echo "*** Root moet dit script starten ***"
  echo "************************************"
  echo ""
  exit
fi
# Controleer of er een optie werd meegegeven
if [[ -z $1 ]]; then
  echo "Gebruik: ./raspbian-noresize.sh /dev/mmcblk0"
  exit
fi
# Controleer of de optie een blok apparaat is
if [[ ! -e $1 || ! $(file $1) =~ "block special" ]]; then
  echo "Fout : Geen blok apparaat, of onbestaand apparaat"
  exit
fi
# Koppel de SD kaart aan een map
mount $1p1 /mnt/
# Maak indien nodig een reservekopie van de originele opstart opdrachten
if [ -f /mnt/cmdline.txt.ori ]; then
  cp /mnt/cmdline.txt.ori /mnt/cmdline.txt
else # Herstel de originele opstartopdrachten
  cp /mnt/cmdline.txt /mnt/cmdline.txt.ori
fi
# Verwijder uit de originele opstart opdrachten het automatisch expanderen van de opslagruimte
sed -i 's/ init=\/usr\/lib\/raspi-config\/init_resize.sh//' /mnt/cmdline.txt
# Geef de aangepaste opstart opdrachten weer
cat /mnt/cmdline.txt
# Koppel de SD kaart los van de /mnt/ map
umount /mnt/

# Bepaal het startpunt van de tweede partitie
PART_START=$(parted $1 -ms unit s p | grep "^2" | cut -f 2 -d: | sed 's/[^0-9]//g')
echo $PART_START
[ "$PART_START" ] || return 1
  # Breek het script af bij een foumelding
# Bepaal het eindpunt van de tweede partitie
PART_END=$(parted $1 -ms unit s p | grep "^2" | cut -f 3 -d: | sed 's/[^0-9]//g')
# Bereken het eindpunt van een 1 GB grotere partitie
PART_END=$((PART_END + 2097152))
echo $PART_END
# Verwijder de tweede partitie en maak deze opnieuw aan, maar nu 1 GB groter
fdisk $1 <<EOF
p
d
$PART_NUM
n
p
2
$PART_START
$PART_END
p
w
EOF
# Controleer de tweede partitie op eventuele fouten en indien mogelijk herstel de fouten
e2fsck -f $1p2
# Maak de extra 1 GB schijfruimte beschikbaar
resize2fs $1p2

Bij het uitvoeren van het script kan je het proces nauwlettend volgen:

dany@laptop:~> sudo sh Documenten/SNT/Raspberry\ Pi/raspian-noresize.sh /dev/mmcblk0
root's password:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles quiet
137216
10590207

Welkom bij 'fdisk' (util-linux 2.25).                                                                                    
Wijzigingen worden alleen in het computergeheugen gemaakt,
tot het moment dat u besluit ze naar schijf te schrijven.
Wees voorzichtig vóór het gebruik van de schrijfopdracht.


Opdracht (m voor hulp): Schijf /dev/mmcblk0: 7,4 GiB, 7948206080 bytes, 15523840 sectoren
Eenheid: sectoren van 1 * 512 = 512 bytes
Sectorgrootte (logisch/fysiek): 512 bytes / 512 bytes
In-/uitvoergrootte (minimaal/optimaal): 512 bytes / 512 bytes
Schijflabeltype: dos
Schijf-ID: 0xd94ffdb3

Device         Boot  Start     End Sectors Size Id Type
/dev/mmcblk0p1        8192  137215  129024  63M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      137216 8493055 8355840   4G 83 Linux

Opdracht (m voor hulp): Partitienummer (1,2, standaard 2): 
Partitie 2 is verwijderd.

Opdracht (m voor hulp): Partitietype
   p   primair (1 primair,  0 uitgebreid,  3 vrij)
   e   uitgebreid (container voor logische partities)
Selecteer (standaard is p): Partitienummer (2-4, standaard 2): Eerste sector (2048-15523839 standaard 2048): Laatste sector, +sectoren, of +grootte{K,M,G,T,P} (137216-15523839 standaard 15523839): 
Nieuwe partitie 2 van type 'Linux' en grootte 5 GiB is aangemaakt.

Opdracht (m voor hulp): Schijf /dev/mmcblk0: 7,4 GiB, 7948206080 bytes, 15523840 sectoren
Eenheid: sectoren van 1 * 512 = 512 bytes
Sectorgrootte (logisch/fysiek): 512 bytes / 512 bytes
In-/uitvoergrootte (minimaal/optimaal): 512 bytes / 512 bytes
Schijflabeltype: dos
Schijf-ID: 0xd94ffdb3

Device         Boot  Start      End  Sectors Size Id Type
/dev/mmcblk0p1        8192   137215   129024  63M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      137216 10590207 10452992   5G 83 Linux

Opdracht (m voor hulp): De partitietabel is gewijzigd.
Aanroepen van ioctl() om partitietabel opnieuw in te lezen...
Leegmaken van schijfbuffers...

e2fsck 1.42.11 (09-Jul-2014)
Stap 1: Controle van inodes, blokken, en groottes
Stap 2: Controle van mappenstructuur
Stap 3: Controle van verbindingen tussen mappen
Stap 4: Controle van verwijzingsaantallen
Stap 5: Controle van groepssamenvattingen
/dev/mmcblk0p2: 133045/261120 bestanden (0.1% niet-aaneengesloten), 938256/1044480 blokken
resize2fs 1.42.11 (09-Jul-2014)
Van grootte veranderen van bestandssysteem op /dev/mmcblk0p2 naar 1306624 blokken (van 4K).
Het bestandssysteem op /dev/mmcblk0p2 is nu 1306624 blokken groot.

Apparaatmelder

Raspbian basissysteem

Plaats de SD kaart in de Raspberry Pi en start de Pi. Je kunt nu het basissysteem naar wens opbouwen. Voor de lessen installeer en configureer ik daarvoor Samba en TightVNC.

Na het voltooien en testen van het basissysteem, sluit je de Raspberry Pi correct af. En maak je een image van dit basissysteem. Dit 8 GB grote image bestand verklein je met het volgende script:

#!/bin/bash
# Image bestand verkleinen

if [[ ! $(whoami) =~ "root" ]]; then
  echo ""
  echo "************************************"
  echo "*** Root moet dit script starten ***"
  echo "************************************"
  echo ""
  exit
fi

if [[ -z $1 ]]; then
  echo "Gebruik: ./raspbian-truncate.sh raspian-netbios-vnc.img"
  exit
fi

if [[ ! -e $1 || ! $(file $1) =~ "DOS/MBR boot sector" ]]; then
  echo "Fout: Geen image bestand, of bestand bestaat niet"
  exit
fi

truncate -s 5422186496 $1

Zo verloopt het uitvoeren van het script:

dany@laptop:~> sudo sh Documenten/SNT/Raspberry\ Pi/raspian-truncate.sh raspbian-basis.img
root's password:

M.a.w. geen nieuws is goed nieuws. Schrijf dit image bestand naar een andere SD kaart.

Raspbian personaliseren

Met het volgende script wordt op de SD kaart de hostname en netbiosnaam aangepast. Daarnaast wordt de systeempartitie uitgebreid waardoor de volledige opslagruimte op de SD kaart beschikbaar wordt.

#!/bin/bash
# Hostname aanpassen en root partitie uitbreiden

# Controleer of het script als root gestart is
if [[ ! $(whoami) =~ "root" ]]; then
  echo ""
  echo "************************************"
  echo "*** Start dit als root gebruiker ***"
  echo "************************************"
  echo ""
  exit
fi

# Controleer of er twee opties ingegeven zijn
if [[ -z $1 || -z $2 ]]; then
  echo "Gebruik: sh raspbian-hostname-resize.sh /dev/mmcblk0 RPIDanPin"
  exit
fi

# Controleer of de eerste optie een block device is
if [[ ! -e $1 || ! $(file $1) =~ "block special" ]]; then
  echo "Error : Not a block device, or device doesn't exist"
  exit
fi

# Koppel de SD kaart aan de map /mnt/
mount $1p2 /mnt/
# Vervang de standaard samba netbiosnaam (raspberrypi) door de opgegeven hostname
sed -i "s/raspberrypi/$2/" /mnt/etc/samba/smb.conf
# Geef de sambaconfiguratie weer
cat /mnt/etc/samba/smb.conf
# Vervang de standaard hostname (raspberrypi) door de opgegeven hostname
sed -i "s/raspberrypi/$2/" /mnt/etc/hostname
# Geef de hostname weer
cat /mnt/etc/hostname
# Koppel de SD kaart los van de map /mnt/
umount /mnt/

# Bepaal de start van de root partitie
PART_START=$(parted $1 -ms unit s p | grep "^2" | cut -f 2 -d: | sed 's/[^0-9]//g')
echo $PART_START
[ "$PART_START" ] || return 1
  # De ontvangen waarde is een foutmelding, meestal veroorzaakt door een reeds gekoppelde root partitie
# Verwijder en maak de root partitie terug aan zonder de gegevens te vernietigen
fdisk $1 <<EOF
p
d
$PART_NUM
n
p
2
$PART_START

p
w
EOF
# Controleer het bestandsysteem en herstel indien mogelijk eventuele fouten
e2fsck -f $1p2
# Activeer de extra beschikbare opslagruimte op de root partitie
resize2fs $1p2

Dit script in actie:

dany@laptop:~> sudo sh Documenten/SNT/Raspberry\ Pi/raspian-hostname-resize.sh /dev/mmcblk0 RPIDanPin
root's password:
[global]
workgroup = WORKGROUP
server string = Samba Server %v
netbios name = RPIDanPin
security = user
map to guest = bad user
dns proxy = no
RPIDanPin
137216

Welkom bij 'fdisk' (util-linux 2.25).                                                                                    
Wijzigingen worden alleen in het computergeheugen gemaakt,
tot het moment dat u besluit ze naar schijf te schrijven.
Wees voorzichtig vóór het gebruik van de schrijfopdracht.


Opdracht (m voor hulp): Schijf /dev/mmcblk0: 7,4 GiB, 7948206080 bytes, 15523840 sectoren
Eenheid: sectoren van 1 * 512 = 512 bytes
Sectorgrootte (logisch/fysiek): 512 bytes / 512 bytes
In-/uitvoergrootte (minimaal/optimaal): 512 bytes / 512 bytes
Schijflabeltype: dos
Schijf-ID: 0x00073f97

Device         Boot  Start      End  Sectors Size Id Type
/dev/mmcblk0p1        8192   137215   129024  63M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      137216 10590207 10452992   5G 83 Linux

Opdracht (m voor hulp): Partitienummer (1,2, standaard 2): 
Partitie 2 is verwijderd.

Opdracht (m voor hulp): Partitietype
   p   primair (1 primair,  0 uitgebreid,  3 vrij)
   e   uitgebreid (container voor logische partities)
Selecteer (standaard is p): Partitienummer (2-4, standaard 2): Eerste sector (2048-15523839 standaard 2048): Laatste sector, +sectoren, of +grootte{K,M,G,T,P} (137216-15523839 standaard 15523839): 
Nieuwe partitie 2 van type 'Linux' en grootte 7,3 GiB is aangemaakt.

Opdracht (m voor hulp): Schijf /dev/mmcblk0: 7,4 GiB, 7948206080 bytes, 15523840 sectoren
Eenheid: sectoren van 1 * 512 = 512 bytes
Sectorgrootte (logisch/fysiek): 512 bytes / 512 bytes
In-/uitvoergrootte (minimaal/optimaal): 512 bytes / 512 bytes
Schijflabeltype: dos
Schijf-ID: 0x00073f97

Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk0p1        8192   137215   129024   63M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      137216 15523839 15386624  7,3G 83 Linux

Opdracht (m voor hulp): De partitietabel is gewijzigd.
Aanroepen van ioctl() om partitietabel opnieuw in te lezen...
Leegmaken van schijfbuffers...

e2fsck 1.42.11 (09-Jul-2014)
Stap 1: Controle van inodes, blokken, en groottes
Stap 2: Controle van mappenstructuur
Stap 3: Controle van verbindingen tussen mappen
Stap 4: Controle van verwijzingsaantallen
Stap 5: Controle van groepssamenvattingen
/dev/mmcblk0p2: 137075/326400 bestanden (0.1% niet-aaneengesloten), 1067730/1306624 blokken
resize2fs 1.42.11 (09-Jul-2014)
Van grootte veranderen van bestandssysteem op /dev/mmcblk0p2 naar 1923328 blokken (van 4K).
Het bestandssysteem op /dev/mmcblk0p2 is nu 1923328 blokken groot.