2012-01-19 2 views
1

У меня есть пакет debian, который я создал, содержащий tar-файл, файл управления и файл postinst. Он построен с использованием dpkg-deb и устанавливает его правильно, используя dpkg.Каталог установки времени запуска debian

Модификация, которую я хотел бы сделать, заключается в том, чтобы установить каталог установки файлов во время выполнения на основе переменной среды, которая будет установлена, когда dpkg -i запускается в файле deb. Я повторяю переменную среды в postinst-скрипте, и я вижу, что ее набор правильно.

Мои вопросы:

1) Можно ли динамически определить каталог для установки во время выполнения?

2) Если возможно, как бы я это сделал? Я прочитал о файле правил и файлах mypackage.install, но я не знаю, позволит ли это сделать это.

Я мог бы взломать его, скопировав файлы в целевое местоположение в сценарии posinst, но я бы предпочел сделать это по-своему, если это возможно.

Заранее благодарен!

+0

Существует опция, которую вы можете передать 'dpkg' для использования другого корня, чем'/usr' для установки. Пакеты 'deb' не имеют« установочного каталога »в этом смысле - это поможет, если вы добавите примеры того, что у вас есть сейчас, и то, что вы бы хотели. В теории вы могли бы перемещать вещи из своего сценария postinst, но я бы сильно отговаривал вас. – tripleee

+0

Хорошая идея. Я попытался использовать -instdir =, и он скопировал файлы, но postinst не будет запускаться с тех пор, как -instdir делает chroot, поэтому вы также должны иметь каталог dpkg admin. Я также попытался использовать --root и --admindir в комбинации, чтобы увидеть, могу ли я разбить две каталоги. rpm имеет флаг перемещения, чтобы вы могли перемещать местоположение пакета. Я должен иметь динамический каталог, так как этот пакет должен жить в разных местах в двух разных встроенных дистрибутивах linux. Например, просто предположим, что один файл в tarball, который живет в разных местах на разных машинах. –

+0

Я бы просто создал два разных пакета 'deb', если только файл не является conffile. Примеры все равно помогут. Типичный управляемый пакетами файл будет выглядеть как '/ usr/lib/yourpackage.so' и типичный conffile, например. '/ И т.д./yourpackage.cfg'. – tripleee

ответ

1

Так вот что я узнал об этой проблеме за последние пару недель.

С предварительно упакованными двоичными файлами вы не можете создать пакет debian с целевым каталогом dynamicall, определенным во время выполнения. Я считаю, что это возможно при установке пакета, который построен из источника, где вы можете установить каталог установки с помощью configure. Но в этом случае, поскольку они встроены в машины Ubuntu, они не имеют такой возможности, поэтому я не преследовал такой вариант. Я разработал нестандартный метод (хак) для установки, который действительно работал. Поскольку пакеты debian просто содержат tar-шар относительно/просто создайте ваш пакет относительно каталога в/tmp. В сценарии postinst вы можете определить, где скопировать файлы из архива в постоянное место.

Я ожидал, что после перезагрузки и автоматического удаления подкаталога в/tmp, dpkg может не знать, что пакет файлов существует. Это не проблема. Когда я запускал 'dpkg -l myapp', он показывал, что все еще установлен. Обновление пакета с помощью dpkg/apt-get также работало без сбоев.

Что я нашел, так это то, что если вы попытаетесь удалить пакет с помощью «dpkg -r myapp», который dpkg попытается удалить/tmp, что было бы плохо. Однако/tmp не легко удаляется, поэтому он никогда не удался. Плюс в нашей ситуации мы никогда не удаляем пакеты, а просто просто обновляем их.

В конечном итоге мне пришлось отказаться от универсального пакета из-за различий кода в источниках, что привело к необходимости перекомпиляции на платформу, но я бы оставил его таким образом, и это действительно сработало.

Я попытался использовать --instdir, чтобы изменить каталог установки пакета, и он перемещает файлы, но dpkg терпит неудачу, так как файл dpkg не может быть найден относительно нового instdir. Использование -instdir похоже на chroot. Я также попробовал --admindir и --root в различных комбинациях, чтобы увидеть, могу ли я использовать систему dpkg относительно /, но установить перемещение файлов, но они не сработали. Я предполагаю, что rpm имеет параметр перемещения, который работает, но не Ubuntu.

0

Вы также можете написать скрипт, который запускает dpkg-deb с другой средой в 6 раз, генерируя 6 разных пакетов. Когда вы вносите изменения, вам просто нужно запустить свой скрипт, и все 6 пакетов будут сгенерированы, и вы сможете установить их на своих машинах, избегая взлома postinst!

0

Почему бы не установить стандартное местоположение и просто использовать сценарий postinst для создания символических ссылок в нужное место? Это намного чище и не должно ничего сломать в dpk -I.

Смежные вопросы