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á).
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:
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:
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`.
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"
];
};
}
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;
};
Provozování systému v tomto režimu je fascinující, ale přináší určité komplikace:
Související články:
Tagy: linux nixos immutability impermanence btrfs zfs persistence devops