{ "meta": { "title": "Hur ProxMenux Backup fungerar internt - rootfs, manifest, applikationer", "description": "Detaljerat innehåll i en ProxMenux-säkerhetskopia: rootfs kopierat med rsync enligt standardprofilens sökvägar, ett strukturerat manifest från sex oberoende insamlare och programinventeringen som styr automatisk ominstallation av paket och komponenter efter återställning.", "ogTitle": "Hur ProxMenux Backup fungerar internt", "ogDescription": "De tre nyttolasterna av en ProxMenux-backup förklarade: rootfs, manifest och applikationer.", "twitterTitle": "Hur ProxMenux Backup fungerar | ProxMenux", "twitterDescription": "De tre nyttolasterna av en ProxMenux-backup och hur återställningen reproducerar källvärden från dem." }, "header": { "title": "Hur det fungerar", "description": "Den interna nedbrytningen av en ProxMenux-backup - filsystem, manifest och applikationsinventering - och hur återställningen förbrukar alla tre för att reproducera källvärden på ett mål som kanske inte delar samma kärna.", "section": "Säkerhetskopiering och återställning" }, "intro": { "title": "Ett arkiv, tre delar", "body": "Varje säkerhetskopia skapar tre tydliga delar under en gemensam förberedelsekatalog. Arkivet som laddas upp till målet (lokalt .tar.zst, PBS-säkerhetskopia eller Borg-arkiv) innehåller samma struktur. Återställningen använder alla tre: manifestet läses före ändringar för att upptäcka avvikelser och bestämma undantag; rootfs ger konfigurationsfiler som tillämpas direkt eller efter omstart; programinventeringen styr paketinstallation och ominstallation av komponenter efter start. Varje del kan granskas eller packas upp oberoende." }, "layout": { "heading": "Arkivlayout", "intro": "Varje arkiv följer samma trädlayout oavsett destination. metadata/ underkatalog håller de strukturerade nyttolasterna; rootfs/ underkatalog håller filsystemet kopiera.", "treeCaption": "Förberedelsekatalogen som skapas vid säkerhetskopiering. Alla mål får samma träd i sitt eget format: tar för lokala mål, PBS-block för PBS och Borg-segment för Borg.", "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": "Innehållet i rootfs", "intro": "Trädet rootfs/ är en vanlig filsystemkopia som skapas med rsync från källvärden. Det innehåller en utvald standardprofil med sökvägar som behövs för Proxmox-återställning samt egna sökvägar som användaren lägger till i jobbet eller den interaktiva sessionen. Urvalet är avsiktligt begränsat till sökvägar som innehåller konfiguration eller lagrar tillstånd som Proxmox inte kan återskapa själv.", "defaultProfileTitle": "Standardprofilen", "defaultProfileBody": "Standardprofilen definieras av hb_default_profile_paths i lib_host_backup_common.sh. Den omfattar åtta fasta kategorier och vid behov ZFS-tillstånd, som tillsammans beskriver en fungerande Proxmox-värd:", "categoriesTitle": "Sökvägskategorier", "categoryRows": [ { "category": "PVE-kärna", "paths": "/etc/pve, /var/lib/pve-cluster, /etc/vzdump.conf", "why": "Cluster filsystem innehåll och vzdump standarder. Pmxcfs databas (config.db) fångas som en konsekvent ögonblicksbild via sqlite3 .backup utan att stoppa klustret, och .db-wal / .db-shm sidovagnar är uteslutna från rsync. När sqlite3 inte är tillgänglig, skapas i stället config.db.raw-fallback, som automatiskt används som databas vid återställning." }, { "category": "Värd identitet och nätverk", "paths": "/etc/hostname, /etc/hosts, /etc/timezone, /etc/resolv.conf, /etc/network, /etc/systemd/network", "why": "Det värden behöver för att komma upp i nätverket med samma identitet. Filerna .link under /etc/systemd/network kopplar nätverkskortens namn till deras MAC-adresser, så att namnen bevaras vid ominstallation och hårdvaruändringar." }, { "category": "Åtkomst och autentisering", "paths": "/etc/ssh, /etc/sudoers, /etc/sudoers.d, /etc/pam.d, /etc/security", "why": "SSH-nycklar, sudoregler och PAM-konfiguration. Att förlora dessa låser användaren ur den restaurerade värden." }, { "category": "Kärna och uppstart", "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": "IOMMU-parametrar, svartlistor för moduler, VFIO-enhets-ID, monteringstabell och lagringskonfiguration." }, { "category": "Skal och språkinställningar", "paths": "/etc/environment, /etc/bash.bashrc, /etc/inputrc, /etc/profile, /etc/profile.d, /etc/locale.gen, /etc/locale.conf", "why": "Systemgemensam skalkonfiguration, miljövariabler och inställningar för generering av språkmiljöer." }, { "category": "Pakethantering och 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-källor för konsekvent paketlösning, schemalagda uppgifter som definieras av användaren." }, { "category": "ProxMenux tillstånd och verktyg", "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": "Valfri men vanlig Proxmox verktyg. Saknade vägar noteras i metadata/missing_paths.txt utan att stoppa backupen." }, { "category": "ProxMenux-program och root-kontot", "paths": "/usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux, /var/lib/proxmenux, /root (flyktiga subdirs exkluderade)", "why": "ProxMenux-installerade binärer och per användare konfiguration under /root. Volatila vägar (.bash_history, .cache/, tmp/, .local/share/Trash/) utesluts från kopian. /var/lib/proxmenux håller de schemalagda backupjobben och värdens tillstånd som hålls av ProxMenux; återställningsstagningen, återställningskopiorna och efteråtsmarkörerna är uteslutna, eftersom de tillhör värden som kör en återställning." }, { "category": "ZFS tillstånd (villkor)", "paths": "/etc/zfs", "why": "Det ingår endast när källvärden kör ZFS. innehåller zpool.cache och hostid." } ], "customTitle": "Utöka profilen med anpassade vägar", "customBody": "Utöver standardprofilen erbjuder ProxMenux två sätt att inkludera ytterligare vägar i en säkerhetskopia. De komponerar utan konflikt och gäller både interaktiva säkerhetskopior och schemalagda jobb.", "customExtrasTitle": "1. Persistenta extrafunktioner (per-host-fil)", "customExtrasBody": "En textfil på /usr/local/share/proxmenux/backup-extra-paths.txt innehåller en lista över absoluta vägar som användaren har markerat som \"alltid inkluderar\" på denna värd. När en säkerhetskopia körs i Default-läge, appenderar ProxMenux dessa vägar till standardprofilen automatiskt utan att fråga. Filen redigeras från gränssnittet - ingen manuell redigering behövs - och kvarstår över omstart och uppdateringar. En absolut väg per rad; # kommentarer är tillåtna.", "customModeTitle": "2. Anpassat läge (per körning)", "customModeBody": "Att starta en säkerhetskopia i Custom-läge ersätter den automatiska tillämpningen av standardprofilen med en checklista som visar varje väg: standardprofilerade poster och de ihållande extrafunktionerna (prefixed med [+] och förmarkerade). Användaren markerar eller avmarkerar poster för den specifika körningen, och kan också trycka på Lägg till anpassad sökväg för att ange en ny väg - som sedan kvarstår till extrafilen för framtida säkerhetskopior.", "customMissingTitle": "Vägar frånvarande från källan", "customMissingBody": "Varje väg från profilen (standard eller tillägg) som inte finns på källvärden registreras i metadata/missing_paths.txt inuti arkivet. Säkerhetskopieringen misslyckas varken eller slutar - användaren ser en sammanfattning av arkiverade vägar och saknade vägar i slutet. I praktiken sker detta för valfria verktygsvägar som /etc/wireguard eller /etc/prometheus när dessa verktyg inte är installerade." }, "manifest": { "heading": "Manifestdelen", "intro": "manifest.json är ett strukturerat JSON-dokument som beskriver källvärden vid backupen. Den produceras av sex oberoende insamlare orkestrerad av build_manifest.sh. Varje samlare läser endast data, producerar ett väldefinierat JSON-fragment och faller tillbaka till ett säkert tomt standard om det misslyckas - manifestet är fortfarande användbart om ett avsnitt är ofullständigt.", "orchestratorCaption": "De sex samlarna komponerar manifestet. Varje samlare körs i sin egen underprocess; ett misslyckande i en faller tillbaka till en dokumenterad säker standard och varnar men inte avbryter backupen.", "collectorRows": [ { "collector": "collect_source_host.sh", "produces": "source_host", "content": "Hostname, PVE version (pveversion), PBS version om värden kör backup-server roll, kärna (uname -r), startläge (efi/bios), root filsystem typ, CPU modell + arkitektur, minne i KB." }, { "collector": "collect_hardware.sh", "produces": "hardware_inventory", "content": "GPU (med leverantör och ProxMenux installer mapping), TPUs (Coral USB + M.2 med lsusb / lspci detektering), NICs (med MAC, PCI slot och bro medlemskap), trådlösa enheter. GPU-poster bär en passthrough_eligible-heuristisk." }, { "collector": "collect_storage.sh", "produces": "storage_inventory", "content": "ZFS-pooler (med pooltyp + medlemsdisker löste /dev/disk/by-id/*, /dev/disk/by-partuuid/* eller rå /dev/sdX-vägar beroende på hur varje pool ursprungligen skapades), LVM-volymgrupper + tunna pooler, fysiska diskar med SMART-kapacitet, PVE storage.cfg-poster, externa monteringar." }, { "collector": "collect_kernel.sh", "produces": "kernel_params", "content": "Parametrar som operatören lagt till i /proc/cmdline, utan standardposter som BOOT_IMAGE=, root=, ro/rw, quiet och splash; moduler som laddas vid start från /etc/modules; sökvägar till /etc/modprobe.d/*.conf-filer med faktiska direktiv (options, blacklist, install, alias, softdep)." }, { "collector": "collect_proxmenux_state.sh", "produces": "proxmenux_installed_components", "content": "Läser /usr/local/share/proxmenux/managed_installs.json (registret över allt ProxMenux har installerat) och installed_tools.json. Varje post håller installationsbanan (menu_script) så att återställningen kan utlösa exakt samma installationsflöde." }, { "collector": "collect_guests.sh", "produces": "vms_lxcs_at_backup", "content": "Uppräknar VMs (qm list) och LXCs (pct list) närvarande vid backuptid - VMID, namn, aktuell status. Endast inventeringen: de faktiska gästdata är vzdump/PBS." } ], "schemaTitle": "Schema validering", "schemaBody": "ProxMenux levereras med en mall som beskriver vilka fält manifestet måste innehålla och hur vart och ett ska se ut. När en säkerhetskopia skapas kan manifestet kontrolleras automatiskt mot mallen, så att en insamlare som har gett felformaterad JSON eller ett felstavat fält upptäcks direkt. Kontrollen är avsedd för utvecklingen av ProxMenux självt: på ett system där den inte är installerad fungerar säkerhetskopieringen som vanligt och manifestet skapas ändå." }, "applications": { "heading": "Applikationsinventeringen", "intro": "Två inventeringar listar programvara utöver Proxmox VE:s baspaket: paketlistan under metadata/ och komponentregistret i rootfs, som beskrivs nedan. Återställningen använder APT eller ProxMenux egna installationsprogram för att återskapa användarens programvara enligt det ursprungliga installationssättet.", "packagesTitle": "packages.manual.list", "packagesBody": "En alfabetisk textlista från apt-mark showmanual med alla APT-paket som uttryckligen installerats på källvärden. Beroenden till Proxmox VE:s bassystem ingår inte; målets APT installerar dem automatiskt. Under återställningen läser _rs_run_complete_extras listan och använder ett filter mot borttagning i kaskad i tre steg: dpkg -s hittar redan installerade paket, andra huvudversioner av bibliotek identifieras och apt-get install --simulate kontrollerar risken för följdborttagningar. Återstående paket installeras med apt-get install -y.", "componentsTitle": "components_status.json (del av rootfs)", "componentsBody": "En JSON registret under /usr/local/share/proxmenux/ som registrerar varje komponent ProxMenux har installerat med sitt exakta tillstånd: version, ProxMenux-specifika flaggor (för NVIDIA: patched boolean; för Coral: DKMS version). Denna fil lever i rootfs - inte i metadata/ - eftersom det är läses efter att rootfs har kopierats till målet. Post-boot dispatcher (apply_cluster_postboot.sh) itererar över sina poster och kör varje komponent --auto-reinstall krok, som läser det inspelade tillståndet och reproducerar installationen mot målets nuvarande kärna.", "componentInstallersTitle": "Installationsprogram för komponenter", "componentInstallersBody": "Fyra ProxMenux installatörer exponerar för närvarande en --auto-reinstall ingångspunkt:", "installerRows": [ { "component": "nvidia_driver", "installer": "gpu_tpu/nvidia_installer.sh", "action": "Läser version + patched. Ladda ner exakt samma NVIDIA runfil, bygger DKMS-moduler mot målets kärna, applicerar ProxMenux-patchen om källan hade den." }, { "component": "coral_driver", "installer": "gpu_tpu/install_coral.sh", "action": "Läser versionen av Coral-drivrutinen och kompilerar DKMS-modulen för målets kärna." }, { "component": "amdgpu_top", "installer": "gpu_tpu/amd_gpu_tools.sh", "action": "Läser den inspelade versionen. Laddar ner exakt .deb från GitHub release." }, { "component": "intel_gpu_tools", "installer": "gpu_tpu/intel_gpu_tools.sh", "action": "APT-installerar paketet. Idempotent om det redan finns från packages.manual.list." } ] }, "restoreFlow": { "heading": "Hur återställningen förbrukar de tre nyttolasterna", "intro": "Återställningen är en sexstegs pipeline. Varje steg läser en specifik delmängd av arkivet och uppdaterar målvärden. Inget stadium kräver att källvärden kan nås - arkivet är helt fristående.", "stagesCaption": "Steg 1 använder manifestet för att bestämma vad du ska röra. Steg 2 kopierar rootfs vägar som är säkra att tillämpa på ett körsystem. Stadium 3 iscensätter de riskfyllda vägarna för nästa start. Steg 3b importerar icke-rot ZFS datapooler vars diskar är alla närvarande. Steg 4 hanterar paket. Stage 5 körs efter omstart och ominstallerar komponenter mot målets kärna.", "stageRows": [ { "stage": "1", "name": "Kompatibilitetskontroll", "reads": "manifest.json", "action": "Kör hb_compat_check. Jämför källa vs mål hårdvara (NIC, lagrings-ID), PVE-version och stor kärnversion. Set HB_COMPAT_KERNEL_DIRECTION (same, bk_newer eller bk_older) och befolkar RS_SKIP_PATHS med hårdvara-drift och cross-kernel uteslutningar." }, { "stage": "2", "name": "Tillämpning under drift", "reads": "rootfs/ (endast säkra vägar)", "action": "_rs_apply … hot kopierar hb_classify_path=hot-poster direkt till live-målet. Allt under /etc/pve, /etc/network eller vägar som klassificeras som reboot/dangerous uppskjuts." }, { "stage": "3", "name": "Förbered uppskjutna ändringar", "reads": "rootfs/ (omstart + farliga vägar)", "action": "_rs_prepare_pending_restore förbereder riskfyllda sökvägar under /var/lib/proxmenux/pending-restore/, skriver plan.env, apply-on-boot.list och rs-skip-paths.txt och aktiverar proxmenux-restore-onboot.service för nästa start." }, { "stage": "3b", "name": "Datapool import", "reads": "manifest.storage_inventory + mål ZFS tillstånd", "action": "_rs_import_data_pools försöker importera varje ZFS-pool utan rotfilsystem vars samtliga diskar finns på målet. Pooler med ett annat hostid provas igen med zpool import -f. Om någon disk saknas hoppas poolen över med en varning. Resultatet per pool loggas i /var/log/proxmenux/restore-datapools-<timestamp>.log." }, { "stage": "4", "name": "Paketinstallation", "reads": "metadata/packages.manual.list", "action": "_rs_run_complete_extras kör kaskadsäkert filter och kallar apt-get install -y med den överlevande paketlistan. Fullständig utdata går till /var/log/proxmenux/restore-apt-*.log." }, { "stage": "5", "name": "Efter uppstart", "reads": "rootfs (redan tillämpat) + components_status.json", "action": "Efter omstart, apply_pending_restore.sh spelar tillbaka de uppskjutna banorna och apply_cluster_postboot.sh kör update-initramfs, update-grub (eller proxmox-boot-tool refresh) och itererar över components_status.json skjuter varje komponent --auto-reinstall krok." } ] }, "whyItWorks": { "heading": "Varför säkerhetskopian delas i tre delar", "body": "Uppdelningen följer uppgifternas livscykel. Filsystemet överförs med rsync: snabbt, öppet och atomärt per fil. Konfigurationstillstånd som måste tolkas före ändringar lagras som strukturerad JSON, läsbar för sig, versionshanterbar med schema och maskinellt jämförbar med målets tillstånd. Programvara som ska installeras om beskrivs i en inventering med namn och versioner; målets pakethanterare och ProxMenux installationsprogram väljer rätt binärer. Varje del fyller sin egen uppgift. Tillsammans eftersträvar de en sammanhängande återställning med feltolerans: ett skadat manifest lämnar rootfs återställbart, ett saknat paket hindrar inte komponentinstallation och ett fel för en post stoppar inte nästa." } }