{ "meta": { "title": "Ako ProxMenux Backup funguje interne — rootfs, manifest a aplikácie", "description": "Podrobný obsah zálohy ProxMenux: rootfs skopírovaný pomocou rsync podľa predvoleného profilu ciest, štruktúrovaný manifest vytvorený šiestimi nezávislými zbernými skriptmi a inventár aplikácií, ktorý riadi automatickú reinštaláciu balíkov a komponentov po obnove.", "ogTitle": "Ako ProxMenux Backup funguje interne", "ogDescription": "Tri časti zálohy ProxMenux: rootfs, manifest a aplikácie.", "twitterTitle": "Ako funguje zálohovanie ProxMenux | ProxMenux", "twitterDescription": "Tri časti zálohy ProxMenux a spôsob, akým z nich obnova znovu vytvorí zdrojového hostiteľa." }, "header": { "title": "Ako to funguje", "description": "Vnútorná štruktúra zálohy ProxMenux — súborový systém, manifest a inventár aplikácií — a spôsob, akým ich obnova používa na vytvorenie pôvodného hostiteľa na cieli, ktorý môže mať iné jadro.", "section": "Záloha a obnova" }, "intro": { "title": "Jeden archív, tri časti", "body": "Každá záloha vytvorí tri jasne oddelené časti v spoločnom prípravnom adresári. Archív odoslaný do cieľa (lokálny .tar.zst, záloha PBS alebo archív Borg) obsahuje túto istú štruktúru. Obnova používa všetky tri: manifest pred zmenami určí rozdiely a výnimky; rootfs poskytne konfiguračné súbory, ktoré sa použijú za behu alebo po reštarte; inventár aplikácií riadi inštaláciu balíkov a reinštaláciu komponentov po štarte. Každú časť možno skontrolovať alebo rozbaliť samostatne." }, "layout": { "heading": "Rozloženie archívu", "intro": "Každý archív sleduje rovnaké rozloženie stromov bez ohľadu na cieľ. Podadresár metadata/ má štruktúrované užitočné zaťaženie; podadresár rootfs/ má kópiu súborového systému.", "treeCaption": "Prípravný adresár vytvorený pri zálohe. Každý cieľ dostane rovnaký strom vo svojom formáte: tar pri lokálnom cieli, bloky PBS pri PBS a segmenty Borg pri Borgu.", "tree": "backup-[timestamp]/\n├── manifest.json # structured host state\n├── metadata/\n│ ├── packages.manual.list # apt-mark showmanual\n│ ├── run_info.env # backup run identity + kernel version + pmxcfs method\n│ ├── paths_archived.txt # exact list of paths that reached rootfs/\n│ └── missing_paths.txt # paths from the profile absent on source\n└── rootfs/\n ├── etc/ # /etc/pve, /etc/network, /etc/systemd/network, /etc/ssh, …\n ├── root/ # /root (with volatile subdirs excluded)\n ├── usr/local/ # /usr/local/bin, /usr/local/share/proxmenux, …\n └── var/ # /var/lib/pve-cluster (config.db via sqlite3 .backup), /var/spool/cron/…" }, "rootfs": { "heading": "Časť rootfs", "intro": "Strom rootfs/ je obyčajná kópia súborového systému vytvorená pomocou rsync zo zdrojového hostiteľa. Obsahuje vybraný predvolený profil ciest dôležitých pre obnovu Proxmoxu a vlastné cesty, ktoré používateľ pridal do úlohy alebo interaktívnej relácie. Výber je zámerne úzky: iba cesty, ktoré obsahujú konfiguráciu alebo uchovávajú stav, ktorý Proxmox nedokáže sám znovu vytvoriť.", "defaultProfileTitle": "Štandardný profil", "defaultProfileBody": "Predvolený profil definuje hb_default_profile_paths v lib_host_backup_common.sh. Zahŕňa osem pevných kategórií a prípadne stav ZFS, ktoré spolu opisujú funkčného hostiteľa Proxmox:", "categoriesTitle": "Kategórie ciest", "categoryRows": [ { "category": "Jadro PVE", "paths": "/etc/pve, /var/lib/pve-cluster, /etc/vzdump.conf", "why": "Obsah klastrového súborového systému a predvolené nastavenia vzdump. Databáza pmxcfs (config.db) sa zachytí ako konzistentná snímka cez sqlite3 .backup bez zastavenia klastra. Sprievodné súbory .db-wal / .db-shm sa z rsync vylúčia. Ak sqlite3 nie je dostupný, vytvorí sa config.db.raw-fallback, ktorý obnova automaticky použije ako databázu." }, { "category": "Identita hostiteľa & sieť", "paths": "/etc/hostname, /etc/hosts, /etc/timezone, /etc/resolv.conf, /etc/network, /etc/systemd/network", "why": "Všetko potrebné na spustenie hostiteľa v sieti s rovnakou identitou. Súbory .link v /etc/systemd/network priraďujú názvy sieťových kariet k ich MAC adresám, aby sa názvy zachovali pri reinštalácii a zmenách hardvéru." }, { "category": "Prístup a overovanie", "paths": "/etc/ssh, /etc/sudoers, /etc/sudoers.d, /etc/pam.d, /etc/security", "why": "Kľúče SSH, pravidlá sudo a konfigurácia PAM. Ich strata môže používateľovi znemožniť prístup k obnovenému hostiteľovi." }, { "category": "Jadro a štart systému", "paths": "/etc/default/grub, /etc/kernel, /etc/modules, /etc/modules-load.d, /etc/modprobe.d, /etc/sysctl.conf, /etc/sysctl.d, /etc/udev/rules.d, /etc/fstab, /etc/iscsi, /etc/multipath", "why": "Parametre IOMMU, zoznamy zakázaných modulov, ID zariadení VFIO, tabuľka pripojení a konfigurácia úložísk." }, { "category": "Shell a miestne nastavenia", "paths": "/etc/environment, /etc/bash.bashrc, /etc/inputrc, /etc/profile, /etc/profile.d, /etc/locale.gen, /etc/locale.conf", "why": "Systémová konfigurácia shellu, premenné prostredia a nastavenie generovania miestnych nastavení." }, { "category": "Správa balíkov a cron", "paths": "/etc/apt, /etc/cron.d, /etc/cron.{daily,hourly,weekly,monthly}, /etc/cron.allow, /etc/cron.deny, /var/spool/cron/crontabs", "why": "APT zdroje pre konzistentné riešenie balíkov, plánované úlohy definované užívateľom." }, { "category": "Stav a nástroje ProxMenux", "paths": "/etc/proxmenux, /etc/systemd/system, /etc/log2ram.conf, /etc/logrotate.conf, /etc/logrotate.d, /etc/lm-sensors, /etc/sensors3.conf, /etc/fail2ban, /etc/snmp, /etc/postfix, /etc/wireguard, /etc/openvpn, /etc/grafana, /etc/influxdb, /etc/prometheus, /etc/telegraf, /etc/zabbix", "why": "Voliteľné, ale bežné náradie Proxmox. Chýbajúce cesty sú zaznamenané v metadata/missing_paths.txt bez zastavenia zálohy." }, { "category": "Spustiteľné súbory ProxMenux a účet root", "paths": "/usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux, /var/lib/proxmenux, /root (bez dočasných podadresárov)", "why": "Binárne systémy nainštalované ProxMenux a konfigurácia na užívateľa podľa /root. Prchavé cesty (.bash_history, .cache/, tmp/, .local/share/Trash/) sú z kópie vylúčené. /var/lib/proxmenux drží plánované záložné úlohy a stav hostiteľa udržiava ProxMenux; obnovenie inscenácie, rollback kópie a post-restore markery sú vylúčené, pretože patria k hostiteľovi, ktorý prevádzkuje obnovenie." }, { "category": "Stav ZFS (podmienený)", "paths": "/etc/zfs", "why": "Zahrnuté iba vtedy, keď zdroj spustí ZFS. Obsahuje zpool.cache a hostid." } ], "customTitle": "Rozšírenie profilu vlastnými cestami", "customBody": "Okrem predvoleného profilu, ProxMenux ponúka dva spôsoby, ako zahrnúť ďalšie cesty do zálohy. Skladajú sa bez konfliktu a obe sa vzťahujú na interaktívne zálohy a plánované pracovné miesta.", "customExtrasTitle": "1. Trvalé doplnky (na-host súbor)", "customExtrasBody": "Textový súbor /usr/local/share/proxmenux/backup-extra-paths.txt obsahuje absolútne cesty, ktoré používateľ na tomto hostiteľovi označil ako „vždy zahrnúť“. Pri zálohe v režime Predvolené sa automaticky pridajú do predvoleného profilu bez otázok. Súbor sa upravuje cez rozhranie, bez ručnej úpravy, a pretrváva medzi reštartmi aj aktualizáciami. Každý riadok obsahuje jednu absolútnu cestu; komentáre s # sú povolené.", "customModeTitle": "2. Vlastný režim (na beh)", "customModeBody": "Spustenie zálohy v režime Vlastný nahradí automatickú aplikáciu predvoleného profilu kontrolným zoznamom zobrazujúcim každú cestu: položky predvoleného profilu a trvalé doplnky (s predponou [+] a vopred začiarknuté). Používateľ začiarkne alebo odznačí položky pre daný konkrétny chod a môže tiež stlačiť Pridať vlastnú cestu na zadanie novej cesty – ktorá sa potom uloží do extra súboru pre budúce zálohy.", "customMissingTitle": "Cesta neprítomná zo zdroja", "customMissingBody": "Akákoľvek cesta z profilu (predvolená alebo pridaná), ktorá neexistuje na zdrojovom hostiteľovi, sa zaznamenáva v metadata/missing_paths.txt vo vnútri archívu. Zálohovanie nezlyhá, ani sa nezastaví. Užívateľ vidí súhrn archivovaných ciest a chýbajúce cesty na konci. V praxi sa to stane pre voliteľné cesty nástrojov, ako je /etc/wireguard alebo /etc/prometheus, ak tieto nástroje nie sú nainštalované." }, "manifest": { "heading": "Časť s manifestom", "intro": "manifest.json je štruktúrovaný dokument JSON opisujúci zdrojového hostiteľa v čase zálohy. Vytvára ho šesť nezávislých zberných skriptov riadených skriptom build_manifest.sh. Každý iba číta údaje a vytvorí presne definovanú časť JSON. Pri zlyhaní použije bezpečnú prázdnu predvolenú hodnotu, takže manifest zostáva použiteľný aj s neúplnou časťou.", "orchestratorCaption": "Manifest tvorí šesť zberných skriptov. Každý beží vo vlastnom podprocese. Pri zlyhaní jednej časti sa použije zdokumentovaná bezpečná predvolená hodnota a zobrazí upozornenie, ale záloha sa nepreruší.", "collectorRows": [ { "collector": "collect_source_host.sh", "produces": "source_host", "content": "Názov hostiteľa, verzia PVE (pveversion), verzia PBS, ak hostiteľ plní úlohu zálohovacieho servera, jadro (uname -r), režim zavádzania (efi/bios), typ koreňového súborového systému, model a architektúra CPU, pamäť v KB." }, { "collector": "collect_hardware.sh", "produces": "hardware_inventory", "content": "GPU s výrobcom a priradeným inštalátorom ProxMenux; TPU Coral USB a M.2 zistené pomocou lsusb/lspci; sieťové karty s MAC adresou, PCI slotom a priradením k mostu; bezdrôtové zariadenia. Záznamy GPU obsahujú heuristiku passthrough_eligible." }, { "collector": "collect_storage.sh", "produces": "storage_inventory", "content": "ZFS pools (s pool typ + členské disky vyriešené na /dev/disk/by-id/*, /dev/disk/by-partuuid/* alebo surové /dev/sdX cesty v závislosti od toho, ako každý pool bol pôvodne vytvorený), LVM objemové skupiny + thin pools, fyzické disky s SMART schopnosť, PVE storage.cfg vstupy, externé pripojenia." }, { "collector": "collect_kernel.sh", "produces": "kernel_params", "content": "Parametre pridané správcom do /proc/cmdline bez bežných predvolených položiek, ako sú BOOT_IMAGE=, root=, ro/rw, quiet a splash; moduly načítavané pri štarte z /etc/modules; a cesty súborov /etc/modprobe.d/*.conf, ktoré obsahujú skutočné direktívy (options, blacklist, install, alias, softdep)." }, { "collector": "collect_proxmenux_state.sh", "produces": "proxmenux_installed_components", "content": "Číta /usr/local/share/proxmenux/managed_installs.json (registrácia všetkého, čo ProxMenux nainštaloval) a installed_tools.json. Každý záznam udržuje inštalačnú dráhu (menu_script), takže obnovenie môže spustiť presne rovnaký inštalačný tok." }, { "collector": "collect_guests.sh", "produces": "vms_lxcs_at_backup", "content": "Vypíše VM (qm list) a kontajnery LXC (pct list) prítomné v čase zálohy: VMID, názov a aktuálny stav. Ide iba o inventár; samotné údaje hostí zálohujú vzdump / PBS." } ], "schemaTitle": "Potvrdenie schémy", "schemaBody": "ProxMenux obsahuje šablónu, ktorá opisuje, ktoré polia musí manifest obsahovať a aký tvar má každé z nich. Pri vytváraní zálohy možno manifest automaticky overiť podľa tejto šablóny, takže zberač, ktorý vytvoril chybný JSON alebo pole s preklepom, sa odhalí okamžite. Kontrola je určená na vývoj samotného ProxMenux: v systéme, kde nie je nainštalovaná, záloha funguje ako zvyčajne a manifest sa vytvorí rovnako." }, "applications": { "heading": "Inventár aplikácií", "intro": "Dva inventáre evidujú softvér pridaný k základným balíkom Proxmox VE: zoznam balíkov v metadata/ a register komponentov v rootfs, podrobne opísané nižšie. Obnova podľa pôvodného spôsobu inštalácie používa APT alebo inštalátory ProxMenux na opätovnú inštaláciu používateľského softvéru.", "packagesTitle": "packages.manual.list", "packagesBody": "Abecedný textový zoznam z apt-mark showmanual obsahuje všetky balíky APT výslovne nainštalované na zdrojovom hostiteľovi. Nezahŕňa závislosti základného systému Proxmox VE, ktoré APT cieľa nainštaluje automaticky. Pri obnove ho číta _rs_run_complete_extras a použije trojstupňový filter proti kaskádovému odstraňovaniu: dpkg -s zistí už nainštalované balíky, pri knižniciach sa zistia iné hlavné verzie a apt-get install --simulate overí riziko následného odstraňovania. Zvyšné balíky sa nainštalujú cez apt-get install -y.", "componentsTitle": "components_status.json (súčasť rootfs)", "componentsBody": "Register JSON v /usr/local/share/proxmenux/ eviduje každý komponent nainštalovaný cez ProxMenux s presným stavom: verziou a osobitnými príznakmi (pri NVIDIA logická hodnota patched, pri Coral verzia DKMS). Súbor je v rootfs, nie v metadata/, pretože sa číta až po skopírovaní rootfs na cieľ. Dispečer po štarte (apply_cluster_postboot.sh) prejde záznamy a spustí pre každý komponent jeho --auto-reinstall hook. Ten prečíta uložený stav a zopakuje inštaláciu pre aktuálne jadro cieľa.", "componentInstallersTitle": "Inštalátory komponentov", "componentInstallersBody": "Štyri inštalátory ProxMenux v súčasnosti vystavujú vstupný bod --auto-reinstall:", "installerRows": [ { "component": "nvidia_driver", "installer": "gpu_tpu/nvidia_installer.sh", "action": "Číta version a patched. Stiahne ten istý inštalačný súbor NVIDIA, zostaví moduly DKMS pre jadro cieľa a znovu použije opravu ProxMenux, ak bola na zdroji zapnutá." }, { "component": "coral_driver", "installer": "gpu_tpu/install_coral.sh", "action": "Číta verziu Coral ovládač. Kompiluje modul DKMS s jadrom cieľa." }, { "component": "amdgpu_top", "installer": "gpu_tpu/amd_gpu_tools.sh", "action": "Číta nahranú verziu. Znovu stiahne presný .deb z GitHub vydania." }, { "component": "intel_gpu_tools", "installer": "gpu_tpu/intel_gpu_tools.sh", "action": "APT inštaluje balík. Idempotentné, ak už prítomný z packages.manual.list." } ] }, "restoreFlow": { "heading": "Ako obnova používa tri časti", "intro": "Obnova má šesť fáz. Každá číta konkrétnu časť archívu a aktualizuje cieľového hostiteľa. Žiadna nevyžaduje dostupnosť zdrojového hostiteľa: archív obsahuje všetky potrebné zálohované údaje.", "stagesCaption": "Fáza 1 podľa manifestu rozhodne, čo upraviť. Fáza 2 skopíruje cesty rootfs použiteľné za behu. Fáza 3 pripraví rizikové cesty na ďalší štart. Fáza 3b importuje dátové pooly ZFS bez koreňového systému, ktorých disky sú všetky prítomné. Fáza 4 rieši balíky. Fáza 5 po reštarte preinštaluje komponenty pre jadro cieľa.", "stageRows": [ { "stage": "1", "name": "Kontrola kompatibility", "reads": "manifest.json", "action": "Spúšťa hb_compat_check. Porovnáva zdrojový a cieľový hardvér (NIC, identifikátory úložísk), verziu PVE a hlavnú verziu jadra. Nastavuje HB_COMPAT_KERNEL_DIRECTION (same, bk_newer alebo bk_older) a zaľudňuje RS_SKIP_PATHS s hardware-drift a cross-kernel s výnimkou." }, { "stage": "2", "name": "Použitie za tepla", "reads": "rootfs/ (len bezpečné cesty)", "action": "_rs_apply … hot kopíruje hb_classify_path=hot položky priamo do živého cieľa. Všetko pod /etc/pve, /etc/network alebo cesty klasifikované ako reboot/dangerous je odložený." }, { "stage": "3", "name": "Príprava odložených zmien", "reads": "rootfs/ (reboot + nebezpečné cesty)", "action": "_rs_prepare_pending_restore pripraví rizikové cesty v /var/lib/proxmenux/pending-restore/, zapíše plan.env, apply-on-boot.list a rs-skip-paths.txt a povolí spustenie proxmenux-restore-onboot.service pri ďalšom štarte." }, { "stage": "3b", "name": "Import dátových poolov", "reads": "manifest.storage_inventory + cieľový ZFS stav", "action": "_rs_import_data_pools importuje každého ZFS pool každého iného typu než root, ktorého úplná sada diskov sa nachádza v cieli. Pools nesúci cudzí hostid sa zopakuje s zpool import -f. Pools chýbajúce disky sú preskočené s varovaním. Výsledok per-pool je zaznamenaný v /var/log/proxmenux/restore-datapools-<timestamp>.log." }, { "stage": "4", "name": "Inštalácia balíka", "reads": "metadata/packages.manual.list", "action": "_rs_run_complete_extras spustí kaskádovo bezpečný filter a zavolá apt-get install -y so zoznamom prežitých balíkov. Celý výstup ide do /var/log/proxmenux/restore-apt-*.log." }, { "stage": "5", "name": "Po štarte systému", "reads": "rootfs (už použité) + components_status.json", "action": "Po reštarte apply_pending_restore.sh použije odložené cesty a apply_cluster_postboot.sh spustí update-initramfs, update-grub alebo proxmox-boot-tool refresh. Potom prejde components_status.json a pre každý komponent spustí jeho --auto-reinstall hook." } ] }, "whyItWorks": { "heading": "Prečo je záloha rozdelená na tri časti", "body": "Rozdelenie sleduje životný cyklus údajov. Súborový systém sa prenáša cez rsync: rýchlo, prehľadne a atómovo po súboroch. Konfiguračný stav, ktorý treba vyhodnotiť pred zmenami, je štruktúrovaný JSON, samostatne čitateľný, verzovateľný schémou a strojovo porovnateľný so stavom cieľa. Softvér na reinštaláciu opisuje inventár názvov a verzií; správca balíkov a inštalátory ProxMenux vyberú vhodné binárne súbory. Každá časť plní vlastnú úlohu. Spolu smerujú ku konzistentnej obnove odolnej voči chybám: poškodený manifest ponecháva rootfs obnoviteľný, chýbajúci balík nebráni inštalácii komponentov a zlyhanie pri jednej položke nezastaví ďalšiu." } }