Usando o Time Machine em um Time Capsule - os backups funcionam perfeitamente. O problema é tentar usar 'tmutil compare' para ver as diferenças entre 2 backups. MacOS Mojave 10.14.5 (mesmo problema na versão anterior do sistema operacional).
A aplicação
Use o Time Machine para fazer backup de vários Macs na rede em várias unidades de backup. A intenção é executar periodicamente operações 'tmutil compare' para ver o que está sendo copiado, quantos arquivos, quantos dados, etc.
Aplicativos como o BackupLoupe fornecerão uma GUI disso - o que é legal - mas você terá que montar manualmente cada pacote esparso. (E, aliás, parece ter parado de funcionar com o Mojave.)
Portanto, a intenção era automatizar o processo:
- Use tmutil destinationinfo para determinar uma lista de unidades de backup.
- Monte todas as unidades (em pontos de montagem separados)
- Examine cada unidade para obter uma lista dos Macs (ou seja, mymac1.sparsebundle, mymac2.sparsebundle, ...)
- Para cada mac, para cada unidade (que possui um pacote esparso para esse Mac), monte o pacote esparso, certifique-se de que ele tenha um nó Backups.backupdb, liste todos os backups (2019-05-22-111213), execute um 'tmutil compare' entre cada entrada e a entrada seguinte.
Um cache é mantido automaticamente para que a etapa 'tmutil compare' seja executada apenas para novos backups.
Como o 'tmutil compare' pode demorar muito, a etapa (4) foi projetada para que cada Mac seja processado e threads separados iniciados - um para cada disco - para serem executados em paralelo. Supondo que iniciar mais threads para Macs adicionais apenas causaria um gargalo na competição pelo acesso às mesmas unidades.
Isso funciona
Use o Finder para conectar-se ao Time Capsule (cria /Volumes/mydisk nos bastidores). No Finder, localize o mymac.sparsebundle de interesse e abra-o com DiskImageMounter (cria /Volumes/Time Machine Backups nos bastidores).
Vá para o terminal e:
cd "/Volumes/Time Machine Backups/Backups.backupdb/mymac"
tmutil compare 2019-05-19-034451 2019-05-18-220446
A saída é exatamente como esperada.
Isso falha
Crie 2 diretórios - ../mytemp/mount e ../mytemp/bundle (como pontos de montagem). Execute tmutils destinationinfo para obter as strings de montagem.
Execute: mount_afp -o rw "afp://tc:pwd@tc._afpovertcp._tcp.local./diskname" ../mytemp/mount
Execute: hdiutil anexar ../mytemp/mount/mymac.sparsebundle -readwrite -mountroot ../mytemp/bundle
Execute: cd "../mytemp/bundle/Time Machine Backups/Backups.backupdb/mymac"
Tudo isso funciona conforme o esperado. O mymac.sparsebundle é montado em ../mytemp/bundle. Pode 'cd' no pacote esparso montado. Um 'ls' lista todos os arquivos de backup conforme esperado.
MAS execute: tmutil compare 2019-05-19-034451 2019-05-18-220446 novamente e obtenha isto:
Must specify at least one item inside a backup.
Na verdade, pode 'cd' no backup 2019-05-19-034451 ou em outro, 'ls' mostra exatamente o que é esperado. Pode 'cd' descer vários níveis, 'cat' alguns arquivos para o console, etc.
Desceu para os mesmos níveis depois de montar nos dois sentidos e emitiu 'touch dummy.file.txt' para realmente criar um arquivo. Isso falhou, mas a adição de 'sudo' foi bem-sucedida - em ambos os cenários de montagem. (Em um determinado backup, isso falhou em qualquer configuração.)
Também tentei 'sudo tmutil ...' em caso de problemas de autorização, mas mesmo resultado. Também executei alguns comandos 'ls -la' em vários níveis, mas nenhuma diferença óbvia no 'rwx' atribuído a nada.
Adicionado tmutil à lista Full Disk Access nas Propriedades do Sistema.
Executou: log show --predicate 'process=="tmutil"'
mas mostra a mesma saída para casos de sucesso e falha.
No juízo Final! Qual é a diferença - contexto, autoridades, ??? O que o Finder e o DiskImageMounter fazem de diferente do mount_afp e do hdiutil? Algum nível é somente leitura e o tmutil está tentando atualizar um log?
Qualquer ajuda ou sugestão será muito apreciada!
Atualizar
Dividiu as 2 etapas - monte odirigircom mount_asp, então monte opacotecom DiskImageManager - e isso funciona. Portanto, o problema está no uso de hdiutil vs DiskImageManager.
Atualização 2
Ainda é um WIP, mas aparentemente 'tmutil'requerque o pacote seja montado em /Volumes!
Tentei enganá-lo criando um link simbólico:
/Volumes/Time Machine Backups -> my mount point
mas ainda falha. Tentando outras soluções alternativas.
Alguém sabe se este é um verdadeiro requisito do tmutil? Está documentado em algum lugar?
Resolvido (mas um hack!)
Tentei adicionar um ponto de montagem raiz a /Volumes, com a ideia de montar vários pacotes esparsos abaixo - mas isso também não funcionou. Evidentemente, 'tmutil' espera que o pacote seja montado como um filho imediato de /Volumes.
Hack final da seguinte forma:
- Crie um ponto de montagem para as unidades: ../mycache/drives
- Monte todas as unidades abaixo deste nó
- Monte tudoPacotesdentro de /Volumes usando o nome padrão normal - Time Machine Backups [n]
- Internamente, descubra qual montagem corresponde a cada unidade listando todas as variedades de backups do Time Machine [n], depois monte o pacote e obtenha a lista de backups do Time Machine [n] novamente para descobrir qual é a nova montagem.
- Em seguida, execute tmutil compare /Volumes/Time Machine Backups 2/Backups.backupdb/mymac/...
Isso funciona razoavelmente bem. Falhará se algum outro processo montar um pacote esparso com uma entrada Time Machine Backups - confundirá a lógica acima.