Легко розпакуйте DEB, відредагуйте постінвест та перепакуйте DEB


129

Я намагаюся встановити OpenCL SDK від Intel, але файли DEB - це помилкова конверсія від RPM ( цікаві див. Тут ). Мені потрібно відредагувати postinstсценарій у ДЕБ, який вони надають.

Як я можу взяти наявний 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не дає способу це зробити. На щастя, пакети дебютів у стандартному форматі: це 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. Це відкриє керуючий файл у вашому редакторі.
Артефакто

1
btw, fakeroot bashі спробувати видавати команди не працюватимуть щодо власності, і arметод є надзвичайно швидким для великих файлів deb!
Сила Водолія

1
Дякую. Це було корисно. Використовувані dpkg-deb -Rрежими зберігалися та dpkg-deb -bскидали uid:gidвитягнуті файли до 0:0. Не
знадобився фейк-кот

2
@PSkocik Не лише файли із заданими файлами, а також, наприклад, файли та каталоги під /etcабо, /varякі мають належати до певної групи.
Жиль

8

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

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

2
Щоб встановити fpm на Debian / Ubuntu: sudo apt-get install ruby-dev build-basic; sudo gem install fpm
Craig S. Anderson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.