Bananapi
Na jednodeskové servery s oblibou používám distribuci Armbian. U desek bananapi je z mého pohledu mizerná softwarová podpora výrobce. V praxi to pro mě znamená, že tam kde nepoběží Armbian, tak je pro mě nepoužitelné jako server.
Banana Pi R1
Banana Pi R2
Pozor, rozlišovat desku Banana Pi R2 a Banana Pi R2 Pro. Chvíli jsem se natrápil s tím, že jsem si stáhnul komunitní build Banana Pi R2 Pro, který ale nešel nabootovat. Kdybych se pozorněji díval na procesor, tak se mi to nestane :)
Dále je třeba počítat s tím, že Banana Pi R2 má jádro 4.19., do kterého budou backportovány patch do prosince 2024. Pak podpora jádra skončí. Zároveň si nové jádro musím kompilovat sám - není automaticky připravováno v rámci distribuce. V minulosti jsem četl diskuse, že se nepodařilo přejít na jádro 5 a vyšší, takže nevidím ani naději, že se to změní a budu muset časem zařízení vyhodit.
Automatické zapnutí po připojení napájení
Bananapi R2 trpí neduhem - chováním, které bych u routeru neočekával. Pro zapnutí je potřeba podržet tlačítko power na cca 7 sec. Ošidné je, že jakmile to vypadá, že bananapi startuje a člověk pustí tlačítko power, tak se vypne. Tlačítko se musí chvíli předržet.
Každopádně když vypadne proud, tak router bez manuálního zapnutí nenastartu - což je u routeru nesmysl.
V diskusi je popsáno řešení, kde se připájí u tlačítka PWR PIN1 a PIN2. Deska se pak bude chovat, jako by někdo držet tlačítko power neustále zapnuté.
Tady na obrázku jsou vidět piny - popis pinů je u tlačítka RESET (u něj rozhodně nechci piny spojit).
Tlačítko POWER je blíže ke konci desky. Tady je vidět řešení propojení PINů 1 a 2 ze spodní strany desky, kde je to jednodušší na přístup:
Osobně jsem jako propojovač použil kousek drátku, který jsem připájel na obě nožičky a tím jsem PINy propojil.
Určitě to lze udělat hezčím způsobem, nicméně řešení mi funguje.
Kompilace
Pokud není možné využít komunitní obrazy https://github.com/armbian/community, nezbývá než se pustit do vlastní kompilace. Protože se při kompilaci musí nainstalovat a stáhnout hodně software, provádím kompilaci raději ve VirtualBoxu, abych si nezabalastil systém.
Pro kompilaci jádra jsem potřeboval kolem 27 GB místa na disku. Pro kompilaci celého OS image je potřeba víc. Odhaduji tak 35 GB, ale nemám to ověřené, protože mi došlo místo, takže jde čistě o odhad.
apt-get -y -qq install git apt install sudo git clone --depth 1 https://github.com/armbian/build cd build ./compile.sh
Dále přihazuji screeny obrazovek z kompilace jádra.
Do not change the kernel configuration
Dole jsem zvolil Show CSC/WIP/EOS/TVB
Musím potvrdit I understand and agree
Zvolím konkrétní verzi desky. Banana Pi R1 má kódové označení „lamobo“.
Volba current
Zapsání obrazu na SD kartu
dd if=Armbian_22.11.0-trunk_Bananapir2pro_kinetic_edge_6.0.7.img of=/dev/sda bs=8M status=progress
BananaPi R2 - Debug-UART
- USB2Serial-Adapter (e.g. CP2102 or FTDI, known problems with Profilic- and ch340g-Chipsets)
- using Uart-Pins (not 40-pin-connector)
- each TX ⇒ RX (r2 tx to rx of usb2serial, tx of usb2serial to r2 rx)
- application for PC:
- Linux: minicom
- Windows: putty
- settings: 115200 8N1 FlowControl: off
Minicom
Minicom je jednou z možností, jak komunikovat skrze sériovou linku.
sudo apt-get install minicom sudo minicom -s
+-----[configuration]------+ | Filenames and paths | | File transfer protocols | | Serial port setup | <<<<<<<<<<<< | Modem and dialing | | Screen and keyboard | | Save setup as dfl | | Save setup as.. | | Exit | | Exit from Minicom | +--------------------------+
+-----------------------------------------------------------------------+ | A - Serial Device : /dev/ttyUSB0 | | B - Lockfile Location : /var/lock | | C - Callin Program : | | D - Callout Program : | | E - Bps/Par/Bits : 115200 8N1 | | F - Hardware Flow Control : No | | G - Software Flow Control : No | | | | Change which setting? | +-----------------------------------------------------------------------+
- save as .dfl
- Exit from Minicom
zdroj: https://www.fw-web.de/dokuwiki/doku.php?id=en:bpi-r2:debug-uart
Přípdně by mělo jít použít i následující příkaz, kde nadefinuji všechno potřebné v příkazové řádce.
minicom --device /dev/ttyUSB0 --baudrate 115200
Screen
Je další možností jak komunikovat se sériovou linkou.
screen /dev/ttyUSB0 115200
Ovládání screenu je trochu podobné jako ovládání minicomu. Detaily popisuje tento článek.
Screen lze mimo jiné používat i na serveru. Spustím nějaký proces na serveru, zmáčknu Ctrl-A a potom d a mohu se odpojit od serveru. Pro načtení screenu po připojení spustím screen s parametrem
screen -r
Pokud mám spuštěných více sezení, tak si vypíšu všechna sezení například takto:
screen -ls screen -r 1
Ukončení screenu provedu pomocí kombinace Ctrl-A a potom K. Vypsání nápovědy je možné pomocí zkratky Ctrl-A a ?.
Problémy po nabootování
systemd-networkd-wait-online
Zařízení po bootu čeká na síťová zařízení, až budou online. Nezkoumal jsem do hloubky, jak to má fungovat. Každopádně mám připojený ethernetový kabel a nemá smysl, aby se kvůli tomu 1,5 minuty nebo déle čekalo na něco, co se nezmění. Zde je o příčině popsáno více. V disku jsem našel řešení:
systemctl disable systemd-networkd-wait-online.service
A podle všeho pro úplné vypnutí (možná se po aktualizaci systemd zase zapne a proto je potřeba ještě zamaskovat):
systemctl disable systemd-networkd-wait-online.service
Stejně se teď potýkám s chybovým kódem v logu:
Dec 11 06:29:58 bananapir2 systemd-networkd-wait-online[6552]: Event loop failed: Connection timed out Dec 11 06:29:58 bananapir2 apt-helper[6550]: E: Podproces /lib/systemd/systemd-networkd-wait-online vrátil chybový kód (1)
Při hledání řešení jsem našel způsob, jak pohodlně editovat konfigurační soubory služeb v systemd.
systemctl edit --full systemd-networkd-wait-online.service
Rovnou to vyzkouším a nastavím timeout na 10 sec editací tohoto řádku:
ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --timeout=10
Failed to start Entropy - based on the HAVEGE algorithm
Při bootování jsem se setkal s touto chybou:
[FAILED] Failed to start Entropy Da…based on the HAVEGE algorithm.
V diskusi jsem našel a aplikoval řešení:
mkdir -p /etc/systemd/system/haveged.service.d echo -e '[Service]\nSystemCallFilter=uname' > /etc/systemd/system/haveged.service.d/syscall.conf
Druhé řešení, které jsem neověřoval je zakomentovat pořádky začínající SystemCallFilter v souboru
/lib/systemd/system/haveged.service
Druhé řešení jsem kombinoval s prvním a ukázalo se, že v kombinaci s prvním to řešení není.
Změna MAC adresy
Pokud by bylo potřeba změnit MAC adresu síťové karty, pomůže příkaz
sudo ip link set dev eth0 address XX:XX:XX:XX:XX:XX
Nastavení sítě
Aktuálně mám trochu zmatek v tom, proč je v distribuci tolik network managerů na nastavení sítě - třeba se k pochopení dostanu později. Můj cíle je nakonfigurovat Bananapi R2 jako router. 4 ethernetové porty budou tedy switch pro interní síť. 1 ethernetový portu bude sloužit pro připojení k internetu. V této části neřeším routování packetů - pouze nastavení LAN portů.
NetworkManager
U NetworkManagera chceme zajistit, aby nenastavoval žádné síťové zařízení. To zajistil již nachystaný soubor /etc/NetworkManager/conf.d/10-ignore-interfaces.conf
[keyfile] unmanaged-devices=interface-name:eth*,interface-name:wan*,interface-name:lan*,interface-name:br*
Toto se hodí, pokud wifi karta nebude stabilní. Může to být z důvodu úsporného režimu a toto zajistí vypnutí úsporného režimu na wifi kartě. Soubor /etc/NetworkManager/conf.d/20-override-wifi-powersave-disable.conf:
[connection] wifi.powersave = 2
Systemd Network
Defaultně byly všechny ethernetové porty v bridgi. Potřeboval jsem jeden port oddělit pro Internet a zbytek v bridgi nechat. Tady se odehrává hlavní nastavení:
root@bananapir2:/etc/systemd/network# ls -l celkem 32 -rw-r--r-- 1 root root 30 26. srp 2021 10-br0.netdev -rw-r--r-- 1 root root 70 17. lis 09.38 10-br0.network -rw-r--r-- 1 root root 39 17. lis 09.52 10-eth0.network -rw-r--r-- 1 root root 40 26. srp 2021 10-lan0.network -rw-r--r-- 1 root root 40 26. srp 2021 10-lan1.network -rw-r--r-- 1 root root 40 26. srp 2021 10-lan2.network -rw-r--r-- 1 root root 40 26. srp 2021 10-lan3.network -rw-r--r-- 1 root root 51 17. lis 09.56 10-wan.network
Když budu procházet jednotlivé soubory, tak 10-br0.netdev vytvoří zařízení br0 typu síťový most (bridge).
root@bananapir2:/etc/systemd/network# cat 10-br0.netdev [NetDev] Name=br0 Kind=bridge
Síťovému mostu je třeba přidělit statickou IP adresu. Ta bude výchozí bránou pro vnitřní síť. Dále pak vypnout DHCP.
root@bananapir2:/etc/systemd/network# cat 10-br0.network [Match] Name=br0 [Network] #DHCP=yes DHCP=no Address=192.168.0.1/24
Pro zařízení eth0 jsem raději vypnul přidělování IP adresy skrze DHCP. Nejsem si jistý, k čemu jinak slouží eth0 - třeba to zjistím později.
root@bananapir2:/etc/systemd/network# cat 10-eth0.network [Match] Name=eth0 [Network] #DHCP=yes
Jednotlivé ethernetové porty budou sloužit jako switch a budou zapojeny do bridge:
root@bananapir2:/etc/systemd/network# cat 10-lan0.network [Match] Name=lan0 [Network] Bridge=br0 root@bananapir2:/etc/systemd/network# cat 10-lan1.network [Match] Name=lan1 [Network] Bridge=br0 root@bananapir2:/etc/systemd/network# cat 10-lan2.network [Match] Name=lan2 [Network] Bridge=br0 root@bananapir2:/etc/systemd/network# cat 10-lan3.network [Match] Name=lan3 [Network] Bridge=br0
Jeden ethernetový port - v mém případě to odpovídá síťovému zařízení WAN bude sloužit pro připojení k internetu. Chci ho tedy vyřadit z bridge a nechat mu přidělovat IP adresu skrze DHCP.
root@bananapir2:/etc/systemd/network# cat 10-wan.network [Match] Name=wan [Network] DHCP=ipv4 #Bridge=br0
Nakonec jsem ještě musel řešit oříšek, protože jsem potřeboval přidělit statickou IP adresu. Tu jsem přidělil, ovšem systém neustále zlobil - byl problém s překladem adres na IP adresy. Soubor /etc/resolv.conf byl prázdný a neobsahoval žádné DNS servery. Takže jsem soubor v /etc/systemd/network editoval a dopsal jsem tam i nastavení DNS serverů.
[Match] Name=wan [Network] #DHCP=ipv4 DHCP=no Address=10.10.10.2/24 DNS=212.96.161.6 212.96.160.7 8.8.8.8 1.1.1.1 Gateway=10.10.20.1 #Bridge=br0
Po tomto nastavení je třeba restartovat síť:
systemctl restart systemd-networkd
Další informace o nastavení lze čerpat zde: https://medium.com/100-days-of-linux/working-with-systemd-networkd-e461cfe80e6d
Po rebootu bohužel si zařízení wan nenačetlo adresu z DHCP serveru dokud jsem neprovedl restart systemd-networkd. Pak se zařízení aktivovalo a adresu si natáhlo. Nakonec jsem problém vyřešil ještě skrz konfiguraci /etc/network/interfaces.
Konfigurace /etc/network/interfaces
root@bananapir2:/etc/network# cat interfaces source /etc/network/interfaces.d/* # Network is managed by Network manager auto lo iface lo inet loopback auto wan iface wan inet dhcp
Pokud budu chtít nastavit statickou IP adresu, tak změním údaje o zařízení wan takto:
auto wan iface wan inet static address 84.42.251.238 netmask 255.255.255.248 gateway 84.42.251.233
Editací souboru /etc/network/interfaces jsem už zajistil, že zařízení wan má po bootu přidělenou IP adresu.
A protože jsem zjistil, že když nemám připojené žádné zařízení v LAN, tak se nepřidělí žádná IP adresa zařízení br0, přidal jsem do souboru ještě tyto řádky. Jinak mi služba dnsmasq při startu bananapi nebyla schopna nastartovat.
auto br0 iface br0 inet static address 192.168.0.1 netmask 255.255.255.0
Pak jsem zjistil, že služba nenastartovala ještě z jiného důvodu po nabootování. Tady je vidět výpis chyby.
root@bananapir2:/home/nosek# systemctl status dnsmasq [35/35] ● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Sun 2022-11-20 16:35:02 CET; 17min ago Process: 1376 ExecStartPre=/etc/init.d/dnsmasq checkconfig (code=exited, status=0/SUCCESS) Process: 1488 ExecStart=/etc/init.d/dnsmasq systemd-exec (code=exited, status=2) CPU: 134ms lis 20 16:35:00 bananapir2 systemd[1]: Starting dnsmasq - A lightweight DHCP and caching DNS server... lis 20 16:35:02 bananapir2 dnsmasq[1488]: dnsmasq: failed to create listening socket for 10.112.235.1: P> lis 20 16:35:02 bananapir2 dnsmasq[1488]: failed to create listening socket for 10.112.235.1: Požadovano> lis 20 16:35:02 bananapir2 dnsmasq[1488]: FAILED to start up lis 20 16:35:02 bananapir2 systemd[1]: dnsmasq.service: Control process exited, code=exited, status=2/IN> lis 20 16:35:02 bananapir2 systemd[1]: dnsmasq.service: Failed with result 'exit-code'. lis 20 16:35:02 bananapir2 systemd[1]: Failed to start dnsmasq - A lightweight DHCP and caching DNS serv>
Nakonec mi pomohla tato diskuse: https://ask.fedoraproject.org/t/dnsmasq-fails-on-initial-startup-succeeds-on-restart-unknown-interface-or-failed-to-create-listening-socket/16893/3
Musel jsem editovat soubor /lib/systemd/system/dnsmasq.service a zakomentovat a přidat řádek takto:
#After=network.target After=network-online.target
Seznam přidělencý IP adres je v souboru:
/var/lib/misc/dnsmasq.leases
Pokud se rozhodnu, že změním IP adresu zařízení, které už je zapsané v tomto souboru, často se děje, že se ještě nějakou dobu přiděluje stará IP adresa. Je proto potřeba vymazat starý záznam v tomto souboru.
Nastavení vm.min_free_kbytes
Defaultní nastavení virtuální paměti v Armbianu je malé. Stávalo se mi pak, že po čase systém havaroval a hledal jsem příčinu. Takto vypadá nastavení virtuální paměti po instalaci:
root@cubieboard2:/home/nosek# cat /proc/sys/vm/min_free_kbytes 3442
Protože mám dostatek paměti RAM, tak jsem hodnotu navýšil editací souboru /etc/sysctl.conf a přidání řádku:
vm.min_free_kbytes=67584
Tady je více o chybě, se kterou jsem se setkával bez úpravy parametru: https://access.redhat.com/solutions/90883. Další informace k vm.min_free_kbytes lze nastudovat zde: https://linuxhint.com/vm_min_free_kbytes_sysctl/
Dále jsem pak nastavil, aby systém používal swapování pouze, když už nemá jinou možnost - opět přidáním řádku do souboru /etc/sysctl.conf:
#A swappiness setting of zero means that the disk will be avoided unless absolutely ##necessary (you run out of memory), while a swappiness setting of 100 means that ##programs will be swapped to disk almost instantly. vm.swappiness=0
Pro načtení nových hodnot bez restartování počítače je potřeba použít příkaz:
sysctl -p
Další konfigurace po čerstvé instalaci
Všimnul jsem si, že je nainstalovaná OpenVPN. Nevyužívám, proto jsem odinstaloval.
apt --purge remove openvpn
Dále byl spuštěn rpcbind, který také nepotřebuji.
systemctl stop rpcbind systemctl stop rpcbind.socket systemctl disable rpcbind
log2ram a journald
Narazil jsem na problém, že se rychle zaplňoval disk /var/log. Zkouším nastavení dle článku: https://github.com/azlux/log2ram/issues/174. Editoval jsem soubor /etc/systemd/journald.conf:
SystemMaxUse=10M RuntimeMaxUse=10M MaxRetentionSec=1day MaxFileSec=1day
Log u konkrétní služby:
journalctl -u systemd-networkd-wait-online
Tady další zdroje na zmenšení journalu: