Вопрос или проблема
Я пытаюсь установить OpenCL SDK от Intel, но файлы DEB являются ошибочными преобразованиями из RPM (см. здесь для любопытных). Мне нужно отредактировать скрипт postinst
в предоставленном ими DEB.
Как я могу взять существующий DEB, извлечь содержимое (включая контрольную информацию), а затем позже перепаковать содержимое для создания нового DEB? Я буду редактировать только файлы, добавление или удаление файлов не требуется.
Основная команда для управления deb-пакетами – это dpkg-deb
.
Чтобы распаковать пакет, создайте пустую директорию и переключитесь в нее, затем запустите dpkg-deb
для извлечения контрольной информации и файлов пакета. Используйте dpkg-deb -b
для перестройки пакета.
mkdir tmp
dpkg-deb -R original.deb tmp
# редактировать DEBIAN/postinst
dpkg-deb -b tmp fixed.deb
Учтите, что если ваш скрипт не выполняется от имени root, на стадии извлечения права доступа и владельцы файлов будут нарушены. Один из способов избежать этого – выполнить ваш скрипт под fakeroot
. Обратите внимание, что необходимо выполнять всю последовательность под fakeroot
, а не каждую команду dpkg-deb
по отдельности, так как именно процесс fakeroot
запоминает права доступа файлов, которые не могут быть созданы такими, какие они есть.
fakeroot sh -c '
mkdir tmp
dpkg-deb -R original.deb tmp
# редактировать DEBIAN/postinst
dpkg-deb -b tmp fixed.deb
'
Вместо того чтобы заниматься правами доступа, вы можете оставить архив данных нетронутым и модифицировать только контрольный архив. dpkg-deb
не предоставляет возможности сделать это. К счастью, deb-пакеты имеют стандартный формат: они представляют собой архивы ar
. Таким образом, вы можете использовать ar
для извлечения контрольного архива, модификации его файлов и использования ar
снова для замены контрольного архива новой версией.
mkdir tmp
cd tmp
ar p ../original.deb control.tar.gz | tar -xz
# редактировать postinst
cp ../original.deb ../fixed.deb
tar czf control.tar.gz *[!z]
ar r ../fixed.deb control.tar.gz
Вы должны добавить запись в changelog и изменить номер версии, если вы что-то изменяете в пакете. Инфраструктура для управления пакетами Debian предполагает, что если два пакета имеют одно и то же имя и версию, это один и тот же пакет. Добавьте суффикс к части debian_revision в конце номера версии; для сортировки суффикс должен начинаться с ~
, например 1.2.3-4.1
станет 1.2.3-4.1~johnjumper1
.
Вместо использования инструментов командной строки вы можете использовать Emacs. Пакет dpkg-dev-el
(который сам по себе является родным пакетом Debian) содержит режимы для редактирования файлов .deb
и редактирования changelog Debian. Emacs можно использовать интерактивно или скриптовать.
Вы можете использовать fpm с опцией --after-install
для замены скрипта postinst
, примерно так:
fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
Если вы хотите только извлечь файлы из .deb файла, 7-Zip будет удобен. 7-Zip поддерживает файлы “ar” для “только распаковки”. (Нет необходимости переименовывать файл; он открывает *.deb как “ar” и показывает “data.tar” внутри.)
Вы можете использовать ar и tar для ручного извлечения файлов
ar x my_deb_file.deb
tar -xJf data.tar.xz
tar -xJf control.tar.xz
Ответ или решение
Для операционной системы на базе Debian пакетный менеджер работает с файлами в формате .deb, предоставляя стандартный способ установки, обновления и удаления программного обеспечения. Ситуация, когда необходимо внести изменения в уже существующий DEB пакет, например, для исправления скрипта postinst, не является редкостью, особенно в случае конверсий с RPM, как описано в вашем запросе с пакетом Intel OpenCL SDK. Данная задача требует понимания структуры DEB пакета и использования различных инструментов для работы с ним.
Теория
Файлы DEB представляют собой коллекцию сжатых архивов, упакованных в один файл с использованием формата ar. Структурно DEB пакет состоит из трех частей: debian-binary, содержащей версию формата пакета, control.tar.gz, содержащего метаданные и скрипты управления, такие как preinst, postinst, prerm, postrm, и data.tar.gz, который содержит фактические файлы и директории программы. Изменение содержимого DEB пакета подразумевает распаковку этих архивов, редактирование необходимых файлов, и последующую сборку нового пакета.
Пример
Для извлечения содержимого и изменения скрипта postinst рекомендуется использовать команду dpkg-deb, специализированную для работы с DEB пакетами. Вот пошаговый алгоритм выполнения задачи:
-
Создание временной директории и распаковка пакета:
mkdir tmp dpkg-deb -R original.deb tmp
Здесь создается временная директория
tmp
, в которую распаковываются файлы из DEB пакетаoriginal.deb
. -
Редактирование скрипта postinst:
Пользователь может использовать текстовый редактор по своему выбору, чтобы внести изменения вtmp/DEBIAN/postinst
. -
Перепаковка измененного пакета:
dpkg-deb -b tmp fixed.deb
Команда создает новый DEB пакет
fixed.deb
, где применены изменения.
Применение
Чтобы избежать проблем с правами доступа и сохранением атрибутов файлов, рекомендуется выполнять весь процесс под fakeroot
, который симулирует среду суперпользователя, позволяя выполнять операции, которые обычно требуют прав root без реального изменения системы:
fakeroot sh -c '
mkdir tmp
dpkg-deb -R original.deb tmp
# редактирование DEBIAN/postinst
dpkg-deb -b tmp fixed.deb
'
В некоторых случаях может возникнуть необходимость модифицировать только контрольный архив, оставаясь при этом в рамках ar
и tar
. Эти утилиты позволяют манипулировать содержимым DEB пакета на более низком уровне:
mkdir tmp
cd tmp
ar p ../original.deb control.tar.gz | tar -xz
# редактирование postinst
cp ../original.deb ../fixed.deb
tar czf control.tar.gz *[!z]
ar r ../fixed.deb control.tar.gz
При изменениях в пакете критически важно обновлять файл changelog
и версию пакета, чтобы избежать конфликтов в системах управления пакетами, предполагающих уникальность имени и версии пакета. Рассматриваемые изменения можно заменить при помощи fpm
или GUI инструментов, как Emacs с пакетом dpkg-dev-el
, который облегчает манипуляции с DEB файлами.
Если необходимо только извлечь содержимое DEB файла, возможно использовать архиватор 7-Zip, который смог бы извлечь данные напрямую. Это может быть полезно при быстром доступе к содержимому без непосредственной сборки нового пакета.
Таким образом, зная структуру пакета и используя указанные инструменты, можно легко произвести необходимые изменения в DEB пакете, сохраняя его работоспособность и корректность метаданных. Это особенно важно для исправления ошибок в пакетах, которые конвертировались из других форматов и содержат критические баги в скриптах установки или настройки.