Installation im Detail
Den Installer besorgen
Lade das ISO und seine .sha256 aus dem
neuesten Release herunter, oder bau es:
nix build .#nixosConfigurations.iso.config.system.build.isoImage
Schreib es auf einen USB-Stick und boote den Zielrechner davon.
Die Datenträgerbezeichnung des Sticks ist LOSOS_INSTALLER. Das BIOS-Bootmenü,
der UEFI-Startbildschirm und das Konsolenbanner zeigen LosOS und den
Release-Tag, und der Hostname ist losos-installer. Darunter steckt NixOS, und
os-release sagt das auch mit ID_LIKE=nixos. Die installierte Box trägt
denselben Namen und Tag in ihrem Bootmenü, ihren Konsolenbannern und in
os-release (NAME=LosOS, IMAGE_VERSION) und behält ID=nixos.
Bevor du bootest
- Secure Boot: aus, oder das LosOS-Zertifikat einspielen. Release-ISOs
sind signiert. Der UEFI-Loader des Sticks ist ein einziges Unified Kernel
Image (Kernel, initrd, Kommandozeile), signiert mit dem db-Zertifikat von
LosOS, und dieser Loader prüft den Hash des Systemabbilds, bevor er es
einhängt. Eine Firmware, die nur den Schlüsseln von Microsoft vertraut,
lehnt den Stick ab, bis das Zertifikat aus
EFI/losos/auf dem Stick oder von der Release-Seite in ihredbaufgenommen wurde, neben den Microsoft-Zertifikaten, nie an ihrer Stelle: Windows, der shim anderer Distributionen und die Option-ROMs von Grafikkarten brauchen diese. OVMF zeigt "Access Denied"; andere Firmware überspringt den Stick womöglich kommentarlos. Der Loader der installierten Box ist nicht signiert, die Box selbst braucht also abgeschaltetes Secure Boot. Die Seite Secure Boot and signed media im Handbuch enthält die Schritte und die Prüfung vonSHA256SUMS.sig.tests/secure-boot.nixist der Nachweis. - UEFI oder BIOS, beides funktioniert. Auf dem Installer-ISO lässt dich
ein Terminalmenü BIOS, UEFI oder automatische Erkennung (die Firmware, die
das ISO gebootet hat) wählen. UEFI bekommt systemd-boot. Legacy-BIOS bekommt
GRUB plus eine 1 MiB große BIOS-Boot-Partition auf der ersten Festplatte.
Ohne Antwort innerhalb von 30 Sekunden wählt das Menü die automatische
Erkennung, sodass auch ein unbeaufsichtigter Boot installiert.
losos-install --biosund--uefiwählen einen Modus, ohne das Menü anzuzeigen. UEFI, ob aus dem Menü oder per--uefi, setzt voraus, dass der Stick selbst im UEFI-Modus gebootet wurde, weil systemd-boot den Booteintrag der Firmware schreibt. Von einem per BIOS gebooteten Stick lehnt der Installer das ab, bevor er irgendeine Festplatte anfasst. BIOS ist hauptsächlich zum Testen in einer VM gedacht. Das Menü gibt es nur auf dem Installer-ISO. Die installierte Appliance zeigt es nie. - Netzwerk anschließen. Der Installer klont den Flake zur Laufzeit.
Was der Installer tut
Nach der Firmware-Wahl läuft der Installer unbeaufsichtigt. Er findet jede
fest eingebaute Festplatte, fasst alle in einer LVM-Volume-Group zusammen,
verschlüsselt sie mit LUKS, formatiert /persist als ext4 und installiert.
- Auf einem Rechner mit TPM-2.0-Chip versiegelt der Installer den
Festplattenschlüssel direkt nach dem Formatieren im Chip
(
systemd-cryptenroll). Die meisten Mini-PCs haben einen in der Firmware, Intel PTT oder AMD fTPM, meist eingeschaltet. Die Box bootet dann ab dem ersten Start unbeaufsichtigt, und auf der Boot-Partition liegt nichts Geheimes. Die Festplatte allein, ausgebaut oder geklont, ist unlesbar. Der Schlüssel ist nicht an Firmware-Messungen (PCRs) gebunden, weil die Box ihre Firmware und ihren Bootloader unbeaufsichtigt aktualisiert und keine Shell hat, um sich aus einer Aussperrung zu befreien. Der Preis ist, dass ein Dieb, der die ganze Box samt Chip mitnimmt, trotzdem an die Daten kommt. Derselbe Zufallsschlüssel, mit dem das Volume formatiert wurde, bleibt im verschlüsselten Volume unter/etc/keys/persist-keyfileals Wiederherstellungs-Slot. - Ohne Chip, oder mit
losos-ctl install --no-tpmaus der Shell des Installers, wird diese Schlüsseldatei stattdessen in die initrd eingebacken. Sie liegt dann auf der unverschlüsselten ESP, und jeder, der die Festplatte mitnimmt, kann die Daten lesen. Der Installer gibt aus, welche der beiden Varianten er gewählt hat.--tpmmacht einen fehlenden Chip zu einem Fehler statt zu einer stillen Installation mit Schlüsseldatei. TPM und der Festplattenschlüssel erklärt, wofür der Chip da ist und worauf eine Box ohne ihn verzichtet. - Gib einer VM ein TPM (swtpm, siehe unten), sonst installiert sie im Schlüsseldatei-Modus.
/persist ist ext4 mit dem Feature encrypt, weil fscrypt es braucht und
btrfs es nicht unterstützt. Du verzichtest auf Kompression und
Prüfsummen der Daten.
Nach dem Neustart zeigt tty1 ein bildschirmfüllendes Banner mit der
IP-Adresse der Box und <hostname>.local. Öffne die IP-Adresse in einem
Browser auf einem beliebigen Rechner im selben Netzwerk. Der .local-Name
funktioniert ebenfalls überall, wo der Rechner mDNS-Namen auflöst. Windows,
macOS, Smartphones und die meisten Linux-Desktops tun das; der Host eines
libvirt- oder VirtualBox-Gasts hinter NAT meist nicht, verwende dort
also die Adresse. Beide führen zu denselben Seiten. Das Banner aktualisiert
sich, wenn sich die Adresse ändert.
Die erste Seite ist der Einrichtungsassistent. Sein erster Schritt ist, dem
eigenen Zertifikat der Box zu vertrauen, damit der Rest der Einrichtung und
jede spätere Anmeldung über HTTPS laufen und dein Browser einen Passkey
anbieten kann. Der Schritt zeigt eine Zeile zum Einfügen in ein Terminal,
passend zu dem Rechner, an dem du sitzt. Auf macOS und Linux ist das
curl -fsSL http://<address>/setup/trust.sh | sh, auf Windows
irm http://<address>/setup/trust.ps1 | iex. Die Box selbst liefert das
Skript als Klartext aus, öffne den Link also zuerst in einem Tab, um es
zu lesen. Das Skript fügt das eine Zertifikat den Speichern hinzu, die deine
Browser lesen, nur für deinen Benutzer: dem Anmeldeschlüsselbund (login
keychain) auf macOS, dem Trusted-Root-Speicher des Benutzers auf Windows, den
NSS-Speichern, die Chrome und Firefox auf Linux verwenden. Es installiert
nichts anderes, fragt nie nach Administratorrechten und gibt den
SHA-256-Fingerabdruck des Zertifikats aus, damit du ihn mit dem auf der Seite
vergleichen kannst. Smartphones bekommen stattdessen den einfachen Download.
Der manuelle Weg bleibt darunter: Lade losos-ca.crt herunter und füge
es selbst als vertrauenswürdige Zertifizierungsstelle hinzu.
Wenn das Ablesen eines Bildschirms und das Eintippen einer Adresse der
abschreckende Teil ist, öffne stattdessen
losos-edge.dasmat.us/find in Chrome und
klicke auf Find my box (Meine Box finden). Chrome fragt einmal, ob die
Seite nach Geräten in deinem lokalen Netzwerk suchen darf (seine Berechtigung
Local Network Access, Chrome 142 oder neuer). Stimm zu, und die Seite
findet die Box über ihren Namen und verlinkt dich zu ihrer Einrichtung. Die
Suche läuft in deinem Browser, zwischen deinem Rechner und der Box. Die Seite
liest /setup/state.json der Box, das ihren Namen und den Fingerabdruck
ihres Zertifikats enthält und sonst nichts, und nichts über dein Netzwerk
verlässt deinen Rechner. Die Box lässt nur diese eine Seite das Dokument lesen
(losos.setup.finderOrigins). Firefox und Safari haben keine solche
Berechtigung und bekommen stattdessen die Anleitung mit eingetippter Adresse.
In einer VM ausprobieren (BIOS)
Für den TPM-Weg braucht die VM einen emulierten Chip bei der Installation und bei jedem Start, mit demselben Zustandsverzeichnis, sonst findet das installierte System den Schlüssel nicht, den es versiegelt hat. Mit swtpm:
mkdir -p tpm
swtpm socket --tpmstate dir=tpm --ctrl type=unixio,path=tpm/sock --tpm2 --daemon
qemu-system-x86_64 ... \
-chardev socket,id=chrtpm,path=tpm/sock -tpmdev emulator,id=tpm0,chardev=chrtpm \
-device tpm-tis,tpmdev=tpm0
Füge diese drei Zeilen sowohl beim Lauf des Installers als auch bei den
späteren Starts hinzu. Ohne sie meldet der Installer
unlock: keyfile in the initrd, und die Box funktioniert im
Schlüsseldatei-Modus.
qemu-img create -f raw disk.img 40G
qemu-system-x86_64 -m 4096 -smp 2 -enable-kvm -machine q35 \
-drive file=losos.iso,media=cdrom,readonly=on \
-drive file=disk.img,format=raw,if=virtio \
-nic user,hostfwd=tcp::8080-:80
Ohne -bios bootet QEMU SeaBIOS, also wählt der Installer GRUB. Sobald er
fertig ist, fahr die VM herunter und starte sie erneut ohne die
Zeile -drive …media=cdrom. Die Adresse der VM ist vom Host aus nur über die
Portweiterleitung erreichbar, öffne also http://localhost:8080.
ISO mit der vollständigen Closure
nix build .#losos-disk-iso # or: devenv shell build-media iso
Beim normalen ISO lädt und baut der Zielrechner das ganze System, etwa
5.8 GiB. Dieses ISO bringt die gebaute Closure mit, sodass nixos-install sie
vom Stick kopiert.
- Es braucht trotzdem ein Netzwerk, um den Flake zu klonen und nixpkgs zu holen.
- Bau es aus demselben Commit, den der Installer klonen wird
(
LOSOS_FLAKE_URL,--depth 1). Sonst unterscheiden sich die Store-Pfade und die Kopien bleiben ungenutzt. - Es ist zu groß für ein Release-Asset auf GitHub. Bau es selbst.
Demo-Image für eine VM
nix build .#losos-disk-qcow2 # or: devenv shell build-media qcow2
Ein vorinstalliertes QCOW2 für QEMU oder virt-manager. Getaggte Releases veröffentlichen es auf GHCR. Es hat keine Festplattenverschlüsselung und führt nie den Installer aus, verwende es also nur für Demos und Entwicklung.
Die Festplatte vergrößern
Das Logical Volume belegt 90 % der Volume Group (losos.storage.fillPercent).
Um den Rest zu nutzen:
losos-ctl grow
Das führt lvextend, cryptsetup resize und resize2fs aus, in dieser
Reihenfolge, bei eingehängtem /persist. /persist enthält /nix und füllt
sich daher mit der Zeit.
Wenn die Reserve aufgebraucht ist, füge eine Festplatte hinzu und vergrößere erneut:
pvcreate /dev/sdX && vgextend persist-vg /dev/sdX && losos-ctl grow
grow schlägt fehl, wenn nichts mehr zu holen ist.