Uživatelské nástroje

Nástroje pro tento web


it:linux:nixos_immutability

NixOS: Imutabilita a perzistence dat (Concept Impermanence)

V článku 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 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:

Tagy: linux nixos immutability impermanence btrfs zfs persistence devops

it/linux/nixos_immutability.txt · Poslední úprava: autor: admin