pacman (Русский)/Pacnew and Pacsave (Русский)

From ArchWiki
Jump to navigation Jump to search

Состояние перевода: На этой странице представлен перевод статьи pacman/Pacnew and Pacsave. Дата последней синхронизации: 2 сентября 2020. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

При удалении пакета pacman сохраняет его файл настроек в виде резервной копии с суффиксом .pacsave. Аналогично, при обновлении пакета pacman сохраняет новый файл настроек с суффиксом .pacnew, если его содержимое отличается от существующего файла настроек. pacman уведомляет пользователя о создании таких файлов.

Почему эти файлы создаются

Файл .pacnew обычно создаётся во время обновления пакета (pacman -Syu, pacman -Su или pacman -U) во избежание перезаписи существующего файла, в который пользователь внёс изменения. Следующее сообщение в выводе pacman говорит от создании такого файла:

warning: /etc/pam.d/usermod installed as /etc/pam.d/usermod.pacnew

Файл .pacsave создаётся во время удаления (pacman -R) или обновления (когда необходимо сперва удалить предыдущую версию) пакета. Если в базе данных pacman имеется запись о создании резервной копии какого-либо файла, то создаётся файл .pacsave. В этом случае pacman выводит следующее сообщение:

warning: /etc/pam.d/usermod saved as /etc/pam.d/usermod.pacsave

Файлы .pacnew и .pacsave лучше всего обрабатывать вручную сразу после обновлений или удаления пакетов. Наличие в системе неправильных файлов настроек может привести к ошибкам в работе программ или даже к полной невозможности их запуска.

Резервные копии файлов пакета

Файлы, для которых необходимо создавать резервные копии при удалении или обновлении, перечисляются в файле PKGBUILD пакета. Например, PKGBUILD пакета pulseaudio содержит следующую строку:

backup=(etc/pulse/{daemon.conf,default.pa,system.pa})

Альтернативный способ предотвращения перезаписи файлов при обновлении пакетов описан в статье pacman#Запрет на обновление файлов.

Разъяснение типов

.pacnew

Для каждого указанного в параметре backup файла обновляемого пакета pacman сравнивает контрольные суммы MD5 оригинальной версии файла, текущей, а также той, что должна быть установлена при обновлении. Если текущий файл в файловой системе был изменен и не соответствует оригинальной версии, pacman не может определить, как правильно объединить все изменения с новой версией файла. По этой причине он сохраняет новую версию с расширением .pacnew и оставляет измененную версию нетронутой.

Варианты сравнения контрольных сумм MD5:

оригинальный = X, текущий = X, новый = X 
Содержимое трёх версий файла совпадает, поэтому можно спокойно производить перезапись. Замена файла происходит без уведомления пользователя (хотя содержимое файлов одинаково, при этом будет обновлена информация о времени установки, изменения и последнего использования файла, а также права доступа, если они изменились).
оригинальный = X, текущий = X, новый = Y 
Содержимое текущей версии не изменялось, но новая версия имеет отличия. Поскольку пользователь не вносил изменений в текущую версию, а новая может содержать улучшения или исправления багов, текущая версия перезаписывается без уведомления пользователя. Это единственная операция объединения файлов, которую способен выполнить pacman.
оригинальный = X, текущий = Y, новый = X 
Изначальный и новый пакеты содержат абсолютно одинаковые версии файла, но текущая версия в файловой системе была изменена. Текущая версия остаётся без изменений, а новая — отклоняется без уведомления пользователя.
оригинальный = X, текущий = Y, новый = Y 
Новая версия идентична текущей. Текущая версия перезаписывается без уведомления пользователя (хотя содержимое файлов одинаково, при этом будет обновлена информация о времени установки, изменения и последнего использования файла, а также права доступа, если они изменились).
оригинальный = X, текущий = Y, новый = Z 
Все три версии различаются, поэтому текущая версия остаётся нетронутой, новая устанавливается с расширением .pacnew, а пользователь получает уведомление о произошедшем. Предполагается, что при необходимости пользователь вручную объединит файлы, внеся все необходимые изменения из новой версии в текущую.

.pacsave

Если при удалении пакета обнаруживается, что оригинальная версия backup-файла была изменена пользователем, то файл сохраняется с суффиксом .pacsave и остаётся в файловой системе.

Примечание: Опция -n в команде pacman -R позволяет полностью удалить такие файлы. В этом случае файлов .pacsave создано не будет.

Поиск файлов .pac*

Pacman не имеет функциональности для работы с файлами .pacnew, поэтому их необходимо обрабатывать вручную, как описано в следующем разделе. Перед этим необходимо определить местонахождение этих файлов. При обновлении или удалении большого количества пакетов файлы .pac* можно пропустить или не заметить. Найти все файлы .pac* можно одним из следующих способов:

  • Поиск по каталогу /etc, в котором хранится большинство глобальных конфигурационных файлов:
    $ find /etc -regextype posix-extended -regex ".+\.pac(new|save)" 2> /dev/null
    Замените /etc на /, чтобы выполнить поиск по всему диску. Для ускорения процесса можно выборочно исключить некоторые каталоги.
  • Используйте утилиту locate, если она установлена. Сначала обновите базу данных:
    # updatedb
    Затем:
    $ locate --existing --regex "\.pac(new|save)$"
  • Используйте лог pacman:
    $ grep --extended-regexp "pac(new|save)" /var/log/pacman.log
    Обратите внимание, что в логе не содержится информации о том, какие файлы в настоящий момент находятся в системе, а какие уже удалены. Команда выведет список всех файлов .pac*, которые когда-либо существовали в системе. Чтобы ограничить вывод последними десятью файлами, перенаправьте его в утилиту tail.

Управление файлами .pac*

pacdiff

Утилита pacdiff из пакета pacman-contrib выполняет поиск файлов .pacnew и .pacsave, после чего предлагает выбор из применимых к ним действиям. По умолчанию использует vimdiff, другой редактор можно задать в переменной окружения DIFFPROG=ваш_редактор pacdiff. Список утилит для сравнения файлов можно найти в статье List of applications/Utilities#Comparison, diff, merge.

Хук pacman

С помощью хука pacman можно настроить автоматический запуск pacdiff после каждого обновления системы. Он будет напоминать о необходимости что-то сделать с появившимися файлами.

При этом нужно помнить, что pacdiff рассчитан на работу в интерактивном режиме, в то время как pacman может запускаться неинтерактивно.

/etc/pacman.d/hooks/pacdiff.hook
[Trigger]
Operation = Install
Operation = Upgrade
Operation = Remove
Type = Package
Target = *

[Action]
Description = Runs pacdiff utility
When = PostTransaction
Exec = /usr/bin/pacdiff

Подробнее о хуках см. pacman#Хуки.

Сторонние утилиты

В AUR можно найти несколько программ от сторонних разработчиков, предлагающий различный уровень автоматизации при работе с файлами .pac*:

  • dotpac — простой интерактивный скрипт с текстовым интерфейсом на основе ncurses. Не имеет возможностей ручного или автоматического объединения.
https://github.com/AladW/dotpac || dotpacAUR
  • etc-update — порт утилиты etc-update из Gentoo, предоставляющей простой интерфейс командной строки для интерактивного редактирования, просмотра и объединения изменений, в том числе автоматического (для незначительных изменений, например, комментариев).
https://wiki.gentoo.org/wiki/Handbook:Parts/Portage/Tools#etc-update || etc-updateAUR
  • p3wm — трёхвариантное объединение файлов .pacnew. Может автоматически объединять простые изменения. При возникновении конфликта использует vimdiff, meld или kdiff3.
https://github.com/5long/p3wm || p3wmAUR
  • pacnew-auto — автоматическое объединение файлов .pacnew на основе git.
https://github.com/joanrieu/pacnew-auto || pacnew-auto-gitAUR[ссылка недействительна: package not found]
  • pacnews-git — простой скрипт, нацеленный на поиск всех файлов .pacnew и их последующее редактирование при помощи vimdiff
https://github.com/pbrisbin/scripts/blob/master/pacnews || pacnews-gitAUR
  • pacfiles-mode — расширение Emacs для работы с файлами .pacnew, доступен на странице melpa.
https://github.com/UndeadKernel/pacfiles-mode ||

Смотрите также