Pacman/Pacnew と Pacsave

提供: ArchWiki
2021年6月19日 (土) 15:11時点におけるKgx (トーク | 投稿記録)による版 (→‎.pacnew ファイルの管理: 項目を英語版と同期して情報を更新)
ナビゲーションに移動 検索に移動

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

pacman によって作成されたこれらのファイルはユーザーによる手動の操作を必要としており、パッケージを更新・削除した後はファイルを即座に処理することが良いとされます。放置していると、不適切な設定によってソフトウェアの誤動作を招いたり、ソフトウェアが実行できなくなったりする可能性があります。

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

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

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

タイプの説明

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

.pacnew

パッケージに含まれている backup ファイルが更新されると、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 拡張子を付けてインストールされます。またユーザーに新しいバージョンについて警告が表示されます。新しいバージョンから現在のバージョンへ必要な変更を手動でマージする必要があります。

.pacsave

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

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

.pac* ファイルの検索

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

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

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

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

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

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

# updatedb

そして:

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

または pacman のログからファイルを見つける方法もあります:

$ grep --extended-regexp "pac(new|save)" /var/log/pacman.log

ログにはファイルシステムにある現在のファイルや既に削除されているファイルの記録は保存していないので注意してください。上記のコマンドはシステムに存在していた全ての *.pac* ファイルを表示します。

tail コマンドを使うことで一番最近の10個の *.pac* ファイルに絞ることができます:

$ grep --extended-regexp "pac(new|save)" /var/log/pacman.log | tail

.pac* ファイルの管理

pacdiff

Pacman には pacnew/pacsave ファイルを管理するためのシンプルなツールとして pacdiff が付属しています。pacdiff は全ての pacnewpacsave ファイルを検索して、ファイルをどうするか質問します。デフォルトでは vimdiff が使われますが、DIFFPROG=your_editor pacdiff で別のツールを指定することも可能です。他の一般的な比較ツールについてはアプリケーション一覧/ユーティリティ#マージツールを参照してください。

サードパーティユーティリティ

AUR にはマージ作業をある程度自動化するサードパーティのユーティリティが存在します。以下のツールを使うことができます:

  • dotpac — ncurses ベースのテキストインターフェイスと分かりやすいウォークスルーによる基礎的な対話スクリプト。マージや自動マージ機能は備えていません。
https://github.com/AladW/dotpac || dotpacAUR
  • etc-update — Gentoo の etc-update ユーティリティの Arch 移植。シンプルな CLI を使って変更を表示・マージ・編集することができます。些細な変更 (コメントの追加など) は自動的にマージすることができます。
https://wiki.gentoo.org/wiki/Handbook:Parts/Portage/Tools#etc-update || etc-updateAUR
  • p3wm — 3方向マージ .pacnew を使って小さな変更を自動的にマージできます。競合が発生した場合は、 vimdiff、 meld、 または kdiff3 を起動して解決します。
https://github.com/5long/p3wm || p3wmAUR
  • pacfiles-mode.pacnew ファイルを管理しマージするためのパッケージで、 melpa から入手できます。
https://github.com/UndeadKernel/pacfiles-mode || パッケージが存在しないか AUR で検索
  • pacnews-git.pacnew ファイルを全て検索して vimdiff で編集するシンプルなスクリプト。
https://github.com/pbrisbin/scripts/blob/master/pacnews || pacnews-gitAUR

参照