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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(update Pkg/AUR templates)
(TranslationStatus)
 
(5人の利用者による、間の13版が非表示)
1行目: 1行目:
  +
{{Lowercase title}}
[[Category:パッケージ管理]]
 
  +
[[Category:パッケージマネージャー]]
[[cs:Pacnew and Pacsave Files]]
 
 
[[de:Pacnew- und Pacsave-Dateien]]
 
[[de:Pacnew- und Pacsave-Dateien]]
[[en:Pacnew and Pacsave Files]]
+
[[en:Pacman/Pacnew and Pacsave]]
[[es:Pacnew and Pacsave Files]]
+
[[es:Pacman (Español)/Pacnew and Pacsave]]
  +
[[fr:Pacman (Français)/Pacnew and Pacsave]]
[[fr:Gestion des fichiers de configurations]]
 
[[it:Pacnew and Pacsave Files]]
+
[[pt:Pacman (Português)/Pacnew and Pacsave]]
[[ru:Pacnew and Pacsave files]]
+
[[ru:Pacman (Русский)/Pacnew and Pacsave]]
  +
[[zh-hans:Pacman/Pacnew and Pacsave]]
== はじめに ==
 
pacman がパッケージを削除するとき設定ファイルがある場合通常はその設定ファイルのバックアップコピー作成されファイルの名前に .pacsave が付けられます。
+
''pacman'' は、設定ファイル存在するパッケージを削除するに、その設定ファイルのバックアップコピー作成します。この時、バックアップファイルの名前に ''.pacsave'' という接尾辞が付けられます。同じように、パッケージをアップグレードする際に、ファイルシステム上に既に存在している設定ファイルの内容が、パッケージに含まれる新しい設定ファイルと異なる場合、新しい方の設定ファイルが ''.pacnew'' ファイルとして保存されます。''pacman'' は、これらのファイルが作成された際に警告を表示します。
   
  +
== これらのファイルが作成される理由 ==
同じく、pacman がパッケージを更新するときに現在インストールされているファイルとは異なる新しいファイルがメンテナによって作成されている場合、.pacnew 設定ファイルを書き出します。場合によっては、特別な事情がある場合、.pacorig ファイルが作成されます。Pacman はこれらのファイルが書きだされた時に警告を表示します。
 
   
{{ic|.pacnew}} ファイルはパッケージを更新したときに ({{Ic|pacman -Syu}}, {{Ic|pacman -Su}}, {{Ic|pacman -U}}) 既に存在(ユーザーによって編集された)ファイルを上書きしないために作成されます。この時 pacman は以下のようなメッセージを出力します:
+
''.pacnew'' ファイルはにファイルシステム上に存在してい変更済みの設定ファイルを上書きしないようにするために、パッケージの更新時に作成されます。この時、''pacman'' は以下のようなメッセージを出力します:
   
warning: /etc/pam.d/usermod installed as /etc/pam.d/usermod.pacnew
+
警告: /etc/pam.d/usermod /etc/pam.d/usermod.pacnew としてインストールされました
   
{{ic|.pacsave}} ファイルはパッケージ削除したり ({{Ic|pacman -R}}) ジを更新するときに (最初にパッケージ削除する必要があります) 作成されます。pacman データベースがパッケージによっ所有されているファイルを記録していときにバックアップされ {{ic|.pacsave}} ファイルが作成されます。この時 pacman は以下のようなメッセージを出力します:
+
''.pacsave'' ファイルはパッケージ削除 ({{ic|pacman -R}}) とアプグレド時作成されます (アップグレード時パッケージが一度削除されるため)''pacman'' は、パッケージを削除する際、データベースを調べバックアップすべきファイルが存在すか判断します。そのようなファイル対しては、バックアップとして ''.pacsave'' ファイルが作成されます。この時、''pacman'' は以下のようなメッセージを出力します:
   
warning: /etc/pam.d/usermod saved as /etc/pam.d/usermod.pacsave
+
警告: /etc/pam.d/usermod /etc/pam.d/usermod.pacsave として保存されました
   
これらのファイルはユーザによる手動操作必要としており、パッケージを更新・削除した後はこれらのファイルにすぐ対処すると良いでしょう。放置していると、正しく設定によってソフトウェアの誤動作を招いたり、ソフトウェアが実行できなくなったりすることがあります。
+
これらのファイルに対してはユーザによる手動操作必要であり、パッケージのアップグレードや削除後は即座にこれらのファイルするが推奨されます。放置していると、不適切な設定によってソフトウェアの誤動作を招いたり、ソフトウェアが実行できなくなったりする可能性があります。
   
 
== パッケージのバックアップファイル ==
 
== パッケージのバックアップファイル ==
   
パッケージの {{ic|PKGBUILD}} ファイルはパッケージを更新・削除したときどのファイルを存・バックアップするべきが指定されています。例えば {{ic|pulseaudio}} の{{ic|PKGBUILD}} にはの行が含まれています:
+
パッケージの [[PKGBUILD]] ファイルパッケージをアップグレードまたは削除したに保持またはバックアップするべきファイルが指定されていることがあります。例えば{{pkg|pulseaudio}} の PKGBUILD には以下の行が含まれています:
   
backup=('etc/pulse/client.conf' 'etc/pulse/daemon.conf' 'etc/pulse/default.pa')
+
backup=(etc/pulse/{daemon.conf,default.pa,system.pa})
  +
  +
パッケージのインストール後、{{ic|pacman -Qii ''package_name''}} を実行することで、pacman データベースからバックアップすべきファイルのリストを取得できます。
  +
  +
パッケージの操作時に特定のファイルを上書きしないようにするには、[[Pacman#アップグレードさせないファイルを設定]] を参照してください。
   
 
== タイプの説明 ==
 
== タイプの説明 ==
   
  +
=== .pacnew ===
*.pac* ファイルにはさまざまなタイプがあります。
 
   
  +
パッケージに含まれている[[#パッケージのバックアップファイル|バックアップファイル]]が更新されると、pacman はファイルの中身から生成される3つの [[wikipedia:Md5sum|md5sum]] を相互に比較します: 1つは更新前のパッケージによってインストールされた元のバージョンのチェックサム、1つはファイルシステムに存在する現在のバージョンのチェックサム、そしてもう1つは新しいパッケージに含まれているバージョンのチェックサムです。ファイルシステムに存在する現在のバージョンのファイルがパッケージによってインストールされる元のバージョンから修正されている場合、pacman は修正を新しいバージョンのファイルにマージする方法を知り得ません。従って、更新するとき、修正されたファイルを上書きする代わりに pacman は ''.pacnew'' 拡張子が付いた新しいバージョンを保存し、修正されたバージョンには手を付けないでおきます。
===.pacnew===
 
   
  +
{{Note|パッケージのインストールにより、他のパッケージによって所有されているファイルが変更される場合があります。例としては、{{Bug|77404}} を参照してください。そのため、手動で変更が加えられていないファイルに対しても ''.pacnew'' ファイルが作成されることがあります。}}
パッケージの {{ic|backup}} ファイルが更新されると、pacman はファイルの中身から生成される3つの [[wikipedia:Md5sum|md5sum]] を相互に比較します: 1つはパッケージによってインストールされる元のバージョンのチェックサム、1つはファイルシステムに存在する現在のバージョンのチェックサム、そして1つは新しいパッケージのバージョンのチェックサム。ファイルシステムに存在する現在のバージョンのファイルがパッケージによってインストールされる元のバージョンから修正されている場合、pacman は修正を新しいバージョンのファイルにマージする方法を知り得ません。従って、更新するとき、修正されたファイルを上書きする代わりに pacman は {{ic|.pacnew}} 拡張子が付いた新しいバージョンを保存し、修正されたバージョンには手を付けないでおきます。
 
   
もっと詳しく言うと、3-way の MD5 チェックサムの比較は以下の結果のどれかになります:
+
もっと詳しく解説すると、3-way の MD5 チェックサムの比較は以下のどれかに当てはまることになります:
   
; original = ''X'', current = ''X'', new = ''X'' : つのバージョンのファイルは全て同じ中身で、上書きしても問題ありません。現在のバージョンは新しいバージョンで上書きされユーザーには通知されません (ファイルの中身が同じだとしても、ファイルのインストール・修正・アクセス時刻などファイルシステム情報は更新されますし、ファイルのパーミッション変更全て適用されます)。
+
; original = ''X'', current = ''X'', new = ''X'' : 3つのバージョンのファイルは全て同じ中身で、上書きしても問題ありません。現在のバージョンは新しいバージョンで上書きされユーザーには通知されません (ファイルの中身が同じ場合でも、ファイルのインストール時刻・修正時刻・アクセス時刻などファイルシステム情報は更新され、ファイルのパーミッション変更されている場合、全て適用されます)。
   
; original = ''X'', current = ''X'', new = ''Y'' : 現在のバージョンの中身は元のバージョンと同じですが、新しいバージョン異なっています。ユーザーが現在のバージョンを修正しておらず、新しいバージョンには改善やバグフィックスが含まれていることがあるので、新しいバージョンによって現在のバージョンは上書きされユーザーには通知されません。これは pacman が実行できる唯一の自動マージです。
+
; original = ''X'', current = ''X'', new = ''Y'' : 現在のバージョンの中身は元のバージョンと同じですが、新しいバージョンとは異なっています。ユーザーが現在のバージョンを修正しておらず、新しいバージョンには改善やバグフィックスが含まれていることがあるので、新しいバージョンによって現在のバージョンは上書きされユーザーには通知されません。これは pacman が実行できる唯一の自動マージです。
   
 
; original = ''X'', current = ''Y'', new = ''X'' : 元のパッケージと新しいパッケージは全く同じバージョンのファイルを含んでいますが、ファイルシステムにある現在のバージョンは修正されています。現在のバージョンがそのまま残され、新しいバージョンはユーザーに通知されずに処分されます。
 
; original = ''X'', current = ''Y'', new = ''X'' : 元のパッケージと新しいパッケージは全く同じバージョンのファイルを含んでいますが、ファイルシステムにある現在のバージョンは修正されています。現在のバージョンがそのまま残され、新しいバージョンはユーザーに通知されずに処分されます。
46行目: 50行目:
 
; original = ''X'', current = ''Y'', new = ''Y'' : 新しいバージョンが現在のバージョンと同一です。現在のバージョンは新しいバージョンによって上書きされユーザーには通知されません (ファイルの中身が同じだとしても、ファイルのインストール・修正・アクセス時刻などファイルシステムの情報は更新されますし、ファイルのパーミッションの変更は全て適用されます)。
 
; original = ''X'', current = ''Y'', new = ''Y'' : 新しいバージョンが現在のバージョンと同一です。現在のバージョンは新しいバージョンによって上書きされユーザーには通知されません (ファイルの中身が同じだとしても、ファイルのインストール・修正・アクセス時刻などファイルシステムの情報は更新されますし、ファイルのパーミッションの変更は全て適用されます)。
   
; original = ''X'', current = ''Y'', new = ''Z'' : つのバージョン全てが異なっています。現在のバージョンはそのまま維持され、新しいバージョンは {{ic|.pacnew}} 拡張子を付けてインストールされます。またユーザーに新しいバージョンについて警告が表示されます。新しいバージョンから現在のバージョンへ必要な変更を手動でマージする必要があります。
+
; original = ''X'', current = ''Y'', new = ''Z'' : 3つのバージョン全てが異なっています。現在のバージョンはそのまま維持され、新しいバージョンは ''.pacnew'' 拡張子を付けてインストールされます。またユーザーに新しいバージョンについて警告が表示されます。新しいバージョンから現在のバージョンへ必要な変更を手動でマージする必要があります。
 
===.pacsave===
 
 
{{ic|backup}} に指定されているファイルのどれかをユーザーが編集した場合、そのファイルは {{ic|.pacsave}} 拡張子が付けられた名前に変更されパッケージが削除された後もファイルシステムに残り続けます。
 
 
{{Note|{{ic|-n}} オプションを付けて {{ic|pacman -R}} を実行すると指定されたパッケージの''全ての''ファイルが完全に削除されます。従って {{ic|.pacsave}} ファイルは作成されません。}}
 
 
===.pacorig===
 
 
パッケージのインストールや更新で、あるファイルが (通常 {{ic|/etc}} にある設定) インストールされているどのパッケージにも属さず、しかしながらそのパッケージの {{ic|backup}} に含まれている状態になった場合、ファイルは {{ic|'''.pacorig'''}} 拡張子で保存されパッケージにあるバージョンのファイルで置き換えられます。設定ファイルがあるパッケージから他のパッケージに移動したときに通常起こります。そのようなファイルが {{ic|backup}} になかった場合、pacman はファイルの衝突エラーで操作を中断します。
 
 
{{Note|{{ic|.pacorig}} ファイルは特別なときにだけ作られるので、このファイルに対処する普遍的な方法は存在しません。既知の問題の場合、おそらく [https://www.archlinux.org/news/ Arch News] に対処する手段が書かれています。}}
 
 
== .pac* ファイルの検索==
 
 
Arch Linux は {{ic|.pacnew}} ファイルのための公式ユーティリティを提供していません。あなた自身でこれらのファイルを管理する必要があります; 次のセクションではいくつかのツールが紹介されています。管理を手動で行うには、まずファイルを確認しなくてはならないでしょう。多数のパッケージを更新・削除した時は、更新された *.pac* ファイルを見落とすかもしれません。{{ic|*.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)$"
 
   
  +
稀に、アップグレードされたパッケージに以前のバージョンには無かったバックアップファイルが含まれていることがありますが、この場合は X/Y/Y か X/Y/Z として正しく処理されます (ここで X は存在しない値)。
または pacman のログを使ってファイルを見つけて下さい:
 
   
  +
=== .pacsave ===
$ egrep "pac(new|orig|save)" /var/log/pacman.log
 
   
  +
{{ic|backup}} で指定されているファイルのどれかをユーザーが編集した場合、そのファイルは ''.pacsave'' 拡張子が付けられた名前に変更され、パッケージが削除された後もファイルシステムに残り続けます。
ログにはファイルシステムにある現在のファイルや既に削除されているファイルの記録は保存していないので注意してください。
 
   
  +
{{Note|{{ic|pacman -R}} で {{ic|-n}} オプションを使うと、指定されたパッケージに含まれる''全ての''ファイルが完全に削除されます。従って、''.pacsave'' ファイルは作成されません。}}
== .pacnew ファイルの管理 ==
 
   
  +
== .pac* ファイルの検索 ==
.pacnew や .pacsave ファイルの問題の解決を補助する様々なツールがあります。標準の diff ユーティリティ (または、colordiff) を使えば簡単にファイルを比較できます。[https://github.com/pbrisbin/scripts/blob/master/pacnews pacnews bash script] は同じような機能を提供します。pacdiff と pacnews はどちらも vimdiff を使って .pacnew や .pacsave ファイルを比較・編集します。
 
   
  +
Pacman は ''.pacnew'' を自動的に処理しません。あなた自身でこれらのファイルを管理する必要があります。次のセクションではいくつかのツールが紹介されています。管理を手動で行うには、まずファイルを確認しなくてはならないでしょう。多数のパッケージを更新・削除した時は、更新された ''.pac*'' ファイルを見落とすかもしれません。''.pac*'' ファイルがインストールされているかどうか調べる方法としては、以下があります:
存在する {{ic|.pacnew}} ファイルを全て確認したら、ユーザーは [[Vim#ファイルのマージ (vimdiff)|vimdiff]], ediff ([[Emacs|emacs]] に含まれています), {{Pkg|meld}} (GNOME の GUI ツール), sdiff ({{Pkg|diffutils}} に含まれています), {{Pkg|kompare}} (KDE の GUI ツール) などの一般的なマージツールを使って手動で対処し、その後 {{ic|.pacnew}} ファイルを削除することができます。
 
   
  +
* グローバルな設定ファイルのほとんどが保存されている {{ic|/etc}} ディレクトリを調べるには、以下のコマンドを実行してください: {{bc|# find /etc -name '*.pacnew' -o -name '*.pacsave'}} ディスク全体を調べるには、コマンドの {{ic|/etc}} の部分を {{ic|/}} に置き換えてください (この場合、検索を高速化させるために[https://stackoverflow.com/a/4210072 特定のディレクトリの検索をスキップする]と良いかもしれません)。
以上の作業において個々のレベルの自動化を提供するサードパーティのユーティリティが [[Arch User Repository#.5Bcommunity.5D|community リポジトリ]]や [[Arch User Repository|AUR]] から利用可能です。
 
  +
* インストールされているならば、[[locate]] を使っても良いです。まず、データベースを再インデックス化してください: {{bc|# updatedb}} 次に以下のコマンドを実行してください: {{bc|$ locate --existing '*.pacnew' '*.pacsave'}}
  +
* Pacman のログを使って見つけるには: {{bc|$ grep '\.pacnew\{{!}}\.pacsave' /var/log/pacman.log}} 注意点としてこのログは、ファイルシステム上に現在存在している ''.pac*'' ファイルと、既に削除された ''.pac*'' ファイルを把握していません。上記のコマンドによって表示されるものは、システム上に一度でも存在していたことのある ''.pac*'' ファイルです。最近の10個の ''.pac*'' ファイルのみを表示するには、コマンドの出力をパイプで {{ic|tail}} に繋げてください。
   
  +
== .pac* ファイルの管理 ==
*pacdiff - {{Pkg|pacman}} パッケージに含まれている最小の CLI スクリプト。pacnew や pacsave ファイルを全て検索し、それぞれのファイルをどうするか尋ねます。
 
*{{AUR|pacmerge-git}}{{Broken package link|{{aur-mirror|pacmerge-git}}}} - CLI 対話式マージプログラム
 
*[[Vim#ファイルのマージ (vimdiff)|Vimdiff]] - ファイルのマージ用に特別に作られた Vim
 
*[[Dotpac]] - ncurses ベースのテキストインターフェイスと便利なウォークスルーを持ったベーシックな対話式スクリプト。マージや自動マージ機能はありません。
 
*pacdiffviewer - 自動マージができるフル機能の対話式 CLI スクリプト。{{AUR|yaourt}} パッケージに含まれています。
 
*{{AUR|diffpac}}{{Broken package link|{{aur-mirror|diffpac}}}} - スタンドアロンの pacdiffviewer 代替
 
*[[Yaourt|Yaourt]] - AUR リポジトリをサポートしているパッケージマネージャ。{{ic|yaourt -C}} を使って設定ファイルの比較・置換・マージなどができます。
 
*{{AUR|etc-update}} - [http://www.gentoo.org/doc/en/handbook/handbook-amd64.xml?part=3&chap=4#doc_chap2 Gentoo の etc-update] ユーティリティの Arch 移植版、対話式の編集や変更のマージ・回覧、些細な変更 (例: コメント) の自動マージなどができるシンプルな CLI を提供します。他のツールとは違い、あなたに新しいエディタを覚えるようしむけるのではなく好みのテキストエディタを使うことができます。
 
*{{Pkg|meld}} - グラフィカルインターフェイスによって2つ(もしくはそれ以上)のファイルを横に並べて比較・編集できる使いやすいプログラム。開いたファイルの違いを色でハイライトします。
 
*{{AUR|pacnews-git}} - {{ic|.pacnew}} ファイルを全て探し、{{ic|vimdiff}} で編集するシンプルなスクリプト。下の {{ic|meld}} を使ったスクリプトとは違います。
 
   
  +
{{Note|ファイルを手動で編集していない場合でも、闇雲に現在のファイルを ''.pacnew'' のバージョンで上書きしないでください。必ずファイルを比較して、手動で変更をマージしてください。}}
=== Meld を使って差異を更新する ===
 
   
  +
=== pacdiff ===
meld をループで使って設定ファイルの更新をするスクリプトです。ループでそれぞれの {{Ic|.pacnew}} ファイルを削除するか尋ねます。
 
   
  +
{{pkg|pacman-contrib}} パッケージは、''.pac*'' ファイルを管理するためのシンプルな {{man|8|pacdiff}} ツールを提供しています。このツールは、全ての ''.pacnew'' ファイルと ''.pacsave'' ファイルを検索し、それぞれに対してどのような操作を行うか尋ねます。デフォルトでは [[Vim#ファイルのマージ|vimdiff]] が使用されますが、{{ic|1=DIFFPROG=''your_editor'' pacdiff}} のように環境変数を設定することで他のツールを指定することもできます。その他の一般的な比較ツールについては [[アプリケーション一覧/ユーティリティ#Comparison, diff, merge]] を参照してください。
{{hc|pacnew|<pre>#!/bin/bash
 
# Merge new *.pacnew configuration files with their originals
 
   
  +
=== サードパーティのユーティリティ ===
pacnew=$(find /etc -type f -name "*.pacnew")
 
   
  +
''.pac*'' の管理を様々なレベルで自動化するサードパーティのユーティリティが、いくつか存在します:
# Check if any .pacnew configurations are found
 
if [[ -z "$pacnew" ]]; then
 
echo " No configurations to update"
 
fi
 
   
  +
* {{App|dotpac|ベーシックな対話スクリプト。ncurses ベースのテキストインターフェイスで、便利なチュートリアルがあります。マージ機能や自動マージ機能は存在しません。|https://github.com/AladW/dotpac|{{AUR|dotpac}}}}
for config in $pacnew; do
 
  +
* {{App|etc-update|''Gentoo'' のユーティリティですが、Arch も含めて他のディストリビューションとの互換性があります。変更を表示、マージ、そして対話的に編集することができるシンプルな CLI を提供します。些細な変更 (コメントなど) は自動的にマージさせることができます。|[[Gentoo:Handbook:Parts/Portage/Tools#etc-update]]|{{Pkg|etc-update}}}}
# Diff original and new configuration to merge
 
  +
* {{App|p3wm|''.pacnew'' ファイルを 3-way merge します。些細な変更は自動的にマージさせることができます。コンフリクトが発生した場合、vimdiff、meld、kdiff3 のどれかを起動します。|https://github.com/5long/p3wm|{{AUR|p3wm}}}}
gksudo meld ${config%\.*} $config &
 
  +
* {{App|pacnews-git|全ての ''.pacnew'' ファイルを見つけ、[[Vim#ファイルのマージ|vimdiff]] で編集するためのシンプルなスクリプト。|https://github.com/pbrisbin/scripts/blob/master/pacnews|{{AUR|pacnews-git}}}}
wait
 
  +
* {{App|pacfiles-mode|[[Emacs]] で ''.pacnew'' ファイルの管理とマージをするためのパッケージ。|https://github.com/UndeadKernel/pacfiles-mode|available in [https://melpa.org/#/pacfiles-mode melpa]}}
# Remove .pacnew file?
 
  +
* {{App|pacdiff-pacman-hook-git|pacdiff を自動的に実行する pacman フック。|https://github.com/desbma/pacman-hooks|{{AUR|pacdiff-pacman-hook-git}}}}
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</pre>}}
 
   
  +
== 参照 ==
このスクリプトはグラフィカルに sudo を使うために [[GNOME|GNOME]] の {{Ic|gksudo}} を利用しています。[[KDE|KDE]] では {{Ic|kdesu}} を使って下さい。
 
   
  +
* フォーラムスレッド: [https://bbs.archlinux.org/viewtopic.php?id=53532 Dealing with .pacnew files]
== 資料 ==
 
   
  +
{{TranslationStatus|pacman/Pacnew and Pacsave|2023-10-25|790643}}
*Arch Linux フォーラム: [https://bbs.archlinux.org/viewtopic.php?id=53532 Dealing With .pacnew Files]
 

2023年10月25日 (水) 17:31時点における最新版

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 拡張子が付いた新しいバージョンを保存し、修正されたバージョンには手を付けないでおきます。

ノート: パッケージのインストールにより、他のパッケージによって所有されているファイルが変更される場合があります。例としては、FS#77404 を参照してください。そのため、手動で変更が加えられていないファイルに対しても .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 拡張子が付けられた名前に変更され、パッケージが削除された後もファイルシステムに残り続けます。

ノート: pacman -R-n オプションを使うと、指定されたパッケージに含まれる全てのファイルが完全に削除されます。従って、.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* ファイルの管理

ノート: ファイルを手動で編集していない場合でも、闇雲に現在のファイルを .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

参照

翻訳ステータス: このページは en:pacman/Pacnew and Pacsave の翻訳バージョンです。最後の翻訳日は 2023-10-25 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。