Я использую хост 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 list -r
и zfs diff
.-v
switch работает так, как ожидалось, и его легко проанализировать.