{
"meta": {
"title": "Obnova medzi rôznymi jadrami — rozpoznanie smeru, bezpečný výber a prispôsobenie | ProxMenux",
"description": "Ako ProxMenux obnoví zálohu hostiteľa na cieľ s inou hlavnou verziou jadra. Vysvetľuje rozpoznanie smeru rozdielu, bezpečný filter vynechávajúci kritické cesty pri novšom cieľovom jadre a štvorfázové doplnenie nastavení IOMMU, ID VFIO a vlastných parametrov bez doslovného kopírovania súborov viazaných na jadro.",
"ogTitle": "ProxMenux Backup — obnova medzi verziami jadra a doplnenie nastavení",
"ogDescription": "Obnova medzi verziami jadra podľa smeru zmeny s bezpečným filtrom a doplnením nastavení nezávislým od jadra.",
"twitterTitle": "Obnova medzi rôznymi jadrami | ProxMenux",
"twitterDescription": "Ako ProxMenux spracováva obnovenie, keď sa cieľové jadro líši od zálohy."
},
"header": {
"title": "Obnova medzi kernelmi",
"description": "Ako ProxMenux zvláda obnovenie, keď cieľový hostiteľ spustí iné jadro od toho, ktoré je zaznamenané v zálohe, najmä keď cieľ spustí novšie jadro. Opisuje, ako sa rozdiel detekuje, ako sa prefiltrujú cesty kritické z hľadiska zavádzania, ktoré by mohli porušiť cieľ, a ako sa užívateľská konfigurácia znovu dodáva bez kopírovania súborov viazaných na jadro doslova.",
"section": "Záloha a obnova"
},
"intro": {
"title": "Každý skok do jadra je riadený inak",
"body": "Jadro hostiteľa Proxmox má verziu ako 6.17.13-2-pve. Prvé dve čísla (6.17) označujú hlavnú verziu; po ich zmene nemusia byť staršie konfiguračné súbory platné. Pri odlišnej verzii jadra v zálohe a cieli sa postup vetví podľa smeru zmeny, pretože obe situácie majú odlišné riziká. Zálohy s novším jadrom než cieľ sa obnovujú bez filtra, podľa zaznamenaných testov cez viac verzií. Zálohy so starším jadrom potrebujú filter, aby staré nastavenia nebránili štartu novšieho cieľa."
},
"directionCheck": {
"heading": "Kontrola smeru",
"intro": "Počas kontroly kompatibility hb_compat_check porovnáva jadro zaznamenané v manifeste zálohy s aktuálnym jadrom cieľa (uname -r) a klasifikuje obnovenie do jedného z troch prípadov, uložené vo vnútornej premennej HB_COMPAT_KERNEL_DIRECTION:",
"rows": [
{
"direction": "same",
"condition": "Hlavná verzia jadra sa zhoduje medzi zálohou a cieľom.",
"behavior": "Úplné obnovenie toku beží nezmenený. Žiadny ďalší filter, žiadna hydratácia, žiadne špeciálne upozornenie v UI."
},
{
"direction": "bk_newer",
"condition": "Jadro zálohy je NOVŠIE než cieľové (napríklad záloha z jadra 7.0 a cieľ s jadrom 6.17).",
"behavior": "Úplný postup obnovy zostáva nezmenený, ako pri same, bez filtra. Uvedené testy overili reinštaláciu ovládačov pre cieľové jadro, nastavenie IOMMU a spustenie VM s odovzdanou GPU."
},
{
"direction": "bk_older",
"condition": "Jadro zálohy je STARŠIE než cieľové (napríklad záloha z jadra 6.17 a cieľ s jadrom 7.0).",
"behavior": "Filter bezpečnej podskupiny a štvorfázová hydratácia nižšie sú aktivované. Obnova pokračuje – cieľ reprodukuje zdroj, ale súbory kritické pri zavádzaní sa neskopírujú doslovne."
}
]
},
"whyBkNewerIsSafe": {
"heading": "Prečo záloha s novším jadrom ako cieľ obnoví nezmenený",
"body": "Pri cieli so starším jadrom než v zálohe používa obnova mechanizmy nezávislé od verzie jadra. Inštalátory ovládačov GPU a PCI zistia bežiace jadro cez uname -r a zostavia DKMS pre cieľ. APT použije binárne balíky cieľovej distribúcie. Parametre IOMMU, napríklad intel_iommu=on, zostávajú stabilné medzi hlavnými verziami. Podľa tohto návrhu sú zoznamy zakázaných modulov, nastavenia GRUB a initramfs zo zálohy syntakticky použiteľné aj na staršom jadre; neznáme parametre jadro ignoruje. ProxMenux preto tento smer spracúva rovnako ako obnovu s rovnakým jadrom."
},
"safeSubsetFilter": {
"heading": "Bezpečný subsetový filter (iba ak je cieľové jadro novšie)",
"intro": "Keď je cieľové jadro novšie ako záložné, kontrola kompatibility pridáva 16 ciest kritických pre štart z hb_unsafe_paths_cross_version do RS_SKIP_PATHS. Tieto cesty sú vylúčené z obnovy, pretože písanie ich verzie zo staršieho jadra nad cieľom spusteným novším spôsobilo paniku jadra pri testovaní. Trasy pokrývajú päť kategórií:",
"categoryRows": [
{
"category": "Zavádzač",
"paths": "/etc/default/grub, /etc/kernel",
"reason": "GRUB defaults viazaná na predchádzajúce poradie jadier a stav proxmox-boot-tool (cmdline, ESP UUIDs, háčiky), ktorý odkazuje na cesty a identifikátory zo staršej inštalácie."
},
{
"category": "Kernelové moduly a štartovacie artefakty",
"paths": "/etc/modules-load.d, /etc/modprobe.d, /etc/initramfs-tools",
"reason": "Zoznamy automaticky načítaných modulov premenovaných medzi hlavnými verziami jadra, neplatné voľby modulov a hooky initramfs napísané pre staršie jadro."
},
{
"category": "Úložný systém a identita súborového systému",
"paths": "/etc/fstab, /etc/multipath, /etc/iscsi, /etc/udev/rules.d, /etc/zfs",
"reason": "UUID, ktoré v tejto inštalácii nemusia existovať, viaccestné ovládače, ktoré sa menia medzi jadrami, iSCSI parametre, ktoré sa vyvíjajú, pravidlá udev, ktoré sa môžu viazať na neexistujúce podsystémy, stav ZFS (zpool.cache + hostid), ktoré môžu uzamknúť pool ako cudzie."
},
{
"category": "APT zdroje",
"paths": "/etc/apt",
"reason": "Vydania v zdrojoch APT môžu pri ďalšej aktualizácii spôsobiť zníženie verzií kritických balíkov."
},
{
"category": "systemd",
"paths": "/etc/systemd/system, /etc/systemd/journald.conf, /etc/systemd/logind.conf, /etc/systemd/system.conf, /etc/systemd/user.conf",
"reason": "Vlastné úpravy jednotiek a odkazy .wants viazané na staršiu hlavnú verziu systemd; konfiguračné kľúče, ktoré novší systemd nemusí rozpoznať."
}
],
"outroBody": "Filter beží PRED konfirmačným dialógom, takže užívateľ vidí presný zoznam ciest, ktoré budú preskočené, kategorizované z dôvodu. Obnovenie stále pokračuje všetko ostatné (konfigurácia VM/LXC, sieť, /etc/pve, užívatelia, cron, ProxMenux stav, balíčky, ovládače, /root) je obnovená normálne."
},
"hydration": {
"heading": "Kernel-agnostická hydratácia",
"intro": "Filter vynechá kritické súbory, preto doplnenie znovu použije vybrané nastavenia: parametre IOMMU, ID VFIO, vlastný GRUB_TIMEOUT a zoznamy blokovaných modulov nvidia. Beží pri novšom cieľovom jadre. Zlúčenie cmdline zachová kľúče cieľa a doplní chýbajúce moduly. Povolené hodnoty GRUB a používateľské súbory môžu nahradiť odlišný obsah cieľa. Opakovanie rovnakých vstupov je idempotentné.",
"phaseRows": [
{
"phase": "1a GRUB cesta",
"detail": "Pre hostiteľov s GRUB (ext4/lvm). _rs_hyd_grub zlúči parametre z manifest.kernel_params.cmdline_extra zálohy do GRUB_CMDLINE_LINUX_DEFAULT cieľa a preskočí existujúce kľúče. Potom obnoví povolené kľúče GRUB_* (GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE, GRUB_DEFAULT, GRUB_TERMINAL, GRUB_DISABLE_OS_PROBER, GRUB_SERIAL_COMMAND, GRUB_GFXMODE, GRUB_GFXPAYLOAD_LINUX) zo súboru /etc/default/grub zálohy, ak sa ich hodnoty líšia od cieľa."
},
{
"phase": "1b — systemd-boot / ZFS",
"detail": "Pre systemd-boot (zvyčajne ZFS ako koreňový systém). _rs_hyd_kernel_cmdline zlúči používateľské parametre z cmdline_extra do cieľového /etc/kernel/cmdline, pričom zachová jeho vlastné parametre štartu root=, boot= a rootflags=."
},
{
"phase": "2 — /etc/modules zlúčenie",
"detail": "_rs_hyd_modules dopĺňa moduly z manifest.kernel_params.modules_loaded_at_boot, ktoré sú na bielom zozname (vfio, vfio_pci, vfio_iommu_type1, vfio_virqfd, kvm, kvm_intel, kvm_amd, nvidia, nvidia_drm, nvidia_modeset, nvidia_uvm, i915, xe) a ešte nie sú prítomné v cieľovom /etc/modules."
},
{
"phase": "3 — Kopírovanie povolených súborov",
"detail": "_rs_hyd_files skopíruje súbory vytvorené používateľom z prípravného rootfs na živý cieľ, keď sa obsah líši. Whitelist pokrýva súbory VFIO/nvidia/blacklist podľa pravidiel /etc/modprobe.d, /etc/modules-load.d a ProxMenux VFIO sa viaže na pravidlo + nvidia udev podľa pravidiel /etc/udev/rules.d. Distro-vlastnené súbory (pve-blacklist.conf, mdadm.conf, nvme.conf) sú zámerne vylúčené, pretože sa ich obsah mení medzi vydaniami."
},
{
"phase": "4 — Vynútenie obnovy po štarte",
"detail": "Štyri fázy píšu priamo na živý cieľ mimo bežného postupu obnovy. Aby zlúčené žetóny/moduly/súbory nadobudli účinnosť na ďalšom štarte, HB_HYDRATION_APPLIED=1 sa šíri cez plan.env na apply_pending_restore.sh, čo núti NEEDS_INITRAMFS=1 a NEEDS_GRUB=1 bez ohľadu na to, čo bolo v zozname. Post-boot dispečer potom regeneruje initramfs a osvieži bootloader."
}
]
},
"planCommit": {
"heading": "Plánovanie a vykonanie — používateľ najprv vidí náhľad",
"body": "Doplnenie má dva režimy. Pred potvrdením ProxMenux spustí _rs_apply_bk_older_hydration v režime plan: vypočíta zmeny, naplní RS_HYDRATION_SUMMARY zeleným zoznamom akcií a nič nezapíše. Dialóg ho zobrazí vedľa žltého zoznamu vynechaných ciest, aby používateľ vopred poznal zmeny. Po potvrdení spustí rovnakú funkciu v režime commit: tie isté fázy a logika, teraz so zápisom do cieľa. Zrušenie ponechá cieľ nedotknutý."
},
"flowDiagram": {
"heading": "Tok, keď je cieľové jadro novšie ako záložné",
"intro": "Kroky pridané, keď je cieľové jadro novšie, sú v rámci normálneho toku obnovy. Všetko ostatné – horúce použitie, čakajúca príprava, inštalácia balíka, dispečer po spustení – beží identicky ako pri obnove rovnakého jadra.",
"diagram": " ┌────────────────────────────────────────────────────────────┐\n │ hb_compat_check │\n │ HB_COMPAT_KERNEL_DIRECTION = bk_older │\n └───────────────────────────┬────────────────────────────────┘\n │\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ Add 16 boot-critical paths to RS_SKIP_PATHS │\n │ /etc/default/grub, /etc/kernel, /etc/modules-load.d, ... │\n └───────────────────────────┬────────────────────────────────┘\n │\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ _rs_apply_bk_older_hydration \"plan\" │\n │ Compute what would be merged │\n │ Populate RS_HYDRATION_SUMMARY (green block) │\n │ No writes │\n └───────────────────────────┬────────────────────────────────┘\n │\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ Confirmation dialog │\n │ Amber: paths skipped by safe-subset filter │\n │ Green: tokens/files reapplied by hydration │\n │ User accepts or cancels │\n └───────────────────────────┬────────────────────────────────┘\n │ (accepted)\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ _rs_apply_bk_older_hydration \"commit\" │\n │ Phase 1a/1b: merge cmdline tokens + GRUB keys │\n │ Phase 2: append modules to /etc/modules │\n │ Phase 3: copy whitelisted vfio/nvidia files │\n │ Set HB_HYDRATION_APPLIED=1 │\n └───────────────────────────┬────────────────────────────────┘\n │\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ Rest of the restore runs normally │\n │ _rs_apply hot (skips RS_SKIP_PATHS) │\n │ _rs_prepare_pending_restore (writes plan.env with │\n │ HB_HYDRATION_APPLIED=1) │\n │ packages.manual.list install │\n │ Reboot │\n │ apply_pending_restore.sh (forces NEEDS_INITRAMFS=1, │\n │ NEEDS_GRUB=1 because of the hydration flag) │\n │ apply_cluster_postboot.sh │\n │ update-initramfs -u -k all │\n │ update-grub / proxmox-boot-tool refresh │\n │ component --auto-reinstall │\n └────────────────────────────────────────────────────────────┘"
},
"concreteExamples": {
"heading": "Konkrétne príklady",
"intro": "Doplnenie nastavení má pri bežných scenároch pozorovateľné výsledky. Dva príklady automaticky spracovaných prípadov:",
"rows": [
{
"scenario": "GPU priechod (VFIO)",
"detail": "Zdroj mal intel_iommu=on iommu=pt v cmdline, vfio/vfio_pci/vfio_iommu_type1 v /etc/modules, /etc/modprobe.d/vfio.conf s options vfio-pci ids=10de:2216, a /etc/modprobe.d/blacklist-nvidia.conf. Hydratácia zlučuje žetóny cmdline do cieľovej GRUB alebo jadra cmdline, pridá vfio moduly do /etc/modules, a skopíruje dva používateľom vytvorené modprobe súbory. Pri ďalšom štarte je IOMMU aktívna, moduly VFIO sa načítajú, GPU je viazaný na vfio-pci a VM sa spustí s funkčným odovzdaním GPU."
},
{
"scenario": "Vlastné GRUB predvolené",
"detail": "Zdroj mal GRUB_TIMEOUT=1 a GRUB_DISABLE_OS_PROBER=true. Hydratácia číta oba kľúče z /etc/default/grub zálohy, vidí, že sa líšia od čerstvých predvolených inštalácií, a prepíše tieto dva riadky v cieľovom súbore (uloženie všetko ostatné, vrátane GRUB_DISTRIBUTOR, nedotknuté)."
}
]
},
"callout": {
"warningTitle": "Čo sa pri novšom cieľovom jadre neobnovuje",
"warningBody": "Doplnenie obnoví iba vybrané nastavenia považované za prenosné medzi jadrami: parametre IOMMU, ID VFIO, povolené kľúče GRUB a moduly z pevného zoznamu (vfio*, nvidia*, i915, xe, kvm*). Ostatné položky, ako vlastné hooky initramfs v /etc/initramfs-tools/hooks/, nepovolené súbory v /etc/modprobe.d/ a vlastné úpravy jednotiek systemd, zostanú vynechané. Môžu používať rozhrania jadra, rozloženie /sys a hooky udev, ktoré sa medzi hlavnými verziami menia a môžu zabrániť štartu. Na presné obnovenie štartovacieho reťazca použite rovnakú hlavnú verziu jadra ako v zálohe."
},
"codeReference": {
"heading": "Kde mechanizmy žijú",
"intro": "Pre vývojárov, ktorí chcú sledovať alebo rozšíriť správanie obnovy medzi verziami jadra:",
"rows": [
{
"component": "Smerové zistenie",
"location": "hb_compat_check v lib_host_backup_common.sh. Nastaví HB_COMPAT_KERNEL_DIRECTION."
},
{
"component": "Zoznam ciest bezpečného filtra",
"location": "hb_unsafe_paths_cross_version v lib_host_backup_common.sh. Vypíše path\\treason riadky používané ako CLI filter a webový koncový ukazovateľ /api/host-backups/restore/prepare."
},
{
"component": "Hydratačné fázy",
"location": "_rs_hyd_grub, _rs_hyd_kernel_cmdline, _rs_hyd_modules, _rs_hyd_files v backup_host.sh. Orchestrovaný _rs_apply_bk_older_hydration."
},
{
"component": "Vynútenie obnovy po štarte",
"location": "apply_pending_restore.sh prečíta HB_HYDRATION_APPLIED z plan.env a vynúti NEEDS_INITRAMFS=1/NEEDS_GRUB=1."
},
{
"component": "Webový náhľad",
"location": "/api/host-backups/restore/prepare v flask_server.py. Načíta pomocnú knižnicu, spustí _rs_apply_bk_older_hydration v režime plánu, vráti akcie na Web modus."
}
]
},
"whereNext": {
"heading": "Kam ísť ďalej",
"items": [
{
"label": "Obnovenie",
"href": "/docs/backup-restore/restoring",
"tail": " — úplný postup obnovy, do ktorého sa tieto mechanizmy zapájajú."
},
{
"label": "Ako to funguje",
"href": "/docs/backup-restore/how-it-works",
"tail": " — manifest a zberné funkcie vytvárajúce blok kernel_params, z ktorého doplnenie číta."
}
]
}
}