{
"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."
}
}