Легко распаковать DEB, отредактировать postinst и упаковать DEB заново.

Вопрос или проблема

Я пытаюсь установить 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 пакетами. Вот пошаговый алгоритм выполнения задачи:

  1. Создание временной директории и распаковка пакета:

    mkdir tmp
    dpkg-deb -R original.deb tmp

    Здесь создается временная директория tmp, в которую распаковываются файлы из DEB пакета original.deb.

  2. Редактирование скрипта postinst:
    Пользователь может использовать текстовый редактор по своему выбору, чтобы внести изменения в tmp/DEBIAN/postinst.

  3. Перепаковка измененного пакета:

    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 пакете, сохраняя его работоспособность и корректность метаданных. Это особенно важно для исправления ошибок в пакетах, которые конвертировались из других форматов и содержат критические баги в скриптах установки или настройки.

Оцените материал
Добавить комментарий

Капча загружается...