Zum Hauptinhalt springen

Overenie správnosti konfigurácie a funkčnosti

Bod 2d zadania: overte správnosť konfigurácie a funkčnosť operačného systému. Overenie má v projekte jednu hlavnú skúšku a tri vrstvy. Hlavná skúška je mesh v dvoch scenároch: bez edge proxy (box zdieľanie odmietne a slúži lokálne) a s edge proxy (dva boxy v jednej sieti so spoločným úložiskom), lebo správnosť konfigurácie tohto systému znamená, že mesh funguje práve vtedy, keď má. Vrstvy sú automatizované testy, ktoré bežia pri každej zmene; ručný kontrolný zoznam vo virtuálnom stroji, ktorý je zároveň scenárom ukážky; a nezávislá kritická recenzia, ktorej nálezy sa opravili a pokryli testami.

Zásada: testy kódujú argumenty, nie len správanie​

Box nemá shell, takže chyba, ktorá sa prejaví až na nainštalovanom stroji, nemá kde byť opravená ručne. Testy preto nechránia len to, že niečo funguje, ale aj prečo je niečo nastavené práve tak: tests/hardening.nix overuje, čo je zámerne vypnuté; tests/resize.nix overuje poradie lvextend → cryptsetup resize → resize2fs; tests/front-vhost.nix overuje, že loopback dostane 403, a vysvetľuje, prečo by 200 bola chyba; tests/install.nix overuje funkciu encrypt na ext4, nie len typ súborového systému. Kto neskôr rozhodnutie zmení, dostane červený test namiesto rozbitého boxu v skrini.

Vrstva 1: automatizované testy​

Jednotkové testy (Rust)​

Vrstva príkazov démona je napísaná proti rozhraniu Losos s reálnou (io_backend) a pamäťovou (fake) implementáciou, takže stavový automat sa testuje bez súborového systému. Plánovače (inštalácia, rast disku, obnova, trh) vracajú plán ako dáta a testy overujú poradie deštruktívnych krokov bez formátovania. Spolu vyše 200 testov v troch crate (backend, backend-registrar, edge-vercel); bežia cez cargo test v CI aj lokálne (devenv test). Oba crate musia byť čisté pre clippy -D warnings a rustfmt.

Testy vo virtuálnych strojoch (NixOS)​

Sedemnásť testov v tests/ bootuje skutočné systémy z tých istých modulov, z ktorých sa inštaluje. Prehľad:

TestČo overuje
install.nixinštalátor na troch prázdnych diskoch: detekcia, disko, LVM, LUKS, ext4 encrypt, otvorenie zväzku kľúčom
tpm.nixod konca po koniec: formát, zapečatenie do swtpm, reštart, odomknutie bez obsluhy
impermanence.nixtmpfs koreň, zoznam trvalých adresárov, práva 700 a oddelené skupiny domén
hardening.nixobe polovice: čo je zapnuté a čo je zámerne vypnuté; povrch jadra pre k3s, rke2, containerd a Longhorn
resize.nixrast /persist za behu v správnom poradí
admin-vm.nixlososd: D-Bus, HTTP API, token, prestavba
front-vhost.nixnginx: smerovanie podľa cesty, guard len pre LAN, 403 na loopbacku, CSP vrátane arm pre /widget-frame/ a /handbook/
setup.nixtrasy prvého spustenia, certifikát, trust.sh, pôvody pre „nájdi môj box“
tls.nixvlastný certifikát boxu a cache
keyring.nixkľúčenka tajomstiev boxu (fscrypt kľúč cez TPM)
console.nixbanner na tty1 s adresou
cluster-vm.nixkoexistencia dvoch Kubernetes runtime na jednom hostiteľovi
edge-vm.nixedge + box: registrácia, tunel
market-vm.nixprodukčné zapojenie Stripe gate
nextcloud-httpd.nixApache v pode Nextcloudu proti fixtúre webroot (front-controller rewrite)
admin-ui.nixprodukčný zväzok SPA v prehliadači so skutočnou hlavičkou CSP
design-system.nixrender React obalu dizajnového systému (len vývoj)

tests/invariants.nix nie je VM: pri vyhodnotení konfigurácie install pripína hodnoty, ktoré si box nemôže dovoliť stratiť driftom predvolenej hodnoty (GC, strop boot menu, režim odomykania, --impure, fragment #install, cache). Beží v nix flake check --no-build, teda v CI pri nulových nákladoch na zostavenie.

VM testy potrebujú KVM a bežia lokálne pred zlúčením zmeny (nix build .#checks.x86_64-linux.<názov>); bez KVM bežia pod TCG pomalšie, ale bežia.

Testy v prehliadači​

admin-ui/app/tests/*.browser.mjs (Playwright, Chromium) spúšťajú skutočný zostavený SPA so skutočnou hlavičkou CSP: sprievodca (36 scenárov), aplikácia (10), oznámenia, vzhľad. Zlyhajú pri každom novom porušení CSP, takže výmena knižnice, ktorá vkladá štýly za behu, zafarbí kontrolu na červeno.

Kontinuálna integrácia​

.github/workflows/ci.yml pri každom push a pull requeste: zhoda pinov (flake.lock = devenv.yaml = devenv.lock), clippy a rustfmt, testy oboch crate, nix flake check s invariantmi, zostavenie balíkov (lososd, registrátor, administračné UI, príručka, OCI obrazy), zostavenie inštalačného ISO a jeho boot pod OVMF aj SeaBIOS (tests/iso-boot.py čaká na DNS dotaz inštalátora), publikovanie zostavených ciest do cache. Príručka má vlastný workflow (typová kontrola, kontrola odkazov a tokenov, zostavenie, nasadenie na GitHub Pages, zostavenie tohto PDF).

Hlavná skúška: mesh funguje, s edge proxy aj bez neho​

Správnosť konfigurácie tohto systému sa nedá overiť na jednom stroji, lebo jeho zmysel je v sieti: box musí nájsť edge, pripojiť sa k meshu a zdieľané úložisko musí byť vidieť z oboch strán. Rovnako dôležité je však to, čo box urobí, keď edge v sieti nie je: musí to zistiť sám, zdieľanie odmietnuť a ďalej slúžiť svojmu majiteľovi lokálne. Hlavné overenie sú preto dva scenáre na jednej sieti bez internetu, každý s očakávaným výsledkom, ktoré sa predvedú za sebou na tej istej zostave dvoch boxov.

Scenár A: bez edge proxy​

Zostava: dva boxy v jednej sieti, žiadny edge (alebo edge vypnutý).

#KrokOčakávaný výsledok
A1spustiť oba boxy a prejsť sprievodcomNextcloud a adminské rozhranie fungujú na každom boxe samostatne; panel Mesh hlási Edge proxy: none
A2pokúsiť sa zapnúť Join the mesh alebo zdieľanie diskuprepínače sú sivé s dôvodom; priame volanie API odpovie 409 s vetou, že edge nebol nájdený
A3nechať boxy bežať a sledovať panel Meshbox skenuje sieť ďalej (mDNS _losos-edge._tcp a nastavená adresa), stav sa nemení, nič sa nepokazí
A4reštartovať boxpo štarte je stav rovnaký: lokálne služby bežia, mesh je vypnutý, nič sa nepokúša pripojiť naslepo

Výsledok scenára A: box bez edge je plnohodnotné lokálne úložisko a nikdy nezačne zdieľať disk do siete, v ktorej nie je dôveryhodný edge. Toto je brána enable-only z kapitoly 6: zdieľanie sa dá zapnúť len s edge v dosahu.

Scenár B: s edge proxy​

Zostava: tie isté dva boxy plus jeden edge v tej istej sieti.

#KrokOčakávaný výsledok
B1spustiť edge (alebo ho zapnúť k zostave zo scenára A)do minúty oba boxy ukážu na paneli Mesh Edge proxy found so zdrojom On this network
B2na oboch boxoch zapnúť Join the meshprestavba prejde; kubectl get nodes na edge ukáže oba uzly v stave Ready
B3na oboch boxoch zapnúť zdieľanie diskuLonghorn na edge ukáže dva uzly s pridelenou kapacitou; adresár /home/shared je odomknutý (fscrypt)
B4vytvoriť zväzok v poole a zapísať doň dátazväzok má repliky na oboch boxoch; dáta sú čitateľné po odpojení jedného boxu
B5vypnúť edgedo minúty oba boxy hlásia Edge proxy: none; zapnutie zdieľania odpovie 409; vlastné aplikácie boxov bežia ďalej (návrat do scenára A)
B6zapnúť edge späťbrána sa otvorí bez zásahu; uzly sa vrátia do Ready bez opätovného pridania (/etc/rancher prežil)
B7nastaviť okno 23:00 až 07:00 a pozrieť uzol na edge mimo oknauzol má taint NoSchedule; v okne a pri nečinnosti taint zmizne
B8pripojiť neoficiálny edge (bez podpisu koreňovým kľúčom)zdieľanie je dovolené, trh hlási noOfficialEdge a objednávka odpovie 409

Výsledok scenára B: úložisko dvoch boxov je spojené do jedného poolu a vidieť ho z oboch strán, členstvo prežije výpadok edge aj reštart, a obchodovanie sa povolí len oficiálnemu edge.

Čím sú scenáre doložené​

  • Automatizovaný test tests/edge-lan.nix (pripravovaný v PR #75): dva virtuálne stroje na jednej sieti, edge s modulom edge a ohlasovaním služby _losos-edge._tcp cez mDNS, box s riadiacou rovinou zariadenia. Test prejde oba scenáre v jednom behu: box bez edge zdieľanie odmietne (A2); s edge v dosahu je prepnutie do režimu mesh prijaté (B1, B2); keď edge zmizne, box to do dvoch skenov zbadá a zapnutie zdieľania odmietne s vlastnou vetou (B5); po návrate edge sa brána znovu otvorí (B6). Druhý, nepodpísaný edge v tom istom teste overuje, že obchodovanie sa povolí len oficiálnemu edge (B8).
  • Ukážka demo/edge-lan/run.sh (ten istý PR): skript postaví edge VM ako smerovač virtuálnej siete (VDE prepínač, 10.77.0.1/24, DHCP, NAT), nainštaluje box z inštalačného ISO, zaberie ho, a prevedie oba scenáre cez API: box bez edge zdieľanie odmietne; edge sa zapne, box ho nájde sám, panel Mesh to ukáže a dovolí zdieľať úložisko; edge sa vypne, box to do minúty zbadá a zdieľanie odmietne; edge sa vráti a brána sa otvorí. Nahrávka oboch vetiev je súčasťou materiálov k obhajobe. Skript je zároveň základom reprodukovateľného firemného nasadenia (edge a boxy v jednej sieti), takže overenie konfigurácie a návod pre operátora sú jeden a ten istý postup.

Body A1 až A4, B1, B2, B5, B6 a B8 pokrýva test edge-lan.nix a ukážka; B3, B4 a B7 sú overené v cluster-vm.nix (koexistencia runtime) a na edge ručne, a sú to body, ktoré ukážka na obhajobe predvedie naživo.

Overenie jedného boxu vo virtuálnom stroji​

Kontrolný zoznam po inštalácii, s očakávaným výsledkom. Je to zároveň scenár ukážky na obhajobe; pri každom bode je uvedené, ktorý bod zadania dokladá.

#KrokOčakávaný výsledokDokladá
1Nabootovať ISO, nechať menu vybrať autodetekciuinštalátor beží bez otázok, vypíše unlock: TPM (so swtpm) alebo unlock: keyfile in the initrd2b
2Reštart bez médiažiadna výzva na heslo; modrý banner s IP adresou a <názov>.local2b, 2a
3Otvoriť IP adresu v prehliadačisprievodca, krok 1 s odtlačkom certifikátu2c
4Nastaviť heslo (12+ znakov, pravidlá sa odškrtnú)Password set, náhradný kľúč zobrazený raz2c
5Prihlásiť sa do LosOS cloudu v kroku 3Nextcloud prihlásený, presmerovanie na prehľad2c, 2d
6Otvoriť /forgejo/LosOS Git odpovedá, téma losos-auto2d
7Zavrieť kartu a otvoriť administráciu znova, odomknúť heslomdialóg Unlock this box prijme heslo; nesprávne heslo dá 4012d
8Zmeniť názov boxu na paneli Sieť, Použiťoznámenie Changes applied, box odpovedá na novom .local mene, IP nezmenená2c, 2d
9Vytvoriť súbor mimo /persist (napr. cez widget) a nahrať súbor do cloudupo reštarte prvý zmizol, druhý ostal2d
10Pozrieť uname -r a /proc/cmdline (cez konzolu VM, v ukážke)najnovšie stabilné jadro; KSPP parametre (slab_nomerge, init_on_alloc=1, …)2a
11cryptsetup luksDump /dev/persist-vg/persist (konzola VM)dva kľúčové sloty, token systemd-tpm2 v slote 12b
12Panel Úložisko → Použiť rezervuzväzok narastie za behu, df ukáže viac miesta2d
13Panel Mesh bez edgeEdge proxy: none, prepínače zdieľania sivé s dôvodom2d
14curl http://127.0.0.1/ na boxe403 (guard len pre LAN), kým curl http://127.0.0.1:8082/api/health odpovie2d

Body 10, 11 a 14 vyžadujú konzolu, ktorú nainštalovaný box nemá; v ukážke sa robia z inštalačného média alebo z VM testu, nie z boxu. Body 1 až 9 sú to, čo majiteľ naozaj robí.

Vrstva 3: nezávislá kritická recenzia​

  1. októbra 2026 autor nechal nad repozitárom urobiť recenziu z pohľadu skúšajúceho („čo by tu komisia našla ako prvé“), s nálezmi overenými v kóde. Nástroje (clippy, testy, typová kontrola) nenašli nič; nálezy boli o správaní a dokumentácii. Najdôležitejšie a ich stav:
NálezOprava
ISO spúšťalo inštalátor bez TPM, hoci dokumentácia opisovala TPM ako predvolenéinštalátor autodetekuje /dev/tpmrm0, zapečatí kľúč hneď po formáte, --no-tpm je opt-out (PR #47, #48); tests/tpm.nix
aktualizácia z github: zdroja by zabudla disky a režim odomykania boxuživé install-target.nix a overrides.nix z /etc/nixos, obe cesty prestavby s --impure; invariant (PR #49)
sprievodca nevedel box zabrať (volal trasu s tokenom, ktorý ešte nemal)krok 2 najprv volá POST /api/setup/claim (PR #45)
administračný kľúč sa vydal raz a nikde nezobrazilzobrazenie v sprievodcovi s Kopírovať a Tlačiť; neskôr heslo ako hlavná cesta (PR #65)
žiadne GC a žiadny strop generácií na samoaktualizujúcom sa boxenix.gc 14 dní, configurationLimit = 5; invariant
piny nixpkgs v devenv.yaml a flake.lock sa rozišli a CI to nestrážiloúloha pins v CI
kľúčový súbor LUKS so surovými bajtmi (NUL) sa formátoval iným kľúčom, než akým sa odomykalhexadecimálny zápis, test otvorenia kľúčom hneď po disko (PR #47)

Ponechané a priznané v bezpečnostnom modeli: certifikát boxu je zároveň CA bez obmedzení; synchronné obsluhy HTTP v démone; trh nikdy nebežal proti skutočnému testovaciemu režimu Stripe (bežal proti náhradám s rovnakým rozhraním). Recenzia a pripravené odpovede sú súčasťou materiálov k obhajobe.

Čo overené nie je​

Pre úplnosť: Nextcloud a Forgejo ako celok nebootujú v žiadnom VM teste (obraz Nextcloudu má 2,6 GiB a jeho zostavenie v testovacom VM by trvalo hodiny); ich funkčnosť sa overuje ručne vo VM ukážke a Apache podu samostatným testom. Mesh s Longhornom a taintom beží v cluster-vm.nix len po koexistenciu runtime; objavenie edge a brána zdieľania majú test edge-lan.nix (PR #75), replikácia a taint sa overujú na edge ručne podľa zoznamu B3, B4 a B7. Trh je overený proti náhradám Stripe a apiservera.