Difference between revisions of "TurtleBot"

From DCEwiki
Jump to: navigation, search
m (Práce v disklessu)
m (Použití mcachefs)
Line 183: Line 183:
 
  ## odpojit /target, znovu připojit a pak už to projde
 
  ## odpojit /target, znovu připojit a pak už to projde
 
  # systemd-nspawn -b -D /target
 
  # systemd-nspawn -b -D /target
+
 
 +
Spuštění systému z keše
 +
 
 
==== Práce v disklessu ====
 
==== Práce v disklessu ====
  

Revision as of 19:39, 30 August 2019


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é:

  1. zmenšit diskový odddíl /dev/nvme0np2 na kterém je souborový systém ext4 s Ubuntu
  2. posunout diskový odddíl /dev/nvme0np3 na kterém je swap (ten bude využívat i disklessový OS)
  3. 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:

  1. Nahození aplikace wpa_supplicant
  2. Získání adresy přes aplikaci dhclient
  3. 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čí.

Upozornění 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í.

Skok

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.
Poznámka Busybox, který běží v ramdisku by default podporuje řadu příkazů, pro které v "plnotučném" systému může existovat samostatná utilita. Pokud ji do ramdisku přes tento skript nakopírujete, tak se použije přednostně.

Obsah souboru /etc/initramfs-tools/wpa_supplicant.conf

network={
        ssid="jmenowifi"
        #psk="heslowifi"
        psk=989c6426c04864f7f386d12ca3bb776131d5eece0860c6c84f1ce2e1d3bac5ec
}
Poznámka 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'.

Overlay nad NFS

Standardní sendwich:

NFS → TMPFS → FS

NFS → FS → TMPFS → FS

Adresáře sdílené přes NFS jsou namountované na adresáře, které jsou přes mcachefs namountované na přípojné body ze kterých se pak skládá sendvič pro overlay, který změny z disklessového systému ukládá na tmpfs, který se po restartu zahodí – tak jako u standardního disklessu

Rozdíl je v tom, že mcachefs při načítání souborů z NFS do RAM paralelně ukládá jejich kopie do kešovacích adresářů na lokálním disku. Jejich obsah se ale (na rozdíl od změn uložených z prostředí disklessu) při restartu nezahodí, takže při opětovném sestavení sendviče nemusí znovu tahat z NFS – catfs pouze zkontroluje zda-li jsou rozšířené atributy souboru stejné.

Na mcachefs jsem se dohmátl přes catfs. Obojí používá FUSE. Rozdíl jsou v tom, že:

  • mcachefs napsané v C má velikost ~0,5 MB kdežto catfs které je naprogramované v rustu má 2,9 MB
  • mcachefs, na rozdíl od catfs, pracuje se žurnálem a symlinky interpretuje jako symlinky – na rozdíl od catfs, který je zobrazuje v závislosti a tom nač odkazují.
  • mcachefs může mít podklad připojený jako readonly – změny se vždy zapisují do cache. U catfs se readonly podklad propaguje jako readonly i do horní vrstvy

Použití mcachefs

# mount … /tmp/backend
# mount -t btrfs -o subvol=cache LABEL=local /tmp/cache
# mcachefs /tmp/backend /target -o cache=/tmp/cache/root,journal=/tmp/cache/journal
…
# systemd-nspawn -D /target
…
## odpojit /target, znovu připojit a pak už to projde
# systemd-nspawn -b -D /target

Spuštění systému z keše

Práce v disklessu

Pro aktualizaci podkladového systému je třeba namountovat základní system na adresář /mnt/background jako rw (pokud je to na onom stroji možné)

Poté se spustí kontejner, ve kterém je možné upravit instalaci:

systemd-nspawn -b -D /mnt/background

Tím se pochopitelně může dostat do nesouladu lokální cache s podkladem. Opravu lze provést tak, že se porušené soubory z keše odstraní

Lokální keš je třeba namountovat na adresář /mnt/cache jako rw a následně zkontrolovat jestli je cksum všech souborů identický s jejic verzemi které nabízí podkladová vrstva z NFS serveru (ta může být namountovaná ro).

Pokud kontrolní součet nesedí, je dobré udělat nejprve truncate na nulovou velikost a potom soubor smazat



  • Trvalo téměř týden, než jsme na to díky Marku Beliškovi přišli.