Я пытаюсь установить 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" внутри.)