====== Instalace distribuce Armbian na Espressobin ======
> **Poznámka k datu vzniku:** Tento článek vychází z praktické zkušenosti z 5. 6. 2021. Postup odpovídá tehdejším verzím Armbianu, firmware a doprovodných balíků a dnes už nemusí přesně odpovídat aktuálnímu stavu.
Již nějakou dobu jsem měl zprovozněný router Espressobin s distribucí [[https://www.armbian.com/espressobin/|Armbian]]. Bohužel zhruba každý měsíc jsem měl přepnutý filesystem do režimu readonly a vždycky bylo příčinou poškození filesystemu. Tentokrát bylo poškození tak fatální, že jsem routeru přestal důvěřovat a rozhodl jsem se pro novou instalaci.
Mé rozhodnutí podpořilo ještě několik dalších důvodů. Zjistil jsem, že je připravený nový firmware datovaný k 4. 1. 2021. Doufal jsem tedy, že nový [[https://minio.k-space.ee/minio/armbian/dl/espressobin/u-boot/|firmware]] pomůže k lepší stabilitě. Pro moji verzi Espressobinu se jednalo o firmware ''flash-image-ddr4-1g-1cs-1000_800.bin''.
Na Armbianu jsem měl starší jádro, takže dalším vylepšením bylo novější jádro. A jako poslední důvod, proč jsem do toho šel, byla výměna SD karty za [[https://www.alza.cz/sandisk-microsdhc-high-endurance-video-32gb-u3-v30-d5701039.htm|SanDisk High Endurance]], která by měla být odolnější proti neustálému přepisování.
{{.:sandisk-high-endurance.png|SanDisk High Endurance}}
{{.:sandisk-endurance-srovnavaci-test.jpg|Srovnání odolnosti paměťových karet}}
===== Flashování bootovacího firmware =====
Nejprve je potřeba flashnout bootovací firmware. Postup i aktuální firmware je popsaný na stránkách [[https://www.armbian.com/espressobin/|Armbianu]]. Nejprve je nutné nahrát firmware na flash disk formátovaný na FAT32. Flash disk připojit do USB 3.0 portu Espressobinu. Mít vytaženou SD kartu, aby se systému nepodařilo nabootovat. Připojit napájení a připojit se přes terminál pomocí minicomu.
Pak stačí napsat:
bubt flash-image-ddr4-1g-1cs-1000_800.bin spi usb
Za pár vteřin dojde k aktualizaci firmware. Jen upozorňuji, že příkazová řádka nenapoví, jaké soubory jsou na USB disku. Musel jsem název napsat přesně a musí se shodovat s názvem firmware, který bude instalován.
===== Příprava SD karty =====
Ze stránek [[https://www.armbian.com/espressobin/|Armbianu]] jsem stáhnul aktuální image distribuce pro Espressobin založenou na jádře 5.10. Image jsem rozbalil a nahrál na SD kartu.
xz -d Armbian_21.05.1_Espressobin_buster_current_5.10.34.img.xz
dd if=Armbian_21.05.1_Espressobin_buster_current_5.10.34.img of=/dev/sda bs=1024k status=progress
Pak už jen stačilo vložit SD kartu do Espressobinu a nabootovat. Armbian jako první krok po nabootování zvětší filesystem na maximum konkrétní SD karty. Poté provede základním nastavením, jako je heslo pro roota a vytvoření nového uživatele.
===== Drobná oprava message of the day =====
Po přihlášení do systému se zobrazí základní informace, tedy MOTD. V posledním řádku jsem měl chybu. Funkčně to nemělo na nic vliv, ale hodně mě to dráždilo.
RX today: Error: Unable to read database "/var/lib/vnstat/br0": No such file or directory Merge "br0+eth0+lan0+lan1+wan+wlp1s0+w" failed.
Příčina problému byla v tom, že systém nemohl rozhodnout, která síťová karta bude primární. Když se podíváme na výpis ''vnstat'', ukazuje kolik dat se přeneslo přes které zařízení.
vnstat
Řešením byla oprava v souboru ''/etc/default/armbian-motd''. Zakomentoval jsem původní řádek s ''PRIMARY_INTERFACE'' a změnil jej na zařízení, které chci vidět:
#PRIMARY_INTERFACE="$(ls -1 /sys/class/net/ | grep -v lo | sed -n -e 'H;${x;s/\n/+/g;s/^+//;p;}')"
PRIMARY_INTERFACE="eth0"
===== Nastavení sítě =====
Espressobin využívám jako router. Internet mám připojený do zařízení ''lan1''. V routeru mám připojenou mini PCI kartu Wi-Fi 5 GHz a USB Wi-Fi kartu 2,4 GHz.
Zbytek zařízení mám tedy v bridgi a pro přístup do internetu budou forwardovány na ''lan1''. Prvním krokem bylo nastavit síťová zařízení v ''/etc/systemd/network''.
# /etc/systemd/network/10-br0.netdev
[NetDev]
Name=br0
Kind=bridge
# /etc/systemd/network/10-br0.network
[Match]
Name=br0
[Network]
#DHCP=ipv4
DHCP=no
Address=192.168.1.1/24
# /etc/systemd/network/10-eth0.network
[Match]
Name=eth0
[Network]
DHCP=ipv4
# /etc/systemd/network/10-lan0.network
[Match]
Name=lan0
[Network]
Bridge=br0
# /etc/systemd/network/10-lan1.network
[Match]
Name=lan1
[Network]
#Bridge=br0
#DHCP=ipv4
# /etc/systemd/network/10-wan.network
[Match]
Name=wan
[Network]
Bridge=br0
==== Nastavení statické IP adresy ====
Protože mám statickou IP adresu, nastavil jsem ji editací souboru ''/etc/network/interfaces'':
auto lan1
iface lan1 inet static
address xx.xx.xx.xx
netmask 255.255.255.255
gateway xx.xx.xx.xx
==== Změna MAC adresy síťového zařízení ====
Pokud bych si nechal přidělovat IP adresu z DHCP, tak je u mého poskytovatele vázána na MAC adresu síťové karty. Může se stát, že v čase budu něco konfigurovat a budu chtít využít dynamického přidělování, tak ať nejsem nemile překvapen. Rovnou jsem změnil MAC adresu síťového zařízení ''lan1''. MAC adresa se nastavuje v souboru ''/boot/armbianEnv.txt''.
Nejprve jsem si vypsal přehled síťových zařízení, která systém vidí, a následně porovnal se souborem ''/boot/armbianEnv.txt''. V mém případě jsem potřeboval změnit MAC adresu zařízení ''eth3addr''.
verbosity=1
emmc_fix=off
spi_workaround=off
eth1addr=0E:BA:9F:93:CB:03
eth2addr=fa:ad:4e:84:25:2f
eth3addr=D0:AF:CC:23:24:ED
rootdev=UUID=4ab813fc-eda7-41af-a81e-1dca466c4454
rootfstype=ext4 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u
==== Změna portu SSH ====
Jeden z kroků, který u serverů dělám, je změna portu, na kterém běží SSH démon.
grep -i port /etc/ssh/sshd_config
# Port 8888
systemctl restart sshd
===== Instalace Wi-Fi karet =====
Pro kontrolu jsem si vypsal, zda jádro detekovalo obě Wi-Fi zařízení.
lspci
lsusb
To vypadalo nadějně, ale když jsem dal vypsat konkrétní jména zařízení, nebyla nalezena žádná, která by příslušela Wi-Fi kartě.
iwconfig
První mě napadlo, že nemám nainstalovaný firmware k Wi-Fi kartám. A odhad byl správný. K instalaci firmwaru lze využít utilitu přímo od Armbianu:
armbian-config
V menu je nutné se proklikat na ''Software'' -> ''Mini'' a nainstalovat mini firmware package. Po instalaci firmware a restartování mikropočítače už byly Wi-Fi karty funkční.
===== Nastavení automatického přidělování IP adres =====
Jednotlivá síťová zařízení jsou nakonfigurována, nyní je třeba nastavit automatické přidělování IP adres. Tento krok předchází konfiguraci konkrétních Wi-Fi sítí. K tomu využívám nástroj ''dnsmasq''.
apt install dnsmasq
Po čerstvé instalaci se mi zobrazila chybová hláška a démon nešel spustit:
dnsmasq: failed to create listening socket for port 53: Address already in use
Chvíli jsem se potrápil, proč čerstvá instalace nefunguje. Pak jsem přišel na to, že je potřeba konfigurace a problém způsobuje chybějící parametr ''bind-interfaces'' v konfiguraci. Vytvořil jsem tedy soubor ''/etc/dnsmasq.d/settings.conf'':
interface=br0
listen-address=192.168.1.1
bind-interfaces
server=8.8.8.8
domain-needed
bogus-priv
dhcp-range=192.168.1.50,192.168.1.150,12h
# přiřazení konkrétní IP adresy na základě MAC adresy
dhcp-host=02:8d:04:23:9B:6A,192.168.1.45
==== NetworkManager ====
Posledním krokem bylo nastavení NetworkManageru tak, aby pracoval s démonem ''dnsmasq'' a aby ignoroval Wi-Fi zařízení.
# /etc/NetworkManager/NetworkManager.conf
[main]
dns=dnsmasq
rc-manager=file
plugins=ifupdown,keyfile
[ifupdown]
managed=true
# /etc/NetworkManager/conf.d/10-ignore-interfaces.conf
[keyfile]
unmanaged-devices=interface-name:eth*,interface-name:wan*,interface-name:lan*,interface-name:br*,interface-name:wlp1s0,interface-name:wlx00117f1bf337
===== Nastavení Wi-Fi AP pomocí hostapd =====
Hostapd byl na zařízení už nainstalován. Stačilo do souboru ''/etc/hostapd.conf'' vložit konfiguraci k síti. Tady jsem se chvíli potrápil, protože konfigurace nefungovala. Postupně jsem tedy odstraňoval řádky v konfiguračním souboru do chvíle, než jsem našel problém. Účelem článku není podrobně rozepsat konfiguraci Wi-Fi, proto sem dávám svoji funkční konfiguraci.
ssid=ESSPRESSOBIN5
interface=wlp1s0
channel=40
bridge=br0
driver=nl80211
logger_syslog=0
logger_syslog_level=0
wmm_enabled=1
wpa=2
preamble=1
wpa_passphrase=silneheslo
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
auth_algs=1
macaddr_acl=0
# IEEE 802.11n
ieee80211n=1
ht_capab=[HT40-][LDPC][SHORT-GI-20][SHORT-GI-40][TX-STBC][RX-STBC1][DSSS_CCK-40]
country_code=CZ
ieee80211d=1
# IEEE 802.11a
hw_mode=a
# IEEE 802.11ac
ieee80211ac=1
vht_capab=[MAX-MPDU-11454][SHORT-GI-80][TX-STBC-2BY1][RX-STBC-1][MAX-A-MPDU-LEN-EXP3]
vht_oper_chwidth=1
vht_oper_centr_freq_seg0_idx=42
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
Zde je ještě konfigurace USB Wi-Fi v ''/etc/hostapd-usb.conf'':
ssid=ESSPRESSOBIN2
interface=wlx00117f1bf337
hw_mode=g
channel=9
bridge=br0
driver=nl80211
logger_syslog=0
logger_syslog_level=0
wmm_enabled=1
wpa=2
preamble=1
wpa_passphrase=silneheslo
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
auth_algs=1
macaddr_acl=0
# IEEE 802.11n
ht_capab=[LDPC][SHORT-GI-20][SHORT-GI-40][TX-STBC][RX-STBC1][DSSS_CCK-40][SMPS-STATIC]
country_code=CZ
ieee80211d=1
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
Nyní je potřeba nastavit spuštění ''hostapd'' po startu systému. Nejprve jsem v ''/etc/default/hostapd'' nastavil, kde má démon načítat hlavní konfigurační soubor, a poté jej zapnul.
DAEMON_CONF="/etc/hostapd.conf"
systemctl enable hostapd
Pro spuštění konfigurace USB Wi-Fi 2,4 GHz je nutné spustit druhou instanci démona po startu systému. Vyřešil jsem to tak, že jsem do souboru ''/etc/rc.local'' přidal řádek:
/usr/sbin/hostapd -B /etc/hostapd-usb.conf
Výsledkem je, že po restartu systému by se měla načíst všechna síťová zařízení a mělo by docházet k přidělování IP adres. Poslední, co je potřeba nastavit, je firewall a routování.
===== Routování a nastavení firewallu =====
Pro nastavení firewallu jsem zvolil utilitu UFW. Nastavoval jsem čistě pro IPv4. Po instalaci jsem nejprve zapnul forwardování IPv4 v ''/etc/sysctl.conf''. Rovnou jsem v souboru nastavil i další věci, jako je například snížené swapování a hlavně větší alokaci paměti. Změny se projeví až po restartu zařízení.
# /etc/sysctl.conf
net.ipv4.ip_forward=1
vm.swappiness=0
vm.min_free_kbytes=65536
vm.overcommit_memory = 1
Dále bylo nutné povolit forwardování IPv4 v souboru ''/etc/ufw/sysctl.conf'':
net/ipv4/ip_forward=1
Dále forwardování v souboru ''/etc/default/ufw'':
DEFAULT_FORWARD_POLICY="ACCEPT"
Routování v souboru ''/etc/ufw/before.rules'' musí být hned na začátku souboru:
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic through lan1
-A POSTROUTING -s 192.168.1.0/24 -o lan1 -j MASQUERADE
COMMIT
Protože jsem měl už nachystaná uživatelská pravidla pro připojení SSH a další služby, přepsal jsem soubor ''/etc/ufw/user.rules'' souborem z předchozího systému, kde už jsem měl veškerá nastavení připravená.
ufw enable
ufw status
A teprve potom začalo routování fungovat. Mohl jsem se připojit přes SSH a pustit se do nastavení dalších programů.
===== Užitečné zdroje =====
* [[https://askubuntu.com/questions/1062651/dnsmasq-failed-to-create-listening-socket-for-port-53-address-already-in-use|dnsmasq: failed to create listening socket for port 53]]
* [[https://www.armbian.com/espressobin/|Armbian pro Espressobin]]
* [[https://linuxize.com/post/how-to-setup-a-firewall-with-ufw-on-ubuntu-20-04/|Jak nastavit firewall pomocí UFW na Ubuntu 20.04]]