Last Updated on 12 september 2022 by Syds
Raspbian 11 Bullseye installeren op Banana Pi Zero M2
Zie ook mijn pagina over het installeren van Debian 11 Bullseye op de BPI M2Z: https://www.sydspost.nl/index.php/2022/08/24/debian-11-bullseye-op-banana-pi-zero-m2/
Omdat de Debian image geen firmware voor de bluetooth adapter bevat besloten om Raspbian 11 Bullseye te gaan installeren op de BPI M2Z. Hierbij een verslag hiervan.
Benodigdheden:
- Banana Pi Zero M2
- WiFi antenne + aansluitkabel
- Monitor, toetsenbord en muis
- HDMI naar HDMI mini kabel
- USB Mini HUB OTG
- 32GB (of groter) SD-Card
- Desktop of Laptop met SD-Card reader
Stap 1. Banana Pi voorbereiden
De WiFi ontvangst van de Banana Pi is belabberd. De Banana Pi heeft niet net als de Raspberry Pi Zero 2W een interne antenne. Gelukkig had ik een antenne draad overgehouden van een eerder project, en had ik onlangs twee antennes van een kapot accesspoint afgeschroefd voordat die in de vuilnisbak belandde.
De antennedraad kun je op de daarvoor bestemde aansluiting van de Banana Pi klikken, vervolgens de antenne op de antennedraad schroeven.
Vervolgens de HDMI naar HDMI mini verloopkabel op je monitor aansluiten en aansluiten op de HDMI-mini aansluiting van de Banana Pi. Om USB randapparatuur aan te kunnen sluiten heb je een OTG USB Mini Hub nodig met micro USB aansluiting, deze sluit je aan op één van de micro USB aansluitingen, maakt niet uit welke. Op deze USB Mini Hub kun je een toetsenbord en muis aansluiten. Tot slot voeden we de Banana Pi m.b.v. een micro USB kabel.
Hiermee zijn de hardware voorbereidingen klaar.
Stap 2. Banana Pi voorzien van Raspbian (9) Stretch image
Ik heb deze stap uitgevoerd m.b.v. een Windows laptop, zie voor de beschrijving voor hoe te werk te gaan met een Linux machine de wiki van Banana Pi: https://wiki.banana-pi.org/Getting_Started_with_M2_Zero
Allereerst downloaden we de Raspbian Stretch image vanaf de site van Banana Pi m.b.v. je laptop of desktop. Download de file https://drive.google.com/file/d/1Xk86WchdJemKb4ltCX0AB9wRj5NJcZL1/view. Om deze image op de SD kaart te kunnen zetten kun je gebruik maken van Balena Etcher. Installeer deze software vanaf: https://www.balena.io/etcher/
Kies voor “Download for Windows (x86/x64)” en wacht tot de software is gedownload. Open daarna het gedownloade bestand en accepteer de Licentieovereenkomst door op “Akkoord” te klikken.
Nadat de software is geïnstalleerd start Balena Etcher automatisch. Het volgende scherm verschijnt:
Kies voor “Flash from file”, en selecteer de Raspbian Stretch image file die je net hebt gedownload en stop de SD card in de cardreader van je laptop/desktop
Als het goed is wordt je SD card direct herkent, klik op “Flash!” om het flashen te starten. Er verschijnt daarna een scherm met het verzoek om Windows Command script toestemming te geven iets aan je systeem te veranderen, klik op “Akkoord”. De image file wordt nu naar je SD-card geschreven, en er wordt automatisch geverifieerd of dit goed gegaan is. Na verloop van tijd verschijnt onderstaande melding dat alles succesvol is verlopen. Je kunt nu de SD kaart weer uit de kaartlezer halen
Stap 3. Raspbian Stretch voor de eerste keer opstarten
Stop de SD kaart in de daarvoor bestemde houder van de Banana Pi, kan maar op één manier, dus kan niet fout gaan. Sluit vervolgens de Banana Pi aan op de voeding en zet de monitor aan. Als alles goed is gegaan zie je je monitor het Banana Pi logo en daarna vol lopen met opstartinformatie. Na verloop verschijnt de desktop omgeving.
(De volgende afbeeldingen zijn schermafdrukken van Putty, een terminal programma, en zijn achteraf gemaakt.)
Als eerste gaan we uiteraard de Banana Pi verbinden met de WiFi. Hiervoor moeten we weten hoe de WiFi interface heet van de Banana Pi. Voer hiervoor het volgende commando uit.
root@radio:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 16:a2:ef:7b:68:b1 brd ff:ff:ff:ff:ff:ff
3: ifb0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 32
link/ether 66:71:d9:15:9b:30 brd ff:ff:ff:ff:ff:ff
4: ifb1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 32
link/ether 46:96:fa:e6:ad:94 brd ff:ff:ff:ff:ff:ff
5: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether e2:ae:d4:ba:01:0f brd ff:ff:ff:ff:ff:ff
6: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
link/ipip 0.0.0.0 brd 0.0.0.0
7: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether ac:6a:a3:1f:cc:bf brd ff:ff:ff:ff:ff:ff
De naam van de WiFi interface begin altijd met de letter w, dus die van de Banana Pi heet dus “wlan0”. Check of de interface nu actief is:
root@radio:~# ip a | grep wlan0
7: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
De status is “UP”, dus we kunnen verder met een scan van het WiFi-netwerk:
root@radio:~# iwlist wlan0 scan| grep ESSID
ESSID:"H369ABF8AF9"
Mijn WiFi netwerk wordt gevonden en heet “H369ABF8AF9”, vervolgens gaan we deze SSID en het bijbehorende wachtwoord toevoegen aan de WiFi configuratie:
root@radio:~# wpa_passphrase <jou SSID> <jou WiFi password>
network={
ssid="<jouw SSID>"
#psk="<jouw WiFi password>"
psk=9a3905058255fb51ba87c9d02d0ca74dd94fd48baab0e0cc22ba9d5c40a2333d
}
Bovenstaande informatie wordt weggeschreven in het bestand /etc/wpa_supplicant/wpa_supplicant.conf. We gaan nu de Banana Pi connectie laten maken met de WiFi:
root@radio:~# wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -i wlan0
Successfully initialized wpa_supplicant
Failed to create interface p2p-dev-wlan0: -22 (Invalid argument)
nl80211: Failed to create a P2P Device interface p2p-dev-wlan0
P2P: Failed to enable P2P Device interface
wlan0: Trying to associate with 2c:91:ab:e4:f2:1d (SSID='H369ABF8AF9' freq=2462 MHz)
wlan0: Associated with 2c:91:ab:e4:f2:1d
wlan0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
wlan0: WPA: Key negotiation completed with 2c:91:ab:e4:f2:1d [PTK=CCMP GTK=CCMP]
wlan0: CTRL-EVENT-CONNECTED - Connection to 2c:91:ab:e4:f2:1d completed [id=0 id_str=]
De connectie is gemaakt, stop wpa_supplicant door op <ctrl>-<c> te drukken. We gaan dit proces in de background starten door de optie -B toe te voegen:
root@radio:~# wpa_supplicant -B -c /etc/wpa_supplicant/wpa_supplicant.conf -i wlan0
maar nu moet de Banana Pi nog een IP-address krijgen van de DHCP server:
root@radio:~# dhclient wlan0
Check of de Banana Pi een IP-address heeft gekregen met:
root@radio:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 16:a2:ef:7b:68:b1 brd ff:ff:ff:ff:ff:ff
3: ifb0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 32
link/ether 66:71:d9:15:9b:30 brd ff:ff:ff:ff:ff:ff
4: ifb1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 32
link/ether 46:96:fa:e6:ad:94 brd ff:ff:ff:ff:ff:ff
5: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether e2:ae:d4:ba:01:0f brd ff:ff:ff:ff:ff:ff
6: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
link/ipip 0.0.0.0 brd 0.0.0.0
7: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether ac:6a:a3:1f:cc:bf brd ff:ff:ff:ff:ff:ff
inet 192.168.2.97/24 brd 192.168.0.255 scope global dynamic wlan0
valid_lft 86342sec preferred_lft 86342sec
inet6 fe80::ae6a:a3ff:fe1f:ccbf/64 scope link
valid_lft forever preferred_lft forever
Je ziet dat mijn Banana Pi het ip-address 192.168.2.97 heeft gekregen. Uiteraard zou bij een reboot het proces wpa_supplicant gestopt worden, en na reboot niet opnieuw gestart. Daarom gaan we ervoor zorgen dat zowel wpa_supplicant als dhclient automatisch gestart worden bij een reboot. Kopieer hiervoor de standaard service file van wpa_supplicant en pas deze aan:
root@radio:~# cp /lib/systemd/system/wpa_supplicant.service /etc/systemd/system/wpa_supplicant.service
root@radio:~# vi /etc/systemd/system/wpa_supplicant.service
Pas het volgende aan in de file /etc/systemd/system/wpa_supplicant.service:
- Pas de regel startende met ExecStart als volgt aan:
ExecStart=/sbin/wpa_supplicant -u -s -c /etc/wpa_supplicant/wpa_supplicant.conf -i wlan0
- en voeg onder deze regel het volgende toe:
Restart=always
De file ziet er na deze aanpassingen als volgt uit:
root@radio:~# cat /etc/systemd/system/wpa_supplicant.service
[Unit]
Description=WPA supplicant
Before=network.target
After=dbus.service
Wants=network.target
[Service]
Type=dbus
BusName=fi.epitest.hostap.WPASupplicant
ExecStart=/sbin/wpa_supplicant -u -s -c /etc/wpa_supplicant/wpa_supplicant.conf -i wlan0
Restart=always
[Install]
WantedBy=multi-user.target
Alias=dbus-fi.epitest.hostap.WPASupplicant.service
Open vervolgens een nieuwe file voor de dhclient service:
root@radio:~# vi /etc/systemd/system/dhclient.service
en kopieer de volgende inhoud in de file:
[Unit]
Description= DHCP Client
Before=network.target
After=wpa_supplicant.service
[Service]
Type=forking
ExecStart=/sbin/dhclient wlan0 -v
ExecStop=/sbin/dhclient wlan0 -r
Restart=always
[Install]
WantedBy=multi-user.target
Tot slot gaan we services activeren:
root@radio:~# systemctl daemon-reload
root@radio:~# systemctl start wpa_supplicant.service
root@radio:~# systemctl enable wpa_supplicant.service
root@radio:~# systemctl start dhclient.service
root@radio:~# systemctl enable dhclient.service
Reboot de Banana Pi, en check of hij automatisch connectie maakt met het WiFi netwerk, en een IP-address toegewezen heeft gekregen:
root@radio:~# reboot
Stap 4. Distro-upgrade naar Raspbian (10) Buster
Voordat we de update starten dienen we eerst het root filesysteem te vergroten. Standaard is die namelijk maar zo’n 7Gb groot, en daarmee te klein om en het huidige besturingssysteem te bevatten, en de download van het nieuwe besturingssysteem. Dit terwijl je SD-card waarschijnlijk nog voldoende vrije ruimte bevat. Start hiervoor fdisk op:
pi@radio:~ $ sudo fdisk /dev/mmcblk0
Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Toets p in om een overzicht te krijgen van de beschikbare partities
Command (m for help): p
Disk /dev/mmcblk0: 29.7 GiB, 31914983424 bytes, 62333952 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
Disklabel type: dos
Disk identifier: 0x6fa2d034
Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 204800 729087 524288 256M c W95 FAT32 (LBA)
/dev/mmcblk0p2 729088 62333951 61604864 29.4G 83 Linux
Maak notitie van de start sector van de Linux partitie, in mijn geval dus 729088. Verwijder de Linux partitie met het commando d:
Command (m for help): d
Partition number (1,2, default 2): 2
Nu maken we een nieuwe partitie aan, met dezelfde start sector als de “oude” Linux partitie, dus geef het commando n. Kies voor “p primary”, en voor partitie nummer 2. Vul bij First sector het start sector nummer in van de oude Linux partitie die je genoteerd hebt, in mijn geval dus 729088. Als laatste sector kies je voor de default. De partitie wordt aangemaakt.
Command (m for help): n
Partition type
p primary (2 primary, 0 extended, 2 free)
e extended (container for logical partitions)
Select (default p):
Using default response p.
Partition number (2,3, default 2):
First sector (2048-62333951, default 2048): 729088
Last sector (729089-62333951, default 62333951):
Command (m for help):
En schrijf de partitie tabel wel met het commando w:
Command (m for help): w
Reboot de BPI, en log opnieuw in
root@radio:~# reboot
Nadat je opnieuw bent ingelogd breiden we het root filesystem uit met:
sudo resize2fs /dev/mmcblk0p2
Check nu de beschikbare ruimte:
pi@radio:~ $ df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 182392 0 182392 0% /dev
tmpfs 50196 2472 47724 5% /run
/dev/mmcblk0p2 30323692 6817272 22191044 24% /
tmpfs 250960 0 250960 0% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 250960 0 250960 0% /sys/fs/cgroup
/dev/mmcblk0p1 261868 66280 195588 26% /boot
tmpfs 50192 0 50192 0% /run/user/109
tmpfs 50192 0 50192 0% /run/user/0
tmpfs 50192 0 50192 0% /run/user/1000
In mijn geval heeft /dev/mmcblk0p2 het root filesystem 76% vrije ruimte, genoeg voor de volgende stappen.
Log in op de Banana Pi en open de file /etc/apt/sources.list:
root@radio:~# vi /etc/apt/sources.list
Verander overall waar nu “stretch” staat in “buster”, de file ziet er dan als volgt uit:
pi@bpi-iot-ros-ai: $ cat sources.list
deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
Open vervolgens de file /etc/apt/sources.list.d/raspi.list
pi@radio: $ sudo vi /etc/apt/sources.list.d/raspi.list
En verander ook hierin “stretch” in “buster”. De file ziet er dan als volgt uit:
pi@radio: $ cat /etc/apt/sources.list.d/raspi.list
deb http://archive.raspberrypi.org/debian/ buster main ui
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://archive.raspberrypi.org/debian/ stretch main ui
Nu kunnen we de upgrade starten met:
root@radio:~# sudo apt-get update
root@radio:~# sudo apt-get upgrade
root@radio:~# sudo apt-get dist-upgrade
Blijf bij het systeem, want zo nu en dan vraagt het upgradeproces of je bepaalde bestanden wilt behouden of overschrijven met een nieuwe (lege) versie, kies altijd voor de default. Op die manier blijven de configuratiewijzigingen die we tot nu toe hebben doorgevoerd bewaard. De upgrade neemt in totaal wel 20 tot 30 minuten in beslag. Als het upgrade proces klaar is reboot je de Banana Pi:
root@radio:~# sudo reboot
Log in op de Banana Pi en check of het operating systeem nu inderdaad Raspbian 10 Buster is:
pi@radio: $ hostnamectl
Static hostname: radio
Icon name: computer
Machine ID: d2f9276347354784998af9e9550d7537
Boot ID: f5f90be250ea4ffeafed6541133edb91
Operating System: Raspbian GNU/Linux 10 (buster)
Kernel: Linux 4.4.55-BPI-M2Z-Kernel
Architecture: arm
Gelukt ! Echter bij controle van de functionaliteit kwam ik er al snel achter dat de bluetooth controller van de BPI niet werd herkend. Tijd mee zitten puzzelen en op internet een “hack” gevonden die dit oplost. Probleem lijkt hem te zitten in de “Bluez” en “Bluetooth” packages die elkaar in de weg zitten. Daarom stoppen we de bluetoothd services, deinstalleren we de bluetooth packages en her installeren we de bluez en blueman packages:
pi@radio: $ sudo systemctl stop bluetooth
pi@radio: $ sudo systemctl disable bluetooth
pi@radio: $ sudo apt-get remove --purge bluetooth
pi@radio: $ sudo apt-get install --reinstall bluez blueman
De “hack” dient uitgevoerd te worden door een niet-root gebruiker, en kan daarom niet in de normale boot cycles in rc.local, systemd oid opgenomen worden. Daarom zetten we voor een tools de rechten goed met
pi@radio: $ sudo chmod u+s /usr/bin/hciattach
pi@radio: $ sudo chmod u+s /bin/hciconfig
pi@radio: $ sudo chmod u+s /usr/sbin/rfkill
Vervolgens maken we shell script aan die de “hack” uitvoert:
pi@radio: $ sudo vi /home/pi/bluetooth.sh
en kopieer onderstaande inhoud in dit shell script:
#!/bin/bash
while [ ! -f /sys/class/rfkill/rfkill0/state ]
do
`/bin/sleep 1`
done
/usr/sbin/rfkill unblock all
/usr/bin/hciattach /dev/ttyS1 bcm43xx 1500000
/usr/bin/hciattach /dev/ttyS1 bcm43xx 1500000
/usr/bin/hciattach any
/bin/hciconfig hci0 up
ook hiervan zetten we de rechten even goed met:
pi@radio: $ sudo chmod u+s /home/pi/bluetooth.sh
pi@radio: $ sudo chmod +x /home/pi/bluetooth.sh
Vervolgens gaan we dit script laten uitvoeren zodra de desktop omgeving wordt gestart:
pi@radio: $ sudo vi /home/pi/.config/autostart/bluetooth.desktop
en kopieer de volgende inhoud in deze file:
[Desktop Entry]
Name=Bluetooth
Exec=/home/pi/bluetooth.sh
reboot en check of de bluetooth adapter nu wel wordt herkend met:
pi@radio: $ sudo bluetoothctl list
Controller AA:AA:AA:AA:AA:AA radio [default]
Vervolgens kun je met behulp van de bluetooth manager op je desktop omgeving of vanaf de cli met bluetoothctl (zie hiervoor ook mijn tutorial voor de Vintage radio) connectie maken met je bluetooth devices.
Stap 5. Distro-upgrade van Raspbian 10 Buster naar Raspbian 11 Bullseye
Feitelijk dezelfde stappen als hierboven beschreven in stap 4. En waarschijnlijk had ik ook wel in één keer kunnen migreren van Raspbian 9 Stretch naar Raspbian 11 Bullseye, maar stapje voor stapje leek me beter.
Log in op de Banana Pi en open de file /etc/apt/sources.list:
root@radio:~# vi /etc/apt/sources.list
Verander de twee regels die je in de vorige stap hebt toegevoegd zodat “buster” in “bullseye” veranderd.
De file ziet er dan als volgt uit:
pi@bpi-iot-ros-ai: $ cat sources.list
deb http://raspbian.raspberrypi.org/raspbian/ bullseye main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
Open vervolgens de file /etc/apt/sources.list.d/raspi.list
pi@radio: $ sudo vi /etc/apt/sources.list.d/raspi.list
En verander ook hierin “stretch” in “buster”, en verwijder “ui” achter “main”. De file ziet er dan als volgt uit:
pi@radio: $ cat /etc/apt/sources.list.d/raspi.list
deb http://archive.raspberrypi.org/debian/ bullseye main
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://archive.raspberrypi.org/debian/ stretch main ui
Nu kunnen we de upgrade starten met:
root@radio:~# apt-get update
root@radio:~# apt-get upgrade
root@radio:~# apt-get dist-upgrade
Noot: Bij de laatste stap in het proces, de distributie upgrade (dist-upgrade) gaf apt-get bij mij een foutmelding dat een afhankelijkheid van lib-gcc niet klopte, hij verwachte een nieuwere versie van gcc-base-8 dan beschikbaar. Dit opgelost met het commando: apt-get install gcc-base-8. Naast de installatie van gcc-base-8 ging het systeem direct verder met de distributie upgrade en het uiteindelijk resultaat was een volledige upgrade naar Raspbian 11 Bullseye.
Blijf bij het systeem, want zo nu en dan vraagt het upgradeproces of je bepaalde bestanden wilt behouden of overschrijven met een nieuwe (lege) versie, kies altijd voor de default. Op die manier blijven de configuratiewijzigingen die we tot nu toe hebben doorgevoerd bewaard. De upgrade neemt in totaal wel 20 tot 30 minuten in beslag. Als het upgrade proces klaar is reboot je de Banana Pi:
root@radio:~# reboot
Log in op de Banana Pi en check of het operating systeem nu inderdaad Raspbian 11 Bullseye is:
root@radio:~# hostnamectl
Static hostname: radio
Icon name: computer
Machine ID: b1762bb2a9d8431a988c6cac5ff8f356
Boot ID: 75304faf0e7940ad9a7f389a7e4f12d3
Operating System: Raspbian GNU/Linux 11 (bullseye)
Kernel: Linux 4.4.55-BPI-M2Z-Kernel
Architecture: arm
Gelukt ! Veel plezier met je Banana Pi Zero M2 met Raspbian 11 Bullseye !
This was a wonderful guide to updating my BananaPI. Thank you for publishing this.
Well, almost. Upgrading to buster went just fine. Moving to bullseye results in the loss of raspberrypi Pixel desktop function. “startx” fails with launch. Still working to figure out a solution but removal and reinstallation of xorg and lightdm was not enough to fix it.
Hi TarHeelz, i use my Banana Pi as a 3D printserver and had no need for the GUI. So i didn’t test X.
If you find the solution, please post it as reaction, so other people can have their advantage with it.
Thx, Syds