{ "meta": { "title": "Como o backup ProxMenux funciona internamente — rootfs, manifestos, aplicativos", "description": "Descrição detalhada do que um backup ProxMenux contém: os rootfs produzidos pelo rsync do perfil de caminho padrão, o manifesto estruturado construído por seis coletores independentes e o inventário de aplicativos que impulsiona a reinstalação automática de pacotes e componentes após uma restauração.", "ogTitle": "Como o backup ProxMenux funciona internamente", "ogDescription": "Os três blocos de um backup ProxMenux: rootfs, manifesto e aplicativos.", "twitterTitle": "Como funcionam as cópias de segurança ProxMenux | ProxMenux", "twitterDescription": "As três cargas de um backup ProxMenux e como a restauração reproduz o host fonte deles." }, "header": { "title": "Como funciona", "description": "A estrutura interna de um backup ProxMenux — sistema de arquivos, manifesto e inventário de aplicativos — e como a restauração usa os três para reproduzir o host de origem em um destino que pode ter outro kernel.", "section": "Cópias de segurança e restauro" }, "intro": { "title": "Um arquivo, três blocos", "body": "Cada backup cria três blocos bem definidos em um único diretório de preparação. O arquivo enviado ao destino (.tar.zst local, backup PBS ou arquivo Borg) mantém essa estrutura. A restauração usa os três: o manifesto é consultado antes das alterações para detectar diferenças e decidir o que excluir; rootfs fornece os arquivos de configuração, aplicados em execução ou após reiniciar; o inventário de aplicativos orienta a instalação de pacotes e a reinstalação de componentes após o boot. Cada bloco pode ser inspecionado ou extraído separadamente." }, "layout": { "heading": "Disposição do arquivo", "intro": "Cada arquivo segue o mesmo layout de árvore, independentemente do destino. O subdiretório metadata/ contém as cargas estruturadas; o subdiretório rootfs/ contém a cópia do sistema de arquivos.", "treeCaption": "O diretório de preparação criado durante o backup. Todos os destinos recebem a mesma árvore no formato nativo: tar para backups locais, blocos PBS para PBS e segmentos Borg para 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": "A carga útil do rootfs", "intro": "A árvore rootfs/ é uma cópia simples do sistema de arquivos criada pelo rsync a partir do host de origem. Contém um perfil padrão de caminhos selecionados para restaurar o Proxmox e os caminhos personalizados adicionados à tarefa ou sessão interativa. A seleção é intencionalmente restrita a caminhos que guardam configuração ou guardam um estado que o Proxmox não consegue recriar sozinho.", "defaultProfileTitle": "O perfil por omissão", "defaultProfileBody": "O perfil padrão é definido por hb_default_profile_paths em lib_host_backup_common.sh. Abrange oito categorias fixas e, quando necessário, o estado ZFS, que juntas descrevem um host Proxmox funcional:", "categoriesTitle": "Categorias de localização", "categoryRows": [ { "category": "Núcleo PVE", "paths": "/etc/pve, /var/lib/pve-cluster, /etc/vzdump.conf", "why": "Conteúdo do sistema de ficheiros de cluster e valores por omissão do vzdump. O banco de dados pmxcfs (config.db) é capturado como um instantâneo consistente via sqlite3 .backup sem parar o cluster, e os sidecars .db-wal / .db-shm são excluídos do rsync. Quando o sqlite3 não está disponível, é criado config.db.raw-fallback, que a restauração usa automaticamente como banco de dados." }, { "category": "Identidade do host e rede", "paths": "/etc/hostname, /etc/hosts, /etc/timezone, /etc/resolv.conf, /etc/network, /etc/systemd/network", "why": "Tudo que o host precisa para entrar na rede com a mesma identidade. Os arquivos .link em /etc/systemd/network fixam nomes de NIC em seus MAC, portanto, reinstalações e alterações de hardware não renomeiam interfaces." }, { "category": "Acesso e autenticação", "paths": "/etc/ssh, /etc/sudoers, /etc/sudoers.d, /etc/pam.d, /etc/security", "why": "SSH chaves, regras de sudo e configuração PAM. Perder estas trava o usuário fora da máquina restaurada." }, { "category": "Kernel e inicialização", "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": "Tokens IOMMU, lista negra do módulo, IDs do dispositivo VFIO, tabela de montagem, configuração da pilha de armazenamento." }, { "category": "Shell e definições regionais", "paths": "/etc/environment, /etc/bash.bashrc, /etc/inputrc, /etc/profile, /etc/profile.d, /etc/locale.gen, /etc/locale.conf", "why": "Configuração do shell, variáveis de ambiente, configuração de geração local." }, { "category": "Gerenciamento de pacotes e cron", "paths": "/etc/apt, /etc/cron.d, /etc/cron.{daily,hourly,weekly,monthly}, /etc/cron.allow, /etc/cron.deny, /var/spool/cron/crontabs", "why": "Fontes APT para resolução consistente de pacotes, tarefas agendadas definidas pelo usuário." }, { "category": "Estado e ferramentas do 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": "Ferramentas opcionais, mas comuns Proxmox. Caminhos ausentes são observados em metadata/missing_paths.txt sem parar o backup." }, { "category": "Binários & root do ProxMenux", "paths": "/usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux, /var/lib/proxmenux, /root (subdires voláteis excluídos)", "why": "Binários instalados em ProxMenux e configuração por usuário sob /root. Os caminhos voláteis (.bash_history, .cache/, tmp/, .local/share/Trash/) são excluídos da cópia. O /var/lib/proxmenux mantém as tarefas de backup programadas e o estado de host mantido pelo ProxMenux; o estadiamento da restauração, as cópias de rollback e os marcadores pós-restore são excluídos, porque pertencem ao host que executa uma restauração." }, { "category": "Estado ZFS (condicional)", "paths": "/etc/zfs", "why": "Apenas incluído quando o host de origem roda ZFS. Contém zpool.cache e hostid." } ], "customTitle": "Estendendo o perfil com caminhos personalizados", "customBody": "Além do perfil padrão, o ProxMenux oferece duas maneiras de incluir caminhos adicionais em um backup. Eles compõem sem conflito e ambos se aplicam a backups interativos e trabalhos agendados.", "customExtrasTitle": "1. Extras persistentes (por máquina)", "customExtrasBody": "Um arquivo de texto no /usr/local/share/proxmenux/backup-extra-paths.txt contém uma lista de caminhos absolutos que o usuário marcou como \"incluir sempre\" nesta máquina. Quando um backup é executado no modo Default, o ProxMenux adiciona esses caminhos ao perfil padrão automaticamente sem perguntar. O arquivo é editado a partir da interface — nenhuma edição manual necessária — e persiste através de reiniciais e atualizações. Um caminho absoluto por linha; # comentários são permitidos.", "customModeTitle": "2. Modo personalizado (por execução)", "customModeBody": "O lançamento de um backup no modo Custom substitui a aplicação automática do perfil padrão por uma lista de verificação mostrando todos os caminhos: as entradas de perfil padrão e os extras persistentes (prefixados com [+] e pré-selecionados). O usuário seleciona ou desmarca entradas para essa execução específica, e também pode pressionar Adicionar caminho personalizado para inserir um novo caminho — que é então persistido para o arquivo extras para backups futuros.", "customMissingTitle": "Caminhos ausentes da fonte", "customMissingBody": "Qualquer caminho do perfil (padrão ou adicionado) que não exista no host fonte é gravado em metadata/missing_paths.txt dentro do arquivo. O backup não falha nem para — o usuário vê um resumo de caminhos arquivados e caminhos faltando no final. Na prática, isso acontece para caminhos de ferramentas opcionais como /etc/wireguard ou /etc/prometheus quando essas ferramentas não estão instaladas." }, "manifest": { "heading": "O bloco do manifesto", "intro": "manifest.json é um documento JSON estruturado que descreve o host de origem no momento do backup. É produzido por seis coletores independentes orquestrados por build_manifest.sh. Cada coletor é somente leitura, produz um fragmento JSON bem definido, e cai de volta para um padrão vazio seguro se falhar — o manifesto ainda é utilizável se uma seção estiver incompleta.", "orchestratorCaption": "Os seis coletores compõem o manifesto. Cada colecionador corre em seu próprio subprocesso; uma falha em um cai de volta para um padrão seguro documentado e avisa, mas não aborta o backup.", "collectorRows": [ { "collector": "collect_source_host.sh", "produces": "source_host", "content": "Hostname, versão PVE (pveversion), versão PBS se o host executar o papel do servidor de backup, kernel (uname -r), modo de inicialização (efi/bios), tipo de sistema de arquivos raiz, modelo CPU + arquitetura, memória em KB." }, { "collector": "collect_hardware.sh", "produces": "hardware_inventory", "content": "GPUs (com o mapeamento do instalador do fornecedor e ProxMenux), TPUs (Coral USB + M.2 com detecção de lsusb/lspci), NICs (com a associação MAC, slot PCI e ponte), dispositivos sem fio. As entradas GPU têm uma heurística passthrough_eligible." }, { "collector": "collect_storage.sh", "produces": "storage_inventory", "content": "ZFS pools (com pool disco do tipo + membro resolvido para /dev/disk/by-id/*, /dev/disk/by-partuuid/* ou em bruto /dev/sdX caminhos dependendo de como cada pool foi originalmente criado), LVM grupos de volume + finos pools, discos físicos com SMART capacidade, PVE storage.cfg entradas, montagens externas." }, { "collector": "collect_kernel.sh", "produces": "kernel_params", "content": "Parâmetros adicionados pelo operador em /proc/cmdline, sem os itens padrão como BOOT_IMAGE=, root=, ro/rw, quiet e splash; módulos carregados na inicialização de /etc/modules; caminhos dos arquivos /etc/modprobe.d/*.conf com diretivas efetivas (options, blacklist, install, alias, softdep)." }, { "collector": "collect_proxmenux_state.sh", "produces": "proxmenux_installed_components", "content": "Lê /usr/local/share/proxmenux/managed_installs.json (registo de tudo que ProxMenux instalou) e installed_tools.json. Cada entrada mantém o caminho do instalador (menu_script) para que a restauração possa desencadear o mesmo fluxo de instalação." }, { "collector": "collect_guests.sh", "produces": "vms_lxcs_at_backup", "content": "Enumera VMs (qm list) e LXCs (pct list) presentes na hora de backup — VMID, nome, estado atual. Apenas o inventário: os dados reais dos hóspedes são da responsabilidade do vzdump / PBS." } ], "schemaTitle": "Validação do esquema", "schemaBody": "O ProxMenux inclui um modelo que descreve os campos que o manifesto deve conter e o formato de cada um. Quando é gerado um backup, o manifesto pode ser verificado automaticamente face a esse modelo, pelo que um coletor que tenha produzido JSON malformado ou um campo mal escrito é detetado de imediato. A verificação destina-se ao desenvolvimento do próprio ProxMenux: num sistema que não a tenha instalada, o backup funciona normalmente e o manifesto é gerado na mesma." }, "applications": { "heading": "O inventário de aplicativos", "intro": "Dois inventários catalogam o software acrescentado aos pacotes básicos do Proxmox VE: a lista de pacotes em metadata/ e o registro de componentes em rootfs, detalhados abaixo. A restauração usa APT ou os instaladores do ProxMenux para reproduzir o software do usuário conforme o método original de instalação.", "packagesTitle": "packages.manual.list", "packagesBody": "Uma lista alfabética em texto simples produzida por apt-mark showmanual com os pacotes APT instalados explicitamente no host de origem. As dependências do sistema Proxmox VE básico são excluídas; o APT do destino as instala automaticamente. Durante a restauração, _rs_run_complete_extras lê a lista e aplica um filtro contra remoções em cascata em três etapas: dpkg -s identifica pacotes já instalados, outras versões principais de bibliotecas são detectadas e apt-get install --simulate verifica o risco de remoções em cascata. Os pacotes restantes são instalados com apt-get install -y.", "componentsTitle": "components_status.json (parte dos rootfs)", "componentsBody": "Um registro JSON sob /usr/local/share/proxmenux/ que registra cada componente ProxMenux instalou com seu estado exato: versão, bandeiras ProxMenux específicas (para NVIDIA: patched booleano; para Coral: versão DKMS). Este arquivo vive dentro dos rootfs — não em metadata/ — porque é lido depois que rootfs foi copiado para o alvo. O expedidor pós-boot (apply_cluster_postboot.sh) itera sobre suas entradas e executa o gancho --auto-reinstall de cada componente, que lê o estado gravado e reproduz a instalação contra o kernel atual do alvo.", "componentInstallersTitle": "Instaladores de componentes", "componentInstallersBody": "Quatro instaladores ProxMenux atualmente expõem um ponto de entrada --auto-reinstall:", "installerRows": [ { "component": "nvidia_driver", "installer": "gpu_tpu/nvidia_installer.sh", "action": "Lê-se version + patched. Transfere exatamente o mesmo arquivo de execução NVIDIA, constrói módulos DKMS contra o kernel do alvo, reaplica o patch ProxMenux se a fonte o tiver." }, { "component": "coral_driver", "installer": "gpu_tpu/install_coral.sh", "action": "Lê a versão do driver Coral. Compila o módulo DKMS contra o kernel do alvo." }, { "component": "amdgpu_top", "installer": "gpu_tpu/amd_gpu_tools.sh", "action": "Lê a versão gravada. Baixa novamente o .deb exato da versão GitHub." }, { "component": "intel_gpu_tools", "installer": "gpu_tpu/intel_gpu_tools.sh", "action": "O APT instala o pacote. Idempotente se já presente de packages.manual.list." } ] }, "restoreFlow": { "heading": "Como a restauração consome as três cargas", "intro": "A restauração é um processo de seis etapas. Cada etapa lê um subconjunto específico do arquivo e atualiza o host alvo. Nenhuma etapa requer que o host de origem seja acessível — o arquivo é totalmente auto-suficiente.", "stagesCaption": "Estágio 1 usa o manifesto para decidir o que tocar. Estágio 2 copia rootfs caminhos que são seguros para aplicar em um sistema em execução. O estágio 3 encena os caminhos arriscados para a próxima inicialização. Fase 3b importa conjuntos de dados ZFS não-root cujos discos estão todos presentes. Estágio 4 lida com pacotes. O estágio 5 é executado após a reinicialização e reinstala componentes contra o kernel do alvo.", "stageRows": [ { "stage": "1", "name": "Verificação de compatibilidade", "reads": "manifest.json", "action": "Corre hb_compat_check. Compara hardware fonte vs. alvo (NICs, IDs de armazenamento), versão PVE e versão principal do kernel. Define HB_COMPAT_KERNEL_DIRECTION (same, bk_newer ou bk_older) e povoa RS_SKIP_PATHS com exclusões de hardware-drift e cross-kernel." }, { "stage": "2", "name": "Aplicação em execução", "reads": "rootfs/ (somente caminhos seguros)", "action": "_rs_apply … hot copia entradas hb_classify_path=hot diretamente para o alvo ao vivo. Qualquer coisa sob /etc/pve, /etc/network ou caminhos classificados como reboot/dangerous é adiada." }, { "stage": "3", "name": "Preparações pendentes", "reads": "rootfs/ (reboot + caminhos perigosos)", "action": "_rs_prepare_pending_restore prepara os caminhos de risco em /var/lib/proxmenux/pending-restore/, grava plan.env, apply-on-boot.list e rs-skip-paths.txt e ativa proxmenux-restore-onboot.service para a próxima inicialização." }, { "stage": "3b", "name": "Importação de pools de dados", "reads": "manifest.storage_inventory + estado ZFS do destino", "action": "_rs_import_data_pools tenta importar cada pool ZFS que não contém a raiz e tem todos os discos presentes no destino. Com hostid de outro host, tenta novamente com zpool import -f. Se faltar um disco, o pool é ignorado com aviso. O resultado por pool é registrado em /var/log/proxmenux/restore-datapools-<timestamp>.log." }, { "stage": "4", "name": "Instalar pacote", "reads": "metadata/packages.manual.list", "action": "_rs_run_complete_extras executa o filtro de segurança em cascata e chama apt-get install -y com a lista de pacotes sobreviventes. Saída completa vai para /var/log/proxmenux/restore-apt-*.log." }, { "stage": "5", "name": "Após o arranque", "reads": "rootfs (já aplicado) + components_status.json", "action": "Após reiniciar, apply_pending_restore.sh reproduz os caminhos diferidos e apply_cluster_postboot.sh executa update-initramfs, update-grub (ou proxmox-boot-tool refresh) e itera sobre components_status.json disparando o gancho --auto-reinstall de cada componente." } ] }, "whyItWorks": { "heading": "Por que dividir o backup em três blocos", "body": "A divisão segue o ciclo de vida dos dados. O sistema de arquivos é transferido com rsync: rápido, transparente e atômico por arquivo. O estado de configuração a interpretar antes das alterações é JSON estruturado, legível separadamente, versionável por esquema e comparável automaticamente com o estado do destino. O software a reinstalar é descrito em um inventário de nomes e versões; o gerenciador de pacotes e os instaladores do ProxMenux escolhem os binários adequados. Cada bloco atende ao próprio objetivo. Juntos, buscam uma restauração coerente com tolerância a falhas: um manifesto corrompido deixa rootfs recuperável, um pacote ausente não impede instalar componentes e uma falha em uma entrada não interrompe a seguinte." } }