Raspberry Pi 3B+

Raspberry Pi, ondertussen wel bekend bij de meeste hobbyisten. Zelf ooit begonnen met de eerste versie, ben ik nu met de nieuwste versie 3B+ begonnen (April 2018). Lees meer over de Raspberry Pi op mijn andere pagina's; deze pagina is over de installatie (voor mezelf, als referentie).

Eerste stappen

Image op SD-card zetten

Het begint met het prepareren van de SD kaart (16 GB, hoewel dat wat overdreven groot is). Ik heb op de raspberry Pi website een Raspberry image gedownload. Omdat ik de Raspberry vooral als een server ingebouwd in de meterkast wil gebruiken, hoef ik niet een volledige desktop-omgeving te hebben. Ben dus gegaan voor de Raspbian Stretch Lite gegaan (versie 2018-04-18), een voor de Raspberry aangepaste versie van Debian Stretch. ZIP gedownload en uitgepakt als '2018-04-18-raspbian-stretch-lite.img' in een tijdelijke map (bestand van 1.9 GByte).

Omdat ik bij een werkend systeem ook een backup van de SDcard wil maken, en 16 GB wel erg veel is, is het handig als de inhoud goed comprimeerbaar is. Ik vul daarom eerst de SDcard met nullen, en schrijf dan pas het image er op (wat tenslotte slechts een gedeelte van de kaart in beslag neemt).

sudo dd bs=4M if=/dev/zero of=/dev/mmcblk0 ; # 10.7 MB/s, dus 25 minuten...
sudo dd bs=4M if=2018-04-18-raspbian-stretch-lite.img of=/dev/mmcblk0
sudo sync
sudo dd bs=4M count=500 if=/dev/mmcblk0 of=readback.img
sudo truncate --reference 2018-04-18-raspbian-stretch-lite.img readback.img
md5sum *.img ; # beiden 737d1ace747da6fbb8bff02833de3251

Raspberry Pi 3B+
De Raspberry, met links Ethernet en USB-stick,
boven USB voeding, en onder extensieprint
met fan-control, shutdown-knop en I2C sensor.

Opstarten en bijwerken

SD card in de Raspberry, netwerkkabel er in, een goede 5 Volt voeding er op (2A minimaal wordt aanbevolen), en hij zou moeten starten. Neem ook een goed USB-kabeltje, goedkope kabeltjes zijn vaak zo bezuinigd op koper dat de inwendige weerstand hoog is... Nu maar hopen dat'ie goed opstart en me toe staat via SSH in te loggen (zonder toetsenbord en beeldscherm)...

Activity-LED gaat aan! Hoe kom je nu achter het IP-adres --> daarvoor gebruik ik de Fing applicatie op Android; die maakt een mooie lijst van de IP adressen en MACs van alle devices die op je lokale netwerk zijn aangesloten. En inderdaad, er duikt een nieuwe 'Raspberry Pi' op, en een 'ping' geeft aan dat er iets werkt.

Maar helaas, SSH laat niets van zich horen. Even zoeken op internet: dat is inderdaad sinds november afgelopen jaar standaard uitgezet... je kan het aanzetten door een lege file genaamd 'ssh' in de BOOT-partitie te zetten. Kaart weer in de laptop, file aanmaken, er terug in de Raspberry. En nu lukt het inderdaad, 'ssh pi@192.xxx.xxx.xxx' (met in plaats van de x'jes natuurlijk het adres zoals gevonden met Fing) geeft me een Linux prompt pi@raspberrypi:~ $ . Yes! Nu SSH permanent aanzetten met sudo raspi-config --> Interfaces --> SSH --> Enable, en natuurlijk gelijk het wachtwoord wijzigen (ik zal later ook mijn eigen accounts aanmaken, en het hele pi-account weggooien).

En natuurlijk: de eerste actie is altijd even zorgen dat de zaak up-to-date is (zie ook 'Raspberry updaten'): sudo apt-get update; sudo apt-get upgrade: niets te doen, was dus nog allemaal up-to-date. Even opruimen: sudo apt-get autoclean; sudo apt-get clean ; check met df hoe veel er vrij is. Dan even sudo reboot. De huidige kernel is nu 4.14.34-v7+ #1110 (uname -a).

Goed om ook even /var/log/syslog door te bladeren, om te checken of er nog dingen fout gaan tijdens het booten. Zo geven bij mij WiFi (Disable WiFi if country not set..., snap ik) and Bluetooth nog meldingen (Failed to start Configure Bluetooth Modems connected by UART)...

Zorgen dat de hele SDcard in gebruik is (nu is nog maar 2 GByte van de 16 in gebruik). Dit kan via sudo raspi-config --> Advanced options --> Expand filesystem, en je kan vervolgens met het df commando zien of het gelukt is: /dev/root is nu 15270256 blokken van 1K -> 16 Gbyte (met 8% in gebruik). Ook nog eens meten wat de snelheid van de SD-card is, waren vroeger problemen mee.

Nog een setup-guide

Zie ook deze guide voor het opzetten van een 'headless' raspberry: zonder monitor en toetsenbord. Ook inclusief aanzetten van WiFi etc.

Hardware configuratie

Voeding, Temperatuur, GPIO

Voeding: stroomgebruik in rust is nu 0.44 Ampere (bij 5.1 Volt). Temperatuur: sudo vcgencmd measure_temp --> temp=46.1'C bij 21 graden kamertemperatuur en zonder kastje: toch maar een koelvinnetje er op, scheelt een paar graden. De Ethernet/USB chip wordt zo te voelen zelfs nog wat warmer, dus ook maar een... Bordje rechtop zetten voor betere airflow. Hier meer informatie over beschikbare vcgencmd commando's. Om dit ook als gewone gebruiker te kunnen doen moet je wat extra instellingen doen (en een reset):

sudo echo 'SUBSYSTEM=="vchiq",GROUP="video",MODE="0660"' > /etc/udev/rules.d/10-vchiq-permissions.rules
sudo usermod -a -G video kees; # mijzelf toevoegen aan de groep 'video'
# of check temp met cat /sys/class/thermal/thermal_zone0/temp; geeft temperatuur*1000

Een kastje gemaakt van wat plaatjes acryl of perspex die ik nog had liggen, zie de foto. Ook nog een ventilatortje gevonden, past er wel mooi bij. Ventilator is 5V/80mA, dus dat kan je niet direct vanuit de Raspberry schakelen, met een extra transistor en wat weerstandjes is dit snel geregeld (schema?). Hiervoor heb ik een simpel uitbreidingskaartje gemaakt van gaatjesprint (zie foto) die via een flatcable aan de expansiepoort van de Rasberry zit. De transistor wordt aangestuurd via GPIO4, zie mijn uitleg over command-line gebruik van GPIO. Dit hoeft sinds de Jessie kernel niet meer als root; user is member van group gpio.

kees@raspberrypi ~ # echo "4" >/sys/class/gpio/export; sleep 1
kees@raspberrypi ~ # echo "out" >/sys/class/gpio/gpio4/direction
kees@raspberrypi ~ # echo "1" >/sys/class/gpio/gpio4/value; # ventilator gaat aan
kees@raspberrypi ~ # echo "0" >/sys/class/gpio/gpio4/value; # ventilator gaat weer uit

Hoeveel effect heeft dit? Bij het berekenen van de md5sum van /dev/zero is een core 100% in gebruik (top commando), met 0.65Ampere stroomgebruik. Met 55.8°C was de temperatuur na 15 minuten nog niet stabiel, maar toch de fan aangezet -> in een minuut naar ongeveer 37°C, en na 5 was het 34.3°C. Werkt dus wel (kan misschien zelfs wel iets trager draaien). Een startup scriptje gemaakt in /etc/rc.local (beter: sudo crontab -e met @reboot) dat regelmatig de temperatuur meet en zo de fan beheert: aan bij 60 graden, uit bij 55 graden. Maar, moet zeggen tot nu toe is de ventilator niet aangegaan (behalve bij testen met een lagere grens).

Naast de fanbesturing: ook nog een drukknop (witte knopje links) en rode LED aangesloten op GPIO17 en GPIO18. De knop wil ik gebruiken om de Raspberry uit te kunnen zetten zonder dit via een computer te hoeven doen; de LED voor bijvoorbeeld meldingen tijdens dat proces (is niet de bedoeling dat bij een druk op de knop de zaak een shutdown doet en plat gaat; moet een 'code' worden). Het ventilatorscript neemt ook dit voor zijn rekening. En nog wat uitbreidingsconnectors, voor I2C (op foto met aangesloten temperatuursensor) en seriële poort.

Communicatie

Heb in ieder geval I²C en seriële poort nodig: zie de Raspberry configuratie-pagina. De seriële poort (UART) is wat problematisch, de Raspberry heeft maar een 'echte', en die is standaard in gebruik voor Bluetooth. Er is een tweede, de mini-UART, maar de baudrate daarvan wisselt met de kloksnelheid, en als de Raspberry te warm wordt gaat de klok naar beneden -> je baudrate gaat de soep in (zie ook de UART-documentatie op de Raspberry site). Nu is hier gelukkig wel wat aan te doen, maar ideaal is het niet. Ik wissel de twee UARTs om (BT gebruikt dan de mini-UART) zodat ik framing errors etc op de externe UART kan gebruiken. Hiervoor is de device tree overlay pi3-miniuart-bt nodig, zie ook de UART configuratie-uitleg (hoefde geen kernel command line aan te passen etc). De seriële configuratie is nu zo dat ttyAMA0 == serial0 de volledige UART is, en beschikbaar is als GPIO-14 en -15 op de 40-pins connector.

kees@raspberrypi:~# ls -al /dev/ser*
lrwxrwxrwx 1 root root 7 mei 12 21:50 /dev/serial0 -> ttyAMA0
lrwxrwxrwx 1 root root 5 mei 12 21:50 /dev/serial1 -> ttyS0
minicom -b 9600 -o -c on -D /dev/serial0; # ^a x om te stoppen

Configureren met: sudo raspi-config, I²C aanzetten (en mijn LM75BD temperatuursensor aansluiten), ...

sudo apt-get install -y python-smbus i2c-tools
i2cdetect -l ; show lijst met I2C devices ; op raspberry3B+ de /dev/i2c-1
sudo chmod o+rw /dev/i2c-1 ; maak hem beschikbaar voor gewone gebruikers; nodig?
i2cget -y 1 0x48 0x00 ; dit leest mijn LM75BD uit (temperatuursensor)

Software configuratie

User names etc

Nu wil ik 'kees' heten, en niet 'pi'... Kan natuurlijk een nieuwe user aanmaken, en de oude weggooien, maar kan ook de user 'pi' renamen naar 'kees'. Dit gaat met het commando usermod, zoals ook hier uitgelegd. Ook de group 'pi' heb ik naar 'kees' omgewerkt, met het commando groupmod. Maar helaas, dat gaat niet als je vanuit 'pi' ingelogd bent. Heb dus toch even een tijdelijke user 'keestemp' aangemaakt, daarop ingelogd, en het daar vanuit gedaan... Let op, een foutje is snel gemaakt, maar niet per se snel opgelost.

sudo adduser keestemp
sudo adduser keestemp sudo
# nu uitloggen, en als 'keestemp' inloggen
sudo usermod -l kees -d /home/kees pi
groupmod -n kees pi

# nu kan je als 'kees' inloggen, en de sporen verwijderen
sudo deluser keestemp
sudo rm -r /home/keestemp
sudo adduser --uid 1010 --ingroup users --disabled-login --shell /usr/sbin/nologin pi
sudo rm /etc/sudoers.d/010_pi-nopasswd

Kijk, een user 'kees' met UID 1000 (first user)! Ondertussen begrepen dat een user 'pi' (en home directory /home/pi) toch door sommige tools verwacht wordt, dus toch maar weer een aangemaakt (maar zonder daarop in te kunnen loggen).

Overzetten instellingen

Ik ga met het opzetten van het systeem een beetje 'smokkelen': ik kopieer de configuratie van mijn oude Raspberry naar de nieuwe, om af te kijken (of configureren van bepaalde apps over te kunnen slaan). Eerst een kopie maken van mijn home directory, en de /etc directory, op de oude raspberry:

tar -cpjf OudeRaspberry.home.tar.bz2 /home/kees/ --exclude "/home/kees/temp/"
sudo tar -cpjf OudeRaspberry.etc.tar.bz2 /etc/

Deze kopie naar de nieuwe overhevelen (FileZilla en SFTP), en daar pak ik ze uit in een tijdelijke map (/home/kees/temp). Ik overschrijf dus niet de bestaande /etc en /home/kees! Ik kan nu selectief stukjes uit het archief kopieren naar waar ik ze wil hebben.

mkdir temp; cd temp; tar -xpvjf OudeRaspberry.home.tar.bz2; tar -xpvjf OudeRaspberry.etc.tar.bz2

Basic Linux config

Enkele basis-instellingen voor de Raspberry, overgenomen uit mijn eerdere configuraties... Instellen grotere swap file, aanpassen gebruik SD card, etc.

sudo apt-get install screen anacron
sudo nano /etc/dphys-swapfile; # en zet CONF_SWAPSIZE=1000 (1 Gbyte swap file op SD)
sudo mkdir /mnt/ramdisk; sudo mkdir /mnt/data; sudo chmod 777 /mnt/ramdisk /mnt/data
sudo nano /etc/fstab; # zie opties hieronder voor '/', ramdisk, en USB stick
sudo nano /etc/sysctl.conf; # zie opties hieronder, aantal systeemconfiguratieparameters
sudo nano .bashrc; # en ~/scripts toevoegen aan $PATH, etc

De instellingen van /etc/fstab zoals hierboven bijgewerkt (/mnt/data voor het testen van de SAMBA server, nu even een USB stick maar wordt later vervangen door de echte hard disk). Voor een langere levensduur noatime en andere parameters aangepast zodat er niet onnodig veel naar de SD geschreven wordt. Zal ik ook /tmp naar ram verhuizen (in plaats van een aparte ramdisk), op mijn oude systeem is op /tmp en /var/tmp normaal minder dan 100KByte in gebruik, maar ik weet niet het piek-gebruik; /var/log is 5 Mbyte. Zie ook /etc/default/tmpfs. In het kort:

PARTUUID=9427c403-02    /            ext4  defaults,noatime,commit=120,errors=remount-ro   0  1
tmpfs                   /mnt/ramdisk tmpfs defaults,noatime,nosuid,mode=0777,size=20m      0  0
/dev/disk/by-label/data /mnt/data    ext4  noexec,noatime,nofail,errors=remount-ro,commit=36000 0  0
# tmpfs /tmp tmpfs defaults,noatime,nosuid,size=100m 0 0
# tmpfs /var/tmp tmpfs nodev,nosuid,size=50m 0 0
# tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=100m 0 0

De /etc/sysctl aanpassingen, van alles wat met name security). De configuratie is standaard al zo ingesteld dat Raspbian minimaal swapt, zie  /etc/sysctl.conf : vm.swappiness=1. Ik heb dit naar 10 verhoogd; geheugen dat echt weinig wordt gebruikt mag best naar swap; en na een aantal dagen draaien als file server is er nog steeds maar zo'n 90 kB in gebruik (zie swapon -s), verwaarloosbaar dus. Forwearding aangezet: is later nodig voor de OpenVPN server. Reload met sudo sysctl --system:

vm.swappiness=10
vm.min_free_kbytes=16384
net.ipv4.ip_forward=1
kernel.sysrq=0
# See https://www.kernel.org/doc/Documentation/sysctl/fs.txt
fs.protected_hardlinks=0
fs.protected_symlinks=0

Security

De basis security: inloggen via SSH met een public key, opzetten van de firewall (met mijn configuratie-script overgehaald van de oude Raspberry) etc.

diff /etc/ssh/sshd_config etc/sshd_config; sudo nano /etc/ssh/sshd_config; # en werk bij waar nodig
sudo apt-get install iptables-persistent
sudo scripts/setup_iptables.sh; sudo ./setup_ip6tables.sh; # locale IP adres correct?
sudo cp temp/etc/rsyslog.d/22-iptables.conf /etc/rsyslog.d; # filter logs, zie firewall pagina

Encrypted files: back-ups etc wil ik veilig opslaan, kunnen privacy-gevoelige gegevens (bankieren etc) in staan. Gebruik hiervoor ecryptfs, zie mijn stukje over disk-encryptie. Vercijferde files van mijn oude .Backups directory kan ik nu naar de nieuwe kopiëren; hoeft verder niets ingesteld te worden of zo (benodigde gegevens zitten in de encrypted files). Na mounten met mijn mount_ecryptfs.sh scriptje zijn ze ongecrypt in Backups beschikbaar.

mkdir Backups .Backups; in de gewenste subfolder
echo "De folder is nog niet gemount met ecryptfs..." > Backups/readme.txt
sudo apt-get install ecryptfs-utils; # install ecryptfs

Tijd voor backup

Mooi moment om een backup te maken van de SD card, device /dev/mmcblk0. Let op; wordt een 16 GByte file (na compressie slechs 360 Mbyte)!

sudo umount /dev/mmcblk0p1; sudo umount /dev/mmcblk0p2
sudo dd bs=16M if=/dev/mmcblk0 of=raspbian3Bplus_20180505.img
md5sum raspbian3Bplus_20180505.img > raspbian3Bplus_20180505.img.md5
# 13 minuten, 16 GByte. En dan er een zip-file (.7z) van maken, 1:15 uur, 360 Mbyte -> 44x reductie!

Applicaties

Wat moet ik er zoal op zetten/configureren (zie overzetten instellingen)? Voornamelijk al de services die ik op de huidige raspberry heb draaien:

  • File server (samba), om vanaf mijn netwerk bij de netwerkschijf te kunnen: OK
    • sudo apt-get install samba samba-common-bin. Zie mijn Samba pagina voor setup. smbpasswd -a <user>. Werkte niet: moest de [printers], [print$] secties actief laten. Waarom --> miste een ';' voor [print$]. Foutje... SMB://192.168.xxx.xxx/shared/ is weer OK in Files (Nautilus). Nog eens optimaliseren qua access.
  • File synchronisation/backup tussen computers met Unison
    • Helaas is op de Debian Stretch de unison versie 2.48 niet compatible met de 2.40 op de oude Raspberry (en op mijn latopts, en ...). Kan ik 2.48 ook makkelijk op de oude raspberry krijgen (om daarop over te gaan)? Wat zijn de verschillen? unison-all installeren?
  • Name server (dnsmasq) voor vaste IP adressen
    • sudo apt-get install dnsmasq dnsutils; sudo service dnsmasq stop;
      mv dnsmasq.conf dnsmasq.conf.org; <copy configuratie>;
      sudo service dnsmasq start

  • VPN server (openVPN), om ook van buitenaf op een veilige manier bij mijn netwerk te komen en veilig te internet(bankier)en
  • ??? Proxy server (squid) samen met SSH als openVPN niet lukt: is dat nog nodig?
  • Media server (mediatomb) om films en muziek naar mijn TV te streamen
  • Mail server (exim4) om mails vanaf de Raspberry te versturen. Laten draaien op ramdisk/tmpfs .
  • ??? Web server (lighttpd), web interface voor home control via Python: of alles via MQTT?
  • Dynamic DNS service (ddclient) om mijn thuisnetwerk buiten een naam te geven -> eerst de andere RP3 disablen
  • Home control/Domotica, een begin van mijn home-automation
    • sudo apt-get install mosquitto mosquitto-clients python-mosquitto python-pip
      sudo pip install paho-mqtt

Nu de rest nog. Tot de volgende keer...