Простая распаковка DEB, редактирование postinst и повторная упаковка DEB

Простая распаковка DEB, редактирование postinst и повторная упаковка DEB

Я пытаюсь установить OpenCL SDK от Intel, но файлы DEB представляют собой ошибочные преобразования из RPM (см.здесь(для любопытных). Мне нужно отредактировать postinstскрипт в DEB, который они предоставляют.

Как я могу взять существующий DEB, извлечь его содержимое (включая контрольную информацию), а затем перепаковать его содержимое, чтобы создать новый DEB? Я буду только редактировать файлы, никакие файлы не будут добавляться или удаляться.

решение1

Основная команда для управления deb-пакетами —dpkg-deb.

Чтобы распаковать пакет, создайте пустой каталог и перейдите в него, затем запустите dpkg-debдля извлечения его управляющей информации и файлов пакета. Используйте dpkg-deb -bдля пересборки пакета.

mkdir tmp
dpkg-deb -R original.deb tmp
# edit 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
  # edit 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
# edit postinst
cp ../original.deb ../fixed.deb
tar czf control.tar.gz *[!z]
ar r ../fixed.deb control.tar.gz

Вам следуетдобавитьзапись в журнале измененийи изменитьномер версииесли вы что-то измените в пакете. Инфраструктура для управления пакетами Debian предполагает, что если два пакета имеют одинаковое имя и версию, то это один и тот же пакет. Добавьте суффикс кdebian_revisionчасть в конце номера версии; в целях сортировки суффикс должен начинаться с ~, например, 1.2.3-4.1становится 1.2.3-4.1~johnjumper1.

Вместо использования инструментов оболочки вы можете использовать Emacs.dpkg-dev-elупаковка(который является его собственным upstream, поскольку это собственный пакет Debian) содержит режимы для редактирования .debфайлов и редактирования журналов изменений Debian. Emacs можно использовать интерактивно или в виде скрипта.

решение2

Вы можете использоватьfpmс --after-installвозможностью замены postinstскрипта, например так:

fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb

решение3

Если вы хотите только извлечь файлы из файла .deb, 7-Zip удобен. 7-Zip поддерживает файлы "ar" только для "распаковки". (Не нужно переименовывать файл; он открывает *.deb как "ar" и показывает "data.tar" внутри.)

Связанный контент