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

From ArchWiki

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

При удалении пакета 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 -Qii пакет.

Альтернативный способ предотвращения перезаписи файлов при обновлении пакетов описан в статье 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.

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

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

  • dotpac — простой интерактивный скрипт с текстовым интерфейсом на основе ncurses. Не имеет возможностей ручного или автоматического объединения.
https://github.com/AladW/dotpac || dotpacAUR
  • etc-update — порт утилиты etc-update из Gentoo, предоставляющей простой интерфейс командной строки для интерактивного редактирования, просмотра и объединения изменений, в том числе автоматического (для незначительных изменений, например, комментариев).
Gentoo:Handbook:Parts/Portage/Tools#etc-update || etc-update
  • p3wm — трёхвариантное объединение файлов .pacnew. Может автоматически объединять простые изменения. При возникновении конфликта использует vimdiff, meld или kdiff3.
https://github.com/5long/p3wm || p3wmAUR
  • 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 ||
  • pacdiff-pacman-hook-git — хук pacman для автоматического запуска pacdiff.
https://github.com/desbma/pacman-hooks || pacdiff-pacman-hook-gitAUR

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