Назад | Перейти на главную страницу

Остановка dpkg от удаления символической ссылки при обновлении пакета

У меня есть пакет debian, который устанавливает файл в /usr/local/java/jre/lib/ext, где /usr/local/java это символическая ссылка на место, где фактически установлен jvm, в данном случае /usr/lib/jvm/java-6-sun.

Новая версия этого пакета устанавливает jar в другом месте. Проблема в том, что установка новой версии заставляет dpkg пытаться привести себя в порядок, в конечном итоге удаляя /usr/local/java символическая ссылка.

Это крайне нежелательное состояние, даже временно.

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

Вот изменения в конфигурации упаковки debian:

diff --git a/debian/dirs b/debian/dirs
--- a/debian/dirs
+++ b/debian/dirs
@@ -1 +1 @@
-usr/local/java/jre/lib/ext
+usr/share/java
diff --git a/debian/rules b/debian/rules
--- a/debian/rules
+++ b/debian/rules
@@ -30,7 +30,7 @@ install: build

        # Add here commands to install the package into debian/tmp.
        # $(MAKE) pure_install
-       cp thejar.jar $(TMP)/usr/local/java/jre/lib/ext
+       cp thejar.jar $(TMP)/usr/share/java

 # Build architecture-independent files here.
 binary-indep: build install

Я представляю, что ухожу usr/local/java/jre/lib/ext в dirs дало бы желаемый эффект, но это просто решает проблему в будущем - я бы предпочел, чтобы этот пакет не отвечал за поддержку символической ссылки.

Итак: какие у меня варианты?

Символьные ссылки - это просто файлы, устанавливаемые пакетом, поэтому применяется нормальное поведение. Я могу думать о следующих вариантах:

  • Отметьте символическую ссылку как файл конфигурации. Я не знаю, поддерживается ли это, но если это так, символическая ссылка должна удаляться только в том случае, если пакет очищен.
  • Не устанавливайте символическую ссылку как файл, а создайте ее в сценарии postinst.
  • Просто создайте символическую ссылку вручную, а не как часть пакета.

Обратите внимание, что все, на что указывает символическая ссылка, будет удалено при удалении старой версии, поэтому я не вижу, как это улучшить.

Если у вас dpkg> 1.15.8, попробуйте заполнить /etc/dpkg/dpkg.cfg.d/excludes с участием:

path-exclude=/usr/local/java/jre/lib/ext

Источник: Экономьте место на диске, исключая ненужные файлы с помощью dpkg | Рафаэль Герцог.

Для пользователей Arch используйте NoExtract = в /etc/pacman.conf и исключите ведущую косую черту из пути. Видеть ArchWiki или man pacman.conf.