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

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Состояние перевода: На этой странице представлен перевод статьи 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

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