Формат файла образа sbd
Файл образа в формате sbd содержит:
Заголовок sbd header длиной 352 байта.
Записи sbd records о данных и участках, помеченных как неиспользуемые, которых может и не быть, например, для пустого инкрементального снапшота. Каждая запись содержит заголовок sbd record header длиной 24 байта.
Завершающая запись sbd footer длиной 12 байт.
Схематично структура всех этих частей представлена на рисунке ниже.

Во всех указанных структурах целые числа длиной более 8 бит, а именно 32-битные и 64-битные, являются беззнаковыми (если не указано другое) и записываются с использованием нотации little endian (от младшего байта к старшему). Поэтому, например, 64-битное целое число вида 0x1234567890ABCDEF будет записано в виде строки байтов 0xEF, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12.
Заголовок файла c образом (SBD header) длиной 352 байта записывается в самом начале файла и содержит следующие поля:
magic — байты с 0 по 7 от начала заголовка — «магическая строка» из 8 символов (ASCII „snapshot“ или побайтово — 0x73 0x6E 0x61 0x70 0x73 0x68 0x6F 0x74), является признаком начала файла в формате sbd и используется, например, чтобы отличить sbd и raw форматы.
version — 1 байт по смещению 8 — используемая версия формата sbd. На данный момент допустимо только значение 1 (0x01).
байты с 9 по 31 включительно являются зарезервированными и должны быть равны 0 в текущей версии формата (SBD v1).
base version — версия базового снапшота — байты с 32 по 39, записывается как 64-битное целое. Это поле имеет смысл только для инкрементальных снапшотов, а для полных снапшотов это поле всегда равно 0. При экспорте инкрементального снапшота с номером n данное поле будет иметь значение n — 1. Если файл снапшота создан с помощью sbdctl merge или sbdctl diff, это поле выставляется в соответствии с логикой этих команд.
snapshot version — версия снапшота — байты с 40 по 47, записывается как 64-битное целое. При экспорте полного или инкрементального снапшота в это поле записывается номер снапшота. При экспорте текущего состояния тома в это поле всегда записывается 0. Если файл снапшота создан с помощью sbdctl merge или sbdctl diff, это поле так же выставляется в соответствии с логикой этих команд.
snapshot timestamp — время создания снапшота — байты с 48 по 55, 64-битное целое число миллисекунд, прошедшее с начала «эпохи UNIX» (полночь 01/01/1970). На данный момент в это поле всегда записывается время создания файла sbd, а не время создания снапшота, поэтому его значение отличается от того, что показывает команда storage snap list.
snapshot name — имя снапшота — байты с 56 по 311, записывается в виде строки ненулевых байт длиной до 256 включительно, дополненной с конца нулевыми байтами до длины 256. Эту строку можно задать только с помощью опции --snapshot-name команды sbdctl export. На данный момент имя снапшота, заданное при его создании и отображающееся с помощью команды storage snap list, не копируется в это поле при экспорте.
volume ID — байты с 312 по 319, 64-битное целое число — идентификатор исходного тома.
volume size — байты с 320 по 327, 64-битное целое число — размер исходного тома в байтах.
volume part size — байты с 328 по 335, 64-битное целое число — при экспорте тома по частям представляет собой размер экспортируемой части в байтах. При экспорте тома целиком в это поле записывается размер всего тома (volume size).
first byte offset — байты с 336 по 343, 64-битное целое число — при экспорте тома по частям представляет собой смещение начала экспортируемой части в байтах от начала тома. При экспорте тома целиком это поле всегда равно 0.
block size — байты с 344 по 347, 32-битное целое число — размер блока исходного тома. Все смещения и размеры, указанные в записях, должны быть кратны этому значению.
header CRC — байты с 348 по 351, 32-битное целое число — контрольная сумма первых 348 байт заголовка, рассчитанная с помощью алгоритма CRC32, аналогичного тому, что используется в утилите gzip и ряде прочих.
Далее идут записи SBD record, соответствующие данным и участкам, помеченным как неиспользуемые. Каждая из таких записей содержит заголовок SBD record header длиной 24 байта, который содержит следующие поля:
type — 1 байт по смещению 0 от начала записи — тип записи. Для формата SBD v1 допустимо только два значения — 0x77 для записей типа nonzero, соответствующих блокам с данными и 0x7A для записей типа zero, соответствующих блокам, помеченным как неиспользуемые.
байты с 1 по 7 включительно являются зарезервированными и должны быть равны 0 в текущей версии формата (SBD v1) для всех типов записей.
offset — байты с 8 по 15, 64-битное целое число — смещение участка, соответвующего данной записи, от начала тома в байтах.
length — байты с 15 по 23, 64-битное целое число — длина участка, соответвующего данной записи, от начала тома в байтах. И смещение, и длина должны быть кратны указанному в заголовке размеру блока.
Для каждой записи типа nonzero, type равно 0x77 или „w“, после заголовка следует ровно length байт данных. Записи типа zero, type равно 0x7A или „z“ состоят только из заголовка.
За последней записью или же сразу за заголовком (если в файле sbd нет ни одной записи) идет завершающая запись (или SBD footer) длиной 12 байт, которая содержит два поля:
footer magic — байты с 0 по 7 от начала SBD footer — «магическая строка» из 8 символов (ASCII „eoffsnap“ или побайтово — 0x65 0x6F 0x66 0x66 0x73 0x6E 0x61 0x70), является признаком конца файла в формате sbd и используется, например, чтобы отличить конец sbd файла от записи.
data CRC — байты с 8 по 11, 32-битное целое число — контрольная сумма всех записей с данными, т.е от конца заголовка до начала завершающей записи. Она рассчитывается с помощью алгоритма CRC32, аналогичного тому, что используется для расчета контрольной суммы заголовка. Магическая строка не участвует в расчете этой контрольной суммы. Утилита sbdctl на данный момент (версия 1.4) только рассчитывает эту контрольную сумму, но не проверяет ее при работе с файлами в формате sbd.