# Pacnew and Pacsave Files (日本語)

## はじめに

pacman がパッケージを削除するときに設定ファイルがある場合、通常はその設定ファイルのバックアップコピーが作成されファイルの名前に .pacsave が付けられます。

同じく、pacman がパッケージを更新するときに現在インストールされているファイルとは異なる新しいファイルがメンテナによって作成されている場合、.pacnew 設定ファイルを書き出します。場合によっては、特別な事情がある場合、.pacorig ファイルが作成されます。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

これらのファイルはユーザーによる手動の操作を必要としており、パッケージを更新・削除した後はこれらのファイルにすぐ対処すると良いでしょう。放置していると、正しくない設定によってソフトウェアの誤動作を招いたり、ソフトウェアが実行できなくなったりすることがあります。

## パッケージのバックアップファイル

パッケージの `PKGBUILD` ファイルにはパッケージを更新・削除したときにどのファイルを保存・バックアップするべきかが指定されています。例えば `pulseaudio` の`PKGBUILD` には次の行が含まれています:

    backup=('etc/pulse/client.conf' 'etc/pulse/daemon.conf' 'etc/pulse/default.pa')

## タイプの説明

- .pac* ファイルにはさまざまなタイプがあります。

### .pacnew

パッケージの `backup` ファイルが更新されると、pacman はファイルの中身から生成される3つの md5sum を相互に比較します: １つはパッケージによってインストールされる元のバージョンのチェックサム、１つはファイルシステムに存在する現在のバージョンのチェックサム、そして１つは新しいパッケージのバージョンのチェックサム。ファイルシステムに存在する現在のバージョンのファイルがパッケージによってインストールされる元のバージョンから修正されている場合、pacman は修正を新しいバージョンのファイルにマージする方法を知り得ません。従って、更新するとき、修正されたファイルを上書きする代わりに pacman は `.pacnew` 拡張子が付いた新しいバージョンを保存し、修正されたバージョンには手を付けないでおきます。

もっと詳しく言うと、3-way の MD5 チェックサムの比較は以下の結果のどれかになります:

original = X, current = X, new = X
  ３つのバージョンのファイルは全て同じ中身で、上書きしても問題ありません。現在のバージョンは新しいバージョンで上書きされユーザーには通知されません (ファイルの中身が同じだとしても、ファイルのインストール・修正・アクセス時刻などファイルシステムの情報は更新されますし、ファイルのパーミッションの変更は全て適用されます)。

original = X, current = X, new = Y
  現在のバージョンの中身は元のバージョンと同じですが、新しいバージョンが異なっています。ユーザーが現在のバージョンを修正しておらず、新しいバージョンには改善やバグフィックスが含まれていることがあるので、新しいバージョンによって現在のバージョンは上書きされユーザーには通知されません。これは pacman が実行できる唯一の自動マージです。

original = X, current = Y, new = X
  元のパッケージと新しいパッケージは全く同じバージョンのファイルを含んでいますが、ファイルシステムにある現在のバージョンは修正されています。現在のバージョンがそのまま残され、新しいバージョンはユーザーに通知されずに処分されます。

original = X, current = Y, new = Y
  新しいバージョンが現在のバージョンと同一です。現在のバージョンは新しいバージョンによって上書きされユーザーには通知されません (ファイルの中身が同じだとしても、ファイルのインストール・修正・アクセス時刻などファイルシステムの情報は更新されますし、ファイルのパーミッションの変更は全て適用されます)。

original = X, current = Y, new = Z
  ３つのバージョン全てが異なっています。現在のバージョンはそのまま維持され、新しいバージョンは `.pacnew` 拡張子を付けてインストールされます。またユーザーに新しいバージョンについて警告が表示されます。新しいバージョンから現在のバージョンへ必要な変更を手動でマージする必要があります。

### .pacsave

`backup` に指定されているファイルのどれかをユーザーが編集した場合、そのファイルは `.pacsave` 拡張子が付けられた名前に変更されパッケージが削除された後もファイルシステムに残り続けます。

Note: `-n` オプションを付けて `pacman -R` を実行すると指定されたパッケージの全てのファイルが完全に削除されます。従って `.pacsave` ファイルは作成されません。

### .pacorig

パッケージのインストールや更新で、あるファイルが (通常 `/etc` にある設定) インストールされているどのパッケージにも属さず、しかしながらそのパッケージの `backup` に含まれている状態になった場合、ファイルは `.pacorig` 拡張子で保存されパッケージにあるバージョンのファイルで置き換えられます。設定ファイルがあるパッケージから他のパッケージに移動したときに通常起こります。そのようなファイルが `backup` になかった場合、pacman はファイルの衝突エラーで操作を中断します。

Note: `.pacorig` ファイルは特別なときにだけ作られるので、このファイルに対処する普遍的な方法は存在しません。既知の問題の場合、おそらく Arch News に対処する手段が書かれています。

## .pac* ファイルの検索

Arch Linux は `.pacnew` ファイルのための公式ユーティリティを提供していません。あなた自身でこれらのファイルを管理する必要があります; 次のセクションではいくつかのツールが紹介されています。管理を手動で行うには、まずファイルを確認しなくてはならないでしょう。多数のパッケージを更新・削除した時は、更新された *.pac* ファイルを見落とすかもしれません。`*.pac*` ファイルがインストールされていないかどうか調べるには:

ほとんどのグローバルな設定が保存されている場所だけを検索するには:

    $ find /etc -regextype posix-extended -regex ".+\.pac(new|save|orig)" 2> /dev/null

ディスク全体を検索するには:

    $ find / -regextype posix-extended -regex ".+\.pac(new|save|orig)" 2> /dev/null

もしくは (インストールしている場合) locate を使って下さい。まずデータベースのインデックスを作成します:

    # updatedb

そして:

    $ locate -e --regex "\.pac(new|orig|save)$"

または pacman のログを使ってファイルを見つけて下さい:

    $ egrep "pac(new|orig|save)" /var/log/pacman.log

ログにはファイルシステムにある現在のファイルや既に削除されているファイルの記録は保存していないので注意してください。

## .pacnew ファイルの管理

.pacnew や .pacsave ファイルの問題の解決を補助する様々なツールがあります。標準の diff ユーティリティ (または、colordiff) を使えば簡単にファイルを比較できます。pacnews bash script は同じような機能を提供します。pacdiff と pacnews はどちらも vimdiff を使って .pacnew や .pacsave ファイルを比較・編集します。

存在する `.pacnew` ファイルを全て確認したら、ユーザーは vimdiff, ediff (emacs に含まれています), meld (GNOME の GUI ツール), sdiff (diffutils に含まれています), Kompare (KDE の GUI ツール) などの一般的なマージツールを使って手動で対処し、その後 `.pacnew` ファイルを削除することができます。

以上の作業において個々のレベルの自動化を提供するサードパーティのユーティリティが community リポジトリや AUR から利用可能です。

- pacdiff - pacman パッケージに含まれている最小の CLI スクリプト。pacnew や pacsave ファイルを全て検索し、それぞれのファイルをどうするか尋ねます。
- pacmerge-git - CLI 対話式マージプログラム
- Vimdiff - ファイルのマージ用に特別に作られた Vim
- Dotpac - ncurses ベースのテキストインターフェイスと便利なウォークスルーを持ったベーシックな対話式スクリプト。マージや自動マージ機能はありません。
- pacdiffviewer - 自動マージができるフル機能の対話式 CLI スクリプト。yaourt パッケージに含まれています。
- diffpac - スタンドアロンの pacdiffviewer 代替
- Yaourt - AUR リポジトリをサポートしているパッケージマネージャ。`yaourt -C` を使って設定ファイルの比較・置換・マージなどができます。
- etc-update - Gentoo の etc-update ユーティリティの Arch 移植版、対話式の編集や変更のマージ・回覧、些細な変更 (例: コメント) の自動マージなどができるシンプルな CLI を提供します。他のツールとは違い、あなたに新しいエディタを覚えるようしむけるのではなく好みのテキストエディタを使うことができます。
- meld - グラフィカルインターフェイスによって2つ（もしくはそれ以上）のファイルを横に並べて比較・編集できる使いやすいプログラム。開いたファイルの違いを色でハイライトします。
- pacnews-git - `.pacnew` ファイルを全て探し、`vimdiff` で編集するシンプルなスクリプト。下の `meld` を使ったスクリプトとは違います。

### Meld を使って差異を更新する

meld をループで使って設定ファイルの更新をするスクリプトです。ループでそれぞれの `.pacnew` ファイルを削除するか尋ねます。

    pacnew

    #!/bin/bash
    # Merge new *.pacnew configuration files with their originals

    pacnew=$(find /etc -type f -name "*.pacnew")

    # Check if any .pacnew configurations are found
    if [[ -z "$pacnew" ]]; then
      echo " No configurations to update"
    fi

    for config in $pacnew; do
      # Diff original and new configuration to merge
      gksudo meld ${config%\.*} $config &
      wait
      # Remove .pacnew file?
      while true; do
        read -p " Delete \""$config"\"? (Y/n): " Yn
        case $Yn in
          [Yy]* ) sudo rm "$config" && \
                  echo " Deleted \""$config"\"."
                  break                         ;;
          [Nn]* ) break                         ;;
          *     ) echo " Answer (Y)es or (n)o." ;;
        esac
      done
    done

このスクリプトはグラフィカルに sudo を使うために GNOME の `gksudo` を利用しています。KDE では `kdesu` を使って下さい。

## 資料

- Arch Linux フォーラム: Dealing With .pacnew Files

Category:

- Package management (日本語)