Как установить файл .deb из скрипта preinst?

У меня есть собственное приложение, упакованное с использованием dpkg. Приложение зависит от нескольких файлов .deb, которые я пытаюсь установить из предустановленного скрипта моего приложения. Сценарий preinst проверяет, установлен ли зависимый файл deb, если нет, то устанавливает его с помощью команды dpkg -i. Это повторяется для всех зависимых файлов deb, необходимых для основного приложения.

Когда я пытаюсь установить основное приложение, используя dpkg -i, команды возвращают ошибку при попытке выполнить сценарий preinst. Ниже приведено сообщение об ошибке:

dpkg: error: dpkg status database is locked by another process

Я удалил файл /var/lib/dpkg/lock и попытался установить приложение. Но безрезультатно. Если я запускаю сценарий preinst отдельно, как и любой другой сценарий оболочки, он запускается без проблем. Все файлы deb будут установлены правильно. Таким образом, проблема заключается только в том, когда этот preinst-скрипт автоматически запускается dpkg -i command.

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


Спасибо, ObsessiveSS0F за ваш быстрый ответ.

1123 Я понимаю, что вы делаете, но это не поможет моей ситуации. Позвольте мне рассказать вам, почему.

  1. Мое основное приложение (скажем, mainapp.deb) зависит от пяти других файлов .deb
    (скажем, 1.deb, 2.deb и т. Д.).
  2. Зависимые файлы .deb являются моими личными пакетами / библиотеками. Таким образом, они не могут быть загружены из Интернета. Поэтому я не могу использовать apt-get для их автоматической установки.
  3. Я бы сделал поле «Зависит» в контрольном файле так, чтобы оно указывало на 1.deb, 2.deb..etc, но, как вы знаете, dpkg -i не будет автоматически устанавливать зависимости.
  4. Я могу выполнить dpkg -i, а затем установить apt-get -f, но для работы apt-get мне нужно отредактировать файл /etc/apt/sources.list, чтобы добавить ссылку на локальный каталог в система, в которой хранятся зависимые файлы .deb.
  5. Ну, # 4, кажется, работает, но я не могу это сделать, потому что это приложение будет установлено на многих серверах, и программа установки должна быть полностью автоматизирована.

Я продолжал исследовать причину, по которой preinst не удалось установить файлы .deb, и, думаю, я понял, почему.

  1. Когда я запускаю dpkg -i mainapp.deb, процесс dpkg создает / var / lib / dpkg / lock
    и некоторые файлы в / var / lib / dkpg / обновляет каталог.
  2. Теперь в скрипте preinst есть ряд команд dpkg -i для установки зависимых файлов
    .deb. Таким образом, как только первая команда dpkg -i в сценарии preinst выполняется, она завершается ошибкой из-за блокировок, созданных предыдущей командой dpkg.
  3. Кажется, что две команды dpkg не могут выполняться параллельно из-за блокировок.

Я изменил сценарий preinst для резервного копирования блокировок, созданных процессом dpkg, во временную папку и удалил исходные блокировки. (команда lsof сообщила, что блокировки были удалены). Теперь, когда блокировки сняты, команды dpkg -i в скрипте preinst выполняются без проблем. Я восстановил блокировки перед выходом из скрипта preinst, чтобы основная команда dpkg -i могла продолжаться. Это сработало, но у меня есть ощущение, что это неправильный подход.

Я все еще пытаюсь найти альтернативные способы установки файла .deb вместе с его зависимостями.

2
задан 8 October 2012 в 16:58

2 ответа

Мысль о перетасовке файлов блокировки делает меня неудобным. Если гарантированно не возникнет проблем с установкой приложения, то, похоже, проблемы не должно быть, однако я считаю, что предустановочный сценарий больше подходит для таких вещей, как остановка служб, на которые будет влиять установка.

Похоже, основная причина проблемы в том, что предустановочный скрипт очищается от операции dpkg после установки файла блокировки. Кажется вероятным, что правильный способ сделать это - либо полностью отделить установку зависимостей, либо повторно упаковать приложение, чтобы оно работало с локальным ppa и корректно устанавливало зависимости.

Мне интересно, не лучше ли установить зависимости с помощью --set-selection и обработать их с помощью dpkg до или после установки приложения. Зависимости могут быть загружены с помощью:

sudo dpkg --set-selections < dependency_files

Где файл dependency_files находится в формате, например:

samba                   install
samba-common            install
samba-common-bin        install
samba-ldb-tools         install
samba4                  install
samba4-common-bin       install

Я полагаю, что файлы могут быть затем установлены с помощью

dpkg --selected-only

Это может быть даже возможно что ваш предустановочный скрипт можно использовать как минимум для части операции --set-selections.

Что касается переупаковки, я не могу здесь помочь, но, похоже, существует сообщество разработчиков пакетов, которые могли бы помочь:

http: // www .debian.org / devel / join / newmaint

http://www.debian.org/support

0
ответ дан 8 October 2012 в 16:58

Для установки файлов .deb необязательно использовать сценарий preinst. Вы можете просто добавить зависимости, а затем упаковать их, используя архив, и любые зависимости и пре-зависимости будут установлены автоматически.

0
ответ дан 8 October 2012 в 16:58

Другие вопросы по тегам:

Похожие вопросы: