Jump to content

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

From ArchWiki
< Pacman (Русский)

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

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

- Форум Arch Linux: Работа с файлами .pacnew

Category:

- Package manager (Русский)

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