Pacman/Pacnew と Pacsave
目次
はじめに
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 を相互に比較します: 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
拡張子が付けられた名前に変更されパッケージが削除された後もファイルシステムに残り続けます。
.pacorig
パッケージのインストールや更新で、あるファイルが (通常 /etc
にある設定) インストールされているどのパッケージにも属さず、しかしながらそのパッケージの backup
に含まれている状態になった場合、ファイルは .pacorig
拡張子で保存されパッケージにあるバージョンのファイルで置き換えられます。設定ファイルがあるパッケージから他のパッケージに移動したときに通常起こります。そのようなファイルが backup
になかった場合、pacman はファイルの衝突エラーで操作を中断します。
.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-gitAUR - CLI 対話式マージプログラム
- Vimdiff - ファイルのマージ用に特別に作られた Vim
- Dotpac - ncurses ベースのテキストインターフェイスと便利なウォークスルーを持ったベーシックな対話式スクリプト。マージや自動マージ機能はありません。
- pacdiffviewer - 自動マージができるフル機能の対話式 CLI スクリプト。yaourtAUR パッケージに含まれています。
- diffpacAUR - スタンドアロンの pacdiffviewer 代替
- Yaourt - AUR リポジトリをサポートしているパッケージマネージャ。
yaourt -C
を使って設定ファイルの比較・置換・マージなどができます。 - etc-updateAUR - Gentoo の etc-update ユーティリティの Arch 移植版、対話式の編集や変更のマージ・回覧、些細な変更 (例: コメント) の自動マージなどができるシンプルな CLI を提供します。他のツールとは違い、あなたに新しいエディタを覚えるようしむけるのではなく好みのテキストエディタを使うことができます。
- meld - グラフィカルインターフェイスによって2つ(もしくはそれ以上)のファイルを横に並べて比較・編集できる使いやすいプログラム。開いたファイルの違いを色でハイライトします。
- pacnews-gitAUR -
.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