TurtleBot
TurtleBot, je robotické zařízení, používané při výuce na Katedře kybernetiky. Jeho "mozkem" je Intel NUC, který sice může komunikovat přes ethernet, ale primárně komunikuje přes Wi-Fi.
Zařízení se dodává s předinstalovaným Ubuntu, ale v rámci sjednocení vývojového prostředí je potřeba na něm rozběhat stejnou diskless instalaci, jako v laboratořích.
Jelikož klasické PXE funguje pouze v rámci na ethernetu, jsou TurtleBoty vytvořené podobným způsobem, je virtuální stroje typu Half-Diskless. Rozdíl je pouze v tom, že se při spouštění nepoužívá virtuální disk publikovaný přes NFS, nýbrž lokální NVME disk.
Co to obnáší?
Příprava na diskless
Parametry NUC7i7DNKE Intel(R) Client Systems verze J85069-205
- 8 jader CPU Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz
- 8 GB RAM (1x 8GB modul Kingston + volný slot)
- Ethernet Connection I219-LM
- 01:00.0 Network controller: Intel Corporation Wireless 8265 / 8275 (rev 78)
~# lsmod | grep iw iwlwifi 151552 0 cfg80211 598016 1 iwlwifi
~# cat /proc/partitions major minor #blocks name 259 0 234431064 nvme0n1 259 1 524288 nvme0n1p1 EFI flags boot, esp (zachovat) 259 2 225643520 nvme0n1p2 ext4 Ubuntu (zmenšit) orig 220355, nově 200000 259 3 8261632 nvme0n1p3 linux-swap (posunout)
NUC pro TurtleBoty je dodáván s předinstalovaným Ubuntu, proto bylo nutné:
- zmenšit diskový odddíl
/dev/nvme0np2
na kterém je souborový systém ext4 s Ubuntu - posunout diskový odddíl
/dev/nvme0np3
na kterém je swap (ten bude využívat i disklessový OS) - vytvořit nový diskový odddíl
/dev/nvme0np4
Tento nově vytvořený diskový oddíl /dev/nvme0np4
byl naformátován na souborový systém Btrfs, aby bylo možné subvolume pro systém nainstalovaný přes debootstrap snapshotovat.
Instalace
Formátování fs, vytvoření subvolume,…
/mnt# debootstrap --verbose --include=firmware-iwlwifi,isc-dhcp-common,openssh-server,wpasupplicant,nfs-common --variant=minbase --components main,contrib,non-free --arch=amd64 unstable ./
…snapshot, bind {/dev,/proc,/sys}, chroot
Editace grub.cfg
Pro zavádění jádra disklessového systému se využívá zavaděč předinstalovaného Ubuntu. K tomu byla nutná následující úprava souboru /mnt/grub/grub.cfg
:
...
Automatizace procesu distribuce na ostatní TurtleBoty
Aby vše fungovalo jak má, musí mít všechny TurtleBoty stejnou výchozí konfiguraci, upravený soubor grub.cfg
na předinstalovaném Ubuntu a vytvořený diskový oddíl /dev/nvme0np4
, s nainstalovaným ramdiskem s podporou wi-fi a jádrem.
Export NFS adresáře
Na NFS serveru byl vytvořen nový Btrfs subvolume s názvem bullseye
, který byl vyexportován přes NFS s následujícími parametry:
/srv/diskless/version/bullseye (rw,fsid=11,nohide,async,subtree_check,no_root_squash)
Výsledek uvedeného nastavení po exportu:
(rw,async,wdelay,nohide,no_root_squash,fsid=11,sec=sys,rw,secure,no_root_squash,no_all_squash)
Úprava instalace disklessu
Po spuštění lokálního systému:
- Nahození aplikace wpa_supplicant
- Získání adresy přes aplikaci dhclient
- Mount NFS adresáře budoucího disklessu
Přejmenování
# hostnamectl set-hostname bullseye
Vytvoření ramdisku s podporou Wi-Fi
Při vytvoření ramdisku s podporou Wi-Fi jsem postupoval podle webové stránky Marka Fargase. Bohužel se ukázalo, že uvedený postup pro připojení přes WPA2 nestačí.
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í. |
Soubor /etc/initramfs-tools/hooks/enable-wireless
, je spustitelný skript, který spustí příkaz update-initramfs -u
při sestavení ramdisku. Skript se postará o nakopírování potřebných modulů, utilit, knihoven a konfiguračních souborů pro nahození wi-fi, tak aby byly splněny všechny potřebné závislosti.
#!/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'.
|
- 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
- https://serverfault.com/questions/354102/tcpdump-filter-on-network-and-subnet-mask filtrování výstupu z tcpdump
Overlay nad NFS
Standardní sendwich:
NFS → TMPFS → FS
NFS → FS → TMPFS → FS
Systémový disk je z NFS namountovaný s parametrem fsc. Tím se zapne FS-cache namountovaná na adresář DO kterého se ukládají načítané soubory.
Přes něj je potom vytvořený overlay, u kterého se změny Z disklessového systému ukládají do tmpfs.
FS-cache instalace balíku cachefilesd
Parametry
- dir
- cesta pro keš
- brun
- Je-li volno alespoň 10% místa na disku, tak se začnou soubory opět ukládat do keše
- bcull
- když klesne volné místo pod 7% kapacity disku, začnou se soubory zahazovat
- bstop
- Pokud volné místo na disku klesne pod 3%
- frun
- 10
- fcull
- 7
- fstop
- 3
- https://www.cyberciti.biz/files/linux-kernel/Documentation/filesystems/caching/cachefiles.txt
- https://en.wikipedia.org/wiki/CacheFS
- https://blog.frehi.be/2019/01/03/fs-cache-for-nfs-clients/
- https://cromwell-intl.com/open-source/performance-tuning/disks.html Tuning I/O
- ↑ Trvalo téměř týden, než jsme na to díky Marku Beliškovi přišli.