pacman/Pacnew と Pacsave
pacman は、設定ファイルが存在するパッケージを削除する際に、その設定ファイルのバックアップコピーを作成します。この時、バックアップファイルの名前には .pacsave という接尾辞が付けられます。同じように、パッケージをアップグレードする際に、ファイルシステム上に既に存在している設定ファイルの内容が、パッケージに含まれる新しい設定ファイルと異なる場合、新しい方の設定ファイルが .pacnew ファイルとして保存されます。pacman は、これらのファイルが作成された際に警告を表示します。
目次
これらのファイルが作成される理由
.pacnew ファイルは、既にファイルシステム上に存在している変更済みの設定ファイルを上書きしないようにするために、パッケージの更新時に作成されます。この時、pacman は以下のようなメッセージを出力します:
警告: /etc/pam.d/usermod は /etc/pam.d/usermod.pacnew としてインストールされました
.pacsave ファイルは、パッケージの削除時 (pacman -R
) とアップグレード時に作成されます (アップグレード時にはパッケージが一度削除されるため)。pacman は、パッケージを削除する際に、データベースを調べてバックアップするべきファイルが存在するか判断します。そのようなファイルに対しては、バックアップとして .pacsave ファイルが作成されます。この時、pacman は以下のようなメッセージを出力します:
警告: /etc/pam.d/usermod は /etc/pam.d/usermod.pacsave として保存されました
これらのファイルに対してはユーザによる手動操作が必要であり、パッケージのアップグレードや削除の後は即座にこれらのファイルを処理することが推奨されます。放置していると、不適切な設定によってソフトウェアの誤動作を招いたり、ソフトウェアが実行できなくなったりする可能性があります。
パッケージのバックアップファイル
パッケージの PKGBUILD ファイルでは、パッケージをアップグレードまたは削除した際に保持またはバックアップするべきファイルが指定されていることがあります。例えば、pulseaudio の PKGBUILD には以下の行が含まれています:
backup=(etc/pulse/{daemon.conf,default.pa,system.pa})
パッケージのインストール後、pacman -Qii package_name
を実行することで、pacman データベースからバックアップすべきファイルのリストを取得できます。
パッケージの操作時に特定のファイルを上書きしないようにするには、Pacman#アップグレードさせないファイルを設定 を参照してください。
タイプの説明
.pacnew
パッケージに含まれているバックアップファイルが更新されると、pacman はファイルの中身から生成される3つの md5sum を相互に比較します: 1つは更新前のパッケージによってインストールされた元のバージョンのチェックサム、1つはファイルシステムに存在する現在のバージョンのチェックサム、そしてもう1つは新しいパッケージに含まれているバージョンのチェックサムです。ファイルシステムに存在する現在のバージョンのファイルがパッケージによってインストールされる元のバージョンから修正されている場合、pacman は修正を新しいバージョンのファイルにマージする方法を知り得ません。従って、更新するとき、修正されたファイルを上書きする代わりに pacman は .pacnew 拡張子が付いた新しいバージョンを保存し、修正されたバージョンには手を付けないでおきます。
もっと詳しく解説すると、3-way の MD5 チェックサムの比較は以下のどれかに当てはまることになります:
- original = X, current = X, new = X
- 3つのバージョンのファイルは全て同じ中身で、上書きしても問題ありません。現在のバージョンは新しいバージョンで上書きされユーザーには通知されません (ファイルの中身が同じ場合でも、ファイルのインストール時刻・修正時刻・アクセス時刻などのファイルシステム情報は更新され、ファイルのパーミッションが変更されている場合、全て適用されます)。
- 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
- 3つのバージョン全てが異なっています。現在のバージョンはそのまま維持され、新しいバージョンは .pacnew 拡張子を付けてインストールされます。またユーザーに新しいバージョンについて警告が表示されます。新しいバージョンから現在のバージョンへ必要な変更を手動でマージする必要があります。
稀に、アップグレードされたパッケージに以前のバージョンには無かったバックアップファイルが含まれていることがありますが、この場合は X/Y/Y か X/Y/Z として正しく処理されます (ここで X は存在しない値)。
.pacsave
backup
で指定されているファイルのどれかをユーザーが編集した場合、そのファイルは .pacsave 拡張子が付けられた名前に変更され、パッケージが削除された後もファイルシステムに残り続けます。
.pac* ファイルの検索
Pacman は .pacnew を自動的に処理しません。あなた自身でこれらのファイルを管理する必要があります。次のセクションではいくつかのツールが紹介されています。管理を手動で行うには、まずファイルを確認しなくてはならないでしょう。多数のパッケージを更新・削除した時は、更新された .pac* ファイルを見落とすかもしれません。.pac* ファイルがインストールされているかどうか調べる方法としては、以下があります:
- グローバルな設定ファイルのほとんどが保存されている
/etc
ディレクトリを調べるには、以下のコマンドを実行してください:# find /etc -name '*.pacnew' -o -name '*.pacsave'
ディスク全体を調べるには、コマンドの/etc
の部分を/
に置き換えてください (この場合、検索を高速化させるために特定のディレクトリの検索をスキップすると良いかもしれません)。 - インストールされているならば、locate を使っても良いです。まず、データベースを再インデックス化してください:
# updatedb
次に以下のコマンドを実行してください:$ locate --existing '*.pacnew' '*.pacsave'
- Pacman のログを使って見つけるには:
$ grep '\.pacnew\|\.pacsave' /var/log/pacman.log
注意点としてこのログは、ファイルシステム上に現在存在している .pac* ファイルと、既に削除された .pac* ファイルを把握していません。上記のコマンドによって表示されるものは、システム上に一度でも存在していたことのある .pac* ファイルです。最近の10個の .pac* ファイルのみを表示するには、コマンドの出力をパイプでtail
に繋げてください。
.pac* ファイルの管理
pacdiff
pacman-contrib パッケージは、.pac* ファイルを管理するためのシンプルな pacdiff(8) ツールを提供しています。このツールは、全ての .pacnew ファイルと .pacsave ファイルを検索し、それぞれに対してどのような操作を行うか尋ねます。デフォルトでは vimdiff が使用されますが、DIFFPROG=your_editor pacdiff
のように環境変数を設定することで他のツールを指定することもできます。その他の一般的な比較ツールについては アプリケーション一覧/ユーティリティ#Comparison, diff, merge を参照してください。
サードパーティのユーティリティ
.pac* の管理を様々なレベルで自動化するサードパーティのユーティリティが、いくつか存在します:
- dotpac — ベーシックな対話スクリプト。ncurses ベースのテキストインターフェイスで、便利なチュートリアルがあります。マージ機能や自動マージ機能は存在しません。
- etc-update — Gentoo のユーティリティですが、Arch も含めて他のディストリビューションとの互換性があります。変更を表示、マージ、そして対話的に編集することができるシンプルな CLI を提供します。些細な変更 (コメントなど) は自動的にマージさせることができます。
- p3wm — .pacnew ファイルを 3-way merge します。些細な変更は自動的にマージさせることができます。コンフリクトが発生した場合、vimdiff、meld、kdiff3 のどれかを起動します。
- pacnews-git — 全ての .pacnew ファイルを見つけ、vimdiff で編集するためのシンプルなスクリプト。
- pacfiles-mode — Emacs で .pacnew ファイルの管理とマージをするためのパッケージ。
- https://github.com/UndeadKernel/pacfiles-mode || available in melpa
- pacdiff-pacman-hook-git — pacdiff を自動的に実行する pacman フック。
参照
- フォーラムスレッド: Dealing with .pacnew files