Debian: предотвращение перезаписи определенного файла во время обновления пакета

9

Я понимаю, что пакет состоит из двух компонентов: configи dataфайлов. Во время обновления пакета (т.е. обновления безопасности) dataфайлы могут быть перезаписаны, но configфайлы всегда должны оставаться прежними. Также configфайлы обычно в /etcи dataв /usr. Иногда, однако, различие размыто.

В моем случае я изменил файл значков для Icedove(Thunderbird):

/usr/share/applications/icedove.desktop

Теперь каждый раз, когда есть Icedove обновлении (Thunderbird) мои изменения перезаписываются файлом по умолчанию (даже если он не менялся между обновлениями).

Есть ли способ предотвратить перезапись этого файла?

Установка его в значение immutable с помощью chattr +i icedove.desktopне является хорошей идеей, так как это приводит к ошибке во время обновления пакета.

Мартин Вегтер
источник
2
@don_crissti Технически правильное местоположение $XDG_DATA_HOME/applications/icedove.desktop, хотя обычно это путь поиска, который вы упоминаете. Спецификация Справочника Базы XDG также предоставляет путь поиска в $XDG_DATA_DIRSдля общесистемных переопределений. Более подробное объяснение того, как в этом случае применяются базовые каталоги XDG, содержится в моем ответе .
Томас Найман

Ответы:

7

В то время как ответ wurtel отвечает на вопрос в формулировке, рассмотрение фона в вопросе показывает, что это еще один случай проблемы XY .

В этом конкретном случае /usr/share/applications/icedove.desktopне следует изменять в первую очередь, но локальный файл конфигурации, который переопределяет конфигурацию по умолчанию, должен быть помещен в подходящее место. Системы, совместимые с freedesktop.org, соответствуют спецификации XDG Base Directory. , цель которой состоит в том, чтобы точно устранить необходимость изменения файлов конфигурации, которые перезаписываются во время обновления пакета.

Если конфигурация предназначена для всей системы, локальный icedove.desktopдолжен быть помещен в applicationsподкаталог для поиска пути, предшествующего /usr/shareв $XDG_DATA_DIRS. Значение этой переменной среды по умолчанию /usr/local/share/:/usr/share/равно, но фактическое значение варьируется в зависимости от распределения. Поскольку в этом случае конфигурация должна быть локальной, правильное расположение есть /usr/local/share/applications/icedove.desktop, хотя имейте в виду, что они могут иметь определенные переопределения, которые могут иметь предпочтение перед конфигурациями usr/local/share.

С другой стороны, если конфигурация имеет отступ для конкретного пользователя, локальный icedove.desktopдолжен быть размещен applicationsв месте, указанном $XDG_DATA_HOME. Обычно это значение по умолчанию $HOME/.local/share, т.е. местоположение файла конфигурации должно быть $HOME/.local/share/applications/icedove.desktop.

Томас Найман
источник
10

Вы хотите dpkg-divertутилиту.

dpkg-divert --divert /usr/share/applications/icedove.desktop.packaged --rename /usr/share/applications/icedove.desktop
wurtel
источник
1
Это может помочь другим: «Не пытайтесь перенаправить файл, который жизненно важен для работы системы - при использовании dpkg-divert есть время, после того как он был перенаправлен, но до того, как dpkg установил новую версию, когда файл не существует. "от debian.org/doc/debian-policy/ap-pkg-diversions.html
2rs2ts