pacman (Русский)/Pacnew and Pacsave (Русский)
При удалении пакета 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. Не имеет возможностей ручного или автоматического объединения.
- etc-update — порт утилиты etc-update из Gentoo, предоставляющей простой интерфейс командной строки для интерактивного редактирования, просмотра и объединения изменений, в том числе автоматического (для незначительных изменений, например, комментариев).
- p3wm — трёхвариантное объединение файлов .pacnew. Может автоматически объединять простые изменения. При возникновении конфликта использует vimdiff, meld или kdiff3.
- pacnews-git — простой скрипт, нацеленный на поиск всех файлов .pacnew и их последующее редактирование при помощи vimdiff
- pacdiff-pacman-hook-git — хук pacman для автоматического запуска pacdiff.
Смотрите также
- Форум Arch Linux: Работа с файлами .pacnew