Операционная система ЗОСРВ «Нейтрино» > Руководство пользователя > Настройка и управление > Загрузочные образы > Повторяемость сборки загрузочного образа



Повторяемость сборки загрузочного образа

Содержит рекомендации по устранению влияния инструментальной системы на процесс создания образа и обеспечению воспроизводимости (идентичности) образов при одинаковых входных данных, в т.ч. при использовании утилиты mkifs на разных инструментальных системах (Windows/Linux)

Повторяемость сборки - это обеспечение воспроизводимости контрольных сумм компонентов и образов вне зависимости от типа инструментальной системы. Обеспечение сохранения контрольных сумм при пересборке - задача, к решению которой необходимо подходить индивидуально в зависимости от проекта. Для начала рекомендуется добиться воспроизводимости сборки какого-то небольшого проекта (одиночного драйвера, утилиты и т.д.).

Существует ряд известных причин, по которым контрольные суммы могут не воспроизводиться:

Переменные окружения
PINFO_DATE
SOURCE_DATE_EPOCH
Файл построения и опции утилиты mkifs
UID и GID файлов
Опция "n(n)"
Прочие причины

Переменные окружения

В первую очередь стоит исключить влияние служебной информации о дате и времени внутри компонентов. На содержимое строк с датой внутри исполняемых/объектных файлов в основном влияют две переменные окружения:

  1. SOURCE_DATE_EPOCH
  2. PINFO_DATE

Важно, чтобы данные переменные окружения попадали в окружение команды make при её запуске. Соответственно, можно их либо предварительно экспортировать (в рамках сессии командного интерпретатора, из которого запускается сборка ПО), либо явно задавать как аргумент команды make. Пример:

$ make SOURCE_DATE_EPOCH=... PINFO_DATE=... install

PINFO_DATE

PINFO_DATE - Перемененная окружения информационного сообщение PINFO. Данное сообщение может быть отображено с помощью команды use с параметром -i. Переменная устанавливается для стандартных рекурсивных проектов ЗОСРВ "Нейтрино" - драйверов, утилит, BSP и т.д.

Пример установки (формат):

$ export PINFO_DATE=$(date +%Y/%m/%d-%H:%M:%S-MSK); make

SOURCE_DATE_EPOCH

SOURCE_DATE_EPOCH — это стандартизированная переменная окружения, которую дистрибутивы могут устанавливать централизованно и использовать инструменты сборки для получения воспроизводимых результатов. На практике SOURCE_DATE_EPOCH указывает последнюю модификацию чего-либо, обычно исходного кода, измеряемую количеством секунд с эпохи Unix, т.е. "January 1st 1970, 00:00:00 UTC".

Данная переменная окружения на работу компиляторов (в т.ч. на устанавливаемые значения макросов __DATE__ и __TIME__);

Пример установки (формат)

$ export SOURCE_DATE_EPOCH=$(date +%s); make

Файл построения и опции утилиты mkifs

В зависимости от файловой системы и сортировки меняется порядок включения файлов из указанного каталога.

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

Например, вместо включения нескольких каталогов из terminfo необходимо прописать явно только требующиеся типы терминала, обычно это xterm и qansi:

/usr/lib/terminfo/q/qansi=${KPDA_TARGET}/usr/lib/terminfo/q/qansi
/usr/lib/terminfo/x/xterm=${KPDA_TARGET}/usr/lib/terminfo/x/xterm

UID и GID файлов

Предположительно проблема может быть в разных идентификаторах пользователя из под которых собирается образ.

Для обеспечения воспроизводимости контрольной суммы образа без использования опции -nn рекомендуется явно задавать идентификаторы владельца и группы для файлов, включаемых в состав образа. Для этого необходимо задать атрибуты uid и gid с помощью опции -l "[uid=<знач> gid=<знач>]" (т.е. для всех файлов, входящих в состав загрузочного образа), либо явно в самом файле построения загрузочного образа (для всех файлов, для групп файлов или индивидуально). Чтобы принудительно задать одинаковые идентификаторы добавьте в начало файла построения строку:

[uid=0 gid=0]

или задайте дополнительную опцию для mkifs:

-l "[uid=0 gid=0]"

Опция "n(n)"

Опция -nn позволяет принудительно установить в 0 (обнулить) ряд атрибутов для файлов, включаемых в образ. Перечень атрибутов, подлежащих обнулению (зависит от формата использования данного параметра):

Использование опции -nn приводит к игнорированию любых значений атрибутов uid и gid - как передаваемых с помощью опции -l, так и явно заданных в файле построения.

Прочие причины

Некоторые причины, почему контрольные суммы собранного ПО различаются после пересборки:

  1. Метки времени могут быть в самом исходном коде: макросы __DATE__, __TIME__ и т.п., которые будут внесены в объектный код при компиляции.
  2. Архиваторы (например, tar) сохраняют даты создания файлов.
  3. При сборке с отладочной информацией, в собранный код может попадать доп. информация, использующая метки времени.
  4. В библиотеки могут вносится при сборке даты объектных файлов.
  5. При линковке в бинарные файлы могут вноситься идентификаторы сборки.
  6. Файлы на файловой системе на различных инструментальных системах могут быть отсортированы в разном порядки и при линковке это меняет порядок расположения данных в бинарных файлах.




Предыдущий раздел: Загрузочные образы