Содержит рекомендации по устранению влияния инструментальной системы на процесс создания образа и обеспечению воспроизводимости (идентичности) образов при одинаковых входных данных, в т.ч. при использовании утилиты mkifs на разных инструментальных системах (Windows/Linux)
Повторяемость сборки - это обеспечение воспроизводимости контрольных сумм компонентов и образов вне зависимости от типа инструментальной системы. Обеспечение сохранения контрольных сумм при пересборке - задача, к решению которой необходимо подходить индивидуально в зависимости от проекта. Для начала рекомендуется добиться воспроизводимости сборки какого-то небольшого проекта (одиночного драйвера, утилиты и т.д.).
Существует ряд известных причин, по которым контрольные суммы могут не воспроизводиться:
В первую очередь стоит исключить влияние служебной информации о дате и времени внутри компонентов. На содержимое строк с датой внутри исполняемых/объектных файлов в основном влияют две переменные окружения:
SOURCE_DATE_EPOCH
PINFO_DATE
Важно, чтобы данные переменные окружения попадали в окружение команды make при её запуске. Соответственно, можно их либо предварительно экспортировать (в рамках сессии командного интерпретатора, из которого запускается сборка ПО), либо явно задавать как аргумент команды make. Пример:
$ make SOURCE_DATE_EPOCH=... PINFO_DATE=... install
PINFO_DATE
- Перемененная окружения информационного сообщение PINFO. Данное сообщение может быть отображено с помощью команды use с параметром -i. Переменная устанавливается для стандартных рекурсивных проектов ЗОСРВ "Нейтрино" - драйверов, утилит, BSP и т.д.
Пример установки (формат):
$ export PINFO_DATE=$(date +%Y/%m/%d-%H:%M:%S-MSK); make
SOURCE_DATE_EPOCH
— это стандартизированная переменная окружения, которую дистрибутивы могут устанавливать централизованно и использовать инструменты сборки для получения воспроизводимых результатов. На практике SOURCE_DATE_EPOCH
указывает последнюю модификацию чего-либо, обычно исходного кода, измеряемую количеством секунд с эпохи Unix, т.е. "January 1st 1970, 00:00:00 UTC".
Данная переменная окружения на работу компиляторов (в т.ч. на устанавливаемые значения макросов __DATE__
и __TIME__
);
Пример установки (формат)
$ export SOURCE_DATE_EPOCH=$(date +%s); make
В зависимости от файловой системы и сортировки меняется порядок включения файлов из указанного каталога.
Чтобы избежать этого, необходимо явно указывать пути и порядок включения файлов в файле построения загрузочного образа типа *.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
Предположительно проблема может быть в разных идентификаторах пользователя из под которых собирается образ.
Для обеспечения воспроизводимости контрольной суммы образа без использования опции -nn рекомендуется явно задавать идентификаторы владельца и группы для файлов, включаемых в состав образа. Для этого необходимо задать атрибуты uid и gid с помощью опции -l "[uid=<знач> gid=<знач>]" (т.е. для всех файлов, входящих в состав загрузочного образа), либо явно в самом файле построения загрузочного образа (для всех файлов, для групп файлов или индивидуально). Чтобы принудительно задать одинаковые идентификаторы добавьте в начало файла построения строку:
[uid=0 gid=0]
или задайте дополнительную опцию для mkifs:
-l "[uid=0 gid=0]"
Опция -nn позволяет принудительно установить в 0 (обнулить) ряд атрибутов для файлов, включаемых в образ. Перечень атрибутов, подлежащих обнулению (зависит от формата использования данного параметра):
Использование опции -nn приводит к игнорированию любых значений атрибутов uid и gid - как передаваемых с помощью опции -l, так и явно заданных в файле построения.
Некоторые причины, почему контрольные суммы собранного ПО различаются после пересборки:
__DATE__
, __TIME__
и т.п., которые будут внесены в объектный код при компиляции.
Предыдущий раздел: Загрузочные образы