Легко распакуйте DEB, отредактируйте postinst и перепакуйте DEB

129

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

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

Джон джампер
источник

Ответы:

202

Основная команда для управления пакетами 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Пакет (который является его собственным вверх по течению , как это родной пакет Debian) содержит режимы для редактирования .debфайлов и редактирование списков изменений Debian. Emacs можно использовать в интерактивном режиме или по сценарию.

жилль
источник
4
Вы можете также использовать -eпереключатель FPM изменить файл управления: fpm -e -s deb -t deb ../old.deb. Это откроет контрольный файл в вашем редакторе.
Artefacto
1
Кстати, fakeroot bashи попытка выдать команды не будет работать в отношении владения, и этот arметод невероятно быстр для больших файлов deb!
Водолей Сила
1
Благодарю. Это было полезно. С dpkg-deb -Rпомощью режимов были сохранены и dpkg-deb -bсброшены uid:gidизвлеченные файлы в 0:0. Не нуждался в fakeroot (я думаю, что могут быть проблемы, если внутри архива есть файлы с установленными идентификаторами {u, g}, но это не так в моей ситуации.
PSkocik
2
@PSkocik Не только файлы setxid, а также, например, файлы и каталоги в каталоге /etcили /varкоторые должны принадлежать к определенной группе.
Жиль
8

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

fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
Juancho
источник
2
Чтобы установить fpm в Debian / Ubuntu: sudo apt-get install ruby-dev build-essential; sudo gem install fpm
Крейг С. Андерсон