====== NixOS: Imutabilita a perzistence dat (Concept Impermanence) ====== V článku [[it:linux:nixos_immutability|NixOS jako imutabilní systém]] jsme si ukázali, že základní systémové komponenty a aplikace jsou v NixOS uloženy v read-only úložišti `/nix/store`. Pokročilí uživatelé NixOS však tento koncept posouvají ještě dál – do stavu, kdy je **celý kořenový souborový systém (/) považován za dočasný** a při každém restartu počítače se kompletně vymaže. Tento přístup se v komunitě označuje jako **Impermanence** (pomíjivost) nebo podle známého motta *"Erase Your Darlings"* (Vymaž své miláčky). Přináší absolutní kontrolu nad tím, jaká data v systému dlouhodobě zůstávají a která jsou perzistentní (trvalá). ===== Proč mazat systém při každém restartu? ===== V běžném operačním systému se postupem času hromadí "datový odpad" – dočasné soubory, cache, logy aplikací, které jste jednou spustili a odinstalovali, nebo zapomenuté konfigurační soubory v `/var` a `/etc`. Systém trpí tzv. softwarovým stárnutím. Pokud je kořenový adresář `/` při každém bootu smazán a obnoven z prázdného snapshotu: * Máte jistotu, že v systému neběží žádný škodlivý kód (malware), který by se pokusil skrýt v systémových složkách – restart ho zlikviduje. * Systém je po deseti letech provozu v naprosto stejně čistém stavu jako první den po instalaci. * Pokud nějaká aplikace vyžaduje trvalé ukládání dat, musíte ji v konfiguraci explicitně definovat. Nic se neděje "za vašimi zády". ===== Architektura imutabilního disku ===== Abychom nepřišli o osobní dokumenty, zdrojové kódy nebo databáze, musíme disk rozdělit na specifické podsvazky (subvolumes) pomocí souborových systémů jako Btrfs nebo ZFS (viz [[it:linux:file_systems|Srovnání Btrfs a ZFS]]). Typické rozdělení disků vypadá takto: * **`/` (root) – Ephemerální (dočasný):** Namontován ze subvolumů Btrfs/ZFS, který se při každém bootu promaže. * **`/nix` – Perzistentní:** Zde sídlí `/nix/store`. Obsahuje všechny aplikace a konfigurace. Nemusí se mazat, protože Nix sám ví, co má vyčistit pomocí Garbage Collection. * **`/persistent` – Perzistentní:** Speciální bezpečné místo na disku, kam se ukládají data, o která nechceme přijít. Sem se fyzicky mapují soubory z domovských adresářů a systémových databází. ===== Jak se čistí kořenový adresář? ===== Promazání kořenového adresáře probíhá v rané fázi startu systému (**initrd**) ještě předtím, než se namontují samotné souborové systémy. Příklad skriptu v jazyce Nix pro souborový systém Btrfs: boot.initrd.postDeviceCommands = lib.mkAfter '' mkdir /btrfs_tmp mount /dev/disk/by-uuid/VAŠE-UUID-DISKU /btrfs_tmp if [ -e /btrfs_tmp/root ]; then btrfs subvolume delete /btrfs_tmp/root fi btrfs subvolume snapshot /btrfs_tmp/root-blank /btrfs_tmp/root umount /btrfs_tmp ''; Tento skript při každém startu smaže subvolume `root` a vytvoří jeho čistou kopii ze záložního prázdného snímku `root-blank`. ===== Řešení perzistence: Komunitní modul Impermanence ===== Abyste nemuseli ručně psát složité symbolické odkazy pro každý soubor, který chcete zachovat, vyvinula komunita NixOS modul s názvem **Impermanence**. Tento modul využívá technologii **bind mounting** (připojení adresáře do jiného adresáře) na úrovni jádra. V konfiguraci systému pak stačí jednoduše deklarovat, které soubory a složky mají "přežít" restart tím, že se propojí do perzistentního úložiště: { inputs, ... }: { imports = [ inputs.impermanence.nixosModules.impermanence ]; # Globální systémová perzistence environment.persistence."/persistent" = { hideMounts = true; directories = [ "/var/log" "/var/lib/bluetooth" "/var/lib/nixos" "/var/lib/systemd/coredump" "/etc/NetworkManager/system-connections" ]; files = [ "/etc/machine-id" "/etc/ssh/ssh_host_rsa_key" "/etc/ssh/ssh_host_ed25519_key" ]; }; } ==== Perzistence uživatelských dat (Home Manager) ==== Stejný přístup lze aplikovat i na domovský adresář uživatele prostřednictvím nástroje **Home Manager**: home.persistence."/persistent/home/anna" = { directories = [ "Downloads" "Documents" "Projects" ".config/PulseEffects" ".mozilla/firefox" # Zachování profilu prohlížeče ".local/share/Steam" # Zachování her ze Steamu ]; allowOther = true; }; ===== Výzvy a na co si dát pozor ===== Provozování systému v tomto režimu je fascinující, ale přináší určité komplikace: * **SSH klíče hostitele:** Pokud zapomenete perzistovat SSH klíče serveru (`/etc/ssh/ssh_host_*`), při každém restartu se vygenerují nové. Klienti se k serveru odmítnou připojit s varováním před útokem Man-in-the-Middle. * **Machine ID:** Soubor `/etc/machine-id` je unikátní pro každou instalaci. Pokud není perzistentní, systém ho generuje znovu, což může mást logovací nástroje (journald) nebo DHCP servery v síti. * **Aplikace třetích stran:** Některé špatně navržené aplikace ukládají důležitá data do složek jako `/tmp` nebo `/var/tmp`. V imutabilním systému tato data po restartu zmizí, což může vést k neočekávanému chování. ---- //Související články:// * [[it:linux:nixos_immutability|NixOS jako imutabilní systém a principy /nix/store]] * [[it:linux:file_systems|Srovnání souborových systémů: Btrfs, ZFS a role v imutabilitě]] * [[it:devops:infrastructure_as_code|Infrastruktura jako kód (IaC) a deklarativní správa]] //Tagy: {{tag>linux nixos immutability impermanence btrfs zfs persistence devops}}//