Назад | Перейти на главную страницу

Как я могу проверить образ моментального снимка ZFS, находящийся в системе резервного копирования?

Я использую хост FreeBSD с ZFS.

Давайте представим, что я сохраняю серию инкрементальных снимков снимков ZFS на удаленном хосте, используя zfs send:

zfs send -i zpool/data/foo@04hoursago zpool/data/foo@10hoursago > /nfs/backups/foo.zfs

Или, возможно, я хочу отправить поток через FTP-сервер:

% ftp backup
ftp> put "| zfs send -i zpool/data/foo@04hoursago zpool/data/foo@10hoursago" /backups/foo.zfs

Я хотел бы проверить это удаленное изображение. Я хотел бы распечатать список снимков, содержащихся в этом изображении, или, при желании, извлечь контрольную сумму или другие метаданные, чтобы проверить правильность изображения и наличие снимков, как я ожидал.

Как я могу запросить файл изображения и посмотреть, что внутри?

я пытался zfs receive с -nv (no-op и verbose), чтобы отобразить снимки в образе, но это может не работать в действующей системе:

# zfs receive -nv zpool < /nfs/backups/foo.zfs
cannot receive new filesystem stream: destination 'zpool' exists
must specify -F to overwrite it
# zfs receive -nv -F zpool < /nfs/backups/foo.zfs
cannot receive new filesystem stream: destination has snapshots (eg. zpool@09hoursago)
must destroy them to overwrite it

Более современные версии ZFS предоставляют команду с именем zstreamdump которые могут предоставлять удобочитаемую информацию из потока (или изображение), созданное с использованием zfs send.

Это пример использования командной строки:

host # zstreamdump < foo.zfs 
BEGIN record
    ...
    toname = zpool/data/foo@04hoursago
    END checksum = 123123123123123123/123123123123123123/asdasdasdasdasd/zxczxczxczxczxc
    ...
    Total write size = 54784 (0xd600)

И пример с FTP:

ftp> get /backups/foo.zfs "| zstreamdump"
BEGIN record
 hdrtype = 1
 ...
 toname = zpool/data/foo@04hoursago
 END checksum = 123123123123123123/123123123123123123/asdasdasdasdasd/zxczxczxczxczxc
 ...

Это дает мне имя фактического снимка и контрольную сумму этого снимка. Конечно, он не предоставит мне список файлов в снимке, потому что эта информация существует на другом уровне.

Я на самом деле не пробовал это на инкрементном снимке, созданном с использованием zfs send -i, но это может быть то, что я хочу.

Я думаю проблема с твоей -nv подход заключался в том, что промежуточные файловые системы не создаются при получении с -n, и поэтому он будет терпеть неудачу каждый раз, пока он работает без флага no-op (но расширение всей файловой системы может занять много времени). К сожалению, большая часть документации / блогов в Интернете не использует этот флаг, поэтому они никогда не сталкиваются с этой ошибкой, как вы (и я).

Также слово предупреждения от Solaris Internals ZFS Best Practices Guide:

Если вы сохраняете поток отправки ZFS в файле или на ленте, и этот файл будет поврежден, его невозможно будет получить, и никакие данные не будут восстановлены. Однако в Неваде в сборке 125 добавлена ​​команда zstreamdump (1m) для проверки потока отправки моментального снимка ZFS. Также RFE 6736794.

Особенно с большими наборами данных это означает три вещи:

  • Если ваш поток находится в хранилище, которому вы не доверяете с точки зрения битовой безопасности, вам нужно будет проверять почти все время и все же жить с риском того, что одна битовая ошибка уничтожит всю вашу резервную копию.
  • Если ваш поток находится в хранилище, которому вы доверяете (например, на томе ZFS, экспортированном как NFS), вы относительно экономны, но вы упускаете zfs list -r и zfs diff.
  • Если у вас есть доступ к собственному хранилищу (например, к тому ZFS, доступ к которому осуществляется через SSH), вы можете расширить полученные файловые системы и использовать упомянутые инструменты. Также в этом случае -v switch работает так, как ожидалось, и его легко проанализировать.