]> Sergey Matveev's repositories - stargrave-blog.git/commit
Сделал detpax -- детерминированный архиватор
authorSergey Matveev <stargrave@stargrave.org>
Thu, 27 Jun 2024 16:47:22 +0000 (19:47 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Thu, 27 Jun 2024 16:47:22 +0000 (19:47 +0300)
commit7687e77d7a77d0a14e4dd38c79886b942199ac9d
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904
parent9a2a473e2c60a9dee87b2f55c6fef88db2723842
Сделал detpax -- детерминированный архиватор

http://www.git.cypherpunks.ru/?p=bass.git;a=blob_plain;f=build/contrib/detpax/README
https://reproducible-builds.org/docs/archives/
Для того, чтобы хоть как-то приближаться к reproducible build-ам, архивы
пакетов тоже должны быть "повторяемыми". bsdtar можно всякие опции
указывать для того, чтобы не хранить UID/GID. touch-ем можно выставить
фиксированное время. find-ом сортировать списки файлов. Но это всё
работает пока bsdtar по умолчанию делает ustar формат.

Но большого размера файлы в него не запихнуть. bsdtar автоматом начинает
использовать pax формат, что хорошо. Но при этом он начинает в него
пихать и точные временные штампы для файлов, что ломает детерминированность
создания архивов. С GNU tar-ом (bsdtar например даже на Astra SE стоит
из коробки), тоже какие-то загвоздки есть, но детали не помню.

Поэтому написал на Go, зная что в нём из коробки есть archive/tar
библиотека, поддерживающая pax-формат, архиватор который бы не сохранял
ничего лишнего. И добавил в него возможность указания более высокого
приоритета сортировки для каких-то директорий (чтобы они были в начале
архива). Сохраняет только права доступа, sticky/setuid/setgid флаги,
файлы, директории, символические и жёсткие ссылки.