Использование Time Machine для Time Capsule — резервное копирование работает гладко. Проблема в попытке использовать 'tmutil compare' для просмотра различий между 2 резервными копиями. MacOS Mojave 10.14.5 (та же проблема на предыдущей версии ОС).
Приложение
Используйте Time Machine для резервного копирования нескольких компьютеров Mac в сети на несколько резервных дисков. Цель состоит в том, чтобы периодически запускать операции 'tmutil compare', чтобы увидеть, что копируется, сколько файлов, сколько данных и т. д.
Такие приложения, как BackupLoupe, предоставляют графический интерфейс для этого, что неплохо, но вам придется вручную монтировать каждый sparsebundle. (И, кстати, похоже, он перестал работать с Mojave.)
Поэтому целью было автоматизировать процесс:
- Используйте tmutil destinationinfo для определения списка резервных дисков.
- Смонтировать все диски (в отдельные точки монтирования)
- Проверьте каждый диск, чтобы получить список компьютеров Mac (например, mymac1.sparsebundle, mymac2.sparsebundle, ...)
- Для каждого Mac, для каждого диска (на котором есть sparsebundle для этого Mac) смонтируйте sparsebundle, убедитесь, что в нем есть узел Backups.backupdb, выведите список всех резервных копий (2019-05-22-111213), запустите «tmutil compare» между каждой записью и текущей записью.
Кэш поддерживается автоматически, поэтому шаг «tmutil compare» запускается только для новых резервных копий.
Поскольку 'tmutil compare' может занять много времени, шаг (4) был разработан таким образом, чтобы каждый Mac обрабатывался и запускались отдельные потоки - по одному для каждого диска - для параллельной работы. Предполагалось, что запуск большего количества потоков для дополнительных Mac просто создаст узкое место, конкурируя за доступ к тем же дискам.
Это работает
Используйте Finder для подключения к Time Capsule (создает /Volumes/mydisk в фоновом режиме). В Finder найдите интересующий вас mymac.sparsebundle и откройте его с помощью DiskImageMounter (создает /Volumes/Time Machine Backups в фоновом режиме).
Зайдите в терминал и:
cd "/Volumes/Time Machine Backups/Backups.backupdb/mymac"
tmutil compare 2019-05-19-034451 2019-05-18-220446
Результат полностью соответствует ожиданиям.
Это не срабатывает
Создайте 2 каталога - ../mytemp/mount и ../mytemp/bundle (как точки монтирования). Запустите tmutils destinationinfo, чтобы получить строки монтирования.
Выполнить: mount_afp -o rw "afp://tc:pwd@tc._afpovertcp._tcp.local./diskname" ../mytemp/mount
Выполнить: hdiutil attach ../mytemp/mount/mymac.sparsebundle -readwrite -mountroot ../mytemp/bundle
Выполнить: cd "../mytemp/bundle/Time Machine Backups/Backups.backupdb/mymac"
Все это работает так, как и ожидалось. Mymac.sparsebundle смонтирован в ../mytemp/bundle. Можно выполнить 'cd' в смонтированный sparsebundle. 'ls' выводит список всех файлов резервных копий, как и ожидалось.
НО выполните: tmutil compare 2019-05-19-034451 2019-05-18-220446 еще раз и получите это:
Must specify at least one item inside a backup.
На самом деле можно 'cd' в резервную копию 2019-05-19-034451 или другую, 'ls' показывает именно то, что ожидается. Можно 'cd' вниз на несколько уровней, 'cat' некоторые файлы в консоль и т. д.
Спустился на те же уровни после монтирования обоими способами и выдал 'touch dummy.file.txt', чтобы фактически создать файл. Это не удалось, но добавление 'sudo' прошло успешно - в обоих сценариях монтирования. (В рамках данной резервной копии это не удалось ни при одной из настроек.)
Также пробовал 'sudo tmutil ...' в случае проблем с авторизацией, но результат тот же. Также делал некоторые команды 'ls -la' на разных уровнях, но никаких очевидных различий в 'rwx', назначенном чему-либо, не обнаружено.
Добавлен tmutil в список полного доступа к диску в свойствах системы.
Выполнено: log show --predicate 'process=="tmutil"'
но показывает одинаковый результат как для успешного, так и для неудачного случая.
В конце концов! В чем разница - контекст, полномочия, ??? Что Finder и DiskImageMounter делают иначе, чем mount_afp и hdiutil? Какой-то уровень только для чтения, а tmutil пытается обновить журнал?
Любая помощь или предложения будут высоко оценены!
Обновлять
Разобрал 2 шага - смонтируйводить машинус помощью mount_asp, затем смонтируйтепучокс DiskImageManager - и это работает. Так что проблема заключается в использовании hdiutil вместо DiskImageManager.
Обновление 2
Все еще в разработке, но, судя по всему, 'tmutil'требуетчтобы пакет был смонтирован в /Volumes!
Попробовал обойти это, создав символическую ссылку:
/Volumes/Time Machine Backups -> my mount point
но все равно не получается. Попытка других обходных путей.
Кто-нибудь знает, является ли это истинным требованием tmutil? Это где-нибудь задокументировано?
Решено (но это хак!)
Попробовал добавить корневую точку монтирования в /Volumes, с идеей затем смонтировать несколько sparsebundles ниже - но это тоже не сработало. Очевидно, 'tmutil' ожидает, что bundle будет смонтирован как непосредственный потомок /Volumes.
Окончательный вариант выглядит следующим образом:
- Создайте точку монтирования для дисков: ../mycache/drives
- Смонтировать все диски ниже этого узла
- Смонтировать всепучкив /Volumes с использованием обычного имени по умолчанию - Резервное копирование Time Machine [n]
- Внутренне выясните, какое монтирование соответствует каждому диску, перечислив все разновидности резервных копий Time Machine [n], затем смонтируйте пакет, снова получите список резервных копий Time Machine [n], чтобы выяснить, какое из них является новым монтированием.
- Затем запустите tmutil compare /Volumes/Time Machine Backups 2/Backups.backupdb/mymac/...
Это работает достаточно хорошо. Произойдет сбой, если какой-либо другой процесс смонтирует sparsebundle с записью резервного копирования Time Machine — это запутает вышеприведенную логику.