「Pacman/Pacnew と Pacsave」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
89行目: 89行目:
   
 
== .pac* ファイルの管理 ==
 
== .pac* ファイルの管理 ==
  +
  +
{{Note|ファイルを手動で編集していない場合でも、闇雲に現在のファイルを ''.pacnew'' のバージョンで上書きしないでください。必ずファイルを比較して、手動で変更をマージしてください。}}
   
 
=== pacdiff ===
 
=== pacdiff ===
   
Pacman pacnew/pacsave ファイルを管理するためのシンプルなツールとして ''pacdiff'' が付属しています。''pacdiff'' は全ての {{ic|pacnew}}{{ic|pacsave}} ファイルを検索しファイルをどうする質問します。デフォルトでは [[Vim#ファイルのマージ (vimdiff)|vimdiff]] が使れますが、{{ic|1=DIFFPROG=your_editor pacdiff}} でのツールを指定することも可能です。他の一般的な比較ツールについては[[アプリケーション一覧/ユーティリティ#マージツール]]を参照してください。
+
{{pkg|pacman-contrib}} パッケージ、''.pac*'' ファイルを管理するためのシンプルな {{man|8|pacdiff}} ツールを提供しています。このツール全ての ''.pacnew'' ファイル''.pacsave'' ファイルを検索し、それぞれに対してのような操作を行うか尋ねます。デフォルトでは [[Vim#ファイルのマージ|vimdiff]] が使用されますが、{{ic|1=DIFFPROG=''your_editor'' pacdiff}} のように環境変数を設定することのツールを指定することもできます。その他の一般的な比較ツールについては [[アプリケーション一覧/ユーティリティ#Comparison, diff, merge]] を参照してください。
   
=== サードパーティユーティリティ ===
+
=== サードパーティユーティリティ ===
   
[[AUR]] にはマージ作業ある程度自動化するサードパーティのユーティリティが存在します。以下のツールを使うことができます:
+
''.pac*'' の管理様々なレベルで自動化するサードパーティのユーティリティが、いくつか存在します:
   
*{{App|dotpac|ncurses ベースのテキストインターフェイスと分かりやすいウォークスルーによる基礎的対話スクリプト。マージや自動マージ機能は備えていません。|https://github.com/AladW/dotpac|{{AUR|dotpac}}}}
+
* {{App|dotpac|ベーシックな対話スクリプト。ncurses ベースのテキストインターフェイスで、便利チューリアルがあります。マージ機能や自動マージ機能は存在しません。|https://github.com/AladW/dotpac|{{AUR|dotpac}}}}
*{{App|etc-update|Gentoo の ''etc-update'' ユーティリティArch 移植。シンプルな CLI を使って変更を表示マージ編集することができます。些細な変更 (コメントの追加など) は自動的にマージることができます。|3=https://wiki.gentoo.org/wiki/Handbook:Parts/Portage/Tools#etc-update|4={{AUR|etc-update}}}}
+
* {{App|etc-update|''Gentoo'' ユーティリティですが、Arch も含めて他のディストリビューとの互換性があります。変更を表示マージ、そして対話的に編集することができるシンプルな CLI を提供します。些細な変更 (コメントなど) は自動的にマージさせることができます。|[[Gentoo:Handbook:Parts/Portage/Tools#etc-update]]|{{Pkg|etc-update}}}}
*{{App|p3wm|3方向マージ ''.pacnew'' を使って小さな変更自動的にマージできます。競合が発生した場合 vimdiff、 meld、 または kdiff3 を起動して解決します。|https://github.com/5long/p3wm| {{AUR|p3wm}}}}
+
* {{App|p3wm|''.pacnew'' ファイル 3-way merge します。些細な変更自動的にマージさせることができます。コンフリクトが発生した場合、vimdiff、meld、kdiff3 のどれかを起動します。|https://github.com/5long/p3wm|{{AUR|p3wm}}}}
*{{App|pacfiles-mode|''.pacnew'' ファイルを管理しマージするためのパッケージで、 [https://melpa.org/#/pacfiles-mode melpa] から入手できます。|https://github.com/UndeadKernel/pacfiles-mode}}
+
* {{App|pacnews-git|全ての ''.pacnew'' ファイルを見つけ、[[Vim#ファイルのマージ|vimdiff]] で編集するためのシンプルなスクリプト。|https://github.com/pbrisbin/scripts/blob/master/pacnews|{{AUR|pacnews-git}}}}
*{{App|pacnews-git|''.pacnew'' ファイルを全て検索して [[Vim#ファイルのマージ (vimdiff)|vimdiff]] で編集するシンプルなスクリプト。|https://github.com/pbrisbin/scripts/blob/master/pacnews|{{AUR|pacnews-git}}}}
+
* {{App|pacfiles-mode|[[Emacs]] で ''.pacnew'' ファイルの管理とマージするためのパッケージ。|https://github.com/UndeadKernel/pacfiles-mode|available in [https://melpa.org/#/pacfiles-mode melpa]}}
  +
* {{App|pacdiff-pacman-hook-git|pacdiff を自動的に実行する pacman フック。|https://github.com/desbma/pacman-hooks|{{AUR|pacdiff-pacman-hook-git}}}}
   
 
== 参照 ==
 
== 参照 ==

2023年10月23日 (月) 18:34時点における版

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#アップグレードさせないファイルを設定 を参照してください。

タイプの説明

.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* ファイルの管理

ノート: ファイルを手動で編集していない場合でも、闇雲に現在のファイルを .pacnew のバージョンで上書きしないでください。必ずファイルを比較して、手動で変更をマージしてください。

pacdiff

pacman-contrib パッケージは、.pac* ファイルを管理するためのシンプルな pacdiff(8) ツールを提供しています。このツールは、全ての .pacnew ファイルと .pacsave ファイルを検索し、それぞれに対してどのような操作を行うか尋ねます。デフォルトでは vimdiff が使用されますが、DIFFPROG=your_editor pacdiff のように環境変数を設定することで他のツールを指定することもできます。その他の一般的な比較ツールについては アプリケーション一覧/ユーティリティ#Comparison, diff, merge を参照してください。

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

.pac* の管理を様々なレベルで自動化するサードパーティのユーティリティが、いくつか存在します:

  • dotpac — ベーシックな対話スクリプト。ncurses ベースのテキストインターフェイスで、便利なチュートリアルがあります。マージ機能や自動マージ機能は存在しません。
https://github.com/AladW/dotpac || dotpacAUR
  • etc-updateGentoo のユーティリティですが、Arch も含めて他のディストリビューションとの互換性があります。変更を表示、マージ、そして対話的に編集することができるシンプルな CLI を提供します。些細な変更 (コメントなど) は自動的にマージさせることができます。
Gentoo:Handbook:Parts/Portage/Tools#etc-update || etc-update
  • p3wm.pacnew ファイルを 3-way merge します。些細な変更は自動的にマージさせることができます。コンフリクトが発生した場合、vimdiff、meld、kdiff3 のどれかを起動します。
https://github.com/5long/p3wm || p3wmAUR
  • pacnews-git — 全ての .pacnew ファイルを見つけ、vimdiff で編集するためのシンプルなスクリプト。
https://github.com/pbrisbin/scripts/blob/master/pacnews || pacnews-gitAUR
  • pacfiles-modeEmacs.pacnew ファイルの管理とマージをするためのパッケージ。
https://github.com/UndeadKernel/pacfiles-mode || available in melpa
  • pacdiff-pacman-hook-git — pacdiff を自動的に実行する pacman フック。
https://github.com/desbma/pacman-hooks || pacdiff-pacman-hook-gitAUR

参照