enable wireless
Klíčový skript, na kterém závisí dynamický ramdisk, pokud se používá v kombinaci s Wi-Fi. Na úspěšném připojení totiž závisí skript nfsroot, který si stahuje konfigurační soubor a další skripty.
Princip
Protože jsou autonomní TurtleBoti vybavení kromě Wi-Fi také ethernetovým portem s podporou PXE dělá skript, bezprostředně po zavedení ovladačů síťových zařízení, detekci zařízení, přes které by se mohl připojit síťovou konektivitu. A protože je ethernetové připojení rychlejší než Wi-Fi, zkouší to nejprve přes ethernet.
Detekce je jednoduchá. Zjistí-li, že má síťová karta uplink – tj. pokud je do konektoru zasunutý „živý” ethernetový kabel, který vede do switche – vyšle přes ni do sítě požadavek, na jehož základě mu DHCP server vrátí jeho síťovou konfiguraci.
A pokud na ethernetovém rohraní žádný uplink nemá, nebo mu žádný DHCP server neodpoví, počká až je inicializováno Wi-Fi zařízení a zkusí se připojit skrze ně.
- Nahodí aplikaci wpa_supplicant, která se připojí na AP
- a pak se pokusí získat adresu přes aplikaci dhclient, stejným způsobem, jako přes ethernet.
- Teprve když se mu to povede, zavolá funci network_configure, která zajistí vygenerování souboru, se kterým bude pracovat skript nfsroot a jiné.
Ramdisk s podporou Wi-Fi
Při vytvoření ramdisku s podporou Wi-Fi jsem původně postupoval podle webové stránky Marka Fargase. Bohužel se ukázalo, že jeho postup pro připojení přes WPA2 nestačí. Ale problém se podařilo vyřešit, a skrit byl upraven tak, aby se po úspěšném připojení přes ethernet už dál o navázání spojení nepokoušel.
Aby fungovalo ověřování přes WPA2, musí mít wpa_supplicant k dispozici další dva jaderné moduly: ccm a ctr[1]. Bez nich funguje pouze anonymní připojení. |
Od té doby skript spolehlivě fungoval až do konce zimního semestru 2023/2024 kdy se u jader řady 6.x objevil nedeterministický problém, o jehož skutečné příčině dosud nic bližšího nevíme. U některých TurtleBotů totiž během zavádění dojde ke stavu, kdy nelze načíst hodnotu ze souboru carrier.
Ladění tohoto skriptu bylo komplikované především z toho důvodu, že TurtleBot obvykle nemá žádnou klávesnici, protože má všechy USB porty obsazeny. Takže pokud takové zařízení z nějakého důvodu zůstane viset v ramdisku, existuje pouze jediné řešení = restart přes vypínač.
Testování
Pro testovací účely byl tedy jeden z TurtleBotů vybaven USB hubem, aby bylo možné do procesu zavádění zasahovat a upravené verze ramdisku byly generovány do souboru initrd.img.0
, aby nebylo nutné komplikovaně editovat menu lokálního zavaděče Grub.
busybox
Aby měl 'busybox k dispozici nástroje pro Wi-Fi, bylo nutné vytvořit spustitelný skript /etc/initramfs-tools/hooks/enable-wireless
, který při spuštění příkazu update-initramfs -u
zajistí, aby se do sestaveného ramdisku nakopírovalo vše potřebné pro nahození wi-fi: jaderné moduly, utility, knihovny atp.
#!/bin/sh set -e PREREQ="" prereqs(){ echo "${PREREQ}" } case "${1}" in prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions manual_add_modules cfg80211 mac80211 iwlwifi iwlmvm ccm ctr copy_exec /bin/ip copy_exec /sbin/wpa_supplicant copy_exec /sbin/wpa_cli copy_exec /sbin/dhclient copy_exec /sbin/dhclient-script copy_file config /etc/initramfs-tools/wpa_supplicant.conf /etc/wpa_supplicant.conf
V tomto ukázkovém skriptu je uvedena pouze je minimální sada nástrojů potřebná k rozběhání připojení přes wifi na turtlebotu. Na většinu ostatních věcí stačí příkazy, které jsou součástí busyboxu. V souvislosti s připojením se ale mohou vyskytnout různé problémy, proto není od věci si do ramdisku přidat i užitečné nástroje, které umožní testování kvality síťového připojení či testování blokového zařízení:
Utilita | Inst. balík | Použití | Kolik přidá na objemu ramdisku |
---|---|---|---|
ip | iproute2 |
Příkaz ip, se kterým pracuje busybox má omezené konfigurační možnosti, proto se k nastavení sítě v našem případě používá plnotučný nástroj ip | |
iwconfig | wireless-tools |
Příkaz iwconfig je užitečný v pokud si nejste jisti zda wpa_supplicant navázal spojení. S jeho pomocí totiž můžete zjistit aktuální nastavení vašeho zařízení, nebo zda-li došlo k připojení. Pokud si přidáte i nástroj iwlist, který je ve stejném instalačním balíku, tak si můžete vypsat i parametry sítí, které vaše wifi "vidí". | |
dhclient | isc-dhcp-client |
Standardně se pro nastavení sítě v ramdisku používá tzv. mikro klient udhcp. Ovšem v našem případě získanou adresu nebyl schopen nastavit, proto je lepší použít "plnotučného" DHCP klienta. | |
ping | iputils-ping |
Nástroj ping vám umožní rychle zjistit zda-li stroj na druhé straně sítě žije. V nouzi místo něj můžete použít telnet, když po otevření portu na druhé straně odklepnete GET | |
arping | iputils-arping |
- | |
tracepath | iputils-tracepath |
- | |
termshark | termshark |
Je GUI rozhraní pro tshark, což terminálová verze utility wireshark, která vám umožní zachytávat síťové pakety na vaší wi-fi. Je to jediné místo, kde můžete zjistit co běhá vzduchem mezi AP a vaším klientem, protože komunikace mezi nimi je jinak šifrovaná. | |
nc | iputils-ping |
- | |
tcpdump | tcpdump |
||
netstat | net-tools |
Umožňuje zjistit jaké jsou aktuálně otevřené porty. |
Obsah souboru /etc/initramfs-tools/wpa_supplicant.conf
network={ ssid="jmenowifi" #psk="heslowifi" psk=989c6426c04864f7f386d12ca3bb776131d5eece0860c6c84f1ce2e1d3bac5ec }
K vygenerování obsahu tohoto souboru můžete použít utilitu wpa_passphrase, která je součástí instalačního balíku wpasupplicant . Řetězec 'psk' se vygeneruje kombinací 'ssid' a plain hesla 'psk'.
|
Sledování provozu na Wi-Fi síti
Jak se jmenuje wifi zařízení a případně jakou má adresu lze zjistit přes ip
~# ip addr show
Síla signálu
Jaký je stav signálu na Wi-Fi zjistíme ze souboru /proc/net/wireless
. Následující příkaz vypisuje jeho obsah ve vteřinovém intervalu
~$ watch -n 1 cat /proc/net/wireless
Pokud nás z toho zajímá pouze síla signálu, můžeme použít tohle:
~$ watch -n 1 "awk 'NR==3 {print \"WiFi Signal Strength= \" \$3 \"00 %\"}' /proc/net/wireless"
Probíhá vůbec síťová komunikace?
Pro rychlé zjištění jestli na zařízení wlp1s0
nějaká komunikace vůbec probíhá, stačí tcpdump. Pokud nás zajímá jen konkrétní adresa, kupř. to co vrací DHCP server, můžeme si vyfiltrovat pouze pakety s jeho adresou:
~# tcpdump -i wlp1s0 -s 0 host 192.168.210.5
- adresa - IPv4 resp. IPv6 adresa
- maska - maska
- rozsah -
- dst net adresa
- src net adresa
- net adresa
- net adresa mask maska
- net adresa/rozsah
- https://serverfault.com/questions/354102/tcpdump-filter-on-network-and-subnet-mask filtrování výstupu z tcpdump
termshark
Pro sofistikovanější monitoring, kdy potřebujeme nahlédnout do paketů lze použít termshark. Klientská stanice je totiž jediným místem, na kterém se dá sledovat síťová komunikace, která probíhá přes Wi-Fi. Mezi NUCem přes AP až po kontroler, který ho spravuje ji nelze sledovat, protože je šifrovaná.
Pokud jsme na klientskou stanici připojeni přes SSH, tak je vhodné odfiltrovat vlastní komunikaci. To můžeme udělat kupř. tak, že odfiltrujeme svoji MAC sdresu:
~# termshark -i wlp1s0 -f "not ether host 9a:5d:9c:ee:11:a0"
Ale pokud nás SSH provoz nezajímá můžeme odfiltrovat rovnou veškerou komunikaci která probíhá přes port 22:
~# termshark -i wlp1s0 -f "not port 22"
Filtry se dají také řetězit:
… -f "not ip.addr == xxx.x.xx.xxx and not ip.src == xxx.x.xx.xx and not mac == xx-xx-xx-xx-xx-xx and not mac == xx-xx-xx-xx-xx-xx and not ip == xxx.x.x.x and not ip.dst == xxx.x.xx.xxx and not ip.src == xxx.x.xx.xxx"
- https://www.cyberpunk.rs/termshark-terminal-ui-for-tshark termshark
- https://github.com/gcla/termshark/blob/master/docs/UserGuide.md termshark
- https://github.com/gcla/termshark/blob/master/docs/FAQ.md tshark
Verze
Verze
Původní verze skriptu, která byla rozšířena o detekci existujících síťových zařízení vycházela z kódu, publikovaného na stránce Marka Fargase. A používala se u TurtleBotů od září 2019 (jádro verze 4.12.0) až do konce zimního semestru 2023/2024, kdy se přešlo z jádra 5.2.0 na jádro verze 6.x a s tím se objevil nečekaný problém.
Ten se projevoval tím, že zavádění zůstávalo viset v ramdisku, protože nedošlo k připojení ačkoliv se ovladač Wi-Fi korektně natáhnul a udev zařízení vytvořil.
- ↑ Trvalo téměř týden, než jsme na to díky Marku Beliškovi přišli.