「Pacman/ヒントとテクニック」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(文字列「http://github.com/」を「https://github.com/」に置換)
(冒頭に pacman のリンクを追加)
 
(8人の利用者による、間の95版が非表示)
1行目: 1行目:
  +
{{Lowercase title}}
[[Category:パッケージ管理]]
 
  +
[[Category:パッケージマネージャー]]
[[en:Pacman/Tips and tricks]]
 
[[es:Pacman/Tips and tricks]]
+
[[de:Pacman-Tipps]]
[[fr:Astuces Pacman]]
+
[[en:pacman/Tips and tricks]]
[[it:Pacman/Tips and tricks]]
+
[[es:Pacman (Español)/Tips and tricks]]
[[ru:Pacman/Tips and tricks]]
+
[[fr:Pacman (Français)/Tips and tricks]]
[[tr:Pacman ipuçları]]
+
[[pt:Pacman (Português)/Tips and tricks]]
  +
[[ru:Pacman (Русский)/Tips and tricks]]
 
[[zh-hans:Pacman/Tips and tricks]]
 
[[zh-hans:Pacman/Tips and tricks]]
 
{{Related articles start}}
 
{{Related articles start}}
{{Related|pacman}}
 
 
{{Related|ミラー}}
 
{{Related|ミラー}}
 
{{Related|パッケージの作成}}
 
{{Related|パッケージの作成}}
 
{{Related articles end}}
 
{{Related articles end}}
以下のヒントや pacman 自体の柔軟性を広げる汎用的な手法については、[[Core Utilities]] や [[Bash]] を見てください。
+
以下のヒントや [[pacman]] 自体の柔軟性を広げる汎用的な手法については、[[Core Utilities]] や [[Bash]] を見てください。
   
  +
== メンテナンス ==
== 外観と利便性の向上 ==
 
   
  +
{{Note|以下のセクションで使われている ''comm'' コマンド (入力が ''sort'' でソートされている必要があります) の代わりに、{{ic|grep -Fxf}} や {{ic|grep -Fxvf}} を使うこともできます。}}
=== グラフィカルフロントエンド ===
 
   
  +
[[システムメンテナンス]]も参照。
* {{App|Discover|KDE のパッケージ管理ツールのコレクション。PackageKit を使用。|https://projects.kde.org/projects/kde/workspace/discover|{{Pkg|discover}}}}
 
* {{App|GNOME packagekit|GTK ベースのパッケージ管理ツール。|http://www.freedesktop.org/software/PackageKit/|{{Pkg|gnome-packagekit}}}}
 
* {{App|GNOME Software|Gnome ソフトウェアアプリ (GNOME の精選ソフトウェアコレクション)。|https://wiki.gnome.org/Apps/Software|{{pkg|gnome-software}}}}
 
* {{App|pcurses|curses フロントエンドのパッケージ管理ツール。|https://github.com/schuay/pcurses|{{Pkg|pcurses}}}}
 
* {{App|tkPacman|Tcl/Tk と X11 にしか依存せず、CLI の ''pacman'' を使ってパッケージデータベースを操作できるソフトウェア。|https://sourceforge.net/projects/tkpacman|{{AUR|tkpacman}}}}
 
   
=== ティティ ===
+
=== パッケジをストアップ ===
* {{App|Arch-Update|Gnome-Shell のアップデートインジケータ。|https://github.com/RaphaelRochet/arch-update|{{AUR|gnome-shell-extension-arch-update}}}}
 
* {{App|Lostfiles|孤立したファイルを検知するスクリプト。|https://github.com/graysky2/lostfiles|{{AUR|lostfiles}}}}
 
* {{App|[[Arch Linux の安定化#pacmatic の使用|Pacmatic]]|アップグレードの前に Arch ニュースをチェックして、設定ファイルの変更を警告する pacman ラッパ。|http://kmkeen.com/pacmatic|{{Pkg|pacmatic}}}}
 
* {{App|Pactoys|リポジトリマネージャ・上流リリースの確認ツール・PKGBUILD の品質チェッカなどが含まれたユーティリティセット。|https://github.com/renatosilva/pactoys}}
 
* {{App|pacutils|libalpm ベースのプログラムのヘルパーライブラリ。|https://github.com/andrewgregory/pacutils|{{AUR|pacutils-git}}}}
 
* {{App|[[pkgfile]]|あるファイルを使っているパッケージが何かを見つけるツール。|https://github.com/falconindy/pkgfile|{{Pkg|pkgfile}}}}
 
* {{App|[[pkgtools]]|Arch Linux パッケージ用のスクリプトコレクション。|https://github.com/Daenyth/pkgtools|{{AUR|pkgtools}}}}
 
* {{App|repoctl|ローカルリポジトリの管理を補助するツール。|https://github.com/cassava/repoctl|{{AUR|repoctl}}}}
 
* {{App|repose|Arch Linux リポジトリ作成ツール。|https://github.com/vodik/repose|{{Pkg|repose}}}}
 
* {{App|srcpac|ソースからのパッケージのリビルドを自動化するシンプルなツール。|https://projects.archlinux.org/srcpac.git|{{Pkg|srcpac}}{{Broken package link|パッケージが存在しません}}}}
 
* {{App|[[Snapper#pacman のトランザクションをスナップショットで記録|snap-pac]]|openSUSE の YaST のように pacman で自動的に snapper のスナップショットを作成するツール。|https://github.com/wesbarnett/snap-pac|{{Pkg|snap-pac}}}}
 
   
  +
==== 未使用のリポジトリで ====
== メンテナンス ==
 
   
  +
デフォルトでは、{{ic|pacman.conf}} に載っているリポジトリが同期、検索、インストール、アップグレードに使用されます。しかし、リポジトリの使用用途は自由に変更できます。例えば、一部のリポジトリは検索のみに使用するには[http://allanmcrae.com/2014/12/pacman-4-2-released/]:
{{Note|このセクションで使われている ''comm'' (''sort'' でソートして入力する必要があります) の代わりに、{{ic|grep -Fxf}} や {{ic|grep -Fxvf}} を使うこともできます。}}
 
   
  +
{{hc|/etc/pacman.conf|2=
[[システムメンテナンス]]も参照。
 
  +
...
  +
[multilib]
  +
Usage = Sync Search
  +
...
  +
}}
   
  +
{{man|5|pacman.conf|REPOSITORY SECTIONS}} を参照。
=== パッケージをリストアップ ===
 
  +
  +
==== バージョンも表示 ====
   
 
バグを報告したりインストールしたパッケージについて説明するときは、インストール済みのパッケージとそのバージョンのリストを貼り付けると便利です。
 
バグを報告したりインストールしたパッケージについて説明するときは、インストール済みのパッケージとそのバージョンのリストを貼り付けると便利です。
   
* 明示的にインストールしたパッケージを全てリストアップ: {{ic|pacman -Qe}}
+
* 明示的にインストールしたパッケージを全てリストアップ: {{ic|pacman -Qe}}
* 依存パッケージではない、明示的にインストーしたネイティブのパッケジ (同期データベース存在するパッケージ) を全てリストアップ: {{ic|pacman -Qent}}
+
* {{ic|''group''}} [[パッケージループ]]含まれるパッケージを全てリストアップ: {{ic|pacman -Sg ''group''}}
* 外部からインストールしたパッケージ (手動でダウンロードインストールしたパッケージ) を: {{ic|pacman -Qm}}
+
* 外部パッケージを全てリストアップ (典型的には、手動でダウンロードしてインストールしたパッケージや、ポジリから削除されたパケージです): {{ic|pacman -Qm}}
* ネイティブなパッケージ (同期データベースからインストールしたパッケージ) をリストアップ: {{ic|pacman -Qn}}
+
* ネイティブなパッケージ (同期データベースからインストールしたパッケージ) をリストアップ: {{ic|pacman -Qn}}
* 正規表現でパッケージをリストアップ: {{ic|pacman -Qs ''regex''}}
+
* 依存パッケージも任意の依存パッケージでもない、明示的にインストールしたネイティブパッケージ (同期データベースにあるパッケージ) をリストアップ: {{ic|pacman -Qent}}
* 正規表現でカスタム出力形式を使ってパッケージをリストアップ: {{ic|expac -s "%-30n %v" ''regex''}} ({{Pkg|expac}} が必要です)
+
* 正規表現にマッチするパッケージをリストアップ: {{ic|pacman -Qs ''regex''}}。
  +
* 正規表現にマッチするパッケージを、カスタムの出力フォーマットでリストアップ ({{Pkg|expac}} が必要です): {{ic|expac -s "%-30n %v" ''regex''}}
   
==== 容量でソート ====
+
==== サイズも表示 ====
   
  +
ハードドライブの容量を空けたい場合に、どのパッケージが最も大きいかを調べられると便利です。方法としては、個々のパッケージのサイズを調べる方法と、パッケージとその依存パッケージのサイズを調べる方法の2つがあります。
インストールしたパッケージのリストを容量で並び替えたい場合 (ハードドライブの空き容量を増やしたいときに有用):
 
   
  +
===== 個々のパッケージ =====
* {{Pkg|expac}} をインストールして {{ic|<nowiki>expac -H M '%m\t%n' | sort -h</nowiki>}} を実行。
 
* {{ic|-c}} オプションを付けて {{Pkg|pacgraph}} を実行。
 
   
複数パッケージのダウロー容量をリストアップするには ({{ic|''packages''}} を空にすると全てのパッケージの情報が出力されます):
+
コマンドは、インストール済みのパッケージをそサイズとともに表示します:
  +
  +
$ LC_ALL=C.UTF-8 pacman -Qi | awk '/^Name/{name=$3} /^Installed Size/{print $4$5, name}' | LC_ALL=C.UTF-8 sort -h
  +
  +
===== パッケージと依存パッケージ =====
  +
  +
パッケージのサイズを依存パッケージとともに表示する方法は2つあります:
  +
  +
* {{Pkg|expac}} をインストールして、次のように実行する: {{ic|expac -H M '%m\t%n' {{!}} sort -h}}
  +
* {{AUR|pacgraph}} で {{ic|-c}} オプションを使う。
  +
  +
複数のパッケージのダウンロードサイズをリストアップするには (全パッケージをリストアップするには {{ic|''packages''}} に何も入力しないでください):
   
 
$ expac -S -H M '%k\t%n' ''packages''
 
$ expac -S -H M '%k\t%n' ''packages''
   
{{Grp|base}} {{Grp|base-devel}} に存在しない明示的にインストールたパッケージの容量と説明リストアップするには:
+
{{Pkg|base}} [[メタパッケージ]]にも {{Grp|xorg}} [[パッケージグループ]]も属さない明示的にインストールされたパッケージをサイズと説明とともにリストアップするには:
  +
  +
$ expac -H M "%011m\t%-20n\t%10d" $(comm -23 <(pacman -Qqen | sort) <({ pacman -Qqg xorg; expac -l '\n' '%E' base; } | sort -u)) | sort -n
  +
  +
バージョンが古いくなっているパッケージをダウンロードサイズともに表示するには:
  +
  +
$ expac -S -H M '%k\t%n' $(pacman -Qqu) | sort -sh
  +
  +
任意の依存パッケージのみを表示するには:
   
  +
$ expac -S "%o" ''package''
$ expac -H M "%011m\t%-20n\t%10d" $(comm -23 <(pacman -Qqen | sort) <(pacman -Qqg base base-devel | sort)) | sort -n
 
   
==== 日付を使う ====
+
==== 日付でソート ====
   
{{Pkg|expac}} を使って最後にインストールた20のパッケージをリストアップするには、次のコマンドを実行:
+
最も最後にインストールされた20のパッケージを {{Pkg|expac}} でリストアップするには:
   
 
$ expac --timefmt='%Y-%m-%d %T' '%l\t%n' | sort | tail -n 20
 
$ expac --timefmt='%Y-%m-%d %T' '%l\t%n' | sort | tail -n 20
   
もしくはエポック秒を使って (1970-01-01 UTC):
+
あるいエポック秒 (1970-01-01 UTC) を表示するには:
   
 
$ expac --timefmt=%s '%l\t%n' | sort -n | tail -n 20
 
$ expac --timefmt=%s '%l\t%n' | sort -n | tail -n 20
   
==== 指定したグループリポジトリに存在しないパッケージ ====
+
==== 指定したグループリポジトリ、メタパッケージ含まれないパッケージ ====
   
{{Note|依存パッケージとしてインストールされたが、既にどのパッケージからも必要とされていないパッケージを確認したい場合は[[#使用していないパッケージの削除 (孤立したパッケージ)|使用していないパッケージの削除 (孤立したパッケージ)]] を参照。}}
+
{{Note|依存パッケージとしてインストールされたが、既にどのパッケージからも必要とされていないパッケージを確認したい場合は [[#使用していないパッケージ (孤立したパッケージ) の削除]] を参照。}}
   
{{Grp|base}} や {{Grp|base-devel}} グループに存在しない明示的にインストールしたパッケージをリストアップ:
+
明示的にインストールしたパッケージの中で {{Pkg|base}} [[メタパッケージ]]に含まれないもの一覧表示するには:
   
$ comm -23 <(pacman -Qeq | sort) <(pacman -Qgq base base-devel | sort)
+
$ comm -23 <(pacman -Qqe | sort) <(expac -l '\n' '%E' base | sort)
   
  +
明示的にインストールしたパッケージの中で {{Pkg|base}} メタパッケージにも {{Grp|xorg}} [[パッケージグループ]]にも含まれていないものを一覧表示するには:
{{Grp|base}} や {{Grp|base-devel}} グループに存在せず、他のパッケージによって必要とされていないインストール済みパッケージをリストアップ:
 
   
$ comm -23 <(pacman -Qqt | sort) <(pacman -Sqg base base-devel | sort)
+
$ comm -23 <(pacman -Qqe | sort) <({ pacman -Qqg xorg; expac -l '\n' '%E' base; } | sort -u)
   
  +
インストールしたパッケージの中で、他のどのパッケージからも必要とされておらず、かつ {{Pkg|base}} メタパッケージにも {{Grp|xorg}} パッケージグループにも含まれていないものを一覧表示するには:
上記と同じで、説明を付けてリストアップ:
 
   
$ expac -HM '%-20n\t%10d' $(comm -23 <(pacman -Qqt | sort) <(pacman -Qqg base base-devel | sort))
+
$ comm -23 <(pacman -Qqt | sort) <({ pacman -Qqg xorg; echo base; } | sort -u)
   
  +
先と同じですが、説明も付けて一覧表示するには:
指定したリポジトリ ''repo_name'' に存在しないインストール済みパッケージをリストアップ:
 
   
$ comm -23 <(pacman -Qtq | sort) <(pacman -Slq ''repo_name'' | sort)
+
$ expac -H M '%-20n\t%10d' $(comm -23 <(pacman -Qqt | sort) <({ pacman -Qqg xorg; echo base; } | sort -u))
   
''repo_name'' リポジトリに含まれているインストール済みパッケージリストアップ:
+
インストールしたパッケージの中で、''repo_name'' という名前のリポジトリに含まれて''ない''もの一覧表示するには:
   
$ comm -12 <(pacman -Qtq | sort) <(pacman -Slq ''repo_name'' | sort)
+
$ comm -23 <(pacman -Qq | sort) <(pacman -Sql ''repo_name'' | sort)
   
=== パッケージに含まれているファイル容量を付けてリストアップ ===
+
インストールしたパッケージの中で、''repo_name'' という名前のリポジトリに含まれているもの一覧表示するには:
   
  +
$ comm -12 <(pacman -Qq | sort) <(pacman -Sql ''repo_name'' | sort)
特定のパッケージが異常な容量を消費していて、どのファイルが容量を食っているのか調べたいときに便利なコマンドです。
 
   
  +
Arch Linux ISO にインストールされているパッケージの中で、{{Pkg|base}} メタパッケージに含まれていないものを一覧表示するには:
$ pacman -Qlq ''package'' | grep -v '/$' | xargs du -h | sort -h
 
   
  +
<nowiki>$ comm -23 <(curl https://gitlab.archlinux.org/archlinux/archiso/-/raw/master/configs/releng/packages.x86_64) <(expac -l '\n' '%E' base | sort)</nowiki>
=== ファイルがどのパッケージにも含まれていないことを確認 ===
 
   
  +
{{Tip|別の方法として、{{ic|comm}} よりも簡単に覚えられる構文を持つ {{Pkg|moreutils}} パッケージの {{ic|combine}} を使うこともできます。詳細は {{man|1|combine}} を参照。}}
どのパッケージにも所有されていない謎のファイルが存在する場合 ([[Arch Linux の安定化#パッケージマネージャを使ってソフトウェアをインストールする|パッケージマネージャを使わずにソフトウェアをインストール]]した場合など)、ファイルを見つけ出して消去すると良いでしょう。以下の手順で見つけ出せます:
 
   
  +
==== 開発版パッケージ ====
# 所有者を確認したいファイルのソート済みリストを作成: {{bc|<nowiki>$ find /etc /opt /usr | sort > all_files.txt</nowiki>}}
 
# pacman によって追跡されているファイルのソート済みリストを作成 (そしてディレクトリの末尾のスラッシュを削除): {{bc|<nowiki>$ pacman -Qlq | sed 's|/$||' | sort > owned_files.txt</nowiki>}}
 
# 後者のファイルには存在しない行を確認: {{bc|$ comm -23 all_files.txt owned_files.txt}}
 
   
  +
開発版や不安定版のパッケージを一覧表示するには:
どのパッケージにも含まれない重要なファイル (実行時に生成されるファイルやカスタム設定など) も存在するため、安全に消去できるファイルを選び出す方法としては不適切です。
 
   
  +
$ pacman -Qq | grep -Ee '-(bzr|cvs|darcs|git|hg|svn)$'
{{Tip|{{AUR|lostfiles}} スクリプトは上記と同じようなことを実行しますが、出力から偽陽性のファイルを取り除くための包括的なブラックリストを使用します。}}
 
   
=== 使用していないパッケージの削除 (孤立したパッケージ) ===
+
==== パッケージの依存パッケージ ====
   
  +
あるパッケージの依存パッケージの一覧を入手したい場合、最も簡単な方法は以下のコマンドの出力を見ることです:
''再帰的に''孤立したパッケージ(とその設定ファイル)を削除するには:
 
   
# pacman -Rns $(pacman -Qtdq)
+
$ pacman -Qi ''package''
   
  +
自動化させるには、pacman の出力をパースするというエラーの発生しやすい方法を取るのではなく、{{Pkg|expac}} を使ってください:
孤立したパッケージが見つからなかった場合、pacman は {{ic|error: no targets specified}} を出力します。{{ic|pacman -Rns}} に何も引数が指定されていないとこうなります。
 
   
  +
$ expac -S '%D' ''package''
{{Note|{{Pkg|pacman}} 4.2.0 現在、{{ic|-Qt}} は本当に孤立しているパッケージしかリストアップしません。他のパッケージによって任意で必要とされているパッケージを含めたい場合、{{ic|-t}} フラグを2回指定してください ({{ic|-Qtt}})。}}
 
   
  +
==== 任意の依存パッケージも表示 ====
{{ic|-Rns}} (や {{ic|-Rnc}}) オプションは直接依存しているパッケージだけを削除し、明示的にインストールされた任意の依存パッケージは削除しません ({{ic|--asdeps}} オプションを使用しなかった場合)。
 
   
  +
明示的にインストールしたパッケージを、その任意の依存パッケージも一緒に一覧表示するには:
必須ではありませんが、任意の依存パッケージをインストールする際に {{ic| --asdeps}} オプションを使用してインストールすることでシステムメンテナンスが楽になります。実行時やインストール時には何も変化はありませんが、{{ic|--asdeps}} オプションを使用してインストールしておけば、孤立したパッケージを削除するときに一緒に削除されるようになります。任意の依存パッケージをインストールするときは、以下のコマンドを使うようにしましょう:
 
   
  +
$ LC_ALL=C.UTF-8 pacman -Qei | sed '/^[^NO ]/d;/None$/d' | awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n\\S"} /Optional Deps/ {print $1"\nO"$2}'
# pacman -S --asdeps <packages that are optional dependencies>
 
   
  +
あるいは、{{Pkg|expac}} を使って:
=== base グループ以外の全てのパッケージを削除する ===
 
   
  +
$ expac -d '\n\n' -l '\n\t' -Q '%n\n\t%O' $(pacman -Qeq)
base グループを除く全てのパッケージを削除する必要がある場合は、以下のワンライナーを試して下さい:
 
   
  +
先とほぼ同じですが、既にインストール済みの任意の依存パッケージを出力から除くには:
# pacman -R $(comm -23 <(pacman -Qq | sort) <((for i in $(pacman -Qqg base); do pactree -ul "$i"; done) | sort -u))
 
   
  +
$ LC_ALL=C.UTF-8 pacman -Qei | sed '/^[^NO ]/d;/None$/d' | awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n\\S"} /Optional Deps/ {print $1"\nO"$2}' | sed 's/^Optional Deps ://;/\[installed\]$/d;s/\s\+/ /'
上記のワンライナーは [https://bbs.archlinux.org/viewtopic.php?id=130176 こちらのスレッド] に書かれたものが元になっています。
 
  +
  +
=== パッケージの閲覧 ===
  +
  +
インストール済みのパッケージを、プレビューウィンドウを表示してブラウズするには:
  +
  +
$ pacman -Qq | fzf --preview 'pacman -Qil {}' --layout=reverse --bind 'enter:execute(pacman -Qil {} | less)'
  +
  +
このコマンドは、パッケージの一覧を左のペインに、パッケージの情報を右のペインにそれぞれ表示させるために [[fzf]] を使用しています。
  +
  +
表示するパッケージを絞るには文字を入力してください。矢印キーで (または {{ic|Ctrl-j}}/{{ic|Ctrl-k}}) で移動し、{{ic|Enter}} でパッケージの情報を ''less'' で表示します。
  +
  +
''pacman'' のデータベースに載っているパッケージ (インストールされているものとされていないもの両方) を同じような方法 (fzf) でブラウズするには:
  +
  +
$ pacman -Slq | fzf --preview 'pacman -Si {}' --layout=reverse
  +
  +
カーソルの移動方法は同じです。しかし、{{ic|Enter}} キーは先程と同じようには動きません。
  +
  +
=== パッケージが所有しているファイルとそのサイズを一覧表示 ===
  +
  +
このコマンドは、特定のパッケージが多くの容量を使用していることが分かっていて、そのパッケージのどのファイルが最も大きいかを確認したい場合に便利かもしれません。
  +
  +
$ pacman -Qlq ''package'' | grep -v '/$' | xargs -r du -h | sort -h
  +
  +
=== どのパッケージにも所有されていないファイルを特定する ===
  +
  +
どのパッケージにも所有されていないファイルがある場合 ([[システムメンテナンス#パッケージマネージャーを使用してソフトウェアをインストールする|ソフトウェアのインストールにパッケージマネージャを使用]]しなかった場合に起こりえます)、そのようなファイルをクリーンアップするために特定する必要があることがあります。
  +
  +
1つ目の方法は、確認しておきたいファイルのリストから、それらが所有されているかどうかを ''pacman'' で調べる方法です:
  +
  +
# (export LC_ALL=C.UTF-8; comm -13 <(pacman -Qlq | sed 's,/$,,' | sort) <(find /etc /usr /opt -path /usr/lib/modules -prune -o -print | sort))
  +
  +
{{Tip|{{Pkg|lostfiles}} スクリプトも同じようなことをしますが、一般的に偽陽性とされるファイルを出力から取り除くための拡張可能なブラックリストが含まれています。}}
  +
  +
=== パッケージによって作成された未所有のファイルを追跡する ===
  +
  +
ほとんどのシステムでは、通常の運用でも状態ファイル、ログ、インデックスなどといった[http://ftp.rpm.org/max-rpm/s1-rpm-inside-files-list-directives.html#S3-RPM-INSIDE-FLIST-GHOST-DIRECTIVE ゴースト]ファイルがゆっくりと蓄積していきます。
  +
  +
{{Pkg|pacutils}} パッケージの {{ic|pacreport}} を使えば、{{ic|/etc/pacreport.conf}} の設定を使用して、そのようなファイルとそれらと関連するパッケージを追跡できます ({{man|1|pacreport|FILES}} を参照)。
  +
  +
設定ファイルの例としては以下のようなものがあるでしょう (要約):
  +
  +
{{hc|/etc/pacreport.conf|2=
  +
[Options]
  +
IgnoreUnowned = usr/share/applications/mimeinfo.cache
  +
  +
[PkgIgnoreUnowned]
  +
alsa-utils = var/lib/alsa/asound.state
  +
bluez = var/lib/bluetooth
  +
ca-certificates = etc/ca-certificates/trust-source/*
  +
dbus = var/lib/dbus/machine-id
  +
glibc = etc/ld.so.cache
  +
grub = boot/grub/*
  +
linux = boot/initramfs-linux.img
  +
pacman = var/lib/pacman/local
  +
update-mime-database = usr/share/mime/magic
  +
}}
  +
  +
設定ファイルを作成したら、{{ic|pacreport --unowned-files}} を root ユーザーとして実行すれば、関連するパッケージがすでにアンインストールされている場合 (または、新しいファイルが作成された場合)、それに対応する未所有のファイルが一覧表示されます。
  +
  +
加えて、[https://github.com/CyberShadow/aconfmgr aconfmgr] ({{AUR|aconfmgr-git}}) は、設定スクリプトを使用して、変更されたファイルや孤立したファイルを追跡できます。
  +
  +
=== 使用していないパッケージ (孤立したパッケージ) の削除 ===
  +
  +
孤立したパッケージ (orphan) とは、依存パッケージとしてインストールされたが、もはやどのパッケージからも必要とされていないパッケージのことです。
  +
  +
パッケージのアンインストール時に {{ic|pacman -Rs ''package''}} ではなく {{ic|pacman -R ''package''}} を使ったことや、[[makedepends]] として設定されているパッケージをインストールしたこと、パッケージの新しいバージョンで依存関係が解消したことが原因で、このようなパッケージは時間と共にシステムに蓄積していく可能性があります。
  +
  +
孤立したパッケージとその設定ファイルを再帰的に削除するには:
  +
  +
# pacman -Qdtq | pacman -Rns -
  +
  +
孤立したパッケージが見つからなかった場合、このコマンドの出力は {{ic|error: argument '-' specified with empty stdin}} ({{ic|エラー: 引数 '-' が指定されましたが標準入力が空です}}) となります。これは、{{ic|pacman -Rns}} に引数が渡されなかった場合の想定通りの動作です。このエラーは、2つ目のコマンドの前に {{Pkg|moreutils}} パッケージの {{man|1|ifne}} を加えれば出なくなります。
  +
  +
削除したくないパッケージが先のコマンドの出力に載っていた場合は、そのパッケージを明示的にインストールしたものとして登録することで、孤立したパッケージのリストから外すことができます:
  +
  +
# pacman -D --asexplicit ''package''
  +
  +
{{Note|{{ic|-Qt}} 引数は、本当にどのパッケージからも一切必要とされていないパッケージしか出力しません。任意の依存パッケージとして必要とされているパッケージも含めるには、{{ic|-t}} フラグを2つ渡してください (つまり、{{ic|-Qtt}})。}}
  +
  +
{{Tip|{{ic|pacman -Qdt}} コマンドを ''pacman'' のトランザクション後の[[pacman#フック|フック]]に追加すると、トランザクションによって必要とされなくなったパッケージが発生した場合に知らせてくれます。こうすると、パッケージがリポジトリから削除された際にしらせてくれるので便利です (パッケージがリポジトリから削除されると、ローカルにインストールされている同じパッケージは、明示的にインストールされていない場合、自動的に孤立したパッケージになるためです)。孤立したパッケージが見つからなかった場合に "failed to execute command" ("コマンドの実行に失敗しました") エラーにならないようにするには、フックの {{ic|Exec}} オプションに次のコマンドを指定してください:
  +
  +
{{ic|<nowiki>/usr/bin/bash -c "/usr/bin/pacman -Qdt || /usr/bin/echo '=> None found.'"</nowiki>}}
  +
  +
{{AUR|pacman-log-orphans-hook}} パッケージも同じようなフックを提供しますが、孤立したパッケージが見つかった際により詳細な指示を出してくれます。}}
  +
  +
=== より多くの不要なパッケージを検出する ===
  +
  +
上記の方法では、必要とされないパッケージが検出されないことがあります。例えば、依存関係のサイクル ("循環依存" とも呼ばれる)、過剰な依存 (複数回、依存関係が発生する)、明示的ではない任意の依存などの場合です。
  +
  +
そのようなパッケージを検出するには:
  +
  +
$ pacman -Qqd | pacman -Rsu --print -
  +
  +
先のコマンドで出力されたパッケージを一度に全て削除したい場合は、{{ic|--print}} フラグ無しでコマンドを実行してください。
  +
  +
=== 必須パッケージ以外の全てのパッケージを削除する ===
  +
  +
必須パッケージを除いて全てのパッケージを削除する必要がある場合、1つの方法は、必須でないパッケージのインストール理由を「依存パッケージ」と設定してから、不要な依存パッケージを全て削除することです。
  +
  +
まず、"明示的にインストール" されたパッケージのインストール理由を "依存関係としてインストール" に変更します:
  +
  +
# pacman -D --asdeps $(pacman -Qqe)
  +
  +
次に、必須パッケージ (つまり、'''削除したくない'''パッケージ) が削除対象にならないようにするために、それらのインストール理由を "明示的にインストール" に変更します:
  +
  +
# pacman -D --asexplicit base linux linux-firmware
  +
  +
{{Note|
  +
* 他のパッケージも削除されないようにしたい場合は、上記のコマンドに加えてください。完全に機能するベースシステムに必要となりうる他のパッケージについては [[インストールガイド#必須パッケージのインストール]] を参照してください。
  +
* 上記のコマンドではブートローダーのパッケージも削除対象になります。削除してもシステム自体は起動可能なままであるはずですが、パッケージがないとブートパラメータを変更できないかもしれません。
  +
}}
  +
  +
最後に、[[#使用していないパッケージ (孤立したパッケージ) の削除]] の手順に従って "依存関係としてインストール" に指定されたパッケージを削除してください。
   
 
=== 複数のパッケージの依存パッケージリストを取得 ===
 
=== 複数のパッケージの依存パッケージリストを取得 ===
   
依存パッケージはアルファベット順ソートされ、重複するパッケージは削除されます。
+
依存パッケージはアルファベット順ソートされ、重複するパッケージは1つにまとめられます。
   
{{Note|ローカルにインストールたパッケージのツリーを表示したいだけの場合、{{ic|pacman -Qi}} を使てください。}}
+
{{Note|ローカルにインストールされたパッケージのみの依存関係ツリーを表示するには({{ic|pacman -Si}} の部分で) {{ic|pacman -Qi}} コマンド代わりに使用してください。}}
   
$ pacman -Si ''packages'' | awk -F'[:<=>]' '/^Depends/ {print $2}' | xargs -n1 | sort -u
+
$ LC_ALL=C.UTF-8 pacman -Si ''packages'' | awk -F'[:<=>]' '/^Depends/ {print $2}' | xargs -n1 | sort -u
   
もしくは、{{Pkg|expac}} を使用して:
+
あるいは、{{Pkg|expac}} を使て:
   
 
$ expac -l '\n' %E -S ''packages'' | sort -u
 
$ expac -l '\n' %E -S ''packages'' | sort -u
159行目: 281行目:
 
=== 変更されたバックアップファイルをリストアップ ===
 
=== 変更されたバックアップファイルをリストアップ ===
   
  +
[[pacman/Pacnew と Pacsave#パッケージのバックアップファイル|ユーザーによって変更される可能性のある]]ファイル (つまり、[[PKGBUILD#backup|PKGBUILD の backup 配列]]に含まれているファイル) として ''pacman'' に追跡されていて、かつユーザーによって変更が加えられた設定ファイルを一覧表示するには:
システムの設定ファイルをバックアップしたい場合は {{ic|/etc/}} にある全てのファイルをコピーすれば良いですが、普通は変更を加えたファイルだけをバックアップすればそれで足ります。変更が加えられた[[Pacnew と Pacsave ファイル#パッケージのバックアップファイル|バックアップファイル]]は次のコマンドで閲覧できます:
 
   
# pacman -Qii | awk '/^MODIFIED/ {print $2}'
+
# pacman -Qii | awk '/\[modified\]/ {print $(NF - 1)}'
   
root で上記のコマンドを実行することで root からしか読み取れないファイル ({{ic|/etc/sudoers}} など) も出力に含まれるようになります。
+
のコマンドを root 権限で実行することでroot ユーザーからしか読み取れないファイル {{ic|/etc/sudoers}} など) も出力に含まれるようになります。
   
  +
このコマンドは、システムのバックアップを選択的に行いたい時や、システムの設定をマシンからマシンへ複製する際に使うことができます。
{{Tip|バックアップファイルだけでなく、pacman が認識している全ての変更済みファイルをリストアップしたい場合は[[#パッケージから変更された全てのファイルをリストアップ|パッケージから変更された全てのファイルをリストアップ]]を見てください。}}
 
  +
  +
{{Tip|
  +
* ''pacman'' のデータベースに載っているファイルのうち変更されたもの (バックアップファイル以外も含む) を一覧表示する方法は [[#パッケージから変更された全てのファイルをリストアップ]] を見てください。
  +
* ''pacman'' によって追跡されていないファイルを一覧表示する方法は [[#どのパッケージにも所有されていないファイルを特定する]] を見てください。
  +
}}
   
 
=== pacman データベースをバックアップ ===
 
=== pacman データベースをバックアップ ===
   
次のコマンドでローカルの pacman データベースをバックアップできます:
+
次のコマンドでローカルの ''pacman'' データベースをバックアップできます:
   
 
$ tar -cjf pacman_database.tar.bz2 /var/lib/pacman/local
 
$ tar -cjf pacman_database.tar.bz2 /var/lib/pacman/local
   
バックアップした pacman データベースファイルは USB スティックや外付けハードドライブ、CD-R などのオフラインメディアに保存してください。
+
バックアップした ''pacman'' データベースファイルは USB スティックや外付けハードドライブ、CD-R など、一つ以上のオフラインメディアに保存してください。
   
 
{{ic|pacman_database.tar.bz2}} ファイルを {{ic|/}} ディレクトリに移動して以下のコマンドを実行することでデータベースを復元できます:
 
{{ic|pacman_database.tar.bz2}} ファイルを {{ic|/}} ディレクトリに移動して以下のコマンドを実行することでデータベースを復元できます:
179行目: 306行目:
 
# tar -xjvf pacman_database.tar.bz2
 
# tar -xjvf pacman_database.tar.bz2
   
{{Note|pacman データベースファイルが破損していて、バックアップファイルが存在しない場合でも、pacman データベースを再構築できる望みはあります。[[# pacman のローカルデータベースを復元する|pacman のローカルデータベースを復元する]]を見てください。}}
+
{{Note|''pacman'' データベースファイルが破損していて、バックアップファイルが存在しない場合でも、''pacman'' データベースを再構築できる望みはあります。[[#pacman のローカルデータベースを復元する]] を見てください。}}
   
 
{{Tip|{{AUR|pakbak-git}} パッケージには上記の作業を自動的に行うスクリプトと [[systemd]] サービスが入っています。{{ic|/etc/pakbak.conf}} で設定が可能です。}}
 
{{Tip|{{AUR|pakbak-git}} パッケージには上記の作業を自動的に行うスクリプトと [[systemd]] サービスが入っています。{{ic|/etc/pakbak.conf}} で設定が可能です。}}
185行目: 312行目:
 
=== 変更履歴を簡単に確認 ===
 
=== 変更履歴を簡単に確認 ===
   
メンテナがパッケージを更新するとき、大抵の場合コミットにはコメントが付けられます。{{AUR|pacolog}} をインストールすることでコマンドラインからコミットメッセージを確認することができます。{{ic|pacolog <package>}} を実行すると、公式リポジトリ AUR のパッケージの最近のコミットメッセージを出力します。
+
メンテナがパッケージを更新するとき、大抵の場合コミットにはコメントが付けられます。{{AUR|pacolog}} をインストールすることでコマンドラインからコミットメッセージを素早く確認することができます。{{ic|pacolog ''package''}} を実行すると、公式リポジトリのパッケージまたは AUR のパッケージの最近のコミットメッセージの一覧表示します。
   
 
== インストールとリカバリ ==
 
== インストールとリカバリ ==
196行目: 323行目:
   
 
# cd ~/Packages
 
# cd ~/Packages
# pacman -Syw base base-devel grub-bios xorg gimp --cachedir .
+
# pacman -Syw --cachedir . base base-devel grub-bios xorg gimp
# repo-add ./custom.db.tar.gz ./*
+
# repo-add ./custom.db.tar.zst ./*.pkg.tar.zst
   
  +
Pacman はデフォルトでホストのインストール環境を参照するため、既存の依存関係を適切に解決したり、ダウンロードしたりすることができません。すべてのパッケージと依存関係が必要である場合は、一時的な空のデータベースを作成し、そのデータベースを {{ic|--dbpath}} オプションで参照すると良いでしょう:
ダウンロードしたら "Packages" フォルダを CD/DVD に焼くか USB スティック、外部 HDD などにコピーしてください。
 
  +
  +
# mkdir /tmp/blankdb
  +
# pacman -Syw --cachedir . --dbpath /tmp/blankdb base base-devel grub-bios xorg gimp
  +
# repo-add ./custom.db.tar.zst ./*.pkg.tar.zst
  +
  +
次に、先の "Packages" ディレクトリを光学ディスク (CD や DVD など) に焼くか、USB ドライブや外部 HDD などに保存してください。
   
 
インストールするには:
 
インストールするには:
205行目: 338行目:
 
'''1.''' メディアをマウントする:
 
'''1.''' メディアをマウントする:
   
  +
光学ディスクドライブの場合は:
# mkdir /mnt/repo
 
  +
# mount /dev/sr0 /mnt/repo # CD/DVD の場合
 
# mount /dev/sdxY /mnt/repo # USB スティックの場合。
+
# mount --mkdir /dev/sr0 /mnt/repo
  +
  +
USB ドライブやハードディスクドライブなどの場合は:
  +
  +
# mount --mkdir /dev/sd''xY'' /mnt/repo
   
'''2.''' {{ic|pacman.conf}} を編集して他のリポジトリ (例: extra, core など) の''前に''リポジトリを追加してください。重要です。れで標準のリポジトリに優先して CD/DVD/USB ファイルがインスールされるようになります:
+
'''2.''' マウントしたリポジトリを {{ic|pacman.conf}} に追加してください。ただし、他のリポジトリより''前に''置いてください。リポジトリの順番が重要です。{{ic|pacman.conf}} の一番下にある、コメントアウトさているリポジトリをアンコメントするだけはいけません。他のリポジトリより前置くことで、CD/DVD/USB にあるファイルを標準のリポジリ上にあものよりも優先させます:
   
{{hc|# nano /etc/pacman.conf|2=
+
{{hc|/etc/pacman.conf|2=
 
[custom]
 
[custom]
 
SigLevel = PackageRequired
 
SigLevel = PackageRequired
Server = file:///mnt/repo/Packages}}
+
Server = file:///mnt/repo/Packages
  +
}}
   
'''3.''' 最後に、pacman データベースを同期し新しいリポジトリを使えるようにしてください:
+
'''3.''' 最後に、''pacman'' データベースを同期し、追加した新しいリポジトリを利用できるようにします:
   
 
# pacman -Syu
 
# pacman -Syu
222行目: 360行目:
 
=== カスタムローカルリポジトリ ===
 
=== カスタムローカルリポジトリ ===
   
pacman 3個人的なリポジトリのデータベースの作成より簡単にするため {{ic|repo-add}} いう名前の新しいスクリプト導入されした。詳しい使い方は {{ic|repo-add --help}} を実行して見て下さい。
+
''pacman'' に含まれる ''repo-add'' スクリプトを使うこと個人用のリポジトリのデータベースを生成するとができ。詳しい使い方は {{ic|repo-add --help}} を実行して見て下さい。
   
  +
パッケージデータベースは tar ファイルです (任意で圧縮できます)。有効な拡張子は、''.db'' か ''.files'' の後に、アーカイブ拡張子 ''.tar''、''.tar.gz''、''.tar.bz2''、''.tar.xz''、''.tar.zst''、''.tar.Z'' のうちどれかを付け加えたものになります。(''repo-add'' を使用する際に) このファイルが存在している必要はありませんが、親ディレクトリはすべて存在していなければなりません。
リポジトリに含むパッケージを全て一つのディレクトリに保存して、次のコマンドを実行してください (''repo'' はカスタムリポジトリの名前に置き換えてください):
 
   
  +
新しいパッケージをデータベースに追加する、あるいはデータベース内にすでにある古いバージョンのパッケージを置き換えるには、以下を実行してください:
$ repo-add /path/to/repo.db.tar.gz /path/to/*.pkg.tar.xz
 
   
  +
$ repo-add ''/path/to/repo.db.tar.zst /path/to/package-1.0-1-x86_64.pkg.tar.zst''
{{ic|repo-add}} を使う際、データベースとパッケージは同じディレクトリにある必要はないので注意してください。ただしそのデータベースで pacman を使うときには、揃っていないといけません。
 
   
  +
''repo-add'' を使用する際は、データベースとパッケージが同一のディレクトリ内に存在している必要はありません。ただし、そのデータベースを ''pacman'' で使用する際は、データベースとパッケージが一緒に存在している必要があるので注意してください。また、リポジトリに含めるビルド済みパッケージをすべて1つのディレクトリに入れておけば、シェルのグロブ拡張を使って複数のパッケージを一度に追加/更新することができます:
新しいパッケージを追加する(そして古いパッケージが存在していたら削除する)には、次を実行してください:
 
   
$ repo-add /path/to/repo.db.tar.gz /path/to/packagetoadd-1.0-1-i686.pkg.tar.xz
+
$ repo-add ''/path/to/repo.db.tar.zst /path/to/*.pkg.tar.zst''
   
  +
{{Warning|''repo-add'' は、コマンドラインで渡された順番でエントリをデータベースに追加します。同じパッケージの複数のバージョンが渡された場合、正しいバージョンが最後に追加されるよう注意しなければなりません。特に、シェルによって使用される辞書順はロケール依存であり、''pacman'' によって使用される {{man|8|vercmp}} の順序とは異なるので注意してください。}}
{{Note|リポジトリからパッケージを削除する必要がある場合、{{Ic|repo-remove}} を使ってください。}}
 
   
  +
複数のアーキテクチャをサポートしようと考えている場合、エラーが起こらないように注意する必要があります。各アーキテクチャに独自のディレクトリツリーが存在している必要があります:
ローカルリポジトリを作成できたら、リポジトリを {{ic|pacman.conf}} に追加してください。{{ic|db.tar.gz}} ファイルの名前がリポジトリの名前です。{{ic|file://}} url を使って直接参照するか、{{ic|ftp://localhost/path/to/directory}} を使って FTP でアクセスしてください。
 
   
  +
{{hc|$ tree ~/customrepo/ {{!}} sed "s/$(uname -m)/''arch''/g"|
カスタムリポジトリを[[非公式ユーザーリポジトリ]]に追加すれば、コミュニティはそれを使うことができるようになります。
 
  +
/home/archie/customrepo/
  +
└── ''arch''
  +
├── customrepo.db -> customrepo.db.tar.zst
  +
├── customrepo.db.tar.zst
  +
├── customrepo.files -> customrepo.files.tar.zst
  +
├── customrepo.files.tar.zst
  +
└── personal-website-git-b99cce0-1-''arch''.pkg.tar.zst
  +
  +
1 directory, 5 files
  +
}}
  +
  +
''repo-add'' 実行ファイルは、パッケージが適切であるかどうかをチェックします。パッケージが適切でない場合、以下のようなエラーメッセージが出力されます:
  +
  +
==> ERROR: '/home/archie/customrepo/''arch''/foo-''arch''.pkg.tar.zst' does not have a valid database archive extension.
  +
  +
''repo-remove'' はパッケージデータベースからパッケージを削除するために使用されます。パッケージの名前のみをコマンドラインで指定します。
  +
  +
$ repo-remove ''/path/to/repo.db.tar.zst pkgname''
  +
  +
ローカルリポジトリを作成できたら、リポジトリを {{ic|pacman.conf}} に追加してください。カスタムリポジトリの例は {{ic|pacman.conf}} 内にあります。リポジトリ名は、データベースのファイル名からファイル拡張子を除いたものになります。上記の例では、リポジトリ名は単に ''repo'' となります。リポジトリの場所を参照するには、{{ic|file://}} URL を使うか、{{ic|<nowiki>http://localhost/path/to/directory</nowiki>}} を使って HTTP 経由で行ってください。
  +
  +
もし良ければ、カスタムリポジトリを[[非公式ユーザーリポジトリ|非公式ユーザリポジトリのリスト]]に追加して、コミュニティがその恩恵を受けられるようにしましょう。
   
 
=== pacman のキャッシュをネットワークで共有する ===
 
=== pacman のキャッシュをネットワークで共有する ===
246行目: 406行目:
 
==== 読み取り専用キャッシュ ====
 
==== 読み取り専用キャッシュ ====
   
  +
Pacman 6.1.0 はキャッシュサーバーを直接サポートしています。キャッシュサーバーは、キャッシュでないサーバーよりも前に試行されます。また、キャッシュサーバーはダウンロード時に HTTP 404 エラーが発生してもサーバープールから削除されず、データベースファイルとしては使用されません。
簡単な方法として、他のコンピュータからミラーとして使用できるスタンドアロンのウェブサーバーを実行するという方法があります: {{ic|darkhttpd /var/cache/pacman/pkg}}。サーバーをミラーリストの一番上に追加してください。キャッシュが存在しない場合、404エラーが大量に出てしまいますが、その場合 pacman はリストの次のミラーを使用します。
 
   
  +
手っ取り早い解決策を探している場合は、他のコンピュータからキャッシュサーバーとしてアクセスできる[https://gist.github.com/willurd/5720255 一時的なシンプルなウェブサーバー]を走らせることができます。
==== 読み書き可能キャッシュ ====
 
   
  +
Pacman のキャッシュディレクトリを共有してみましょう。例えば、[[Python]] の [https://docs.python.org/3/library/http.server.html#http-server-cli http.server] モジュールを使う場合は:
{{Tip|[[pacserve]] を使うことで以下の方法をもっと簡単に実現できます。}}
 
   
  +
$ python -m http.server -d /var/cache/pacman/pkg/
複数のコンピュータ間でパッケージを共有するには、ネットワークベースのマウントプロトコルを使って {{ic|/var/cache/pacman/}} を共有します。このセクションでは shfs または sshfs を使ってパッケージキャッシュと関連するライブラリディレクトリを同一ローカルネットワーク上の複数のコンピュータで共有する方法を示します。ネットワークで共有されるキャッシュは、ファイルシステムの選択やその他の要因で、遅くなることがあります。
 
   
  +
{{Tip|デフォルトでは、Python の {{ic|http.server}} は任意のインターフェイスの {{ic|8000}} 番ポートをリッスンします。別のポートを使いたい場合や、特定のアドレスにのみバインドしたい場合は、パラメータを追加してください:
まず、ネットワークをサポートするファイルシステムをインストールしてください。例えば [[sshfs]], [[shfs]], ftpfs, [[Samba|smbfs]], [[NFS|nfs]] など。
 
  +
  +
$ python -m http.server -d /var/cache/pacman/pkg/ --bind 127.0.0.1 8080
  +
}}
  +
  +
次に、各クライアントマシンでキャッシュサーバーを追加するように {{ic|/etc/pacman.d/mirrorlist}} を[[テキスト編集|編集]]してください:
  +
  +
{{hc|/etc/pacman.d/mirrorlist|2=
  +
CacheServer = http://''server-ip'':''port''
  +
}}
  +
  +
{{Warning|他のサーバーエントリと違って、このカスタムサーバーのオプションには {{ic|/repos/$repo/os/$arch}} を付けてはいけません。このキャッシュサーバーにはこのディレクトリ階層が存在しないため、クエリが失敗してしまうからです。}}
  +
  +
スタンドアローンな方法としては {{Pkg|darkhttpd}} で最小限のウェブサーバーを立てられます。先の {{ic|python}} コマンドを例えば以下のように置き換えてください:
  +
  +
[http]$ darkhttpd /var/cache/pacman/pkg --no-server-id
  +
  +
利便性のために darkhttpd を ''systemd'' サービスとして走らせることもできます。[[Systemd#ユニットファイル]] を参照してください。
  +
  +
Rust で書かれた小規模な Web サーバーである {{Pkg|miniserve}} も使用できます:
  +
  +
$ miniserve /var/cache/pacman/pkg
  +
  +
次に、miniserve へアクセスできる最初の URL を使って、上記のように {{ic|/etc/pacman.d/mirrorlist}} を編集してください。
  +
  +
すでに他の目的で Web サーバーを実行している場合は、代わりにそれをローカルリポジトリサーバーとして再利用できます。たとえば、すでに [[nginx]] でサイトを提供している場合は、8080 番ポートで待受する ''nginx'' サーバーブロックを追加できます:
  +
  +
{{hc|/etc/nginx/nginx.conf|
  +
server {
  +
listen 8080;
  +
root /var/cache/pacman/pkg;
  +
server_name myarchrepo.localdomain;
  +
try_files $uri $uri/;
  +
}
  +
}}
  +
  +
この変更を加えた後は、必ず {{ic|nginx.service}} の[[再起動]]を行ってください。
  +
  +
{{Tip|どの Web サーバーを使用する場合でも、ファイアウォール設定 (存在する場合) で、設定されたポートへの目的のトラフィックの到達が許可され、不要なトラフィックが許可されていないことを確認してください。[[セキュリティ#ネットワークとファイアウォール]]を参照してください。}}
  +
  +
==== 読み取り専用キャッシュのオーバーレイマウント ====
  +
  +
ローカルネットワーク上にあるマシンの {{ic|/var/cache/pacman/pkg}} ディレクトリを[[Overlayfs|オーバーレイマウント]]することで、読み取り専用のパッケージキャッシュとして使うことができます。キャッシュサーバーに他のマシンでも使われている最新のパッケージがある程度包括的にインストールされている場合、このような構成は効果的です。低帯域幅のアップストリーム接続の終端に一定数のマシンが存在する場合、この方法が便利です。
  +
  +
例:
  +
  +
# mkdir /tmp/remote_pkg /mnt/workdir_pkg /tmp/pacman_pkg
  +
# sshfs ''remote_username''@''remote_pkgcache_addr'':/var/cache/pacman/pkg /tmp/remote_pkg -C
  +
# mount -t overlay overlay -o lowerdir=/tmp/remote_pkg,upperdir=/var/cache/pacman/pkg,workdir=/mnt/workdir_pkg /tmp/pacman_pkg
  +
  +
{{Note|作業ディレクトリは、上位ディレクトリと同じマウント済みデバイス上の空のディレクトリである必要があります。[[Overlayfs#使用方法]] を参照してください。}}
  +
  +
{{Tip|1={{ic|/tmp/pacman_pkg}} オーバーレイディレクトリ内のファイルを一覧表示しようとすると "Stale file handle" などのエラーが発生する場合、オーバーレイマウントのオプションに {{ic|1=-o redirect_dir=off -o index=off}} を使ってみてください。}}
  +
  +
これで、オプション {{ic|--cachedir /tmp/pacman_pkg}} を使用して ''pacman'' を実行できます。例:
  +
  +
# pacman -Syu --cachedir /tmp/pacman_pkg
  +
  +
==== 読み取り専用の分散キャッシュ ====
  +
  +
パッケージキャッシュを提供しているネットワーク上の他のコンピューターを自動的に検出するための Arch 固有のツールがあります。{{Pkg|pacredir}}、[[pacserve]]、{{AUR|pkgdistcache}}、または {{AUR|paclan}} を試してください。pkgdistcache は、プレーンな UDP ではなく Avahi を使用します。これは、WiFi とイーサネット間のブリッジではなくルーティングを行う特定のホームネットワークでより適切に機能する可能性があります。
  +
  +
歴史的には、[https://bbs.archlinux.org/viewtopic.php?id=64391 PkgD] と [https://github.com/toofishes/multipkg multipkg] がありましたが、現在はメンテナンスされていません。
  +
  +
==== 読み書き可能キャッシュ ====
  +
  +
ネットワークベースのマウントプロトコルを使って {{ic|/var/cache/pacman/}} を共有すれば、複数のコンピュータ間でパッケージを共有することができます。このセクションでは、[[SSHFS]] を使って、同じローカルネットワーク上にある複数のコンピュータ間でパッケージのキャッシュ及び関連するライブラリディレクトリを共有する方法を説明します。ただし、ネットワーク経由で共有されたキャッシュは、ファイルシステムの選択などの要因によって遅くなる可能性があることを留意しておいてください。
  +
  +
まず、ネットワーク共有をサポートするファイルシステムのパッケージ ({{Pkg|sshfs}} や {{Pkg|curlftpfs}}、{{Pkg|samba}}、{{Pkg|nfs-utils}} のうち一つ) をインストールしてください。
   
 
{{Tip|
 
{{Tip|
* sshfs や shfs を使う場合、[[SSH 鍵]]を読んで下さい。
+
* ''sshfs'' を使う場合、[[SSH 鍵]] の記事を読むことを検討してください。
* デフォルトでは、smbfs はファイル名にコロン使えないので、クライアントは問題のあるパッケージをダウンロードしなおしてしまいます。クライアント側で {{ic|mapchars}} マウントオプションを使用することで解決ます}}
+
* デフォルトでは、''smbfs''コロンを含むファイル名をサポートしていないため、クライアントそのような問題のあるパッケージをいちいちインターネットからダウンロードしてしまいます。これを防ぐには、クライアント側で {{ic|mapchars}} マウントオプションを使用してください
  +
}}
  +
  +
次に、サーバ上の {{ic|/var/cache/pacman/pkg}} をすべてのクライアントマシン上の {{ic|/var/cache/pacman/pkg}} にマウントすることで実際のパッケージを共有できます。
  +
  +
{{Warning|{{ic|/var/cache/pacman/pkg}} とその上位のディレクトリ ({{ic|/var}} など) はシンボリックリンクにしてはいけません。Pacman はこれらがディレクトリであると期待するからです。''pacman'' が自身を再インストールまたはアップグレードする時、そのようなシンボリックリンクは削除され、空のディレクトリが代わりに作成されます。しかし、トランザクション中、''pacman'' は一部のファイルがそのディレクトリ内に存在することを期待するため、アップデートのプロセスに問題が発生してしまいます。詳細は {{Bug|50298}} を参照してください。}}
  +
  +
==== rsync や FTP で双方向同期 ====
  +
  +
ローカル環境でのもう一つの方法は [[rsync]] です。キャッシュを提供するサーバーを選択し、[[rsync#デーモンとして|rsync デーモン]]を有効化してください。クライアント側では、rsync プロトコルを介すことでこの共有ディレクトリと双方向で同期します。Rsync プロトコルにおいては、ファイル名にコロンが含まれていても問題ありません。
  +
  +
以下はクライアント側での例です。共有ディレクトリの名前に {{ic|uname -m}} を使うことで、システムのアーキテクチャと同じキャッシュを同期できるようにします:
  +
  +
# rsync ... rsync://server/share_$(uname -m)/ /var/cache/pacman/pkg/
  +
# pacman -Syu
  +
# paccache --remove --keep 3
  +
# rsync --delete ... /var/cache/pacman/pkg/ rsync://server/share_$(uname -m)/
   
  +
暗号化されていない [[rsync#デーモンとして|rsync デーモン]]よりもセキュアな方法として rsync over ssh があります。これについては [[Rsync#SSH を使った自動バックアップ]] で概説されています。
それから、サーバーの {{ic|/var/cache/pacman/pkg}} をクライアントマシンの {{ic|/var/cache/pacman/pkg}} にマウントすることでパッケージを共有できます。
 
   
  +
Rsync がローカル環境で利用できない場合は、シンプルな ftp サービスを双方向同期に使用するのも良いでしょう。{{Pkg|lftp}} は、ローカルをリモートストレージと同期するためのオプション {{ic|--mirror}} と {{ic|--delete}} を提供しています。
==== nginx を使用する動的なリバースプロキシキャッシュ ====
 
   
  +
==== nginx で動的リバースプロキシキャッシュ ====
[[nginx]] を使って公式の上流ミラーへのリクエストをプロキシして結果をローカルディスクにキャッシュすることができます。その後、ファイルへのリクエストは全てローカルのキャッシュから供給されるようになり、大量のサーバーを更新するときでもインターネットのトラフィックを簡単に最小限に抑えることができます。
 
   
  +
[[nginx]] を使えば、パッケージのリクエストを公式の上流ミラーにプロキシして、ダウンロードしたファイルをローカルのディスクにキャッシュしておくことができます。その後、同じパッケージに対するリクエストはすべてローカルのキャッシュから直接提供されるようになるため、多くのコンピュータが存在する場合に必要になるインターネットトラフィックの量を最小化できます。
{{Warning|この方法には欠点があります。パッケージファイルの相対パスが同じミラーを使う必要があり同じパスを使うようにキャッシュを設定しなければなりません。この例では、相対パスが {{ic|/archlinux/$repo/os/$arch}} のミラーを使用して {{ic|mirrorlist}} のキャッシュの {{ic|Server}} 設定も同じ相対パスとします。}}
 
   
この例では、キャッシュサーバーを {{ic|<nowiki>http://cache.domain.local:8080/</nowiki>}} で実行しパッケージを {{ic|/srv/http/pacman-cache/}} に保存します。
+
この例では、キャッシュサーバーを {{ic|<nowiki>http://cache.domain.example:8080/</nowiki>}} で実行しパッケージを {{ic|/srv/http/pacman-cache/}} に保存します。
   
キャッシュのディレクトリを作成しnginx からファイル書き込るようにパーティション設定:
+
キャッシュを提供するコンピュータに [[nginx]] をインストールしてください。キャッシュ用のディレクトリを作成しnginx がそのディレクトリへファイル書き込みできるようにパーミッション設定を行ってください:
   
# mkdir /srv/http/pacman-cache
+
# mkdir /srv/http/pacman-cache
# chown http:http /srv/http/pacman-cache
+
# chown http:http /srv/http/pacman-cache
   
  +
この [https://github.com/nastasie-octavian/nginx_pacman_cache_config/blob/c54eca4776ff162ab492117b80be4df95880d0e2/nginx.conf pacman キャッシュ用の nginx 設定]を {{ic|/etc/nginx/nginx.conf}} の開始点として使います。{{ic|resolver}} ディレクティブの設定はこれでよいかどうかを確認してください。上流のサーバーブロックでは、{{ic|proxy_pass}} ディレクティブを公式ミラーのアドレスに設定してください。オプションの形式は先の設定ファイルを参考にしてください。設定ファイルが完成したら、[[nginx#サービスの開始|nginx を開始し、有効化してください]]。
次に、nginx を [https://gist.github.com/anonymous/97ec4148f643de925e433bed3dc7ee7d 動的キャッシュ] として設定 (コマンドについてはコメントを読んでください)。
 
   
最後に、他の Arch Linux サーバーを更新して {{ic|mirrorlist}} ファイルに以下の行を追加して新しいキャッシュを使うように設定:
+
キャッシュを使う Arch Linux コンピュタ (キャッシュホストするコンピュータも含む) の {{ic|mirrorlist}} ファイルの一番最初に以下の行を追加する必要があります:
   
 
{{hc|/etc/pacman.d/mirrorlist|<nowiki>
 
{{hc|/etc/pacman.d/mirrorlist|<nowiki>
Server = http://cache.domain.local:8080/archlinux/$repo/os/$arch
+
Server = http://cache.domain.example:8080/$repo/os/$arch
 
...
 
...
 
</nowiki>}}
 
</nowiki>}}
   
{{Note|時間とにディレクトリは膨れ上がるため、古いパッケージを消去できるようにする必要があります。({{ic|pacman}} に含まれている) {{ic|paccache}} を使うことでお好きな基準で消去を自動化することが可能です。例えば、{{ic|find /srv/http/pacman-cache/ -type d -exec paccache -v -r -k 2 -c {} \;}} はキャッシュディレクトリに最新から1つ前のバージョンまでパッケージを保持します。}}
+
{{Note|時間とキャッシュディレクトリの容量増加するため、古いパッケージキャッシュクリーンアップするようにしておく必要があります。{{ic|paccache}} ({{Pkg|pacman-contrib}} でインストールできます) は、保持するパッケージキャッシュを決める条件を使うことでクリーンアップを自動化できます。例えば、次のコマンドはキャッシュディレクトリ内のパッケージのうち最新の2つのバージョンのみを保持します (残りは削除されます): {{ic|find /srv/http/pacman-cache/ -type d -exec paccache -v -r -k 2 -c {} \;}}。}}
   
==== BitTorrent Sync を使って pacman のパッケージキャッシュを同期する ====
+
==== Pacoloco プロキシキャッシュサーバー ====
   
  +
[https://github.com/anatol/pacoloco Pacoloco] は、''pacman'' リポジトリ用の使いやすいプロキシキャッシュサーバーです。キャッシュ済みのパッケージの[https://github.com/anatol/pacoloco/commit/048b09956b0d8ef71c0ed1f804fd332d9ab5e3c8 自動プリフェッチ]も可能です。
[[BitTorrent Sync]] はネットワークを介してフォルダを同期する新方法です (LAN でもインターネットでも動作します)。ピアツーピアなのでサーバーを設定する必要はありません: 詳しくはリンクを参照してください。
 
BitTorrent Sync を使って pacman のキャッシュを共有する方法:
 
* まず同期したいマシンに AUR から {{AUR|btsync}} パッケージをインストール。
 
* [[BitTorrent Sync]] の wiki ページや AUR パッケージのインストール手順に従う。
 
** root アカウントで動作するように BitTorrent Sync を設定。pacman パッケージキャッシュの読み書き権限が必要です。
 
** btsync のウェブ UI でパスワードを設定。
 
** btsync の systemd デーモンを起動。
 
** btsync のウェブ GUI から最初のマシンに新しい同期フォルダを追加して Secret を生成。フォルダは {{ic|/var/cache/pacman/pkg}} を指定。
 
** 同じ Secret を使って他のマシンにもフォルダを追加してシステム間でキャッシュされたパッケージを共有。もしくは、最初のシステムをマスター、他のシステムをスレーブとして、Read Only Secret を使用。{{ic|/var/cache/pacman/pkg}} を指定。
 
   
  +
{{Pkg|pacoloco}} パッケージでインストールできます。Pacoloco の設定ファイルを開き、''pacman'' ミラーを追加してください:
マシンを接続したらキャッシュの同期が開始されます。Pacman は同期中でも問題なく動作します。同期は完全に自動です。
 
   
  +
{{hc|/etc/pacoloco.yaml|<nowiki>
{{Note|BitTorrent Sync のフリーの代替として [[Syncthing]] が存在し、同じように使うことができます。}}
 
  +
port: 9129
  +
repos:
  +
mycopy:
  +
urls:
  +
- http://mirror.lty.me/archlinux
  +
- http://mirrors.kernel.org/archlinux
  +
</nowiki>}}
   
  +
{{ic|pacoloco.service}} を[[再起動]]すると、プロキシリポジトリが {{ic|http://''myserver'':9129/repo/mycopy}} で利用できるようになります。
==== 要らなくなったキャッシュが消えないようにする ====
 
   
  +
==== Flexo プロキシキャッシュサーバー ====
デフォルトでは、{{Ic|pacman -Sc}} はコマンドの実行時にマシンにインストールされていないパッケージのキャッシュを削除します。pacman はキャッシュを共有している全てのマシンにインストールされているパッケージを推測することができないため、削除してはいけないファイルまで削除してしまいます。
 
   
  +
[https://github.com/nroi/flexo Flexo] は、''pacman'' リポジトリ用のさらに別のプロキシキャッシュサーバーです。Flexo は {{AUR|flexo-git}} でインストールできます。インストールしたら、{{ic|flexo.service}} ユニットを[[起動]]してください。
キャッシュを削除するときは古い tarball だけを削除するように、{{ic|/etc/pacman.conf}} の {{ic|[options]}} セクションに以下のエントリを追加してください:
 
   
  +
Flexo はデフォルトでは {{ic|7878}} 番ポートで動作します。''pacman'' に Flexo 経由でパッケージをダウンロードさせるには、{{ic|/etc/pacman.d/mirrorlist}} の一番最初に {{ic|1=Server = http://''myserver'':7878/$repo/os/$arch}} を記述してくだしあ。
CleanMethod = KeepCurrent
 
   
=== ファイルシステからパッケージを再作成 ===
+
==== 同期プログラを使用して pacman パッケージキャッシュ同期する ====
   
  +
[[Syncthing]] または [[Resilio Sync]] を使用して、''pacman'' キャッシュディレクトリ (つまり、{{ic|/var/cache/pacman/pkg}}) を同期します。
ファイルシステムからパッケージを再作成するには、(pacman に含まれている) ''bacman'' を使います。システム上のファイルがそのまま使われるため、作成されるパッケージにはファイルへの変更も一緒に含まれてしまいます。再作成したパッケージの配布は非推奨です。[[ABS]] や [[Arch Rollback Machine]] を見てください。
 
   
  +
==== 望まないキャッシュ削除を防ぐ ====
{{Tip|''bacman'' は {{ic|makepkg.conf}} の {{ic|PACKAGER}}, {{ic|PKGDEST}}, {{ic|PKGEXT}} オプションを使用します。環境変数をエクスポートすることで圧縮ツールのオプションを指定することができます。例えば {{ic|1=XZ_OPT="-T 0"}} は ''xz'' の並列圧縮を有効化します。}}
 
   
  +
デフォルトでは、{{ic|pacman -Sc}} は、キャッシュにあるパッケージ tarball のうち、同マシン上にインストールされていないパッケージに対応するものを削除します。''pacman'' は、キャッシュを共有するすべてのマシンにどのようなパッケージがインストールされているかを予測できないため、削除すべきでないファイルを削除してしまうことになります。
別のツールとして {{AUR|fakepkg}} も存在します。並列化をサポートしており複数のパッケージを入力することができます。''bacman'' ではどちらもサポートされていません。
 
  +
  +
キャッシュのクリーンアップ時に ''古くなった'' tarball のみを削除するには:
  +
  +
{{hc|/etc/pacman.conf|2=
  +
[options]
  +
CleanMethod = KeepCurrent
  +
}}
  +
  +
=== ファイルシステムからパッケージを再構成する ===
  +
  +
ファイルシステム上のインストール済みファイルからパッケージを再構築するには、{{AUR|fakepkg}} を使用してください。システム上のファイルはそのままパッケージ化されるため、ファイルシステムに加えた変更はすべてパッケージにも受け継がれます。そのため、再構成したパッケージを配布することは推奨されません。代替方法は [[ABS]] と [[Arch Linux Archive]] を参照してください。
   
 
=== インストール済みパッケージのリスト ===
 
=== インストール済みパッケージのリスト ===
   
  +
明示的にインストールされたすべてのパッケージのリストを保持しておくと、たとえばシステムをバックアップしたり、新しいシステムへのインストールを高速化したりするのに役立ちます:
{{Tip|1=<nowiki></nowiki>
 
* 以下の作業は自動化できます。{{AUR|plist-gist}} や [https://bbs.archlinux.org/viewtopic.php?id=200067 bacpac] を参照。
 
* 既にインストールされているパッケージをスキップするには、{{ic|--needed}} を使ってください。}}
 
   
  +
$ pacman -Qqe > pkglist.txt
ネイティブの、明示的にインストールしたパッケージのリストを保存しておくことで新しいシステムのインストールを素早く行うことができます。
 
   
  +
{{Note|
$ pacman -Qqen > pkglist.txt
 
  +
* オプション {{ic|-t}} を使用すると、他の明示的にインストールされたパッケージによって必要とされているパッケージは列挙されません。作成したリストから再インストールすると、これらのパッケージはインストールされますが、インストール理由は単なる依存関係となります。
  +
* オプション {{ic|-n}} を使用すると、外部パッケージ ([[AUR]] など) がリストから省略されます。
  +
* {{ic|comm -13 <(pacman -Qqdt {{!}} sort) <(pacman -Qqdtt {{!}} sort) > optdeplist.txt}} を使えば、インストール済みの任意の依存関係のリストも作成できます。任意の依存関係は {{ic|--asdeps}} フラグで再インストールできます。
  +
* {{ic|pacman -Qqem > foreignpkglist.txt}} を使えば、明示的にインストールされた AUR およびその他の外部パッケージのリストを作成できます。
  +
}}
   
  +
明示的にインストールされたパッケージの最新リストを保持するために (たとえば、バージョン管理された {{ic|/etc/}} と組み合わせて)、[[Pacman#フック|フック]]を設定できます。例:
リストのバックアップからパッケージをインストールするには、以下のコマンドを実行:
 
   
  +
[Trigger]
# pacman -S - < pkglist.txt
 
  +
Operation = Install
  +
Operation = Remove
  +
Type = Package
  +
Target = *
  +
  +
[Action]
  +
When = PostTransaction
  +
Exec = /bin/sh -c '/usr/bin/pacman -Qqe > /etc/pkglist.txt'
   
[[AUR]] パッケージなど、外部からインストールしたパッケージがリストに含まれてい場合、リストから削除:
+
=== リストからパッケージインストール ===
   
  +
既にインストール済みの最新のパッケージを再インストールせずに、以前保存したパッケージリストからパッケージをインストールするには、以下を実行してください:
# pacman -S $(comm -12 <(pacman -Slq | sort) <(sort pkglist.txt))
 
   
  +
# pacman -S --needed - < pkglist.txt
リストに書かれていないパッケージを全て削除するには:
 
  +
  +
しかし、リストに AUR 由来の外部パッケージやローカルにインストールされた外部パッケージなどが載っていることもあります。リストから外部パッケージを除くには、先のコマンドを以下のように拡張することで可能です:
  +
  +
# pacman -S --needed $(comm -12 <(pacman -Slq | sort) <(sort pkglist.txt))
  +
  +
最後に、システムにインストールされているパッケージがリストと一致していることを確認し、リストに記載されていないパッケージはすべて削除してください:
   
 
# pacman -Rsu $(comm -23 <(pacman -Qq | sort) <(sort pkglist.txt))
 
# pacman -Rsu $(comm -23 <(pacman -Qq | sort) <(sort pkglist.txt))
   
  +
{{Tip|これらのタスクは自動化できます。例としては {{AUR|bacpac}}、{{AUR|packup}}、{{AUR|pacmanity}}、{{AUR|pug}} を参照してください。}}
=== パッケージから変更された全てのファイルをリストアップ ===
 
  +
  +
=== パッケージの元の状態から変更された全てのファイルをリストアップ ===
   
ファイルが破損している可能性があるが (例: ソフトウェアあるいはハードウェアの障)ファイルが確実に破損しているとは言えない場合、パッケージのハッシュサムを比較すると良いょう。{{AUR|pacutils}} で比較することができます:
+
(ソフトウェア/アードウェアの障害によって) ファイルが破損しているが疑われるが、本当に破損しているかどうかわからない場合、パッケージ内のファイルのハッシュ値と比較したほうが良いかもれません。{{Pkg|pacutils}} で比較することができます:
   
# paccheck --md5sum --quiet
+
# paccheck --sha256sum --quiet
   
データベースのリカバリについては [[#pacman のローカルデータベースを復元する|pacman のローカルデータベースを復元する]]を参照。{{ic|mtree}} ファイル[[#.pkg ファイルに含まれているファイルを閲覧する|該当するパッケージファイルから {{ic|.MTREE}} として抽出]]できます。
+
データベースの復元方法については[[#Pacman のローカルデータベースを復元する]] 見てください。{{ic|mtree}} ファイル[[#.pkg ファイル内の特定のファイルの内容る|それぞれのパッケージファイルから {{ic|.MTREE}} として抽出する]]こともできます。
   
{{Note|悪意のある変更がている可能性がある場合はつけてくださいセキュリティ上、ライブメディアを使用したりハッシュサムを別のところから持ってくるなどの用心ること推奨ます。}}
+
{{Note|悪意のある変更が疑われる場合は、この方法そのまま'''使うべきではありません'''そのような場合、ライブメディアを使用して、ハッシュ値参照用のソースを別途用意するなどといったセキュリティ上予防措置ること推奨されます。}}
   
 
=== 全てのパッケージの再インストール ===
 
=== 全てのパッケージの再インストール ===
   
てのネイティブパッケージを再インストールするには、を使さい:
+
すべてのネイティブパッケージを再インストールするには、以下のコマンドを使用しください:
   
# pacman -Qnq | pacman -S -
+
# pacman -Qqn | pacman -S -
   
外部 (AUR) パッケージは別に再インストールする必要があります。外部のパッケージは {{ic|pacman -Qmq}} で一覧できます。
+
外部 (AUR) パッケージはまた別に再インストールする必要があります。ようなパッケージは {{ic|pacman -Qqm}} でリストアップできます。
   
デフォルトで Pacman はインストール理由(明示的にインストールしたか、依存でインストールしたか)持します。
+
デフォルトでは、Pacman は[[インストール理由]]持します。
   
  +
{{Warning|すべてのパッケージの上書きを強制するには、{{ic|1=--overwrite=*}} を使用してください。とはいえ、これは最後の手段とするべきです。[[システムメンテナンス#特定の pacman コマンドを避けてください]] を参照。}}
=== pacman のローカルデータベースを復元する ===
 
  +
  +
=== Pacman のローカルデータベースを復元する ===
   
 
[[pacman/ローカルデータベースの復元]]を見てください。
 
[[pacman/ローカルデータベースの復元]]を見てください。
366行目: 641行目:
 
=== 既存のインストールから USB キーを復元する ===
 
=== 既存のインストールから USB キーを復元する ===
   
USB キーに Arch をインストールしていててしまった場合 (例: ファイルの書き込み中に取り出してしまった場合など)、てのパッケージを再インストールして元に戻せる可能性があります (USB キーが {{ic|/newarch}} にマウントされている場合):
+
Arch を USB キーにインストールしたが、内部のデータがてしまった場合 (例えば、書き込み中に USB を抜いてしまった場合など)、すべてのパッケージを再インストールして、再び動かるようにできる可能性があります (USB キーが {{ic|/newarch}} にマウントされている場合):
   
 
# pacman -S $(pacman -Qq --dbpath /newarch/var/lib/pacman) --root /newarch --dbpath /newarch/var/lib/pacman
 
# pacman -S $(pacman -Qq --dbpath /newarch/var/lib/pacman) --root /newarch --dbpath /newarch/var/lib/pacman
   
=== .pkg ファイルに含まれているファイルを閲覧する ===
+
=== .pkg ファイル内の特定のファイルの内容る ===
   
例えば、{{Pkg|systemd}} パッケージに含まれている {{ic|/etc/systemd/logind.conf}} の中身たい場合:
+
例えば、{{Pkg|systemd}} パッケージ内の {{ic|/etc/systemd/logind.conf}} の内容たい場合:
   
$ tar -xOf /var/cache/pacman/pkg/systemd-204-3-x86_64.pkg.tar.xz etc/systemd/logind.conf
+
$ bsdtar -xOf /var/cache/pacman/pkg/systemd-250.4-2-x86_64.pkg.tar.zst etc/systemd/logind.conf
   
もしくは {{pkg|vim}} を使って圧縮ファイルを閲覧することもできます:
+
あるい、アーカイブのブラウズに {{Pkg|vim}} を使こともできます:
   
$ vim /var/cache/pacman/pkg/systemd-204-3-x86_64.pkg.tar.xz
+
$ vim /var/cache/pacman/pkg/systemd-250.4-2-x86_64.pkg.tar.zst
   
 
=== 古いパッケージのライブラリを使っているアプリケーションを探す ===
 
=== 古いパッケージのライブラリを使っているアプリケーションを探す ===
   
  +
既に実行中のプロセスには、システムの更新による変更が自動的に適用されません。その結果、実行中のプロセスは古いライブラリを使い続けます。脆弱性やその他のバグ、あるいはバージョン間での非互換性に関連する問題が発生する可能性があることから、このようなことは望ましくない場合があります。
パッケージをインストールしても、(デーモンやサーバーなど) ずっと実行し続けているプログラムが古いパッケージのライブラリのコードを使用している可能性があります。古いライブラリにセキュリティのバグが存在する場合、プログラムを実行し続けるのは得策ではありません。
 
   
以下のコマンドで古いパッケージのコードを使用しているプログラムをて見つけることができます:
+
更新されたライブラリに依存しているプロセスは {{Pkg|htop}} (影響を受けるプログラムの名前ハイライトします) や {{Pkg|lsof}} (これはライブラリの名前も出力します) ベースのスニペットを使って見つけることができます:
   
 
# lsof +c 0 | grep -w DEL | awk '1 { print $1 ": " $NF }' | sort -u
 
# lsof +c 0 | grep -w DEL | awk '1 { print $1 ": " $NF }' | sort -u
   
  +
この方法では、実行中のプロセスによって開かれたままになっているファイルのみを検出します。そのようなファイルは基本的に共有ライブラリ ({{ic|.so}} ファイル) だけです。これは、Java や Python アプリケーションのライブラリといった一部の依存関係を見逃してしまうことがあります。
実行中のプログラムの名前と削除あるいは置換された古いライブラリが出力されます。
 
   
  +
=== 必要な言語のコンテンツのみをインストールする ===
== パフォーマンス ==
 
   
  +
多くのパッケージは、複数の言語のドキュメントと翻訳をインストールします。中にはそのような不必要のファイルを削除するように設計されたプログラムもあります。例えば、{{AUR|localepurge}} はパッケージのインストール後に実行され、不必要なロケールファイルを削除します。より直接的なアプローチは {{ic|pacman.conf}} の {{ic|NoExtract}} ディレクティブで、これはそのようなファイルをそもそもインストールしないようにできます。
=== データベースのアクセス速度を向上させる ===
 
   
  +
{{Note|[[pacman#インストールさせないファイルを設定]] で説明されている通り、"後ろのルールは前のルールを上書きします。また、{{ic|!}} を前に付けることでルールを無効化できます。"}}
Pacman はパッケージの全ての情報を、パッケージごとの小さなファイルに保存しています。データベースのアクセス速度を向上させればデータベースを使う処理 (例: パッケージの検索・パッケージの依存関係の解決) にかかる時間が短くなります。一番安全で簡単な方法は root で次を実行することです:
 
   
  +
ヘルプファイルの翻訳を C ロケールを除いてすべてインストールしないようにするには、以下のディレクティブを追加してください:
# pacman-optimize
 
   
  +
NoExtract = usr/share/help/* !usr/share/help/C/*
小さなファイルをハードディスクのひとつの (物理的な) 場所にまとめて置くことでパッケージにアクセスするときにハードディスクのヘッドがあまり動かなくてもいいようにします。この方法は安全ですが、フールプルーフではありません。ファイルシステムによっては、ディスク上の使用している領域と空の領域がフラグメンテーションを起こすことがあります。さらにアグレッシブな方法として、データベースを最適化する前にインストールされていないパッケージをキャッシュから削除し使われていないリポジトリを削除するという方法があります:
 
   
  +
HTML ドキュメントをすべてインストールしないようにするには、以下を追加してください:
# pacman -Sc && pacman-optimize
 
  +
  +
NoExtract = usr/share/gtk-doc/html/*
  +
NoExtract = usr/share/doc/HTML/*
  +
  +
{{Warning|1='''すべての'''ロケールを削除すると [[Special:Permalink/460285#Dangerous NoExtract example|dmenu]]、[[Special:Permalink/767628#Languages: NoExtract usr/share/X11/locale/*|Steam]]、さらには [https://bbs.archlinux.org/viewtopic.php?id=250846 Xorg] で意図しない結果が起きたと一部のユーザーが報告しています。以下の例では、英語 (米国) 用のファイルと必須の C ロケールのみをインストールすることで、そのような問題を回避するように調整されています。}}
  +
  +
必要なものを除いて様々な[[ロケール]]をインストールしないようにするには:
  +
  +
{{bc|1=
  +
NoExtract = usr/share/locale/* usr/share/X11/locale/*/* usr/share/i18n/locales/* opt/google/chrome/locales/* !usr/share/X11/locale/C/*
  +
NoExtract = !usr/share/X11/locale/compose.dir !usr/share/X11/locale/iso8859-1/*
  +
NoExtract = !*locale*/en*/* !usr/share/*locale*/locale.*
  +
NoExtract = !usr/share/*locales/en_?? !usr/share/*locales/i18n* !usr/share/*locales/iso*
  +
NoExtract = usr/share/i18n/charmaps/* !usr/share/i18n/charmaps/UTF-8.gz !usr/share/i18n/charmaps/ANSI_X3.4-1968.gz
  +
NoExtract = !usr/share/*locales/trans*
  +
NoExtract = !usr/share/*locales/C !usr/share/*locales/POSIX
  +
}}
  +
  +
翻訳された [[man ページ]]をインストールしないようにするには、以下を追加してください:
  +
  +
NoExtract = usr/share/man/* !usr/share/man/man*
  +
  +
{{Pkg|vim-runtime}} に含まれている言語ファイルをインストールしないようにするには、以下を追加してください:
  +
  +
NoExtract = usr/share/vim/vim*/lang/*
  +
  +
[[Qt]] アプリケーションの英語コンテンツ以外をインストールしないようにするには、以下を追加してください:
  +
  +
NoExtract = usr/share/*/translations/*.qm usr/share/*/nls/*.qm usr/share/qt/phrasebooks/*.qph usr/share/qt/translations/*.pak !*/en-US.pak
  +
  +
[[Electron]] アプリケーションの英語コンテンツ以外をインストールしないようにするには、以下を追加してください:
  +
  +
NoExtract = usr/share/*/locales/*.pak opt/*/locales/*.pak usr/lib/*/locales/*.pak !*/en-US.pak
  +
  +
[[LibreOffice]] の英語のヘルプファイルをインストールしないようにするには、以下を追加してください:
  +
  +
NoExtract = usr/lib/libreoffice/help/en-US/*
  +
  +
[[アプリケーション一覧/ドキュメント#Office suites|OnlyOffice]] の英語コンテンツ以外をインストールしないようにするには、以下を追加してください:
  +
  +
{{bc|1=
  +
NoExtract = opt/onlyoffice/desktopeditors/dictionaries/* !opt/onlyoffice/desktopeditors/dictionaries/en_US/*
  +
NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/*/main/locale/* !*/en.json
  +
NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/*/main/resources/help/*/* !*/help/en/*
  +
NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/*/main/resources/symboltable/* !*/en.json
  +
NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/documenteditor/forms/locale/* !*/en.json
  +
NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/spreadsheeteditor/main/resources/formula-lang/* !*/en.json !*/en_desc.json
  +
NoExtract = opt/onlyoffice/desktopeditors/converter/empty/*/* !opt/onlyoffice/desktopeditors/converter/empty/en-US/*
  +
}}
  +
  +
英語の [[iBus]] 絵文字辞書以外をインストールしないようにするには、以下を追加してください:
  +
  +
NoExtract = usr/share/ibus/dicts/emoji-*.dict !usr/share/ibus/dicts/emoji-en.dict
  +
  +
=== 接続状況が悪い場合でもパッケージをインストールする ===
  +
  +
接続環境が悪い場所でパッケージをインストールする際 (電車で携帯電話を使う場合など)、{{ic|--disable-download-timeout}} オプションを使えば以下のようなエラーが発生する可能性を減らすことができます:
  +
  +
error: failed retrieving file […] Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds
  +
  +
もしくは、
  +
  +
error: failed retrieving file […] Operation timed out after 10014 milliseconds with 0 out of 0 bytes received
  +
  +
== パフォーマンス ==
   
  +
{{Out of date|このページは、pacman が並列ダウンロードをネイティブにサポートする前に書かれました。v6 以降、複数のパッケージを同時にダウンロードするオプションは以下だけではありません。}}
=== ダウンロード速度を向上させる ===
 
   
  +
=== ダウンロード速度 ===
{{Note|ダウンロード速度が極端に遅い場合、使っている[[ミラー]]が ftp.archlinux.org ではないことを確認してください。[https://www.archlinux.org/news/302/ 2007年の3月からこのサーバーには速度制限がかかっています]。}}
 
   
 
パッケージをダウンロードするとき pacman は {{ic|/etc/pacman.d/mirrorlist}} に書かれている順番通りにミラーを使用します。リストの一番上のミラーがデフォルトで使用されますが、それが最速のミラーだとは限りません。一番高速なミラーを選択する方法は[[ミラー]]を見てください。
 
パッケージをダウンロードするとき pacman は {{ic|/etc/pacman.d/mirrorlist}} に書かれている順番通りにミラーを使用します。リストの一番上のミラーがデフォルトで使用されますが、それが最速のミラーだとは限りません。一番高速なミラーを選択する方法は[[ミラー]]を見てください。
   
Pacman に初めから入っていファイルダウンロー代わりに他のアプリケーションを使ってパッケージダウンロードすることで Pacmanパッケージダウンロード速度上げることができます。
+
Pacman のダウンロード速度は、[[pacman#並列ダウンロードを有効|並列ダウンロー有効化]]や、パッケージダウンロード ''pacman'' 内蔵ファイルダウンローダー以外のアプリケーション使うことでも改善することができます。
   
どんな場合でも、変更を行う前に最新の Pacman を使っていることを確認してください:
+
いずれの場合でも、変更を行う前に最新の ''pacman'' を使っていることを確認してください:
   
 
# pacman -Syu
 
# pacman -Syu
416行目: 756行目:
 
==== Powerpill ====
 
==== Powerpill ====
   
Powerpill は Pacman完全なラッパーで並行・分割ダウンロードを使うことによってダウンロード処理を高速化します。通常の Pacman は一度にひとつパッケージしかダウンロードしないで、ダウンロードが完了するまで次のダウンロードが始まりません。Powerpill は異なるアプローチます: 同時に可能な限り多くのパッケージをダウンロードしようとします。
+
[[Powerpill]]''pacman'' のラッパーで列で分割ダウンロードをうことによって ''pacman'' のダウンロード速度向上ります。
 
[[Powerpill|Powerpill の wiki ページ]]に基本的な設定・使用方法と、パッケージと上流のリンクがあります。
 
   
 
==== wget ====
 
==== wget ====
   
pacman に初めから入っている機能よりもパワフルなプロキシ設定が必要な場合、wget はとても使い勝手がよいです。
+
''pacman'' に初めから入っている機能よりもパワフルなプロキシ設定が必要な場合、wget はとても使い勝手の良選択肢です。
   
{{ic|wget}} を使うには、まず {{ic|pacman -S wget}} で wget をインストールしそれから {{ic|/etc/pacman.conf}} を編集して次行を {{ic|[options]}} セクションアンコメントしてください:
+
{{ic|wget}} を使うには、まず {{Pkg|wget}} を[[インストール]]し、{{ic|/etc/pacman.conf}} ファイルの {{ic|[options]}} セクションにある以下の行をアンコメントしてください:
   
XferCommand = /usr/bin/wget -c -q --show-progress --passive-ftp -O %o %u
+
XferCommand = /usr/bin/wget --passive-ftp --show-progress -c -q -N %u
   
 
{{ic|/etc/pacman.conf}} に {{ic|wget}} パラメータを記述する代わりに、{{ic|wget}} の設定ファイルを直接修正することも可能です (システム全体のファイルは {{ic|/etc/wgetrc}}、ユーザー別のファイルは {{ic|$HOME/.wgetrc}})。
 
{{ic|/etc/pacman.conf}} に {{ic|wget}} パラメータを記述する代わりに、{{ic|wget}} の設定ファイルを直接修正することも可能です (システム全体のファイルは {{ic|/etc/wgetrc}}、ユーザー別のファイルは {{ic|$HOME/.wgetrc}})。
432行目: 770行目:
 
==== aria2 ====
 
==== aria2 ====
   
[[aria2]] はレジューム機能と分割 HTTP/HTTPS/FTP ダウンロードをサポートしている軽量なダウンロードユーティリティです。[http://aria2.sourceforge.net/ aria2] を使えば同時に複数の HTTP/HTTPS/FTP 接続を Arch ミラーにすることができ、ファイルパッケージの取得の際のダウンロード速度が上昇します。
+
[[aria2]] はレジューム機能と分割 HTTP/HTTPS/FTP ダウンロードをサポートしている軽量なダウンロードユーティリティです。aria2 を使えば、Arch ミラー対して複数の HTTP/HTTPS/FTP 接続を同時確立することができ、ファイルパッケージのダウンロード速度がするはずです。
   
{{Note|Pacman の XferCommand で aria2c を使っても複数パッケージの同時ダウンロードは行われません。Pacman はひとつのパッケージごとに XferCommand を呼び出し、それが完了してから次を呼び出すからです。同時に複数のパッケージをダウンロードするには、上の [[#Powerpill|powerpill]] のセクションを見て下さい。}}
+
{{Note|''pacman'' の XferCommand で aria2c を使っても複数パッケージの同時ダウンロードは'''行われません'''。Pacman はひとつのパッケージごとに XferCommand を呼び出し、それが完了してから次を呼び出すからです。同時に複数のパッケージをダウンロードするには、[[Powerpill]] を見て下さい。}}
   
{{Pkg|aria2}} をインストールして {{ic|/etc/pacman.conf}} を編集し、以下行を {{ic|[options]}} セクションに追加してください:
+
{{Pkg|aria2}} をインストールして{{ic|/etc/pacman.conf}} の {{ic|[options]}} セクションに以下の行を追加してください:
   
 
XferCommand = /usr/bin/aria2c --allow-overwrite=true --continue=true --file-allocation=none --log-level=error --max-tries=2 --max-connection-per-server=2 --max-file-not-found=5 --min-split-size=5M --no-conf --remote-time=true --summary-interval=60 --timeout=5 --dir=/ --out %o %u
 
XferCommand = /usr/bin/aria2c --allow-overwrite=true --continue=true --file-allocation=none --log-level=error --max-tries=2 --max-connection-per-server=2 --max-file-not-found=5 --min-split-size=5M --no-conf --remote-time=true --summary-interval=60 --timeout=5 --dir=/ --out %o %u
   
{{Tip|1=設定を簡単にして他の設定オプションを追加する [https://bbs.archlinux.org/viewtopic.php?pid=1491879#p1491879 aria2 を pacman で使用するの設定] も存在します。}}
+
{{Tip|1=[https://bbs.archlinux.org/viewtopic.php?pid=1491879#p1491879 このページで示されている、aria2 を pacman で使用する設定]は、設定を簡単にし、より多くの設定オプションを追加します。}}
   
aria2c で使用できるオプションについては {{ic|man aria2c}} の [http://aria2.sourceforge.net/manual/en/html/aria2c.html#options OPTIONS] を見てください。
+
使用されてい aria2c のオプションについては {{man|1|aria2c|OPTIONS}} を見てください。
   
* {{ic|-d, --dir}}: [[pacman]] によって指定されるダウンロードしたファイルを保存するディレクトリ。
+
* {{ic|-d, --dir}}: ダウンロードしたファイルを保存するディレクトリ。
 
* {{ic|-o, --out}}: ダウンロードしたファイルの出力ファイル名。
 
* {{ic|-o, --out}}: ダウンロードしたファイルの出力ファイル名。
* {{ic|%o}}: pacman によって指定されるローカルのファイル名を表す変数。
+
* {{ic|%o}}: ''pacman'' によって指定されるローカルのファイル名を表す変数。
*{{ic|%u}}: pacman によって指定されるダウンロード URL を表す変数。
+
* {{ic|%u}}: ''pacman'' によって指定されるダウンロード URL を表す変数。
   
 
==== 他のアプリケーション ====
 
==== 他のアプリケーション ====
   
Pacman で利用できるダウンロードアプリケションは他にもあります:
+
''pacman'' で利用できるダウンローーは他にもあります。以下はそのダウンローダーと、利用するための XferCommand 設定を挙げています:
   
 
* {{ic|snarf}}: {{ic|1=XferCommand = /usr/bin/snarf -N %u}}
 
* {{ic|snarf}}: {{ic|1=XferCommand = /usr/bin/snarf -N %u}}
 
* {{ic|lftp}}: {{ic|1=XferCommand = /usr/bin/lftp -c pget %u}}
 
* {{ic|lftp}}: {{ic|1=XferCommand = /usr/bin/lftp -c pget %u}}
 
* {{ic|axel}}: {{ic|1=XferCommand = /usr/bin/axel -n 2 -v -a -o %o %u}}
 
* {{ic|axel}}: {{ic|1=XferCommand = /usr/bin/axel -n 2 -v -a -o %o %u}}
  +
* {{ic|hget}}: {{ic|1=XferCommand = /usr/bin/hget %u -n 2 -skip-tls false}} (詳細は [https://github.com/huydx/hget Github のプロジェクトページのドキュメント]を読んでください)
  +
* {{ic|saldl}}: {{ic|1=XferCommand = /usr/bin/saldl -c6 -l4 -s2m -o %o %u}} (詳細は [https://saldl.github.io プロジェクトページのドキュメント]を読んでください)
  +
  +
== ユーティリティ ==
  +
  +
* {{App|isfree|フリーでないパッケージを一覧表示する Bash スクリプト。Parabola のブラックリストをベースとしています。|https://github.com/leo-arch/isfree|{{AUR|isfree}}}}
  +
* {{App|Lostfiles|孤立したファイルを検知するスクリプト。|https://github.com/graysky2/lostfiles|{{Pkg|lostfiles}}}}
  +
* {{App|pacutils|libalpm ベースのプログラム用のヘルパーライブラリ。|https://github.com/andrewgregory/pacutils|{{Pkg|pacutils}}}}
  +
* {{App|[[pkgfile]]|あるファイルを使っているパッケージが何かを見つけるツール。|https://github.com/falconindy/pkgfile|{{Pkg|pkgfile}}}}
  +
* {{App|pkgtop|GNU/Linux 用に開発されたインタラクティブなパッケージマネージャ兼リソースモニター。|https://github.com/orhun/pkgtop|{{AUR|pkgtop-git}}}}
  +
* {{App|[[Powerpill]]|[[aria2]] や [[Reflector]] を通じて並列分割ダウンロードを行い ''pacman'' のダウンロード処理を高速化。|https://xyne.dev/projects/powerpill/|{{AUR|powerpill}}}}
  +
* {{App|repoctl|ローカルリポジトリの管理を補助するツール。|https://github.com/cassava/repoctl|{{AUR|repoctl}}}}
  +
* {{App|repose|Arch Linux リポジトリ作成ツール。|https://github.com/vodik/repose|{{Pkg|repose}}}}
  +
* {{App|[[Snapper#pacman のトランザクションをスナップショットで記録|snap-pac]]|openSUSE の YaST のように ''pacman'' で自動的に snapper のスナップショットを作成するツール。|https://github.com/wesbarnett/snap-pac|{{Pkg|snap-pac}}}}
  +
* {{App|vrms-arch|フリーでないパッケージがインストールされているかどうかを教えてくれるバーチャル Richard M. Stallman。|https://github.com/orospakr/vrms-arch|{{AUR|vrms-arch-git}}}}
  +
  +
=== グラフィカル ===
  +
  +
{{Warning|PackageKit は既定でシステムのパーミッションを {{ic|wheel}} グループに開放するので、一般的な用途では[https://github.com/archlinux/archinstall/issues/1321#issuecomment-1151343223 おすすめできません]。{{Bug|50459}} および {{Bug|57943}} を参照してください。}}
  +
  +
* {{App|Deepin App Store|DTK で構築された Deepin デスクトップ環境用のサードパーティアプリストア。PackageKit を使用しています。[https://www.freedesktop.org/wiki/Distributions/AppStream/ AppStream メタデータ] をサポートしています。.|https://github.com/dekzi/dde-store|{{Pkg|deepin-store}}}}
  +
* {{App|Discover|C++/QML で書かれた、PackageKit を使用する Qt 5 アプリケーションマネージャ。[https://www.freedesktop.org/wiki/Distributions/AppStream/ AppStream メタデータ]、[[Flatpak]]、[[fwupd|ファームウェアの更新]]をサポートしています。{{Grp|plasma}} に含まれています。|https://apps.kde.org/discover/|{{Pkg|discover}}}}
  +
* {{App|GNOME PackageKit|C で書かれた、PackageKit を使用する GTK 3 パッケージマネージャ。|https://freedesktop.org/software/PackageKit/|{{Pkg|gnome-packagekit}}}}
  +
* {{App|pcurses|C++ で書かれた、Curses TUI の ''pacman'' ラッパー。|https://github.com/schuay/pcurses|{{AUR|pcurses}}}}
  +
* {{App|tkPacman|Tcl で書かれた、Tk の pacman ラッパー。|https://sourceforge.net/projects/tkpacman|{{AUR|tkpacman}}}}
  +
  +
{{TranslationStatus|pacman/Tips and tricks|2024-08-24|814725}}

2024年8月24日 (土) 15:36時点における最新版

関連記事

以下のヒントや pacman 自体の柔軟性を広げる汎用的な手法については、Core UtilitiesBash を見てください。

目次

メンテナンス

ノート: 以下のセクションで使われている comm コマンド (入力が sort でソートされている必要があります) の代わりに、grep -Fxfgrep -Fxvf を使うこともできます。

システムメンテナンスも参照。

パッケージをリストアップ

未使用のリポジトリで

デフォルトでは、pacman.conf に載っているリポジトリが同期、検索、インストール、アップグレードに使用されます。しかし、リポジトリの使用用途は自由に変更できます。例えば、一部のリポジトリは検索のみに使用するには[1]:

/etc/pacman.conf
...
[multilib]
Usage = Sync Search
...

pacman.conf(5) § REPOSITORY SECTIONS を参照。

バージョンも表示

バグを報告したりインストールしたパッケージについて説明するときは、インストール済みのパッケージとそのバージョンのリストを貼り付けると便利です。

  • 明示的にインストールしたパッケージを全てリストアップ: pacman -Qe
  • group パッケージグループに含まれるパッケージを全てリストアップ: pacman -Sg group
  • 外部パッケージを全てリストアップ (典型的には、手動でダウンロードしてインストールしたパッケージや、リポジトリから削除されたパッケージです): pacman -Qm
  • ネイティブなパッケージ (同期データベースからインストールしたパッケージ) をリストアップ: pacman -Qn
  • 依存パッケージでも任意の依存パッケージでもない、明示的にインストールしたネイティブパッケージ (同期データベースにあるパッケージ) をリストアップ: pacman -Qent
  • 正規表現にマッチするパッケージをリストアップ: pacman -Qs regex
  • 正規表現にマッチするパッケージを、カスタムの出力フォーマットでリストアップ (expac が必要です): expac -s "%-30n %v" regex

サイズも表示

ハードドライブの容量を空けたい場合に、どのパッケージが最も大きいかを調べられると便利です。方法としては、個々のパッケージのサイズを調べる方法と、パッケージとその依存パッケージのサイズを調べる方法の2つがあります。

個々のパッケージ

次のコマンドは、インストール済みのパッケージをそのサイズとともに表示します:

$ LC_ALL=C.UTF-8 pacman -Qi | awk '/^Name/{name=$3} /^Installed Size/{print $4$5, name}' | LC_ALL=C.UTF-8 sort -h
パッケージと依存パッケージ

パッケージのサイズを依存パッケージとともに表示する方法は2つあります:

  • expac をインストールして、次のように実行する: expac -H M '%m\t%n' | sort -h
  • pacgraphAUR-c オプションを使う。

複数のパッケージのダウンロードサイズをリストアップするには (全パッケージをリストアップするには packages に何も入力しないでください):

$ expac -S -H M '%k\t%n' packages

base メタパッケージにも xorg パッケージグループにも属さない、明示的にインストールされたパッケージをサイズと説明とともにリストアップするには:

$ expac -H M "%011m\t%-20n\t%10d" $(comm -23 <(pacman -Qqen | sort) <({ pacman -Qqg xorg; expac -l '\n' '%E' base; } | sort -u)) | sort -n

バージョンが古いくなっているパッケージをダウンロードサイズともに表示するには:

$ expac -S -H M '%k\t%n' $(pacman -Qqu) | sort -sh

任意の依存パッケージのみを表示するには:

$ expac -S "%o" package

日付でソート

最も最後にインストールされた20個のパッケージを expac でリストアップするには:

$ expac --timefmt='%Y-%m-%d %T' '%l\t%n' | sort | tail -n 20

あるいは、エポック秒 (1970-01-01 UTC) を表示するには:

$ expac --timefmt=%s '%l\t%n' | sort -n | tail -n 20

指定したグループ、リポジトリ、メタパッケージに含まれないパッケージ

ノート: 依存パッケージとしてインストールされたが、既にどのパッケージからも必要とされていないパッケージを確認したい場合は #使用していないパッケージ (孤立したパッケージ) の削除 章を参照。

明示的にインストールしたパッケージの中で base メタパッケージに含まれないものを一覧表示するには:

$ comm -23 <(pacman -Qqe | sort) <(expac -l '\n' '%E' base | sort)

明示的にインストールしたパッケージの中で base メタパッケージにも xorg パッケージグループにも含まれていないものを一覧表示するには:

$ comm -23 <(pacman -Qqe | sort) <({ pacman -Qqg xorg; expac -l '\n' '%E' base; } | sort -u)

インストールしたパッケージの中で、他のどのパッケージからも必要とされておらず、かつ base メタパッケージにも xorg パッケージグループにも含まれていないものを一覧表示するには:

$ comm -23 <(pacman -Qqt | sort) <({ pacman -Qqg xorg; echo base; } | sort -u)

先と同じですが、説明も付けて一覧表示するには:

$ expac -H M '%-20n\t%10d' $(comm -23 <(pacman -Qqt | sort) <({ pacman -Qqg xorg; echo base; } | sort -u))

インストールしたパッケージの中で、repo_name という名前のリポジトリに含まれていないものを一覧表示するには:

$ comm -23 <(pacman -Qq | sort) <(pacman -Sql repo_name | sort)

インストールしたパッケージの中で、repo_name という名前のリポジトリに含まれているものを一覧表示するには:

$ comm -12 <(pacman -Qq | sort) <(pacman -Sql repo_name | sort)

Arch Linux ISO にインストールされているパッケージの中で、base メタパッケージに含まれていないものを一覧表示するには:

$ comm -23 <(curl https://gitlab.archlinux.org/archlinux/archiso/-/raw/master/configs/releng/packages.x86_64) <(expac -l '\n' '%E' base | sort)
ヒント: 別の方法として、comm よりも簡単に覚えられる構文を持つ moreutils パッケージの combine を使うこともできます。詳細は combine(1) を参照。

開発版パッケージ

開発版や不安定版のパッケージを一覧表示するには:

$ pacman -Qq | grep -Ee '-(bzr|cvs|darcs|git|hg|svn)$'

パッケージの依存パッケージ

あるパッケージの依存パッケージの一覧を入手したい場合、最も簡単な方法は以下のコマンドの出力を見ることです:

$ pacman -Qi package

自動化させるには、pacman の出力をパースするというエラーの発生しやすい方法を取るのではなく、expac を使ってください:

$ expac -S '%D' package

任意の依存パッケージも表示

明示的にインストールしたパッケージを、その任意の依存パッケージも一緒に一覧表示するには:

$ LC_ALL=C.UTF-8 pacman -Qei | sed '/^[^NO ]/d;/None$/d' | awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n\\S"} /Optional Deps/ {print $1"\nO"$2}'

あるいは、expac を使って:

$ expac -d '\n\n' -l '\n\t' -Q '%n\n\t%O' $(pacman -Qeq)

先とほぼ同じですが、既にインストール済みの任意の依存パッケージを出力から除くには:

$ LC_ALL=C.UTF-8 pacman -Qei | sed '/^[^NO ]/d;/None$/d' | awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n\\S"} /Optional Deps/ {print $1"\nO"$2}' | sed 's/^Optional Deps   ://;/\[installed\]$/d;s/\s\+/ /'

パッケージの閲覧

インストール済みのパッケージを、プレビューウィンドウを表示してブラウズするには:

$ pacman -Qq | fzf --preview 'pacman -Qil {}' --layout=reverse --bind 'enter:execute(pacman -Qil {} | less)'

このコマンドは、パッケージの一覧を左のペインに、パッケージの情報を右のペインにそれぞれ表示させるために fzf を使用しています。

表示するパッケージを絞るには文字を入力してください。矢印キーで (または Ctrl-j/Ctrl-k) で移動し、Enter でパッケージの情報を less で表示します。

pacman のデータベースに載っているパッケージ (インストールされているものとされていないもの両方) を同じような方法 (fzf) でブラウズするには:

$ pacman -Slq | fzf --preview 'pacman -Si {}' --layout=reverse

カーソルの移動方法は同じです。しかし、Enter キーは先程と同じようには動きません。

パッケージが所有しているファイルとそのサイズを一覧表示

このコマンドは、特定のパッケージが多くの容量を使用していることが分かっていて、そのパッケージのどのファイルが最も大きいかを確認したい場合に便利かもしれません。

$ pacman -Qlq package | grep -v '/$' | xargs -r du -h | sort -h

どのパッケージにも所有されていないファイルを特定する

どのパッケージにも所有されていないファイルがある場合 (ソフトウェアのインストールにパッケージマネージャを使用しなかった場合に起こりえます)、そのようなファイルをクリーンアップするために特定する必要があることがあります。

1つ目の方法は、確認しておきたいファイルのリストから、それらが所有されているかどうかを pacman で調べる方法です:

# (export LC_ALL=C.UTF-8; comm -13 <(pacman -Qlq | sed 's,/$,,' | sort) <(find /etc /usr /opt -path /usr/lib/modules -prune -o -print | sort))
ヒント: lostfiles スクリプトも同じようなことをしますが、一般的に偽陽性とされるファイルを出力から取り除くための拡張可能なブラックリストが含まれています。

パッケージによって作成された未所有のファイルを追跡する

ほとんどのシステムでは、通常の運用でも状態ファイル、ログ、インデックスなどといったゴーストファイルがゆっくりと蓄積していきます。

pacutils パッケージの pacreport を使えば、/etc/pacreport.conf の設定を使用して、そのようなファイルとそれらと関連するパッケージを追跡できます (pacreport(1) § FILES を参照)。

設定ファイルの例としては以下のようなものがあるでしょう (要約):

/etc/pacreport.conf
[Options]
IgnoreUnowned = usr/share/applications/mimeinfo.cache

[PkgIgnoreUnowned]
alsa-utils = var/lib/alsa/asound.state
bluez = var/lib/bluetooth
ca-certificates = etc/ca-certificates/trust-source/*
dbus = var/lib/dbus/machine-id
glibc = etc/ld.so.cache
grub = boot/grub/*
linux = boot/initramfs-linux.img
pacman = var/lib/pacman/local
update-mime-database = usr/share/mime/magic

設定ファイルを作成したら、pacreport --unowned-files を root ユーザーとして実行すれば、関連するパッケージがすでにアンインストールされている場合 (または、新しいファイルが作成された場合)、それに対応する未所有のファイルが一覧表示されます。

加えて、aconfmgr (aconfmgr-gitAUR) は、設定スクリプトを使用して、変更されたファイルや孤立したファイルを追跡できます。

使用していないパッケージ (孤立したパッケージ) の削除

孤立したパッケージ (orphan) とは、依存パッケージとしてインストールされたが、もはやどのパッケージからも必要とされていないパッケージのことです。

パッケージのアンインストール時に pacman -Rs package ではなく pacman -R package を使ったことや、makedepends として設定されているパッケージをインストールしたこと、パッケージの新しいバージョンで依存関係が解消したことが原因で、このようなパッケージは時間と共にシステムに蓄積していく可能性があります。

孤立したパッケージとその設定ファイルを再帰的に削除するには:

# pacman -Qdtq | pacman -Rns -

孤立したパッケージが見つからなかった場合、このコマンドの出力は error: argument '-' specified with empty stdin (エラー: 引数 '-' が指定されましたが標準入力が空です) となります。これは、pacman -Rns に引数が渡されなかった場合の想定通りの動作です。このエラーは、2つ目のコマンドの前に moreutils パッケージの ifne(1) を加えれば出なくなります。

削除したくないパッケージが先のコマンドの出力に載っていた場合は、そのパッケージを明示的にインストールしたものとして登録することで、孤立したパッケージのリストから外すことができます:

# pacman -D --asexplicit package
ノート: -Qt 引数は、本当にどのパッケージからも一切必要とされていないパッケージしか出力しません。任意の依存パッケージとして必要とされているパッケージも含めるには、-t フラグを2つ渡してください (つまり、-Qtt)。
ヒント: pacman -Qdt コマンドを pacman のトランザクション後のフックに追加すると、トランザクションによって必要とされなくなったパッケージが発生した場合に知らせてくれます。こうすると、パッケージがリポジトリから削除された際にしらせてくれるので便利です (パッケージがリポジトリから削除されると、ローカルにインストールされている同じパッケージは、明示的にインストールされていない場合、自動的に孤立したパッケージになるためです)。孤立したパッケージが見つからなかった場合に "failed to execute command" ("コマンドの実行に失敗しました") エラーにならないようにするには、フックの Exec オプションに次のコマンドを指定してください:

/usr/bin/bash -c "/usr/bin/pacman -Qdt || /usr/bin/echo '=> None found.'"

pacman-log-orphans-hookAUR パッケージも同じようなフックを提供しますが、孤立したパッケージが見つかった際により詳細な指示を出してくれます。

より多くの不要なパッケージを検出する

上記の方法では、必要とされないパッケージが検出されないことがあります。例えば、依存関係のサイクル ("循環依存" とも呼ばれる)、過剰な依存 (複数回、依存関係が発生する)、明示的ではない任意の依存などの場合です。

そのようなパッケージを検出するには:

$ pacman -Qqd | pacman -Rsu --print -

先のコマンドで出力されたパッケージを一度に全て削除したい場合は、--print フラグ無しでコマンドを実行してください。

必須パッケージ以外の全てのパッケージを削除する

必須パッケージを除いて全てのパッケージを削除する必要がある場合、1つの方法は、必須でないパッケージのインストール理由を「依存パッケージ」と設定してから、不要な依存パッケージを全て削除することです。

まず、"明示的にインストール" されたパッケージのインストール理由を "依存関係としてインストール" に変更します:

# pacman -D --asdeps $(pacman -Qqe)

次に、必須パッケージ (つまり、削除したくないパッケージ) が削除対象にならないようにするために、それらのインストール理由を "明示的にインストール" に変更します:

# pacman -D --asexplicit base linux linux-firmware
ノート:
  • 他のパッケージも削除されないようにしたい場合は、上記のコマンドに加えてください。完全に機能するベースシステムに必要となりうる他のパッケージについては インストールガイド#必須パッケージのインストール を参照してください。
  • 上記のコマンドではブートローダーのパッケージも削除対象になります。削除してもシステム自体は起動可能なままであるはずですが、パッケージがないとブートパラメータを変更できないかもしれません。

最後に、#使用していないパッケージ (孤立したパッケージ) の削除 の手順に従って "依存関係としてインストール" に指定されたパッケージを削除してください。

複数のパッケージの依存パッケージリストを取得

依存パッケージはアルファベット順にソートされ、重複するパッケージは1つにまとめられます。

ノート: ローカルにインストールされたパッケージのみの依存関係ツリーを表示するには、(pacman -Si の部分で) pacman -Qi コマンドを代わりに使用してください。
$ LC_ALL=C.UTF-8 pacman -Si packages | awk -F'[:<=>]' '/^Depends/ {print $2}' | xargs -n1 | sort -u

あるいは、expac を使って:

$ expac -l '\n' %E -S packages | sort -u

変更されたバックアップファイルをリストアップ

ユーザーによって変更される可能性のあるファイル (つまり、PKGBUILD の backup 配列に含まれているファイル) として pacman に追跡されていて、かつユーザーによって変更が加えられた設定ファイルを一覧表示するには:

# pacman -Qii | awk '/\[modified\]/ {print $(NF - 1)}'

このコマンドを root 権限で実行することで、root ユーザーからしか読み取れないファイル /etc/sudoers など) も出力に含まれるようになります。

このコマンドは、システムのバックアップを選択的に行いたい時や、システムの設定をマシンからマシンへ複製する際に使うことができます。

ヒント:

pacman データベースをバックアップ

次のコマンドでローカルの pacman データベースをバックアップできます:

$ tar -cjf pacman_database.tar.bz2 /var/lib/pacman/local

バックアップした pacman データベースファイルは USB スティックや外付けハードドライブ、CD-R など、一つ以上のオフラインメディアに保存してください。

pacman_database.tar.bz2 ファイルを / ディレクトリに移動して以下のコマンドを実行することでデータベースを復元できます:

# tar -xjvf pacman_database.tar.bz2
ノート: pacman データベースファイルが破損していて、バックアップファイルが存在しない場合でも、pacman データベースを再構築できる望みはあります。#pacman のローカルデータベースを復元する を見てください。
ヒント: pakbak-gitAUR パッケージには上記の作業を自動的に行うスクリプトと systemd サービスが入っています。/etc/pakbak.conf で設定が可能です。

変更履歴を簡単に確認

メンテナがパッケージを更新するとき、大抵の場合コミットにはコメントが付けられます。pacologAUR をインストールすることでコマンドラインからコミットメッセージを素早く確認することができます。pacolog package を実行すると、公式リポジトリのパッケージまたは AUR のパッケージの最近のコミットメッセージの一覧を表示します。

インストールとリカバリ

パッケージを取得・復活させる別の方法。

パッケージを CD/DVD や USB スティックからインストールする

パッケージやパッケージグループをダウンロードするには:

# cd ~/Packages
# pacman -Syw --cachedir . base base-devel grub-bios xorg gimp
# repo-add ./custom.db.tar.zst ./*.pkg.tar.zst

Pacman はデフォルトでホストのインストール環境を参照するため、既存の依存関係を適切に解決したり、ダウンロードしたりすることができません。すべてのパッケージと依存関係が必要である場合は、一時的な空のデータベースを作成し、そのデータベースを --dbpath オプションで参照すると良いでしょう:

# mkdir /tmp/blankdb
# pacman -Syw --cachedir . --dbpath /tmp/blankdb base base-devel grub-bios xorg gimp
# repo-add ./custom.db.tar.zst ./*.pkg.tar.zst

次に、先の "Packages" ディレクトリを光学ディスク (CD や DVD など) に焼くか、USB ドライブや外部 HDD などに保存してください。

インストールするには:

1. メディアをマウントする:

光学ディスクドライブの場合は:

# mount --mkdir /dev/sr0 /mnt/repo

USB ドライブやハードディスクドライブなどの場合は:

# mount --mkdir /dev/sdxY /mnt/repo

2. マウントしたリポジトリを pacman.conf に追加してください。ただし、他のリポジトリより前に置いてください。リポジトリの順番が重要です。pacman.conf の一番下にある、コメントアウトされているリポジトリをアンコメントするだけではいけません。他のリポジトリより前に置くことで、CD/DVD/USB にあるファイルを標準のリポジトリ上にあるものよりも優先させます:

/etc/pacman.conf
[custom]
SigLevel = PackageRequired
Server = file:///mnt/repo/Packages

3. 最後に、pacman データベースを同期し、追加した新しいリポジトリを利用できるようにします:

# pacman -Syu

カスタムローカルリポジトリ

pacman に含まれる repo-add スクリプトを使うことで、個人用のリポジトリのデータベースを生成することができます。詳しい使い方は repo-add --help を実行して見て下さい。

パッケージデータベースは tar ファイルです (任意で圧縮できます)。有効な拡張子は、.db.files の後に、アーカイブ拡張子 .tar.tar.gz.tar.bz2.tar.xz.tar.zst.tar.Z のうちどれかを付け加えたものになります。(repo-add を使用する際に) このファイルが存在している必要はありませんが、親ディレクトリはすべて存在していなければなりません。

新しいパッケージをデータベースに追加する、あるいはデータベース内にすでにある古いバージョンのパッケージを置き換えるには、以下を実行してください:

$ repo-add /path/to/repo.db.tar.zst /path/to/package-1.0-1-x86_64.pkg.tar.zst

repo-add を使用する際は、データベースとパッケージが同一のディレクトリ内に存在している必要はありません。ただし、そのデータベースを pacman で使用する際は、データベースとパッケージが一緒に存在している必要があるので注意してください。また、リポジトリに含めるビルド済みパッケージをすべて1つのディレクトリに入れておけば、シェルのグロブ拡張を使って複数のパッケージを一度に追加/更新することができます:

$ repo-add /path/to/repo.db.tar.zst /path/to/*.pkg.tar.zst
警告: repo-add は、コマンドラインで渡された順番でエントリをデータベースに追加します。同じパッケージの複数のバージョンが渡された場合、正しいバージョンが最後に追加されるよう注意しなければなりません。特に、シェルによって使用される辞書順はロケール依存であり、pacman によって使用される vercmp(8) の順序とは異なるので注意してください。

複数のアーキテクチャをサポートしようと考えている場合、エラーが起こらないように注意する必要があります。各アーキテクチャに独自のディレクトリツリーが存在している必要があります:

$ tree ~/customrepo/ | sed "s/$(uname -m)/arch/g"
/home/archie/customrepo/
└── arch
    ├── customrepo.db -> customrepo.db.tar.zst
    ├── customrepo.db.tar.zst
    ├── customrepo.files -> customrepo.files.tar.zst
    ├── customrepo.files.tar.zst
    └── personal-website-git-b99cce0-1-arch.pkg.tar.zst

1 directory, 5 files

repo-add 実行ファイルは、パッケージが適切であるかどうかをチェックします。パッケージが適切でない場合、以下のようなエラーメッセージが出力されます:

==> ERROR: '/home/archie/customrepo/arch/foo-arch.pkg.tar.zst' does not have a valid database archive extension.

repo-remove はパッケージデータベースからパッケージを削除するために使用されます。パッケージの名前のみをコマンドラインで指定します。

$ repo-remove /path/to/repo.db.tar.zst pkgname

ローカルリポジトリを作成できたら、リポジトリを pacman.conf に追加してください。カスタムリポジトリの例は pacman.conf 内にあります。リポジトリ名は、データベースのファイル名からファイル拡張子を除いたものになります。上記の例では、リポジトリ名は単に repo となります。リポジトリの場所を参照するには、file:// URL を使うか、http://localhost/path/to/directory を使って HTTP 経由で行ってください。

もし良ければ、カスタムリポジトリを非公式ユーザリポジトリのリストに追加して、コミュニティがその恩恵を受けられるようにしましょう。

pacman のキャッシュをネットワークで共有する

LAN 上で複数の Arch マシンを使っている場合、パッケージを共有することでダウンロード回数を劇的に減らすことができます。使用しているアーキテクチャが異なるマシン (i686 と x86_64) でキャッシュを共有してはいけません。問題が発生します。

読み取り専用キャッシュ

Pacman 6.1.0 はキャッシュサーバーを直接サポートしています。キャッシュサーバーは、キャッシュでないサーバーよりも前に試行されます。また、キャッシュサーバーはダウンロード時に HTTP 404 エラーが発生してもサーバープールから削除されず、データベースファイルとしては使用されません。

手っ取り早い解決策を探している場合は、他のコンピュータからキャッシュサーバーとしてアクセスできる一時的なシンプルなウェブサーバーを走らせることができます。

Pacman のキャッシュディレクトリを共有してみましょう。例えば、Pythonhttp.server モジュールを使う場合は:

$ python -m http.server -d /var/cache/pacman/pkg/
ヒント: デフォルトでは、Python の http.server は任意のインターフェイスの 8000 番ポートをリッスンします。別のポートを使いたい場合や、特定のアドレスにのみバインドしたい場合は、パラメータを追加してください:
$ python -m http.server -d /var/cache/pacman/pkg/ --bind 127.0.0.1 8080

次に、各クライアントマシンでキャッシュサーバーを追加するように /etc/pacman.d/mirrorlist編集してください:

/etc/pacman.d/mirrorlist
CacheServer = http://server-ip:port
警告: 他のサーバーエントリと違って、このカスタムサーバーのオプションには /repos/$repo/os/$arch を付けてはいけません。このキャッシュサーバーにはこのディレクトリ階層が存在しないため、クエリが失敗してしまうからです。

スタンドアローンな方法としては darkhttpd で最小限のウェブサーバーを立てられます。先の python コマンドを例えば以下のように置き換えてください:

[http]$ darkhttpd /var/cache/pacman/pkg --no-server-id

利便性のために darkhttpd を systemd サービスとして走らせることもできます。Systemd#ユニットファイル を参照してください。

Rust で書かれた小規模な Web サーバーである miniserve も使用できます:

$ miniserve /var/cache/pacman/pkg

次に、miniserve へアクセスできる最初の URL を使って、上記のように /etc/pacman.d/mirrorlist を編集してください。

すでに他の目的で Web サーバーを実行している場合は、代わりにそれをローカルリポジトリサーバーとして再利用できます。たとえば、すでに nginx でサイトを提供している場合は、8080 番ポートで待受する nginx サーバーブロックを追加できます:

/etc/nginx/nginx.conf
server {
    listen 8080;
    root /var/cache/pacman/pkg;
    server_name myarchrepo.localdomain;
    try_files $uri $uri/;
}

この変更を加えた後は、必ず nginx.service再起動を行ってください。

ヒント: どの Web サーバーを使用する場合でも、ファイアウォール設定 (存在する場合) で、設定されたポートへの目的のトラフィックの到達が許可され、不要なトラフィックが許可されていないことを確認してください。セキュリティ#ネットワークとファイアウォールを参照してください。

読み取り専用キャッシュのオーバーレイマウント

ローカルネットワーク上にあるマシンの /var/cache/pacman/pkg ディレクトリをオーバーレイマウントすることで、読み取り専用のパッケージキャッシュとして使うことができます。キャッシュサーバーに他のマシンでも使われている最新のパッケージがある程度包括的にインストールされている場合、このような構成は効果的です。低帯域幅のアップストリーム接続の終端に一定数のマシンが存在する場合、この方法が便利です。

例:

# mkdir /tmp/remote_pkg /mnt/workdir_pkg /tmp/pacman_pkg
# sshfs remote_username@remote_pkgcache_addr:/var/cache/pacman/pkg /tmp/remote_pkg -C
# mount -t overlay overlay -o lowerdir=/tmp/remote_pkg,upperdir=/var/cache/pacman/pkg,workdir=/mnt/workdir_pkg /tmp/pacman_pkg
ノート: 作業ディレクトリは、上位ディレクトリと同じマウント済みデバイス上の空のディレクトリである必要があります。Overlayfs#使用方法 を参照してください。
ヒント: /tmp/pacman_pkg オーバーレイディレクトリ内のファイルを一覧表示しようとすると "Stale file handle" などのエラーが発生する場合、オーバーレイマウントのオプションに -o redirect_dir=off -o index=off を使ってみてください。

これで、オプション --cachedir /tmp/pacman_pkg を使用して pacman を実行できます。例:

# pacman -Syu --cachedir /tmp/pacman_pkg

読み取り専用の分散キャッシュ

パッケージキャッシュを提供しているネットワーク上の他のコンピューターを自動的に検出するための Arch 固有のツールがあります。pacredirpacservepkgdistcacheAUR、または paclanAUR を試してください。pkgdistcache は、プレーンな UDP ではなく Avahi を使用します。これは、WiFi とイーサネット間のブリッジではなくルーティングを行う特定のホームネットワークでより適切に機能する可能性があります。

歴史的には、PkgDmultipkg がありましたが、現在はメンテナンスされていません。

読み書き可能キャッシュ

ネットワークベースのマウントプロトコルを使って /var/cache/pacman/ を共有すれば、複数のコンピュータ間でパッケージを共有することができます。このセクションでは、SSHFS を使って、同じローカルネットワーク上にある複数のコンピュータ間でパッケージのキャッシュ及び関連するライブラリディレクトリを共有する方法を説明します。ただし、ネットワーク経由で共有されたキャッシュは、ファイルシステムの選択などの要因によって遅くなる可能性があることを留意しておいてください。

まず、ネットワーク共有をサポートするファイルシステムのパッケージ (sshfscurlftpfssambanfs-utils のうち一つ) をインストールしてください。

ヒント:
  • sshfs を使う場合、SSH 鍵 の記事を読むことを検討してください。
  • デフォルトでは、smbfs はコロンを含むファイル名をサポートしていないため、クライアント側はそのような問題のあるパッケージをいちいちインターネットからダウンロードしてしまいます。これを防ぐには、クライアント側で mapchars マウントオプションを使用してください。

次に、サーバ上の /var/cache/pacman/pkg をすべてのクライアントマシン上の /var/cache/pacman/pkg にマウントすることで実際のパッケージを共有できます。

警告: /var/cache/pacman/pkg とその上位のディレクトリ (/var など) はシンボリックリンクにしてはいけません。Pacman はこれらがディレクトリであると期待するからです。pacman が自身を再インストールまたはアップグレードする時、そのようなシンボリックリンクは削除され、空のディレクトリが代わりに作成されます。しかし、トランザクション中、pacman は一部のファイルがそのディレクトリ内に存在することを期待するため、アップデートのプロセスに問題が発生してしまいます。詳細は FS#50298 を参照してください。

rsync や FTP で双方向同期

ローカル環境でのもう一つの方法は rsync です。キャッシュを提供するサーバーを選択し、rsync デーモンを有効化してください。クライアント側では、rsync プロトコルを介すことでこの共有ディレクトリと双方向で同期します。Rsync プロトコルにおいては、ファイル名にコロンが含まれていても問題ありません。

以下はクライアント側での例です。共有ディレクトリの名前に uname -m を使うことで、システムのアーキテクチャと同じキャッシュを同期できるようにします:

# rsync ... rsync://server/share_$(uname -m)/ /var/cache/pacman/pkg/ 
# pacman -Syu
# paccache --remove --keep 3
# rsync --delete ... /var/cache/pacman/pkg/ rsync://server/share_$(uname -m)/

暗号化されていない rsync デーモンよりもセキュアな方法として rsync over ssh があります。これについては Rsync#SSH を使った自動バックアップ で概説されています。

Rsync がローカル環境で利用できない場合は、シンプルな ftp サービスを双方向同期に使用するのも良いでしょう。lftp は、ローカルをリモートストレージと同期するためのオプション --mirror--delete を提供しています。

nginx で動的リバースプロキシキャッシュ

nginx を使えば、パッケージのリクエストを公式の上流ミラーにプロキシして、ダウンロードしたファイルをローカルのディスクにキャッシュしておくことができます。その後、同じパッケージに対するリクエストはすべてローカルのキャッシュから直接提供されるようになるため、多くのコンピュータが存在する場合に必要になるインターネットトラフィックの量を最小化できます。

この例では、キャッシュサーバーを http://cache.domain.example:8080/ で実行し、パッケージを /srv/http/pacman-cache/ に保存します。

キャッシュを提供するコンピュータに nginx をインストールしてください。キャッシュ用のディレクトリを作成し、nginx がそのディレクトリへファイルを書き込みできるようにパーミッションの設定を行ってください:

# mkdir /srv/http/pacman-cache
# chown http:http /srv/http/pacman-cache

この pacman キャッシュ用の nginx 設定/etc/nginx/nginx.conf の開始点として使います。resolver ディレクティブの設定はこれでよいかどうかを確認してください。上流のサーバーブロックでは、proxy_pass ディレクティブを公式ミラーのアドレスに設定してください。オプションの形式は先の設定ファイルを参考にしてください。設定ファイルが完成したら、nginx を開始し、有効化してください

キャッシュを使うには、各 Arch Linux コンピュータ (キャッシュをホストするコンピュータも含む) の mirrorlist ファイルの一番最初に以下の行を追加する必要があります:

/etc/pacman.d/mirrorlist
Server = http://cache.domain.example:8080/$repo/os/$arch
...
ノート: 時間ともにキャッシュディレクトリの容量は増加するために、古いパッケージキャッシュをクリーンアップするようにしておく必要があります。paccache (pacman-contrib でインストールできます) は、保持するパッケージキャッシュを決める条件を使うことでクリーンアップを自動化できます。例えば、次のコマンドはキャッシュディレクトリ内のパッケージのうち最新の2つのバージョンのみを保持します (残りは削除されます): find /srv/http/pacman-cache/ -type d -exec paccache -v -r -k 2 -c {} \;

Pacoloco プロキシキャッシュサーバー

Pacoloco は、pacman リポジトリ用の使いやすいプロキシキャッシュサーバーです。キャッシュ済みのパッケージの自動プリフェッチも可能です。

pacoloco パッケージでインストールできます。Pacoloco の設定ファイルを開き、pacman ミラーを追加してください:

/etc/pacoloco.yaml
port: 9129
repos:
  mycopy:
    urls:
      - http://mirror.lty.me/archlinux
      - http://mirrors.kernel.org/archlinux

pacoloco.service再起動すると、プロキシリポジトリが http://myserver:9129/repo/mycopy で利用できるようになります。

Flexo プロキシキャッシュサーバー

Flexo は、pacman リポジトリ用のさらに別のプロキシキャッシュサーバーです。Flexo は flexo-gitAUR でインストールできます。インストールしたら、flexo.service ユニットを起動してください。

Flexo はデフォルトでは 7878 番ポートで動作します。pacman に Flexo 経由でパッケージをダウンロードさせるには、/etc/pacman.d/mirrorlist の一番最初に Server = http://myserver:7878/$repo/os/$arch を記述してくだしあ。

同期プログラムを使用して pacman パッケージキャッシュを同期する

Syncthing または Resilio Sync を使用して、pacman キャッシュディレクトリ (つまり、/var/cache/pacman/pkg) を同期します。

望まないキャッシュ削除を防ぐ

デフォルトでは、pacman -Sc は、キャッシュにあるパッケージ tarball のうち、同マシン上にインストールされていないパッケージに対応するものを削除します。pacman は、キャッシュを共有するすべてのマシンにどのようなパッケージがインストールされているかを予測できないため、削除すべきでないファイルを削除してしまうことになります。

キャッシュのクリーンアップ時に 古くなった tarball のみを削除するには:

/etc/pacman.conf
[options]
CleanMethod = KeepCurrent

ファイルシステムからパッケージを再構成する

ファイルシステム上のインストール済みファイルからパッケージを再構築するには、fakepkgAUR を使用してください。システム上のファイルはそのままパッケージ化されるため、ファイルシステムに加えた変更はすべてパッケージにも受け継がれます。そのため、再構成したパッケージを配布することは推奨されません。代替方法は ABSArch Linux Archive を参照してください。

インストール済みパッケージのリスト

明示的にインストールされたすべてのパッケージのリストを保持しておくと、たとえばシステムをバックアップしたり、新しいシステムへのインストールを高速化したりするのに役立ちます:

$ pacman -Qqe > pkglist.txt
ノート:
  • オプション -t を使用すると、他の明示的にインストールされたパッケージによって必要とされているパッケージは列挙されません。作成したリストから再インストールすると、これらのパッケージはインストールされますが、インストール理由は単なる依存関係となります。
  • オプション -n を使用すると、外部パッケージ (AUR など) がリストから省略されます。
  • comm -13 <(pacman -Qqdt | sort) <(pacman -Qqdtt | sort) > optdeplist.txt を使えば、インストール済みの任意の依存関係のリストも作成できます。任意の依存関係は --asdeps フラグで再インストールできます。
  • pacman -Qqem > foreignpkglist.txt を使えば、明示的にインストールされた AUR およびその他の外部パッケージのリストを作成できます。

明示的にインストールされたパッケージの最新リストを保持するために (たとえば、バージョン管理された /etc/ と組み合わせて)、フックを設定できます。例:

[Trigger]
Operation = Install
Operation = Remove
Type = Package
Target = *

[Action]
When = PostTransaction
Exec = /bin/sh -c '/usr/bin/pacman -Qqe > /etc/pkglist.txt'

リストからパッケージをインストールする

既にインストール済みの最新のパッケージを再インストールせずに、以前保存したパッケージリストからパッケージをインストールするには、以下を実行してください:

# pacman -S --needed - < pkglist.txt

しかし、リストに AUR 由来の外部パッケージやローカルにインストールされた外部パッケージなどが載っていることもあります。リストから外部パッケージを除くには、先のコマンドを以下のように拡張することで可能です:

# pacman -S --needed $(comm -12 <(pacman -Slq | sort) <(sort pkglist.txt))

最後に、システムにインストールされているパッケージがリストと一致していることを確認し、リストに記載されていないパッケージはすべて削除してください:

# pacman -Rsu $(comm -23 <(pacman -Qq | sort) <(sort pkglist.txt))
ヒント: これらのタスクは自動化できます。例としては bacpacAURpackupAURpacmanityAURpugAUR を参照してください。

パッケージの元の状態から変更された全てのファイルをリストアップ

(ソフトウェア/アードウェアの障害によって) ファイルが破損していることが疑われるが、本当に破損しているかどうかはわからない場合は、パッケージ内のファイルのハッシュ値と比較したほうが良いかもしれません。pacutils で比較することができます:

# paccheck --sha256sum --quiet

データベースの復元方法については、#Pacman のローカルデータベースを復元する を見てください。mtree ファイルはそれぞれのパッケージファイルから .MTREE として抽出することもできます。

ノート: 悪意のある変更が疑われる場合は、この方法をそのまま使うべきではありません。そのような場合、ライブメディアを使用して、ハッシュ値参照用のソースを別途用意するなどといったセキュリティ上の予防措置を取ることが推奨されます。

全てのパッケージの再インストール

すべてのネイティブなパッケージを再インストールするには、以下のコマンドを使用してください:

# pacman -Qqn | pacman -S -

外部 (AUR) パッケージはまた別に再インストールする必要があります。そのようなパッケージは pacman -Qqm でリストアップできます。

デフォルトでは、Pacman はインストール理由を保持します。

警告: すべてのパッケージの上書きを強制するには、--overwrite=* を使用してください。とはいえ、これは最後の手段とするべきです。システムメンテナンス#特定の pacman コマンドを避けてください を参照。

Pacman のローカルデータベースを復元する

pacman/ローカルデータベースの復元を見てください。

既存のインストールから USB キーを復元する

Arch を USB キーにインストールしたが、内部のデータが壊れてしまった場合 (例えば、書き込み途中に USB を抜いてしまった場合など)、すべてのパッケージを再インストールして、再び動かせるようにできる可能性があります (USB キーが /newarch にマウントされている場合):

# pacman -S $(pacman -Qq --dbpath /newarch/var/lib/pacman) --root /newarch --dbpath /newarch/var/lib/pacman

.pkg ファイル内の特定のファイルの内容を見る

例えば、systemd パッケージ内の /etc/systemd/logind.conf の内容を見たい場合:

$ bsdtar -xOf /var/cache/pacman/pkg/systemd-250.4-2-x86_64.pkg.tar.zst etc/systemd/logind.conf

あるいは、アーカイブのブラウズに vim を使うこともできます:

$ vim /var/cache/pacman/pkg/systemd-250.4-2-x86_64.pkg.tar.zst

古いパッケージのライブラリを使っているアプリケーションを探す

既に実行中のプロセスには、システムの更新による変更が自動的に適用されません。その結果、実行中のプロセスは古いライブラリを使い続けます。脆弱性やその他のバグ、あるいはバージョン間での非互換性に関連する問題が発生する可能性があることから、このようなことは望ましくない場合があります。

更新されたライブラリに依存しているプロセスは htop (影響を受けるプログラムの名前をハイライトします) や lsof (これはライブラリの名前も出力します) ベースのスニペットを使って見つけることができます:

# lsof +c 0 | grep -w DEL | awk '1 { print $1 ": " $NF }' | sort -u

この方法では、実行中のプロセスによって開かれたままになっているファイルのみを検出します。そのようなファイルは基本的に共有ライブラリ (.so ファイル) だけです。これは、Java や Python アプリケーションのライブラリといった一部の依存関係を見逃してしまうことがあります。

必要な言語のコンテンツのみをインストールする

多くのパッケージは、複数の言語のドキュメントと翻訳をインストールします。中にはそのような不必要のファイルを削除するように設計されたプログラムもあります。例えば、localepurgeAUR はパッケージのインストール後に実行され、不必要なロケールファイルを削除します。より直接的なアプローチは pacman.confNoExtract ディレクティブで、これはそのようなファイルをそもそもインストールしないようにできます。

ノート: pacman#インストールさせないファイルを設定 で説明されている通り、"後ろのルールは前のルールを上書きします。また、! を前に付けることでルールを無効化できます。"

ヘルプファイルの翻訳を C ロケールを除いてすべてインストールしないようにするには、以下のディレクティブを追加してください:

NoExtract = usr/share/help/* !usr/share/help/C/*

HTML ドキュメントをすべてインストールしないようにするには、以下を追加してください:

NoExtract = usr/share/gtk-doc/html/*
NoExtract = usr/share/doc/HTML/*
警告: すべてのロケールを削除すると dmenuSteam、さらには Xorg で意図しない結果が起きたと一部のユーザーが報告しています。以下の例では、英語 (米国) 用のファイルと必須の C ロケールのみをインストールすることで、そのような問題を回避するように調整されています。

必要なものを除いて様々なロケールをインストールしないようにするには:

NoExtract = usr/share/locale/* usr/share/X11/locale/*/* usr/share/i18n/locales/* opt/google/chrome/locales/* !usr/share/X11/locale/C/*
NoExtract = !usr/share/X11/locale/compose.dir !usr/share/X11/locale/iso8859-1/*
NoExtract = !*locale*/en*/* !usr/share/*locale*/locale.*
NoExtract = !usr/share/*locales/en_?? !usr/share/*locales/i18n* !usr/share/*locales/iso*
NoExtract = usr/share/i18n/charmaps/* !usr/share/i18n/charmaps/UTF-8.gz !usr/share/i18n/charmaps/ANSI_X3.4-1968.gz
NoExtract = !usr/share/*locales/trans*
NoExtract = !usr/share/*locales/C !usr/share/*locales/POSIX

翻訳された man ページをインストールしないようにするには、以下を追加してください:

NoExtract = usr/share/man/* !usr/share/man/man*

vim-runtime に含まれている言語ファイルをインストールしないようにするには、以下を追加してください:

NoExtract = usr/share/vim/vim*/lang/*

Qt アプリケーションの英語コンテンツ以外をインストールしないようにするには、以下を追加してください:

NoExtract = usr/share/*/translations/*.qm usr/share/*/nls/*.qm usr/share/qt/phrasebooks/*.qph usr/share/qt/translations/*.pak !*/en-US.pak

Electron アプリケーションの英語コンテンツ以外をインストールしないようにするには、以下を追加してください:

NoExtract = usr/share/*/locales/*.pak opt/*/locales/*.pak usr/lib/*/locales/*.pak !*/en-US.pak

LibreOffice の英語のヘルプファイルをインストールしないようにするには、以下を追加してください:

NoExtract = usr/lib/libreoffice/help/en-US/*

OnlyOffice の英語コンテンツ以外をインストールしないようにするには、以下を追加してください:

NoExtract = opt/onlyoffice/desktopeditors/dictionaries/* !opt/onlyoffice/desktopeditors/dictionaries/en_US/*
NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/*/main/locale/* !*/en.json
NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/*/main/resources/help/*/* !*/help/en/*
NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/*/main/resources/symboltable/* !*/en.json
NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/documenteditor/forms/locale/* !*/en.json
NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/spreadsheeteditor/main/resources/formula-lang/* !*/en.json !*/en_desc.json
NoExtract = opt/onlyoffice/desktopeditors/converter/empty/*/* !opt/onlyoffice/desktopeditors/converter/empty/en-US/*

英語の iBus 絵文字辞書以外をインストールしないようにするには、以下を追加してください:

NoExtract = usr/share/ibus/dicts/emoji-*.dict !usr/share/ibus/dicts/emoji-en.dict

接続状況が悪い場合でもパッケージをインストールする

接続環境が悪い場所でパッケージをインストールする際 (電車で携帯電話を使う場合など)、--disable-download-timeout オプションを使えば以下のようなエラーが発生する可能性を減らすことができます:

error: failed retrieving file […] Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds

もしくは、

error: failed retrieving file […] Operation timed out after 10014 milliseconds with 0 out of 0 bytes received

パフォーマンス

この記事またはセクションは情報が古くなっています。
理由: このページは、pacman が並列ダウンロードをネイティブにサポートする前に書かれました。v6 以降、複数のパッケージを同時にダウンロードするオプションは以下だけではありません。 (Discuss)

ダウンロード速度

パッケージをダウンロードするとき pacman は /etc/pacman.d/mirrorlist に書かれている順番通りにミラーを使用します。リストの一番上のミラーがデフォルトで使用されますが、それが最速のミラーだとは限りません。一番高速なミラーを選択する方法はミラーを見てください。

Pacman のダウンロード速度は、並列ダウンロードの有効化や、パッケージのダウンロードに pacman 内蔵のファイルダウンローダー以外のアプリケーションを使うことでも改善することができます。

いずれの場合でも、変更を行う前に最新の pacman を使っていることを確認してください:

# pacman -Syu

Powerpill

Powerpillpacman のラッパーで、並列で分割ダウンロードを行うことによって pacman のダウンロード速度の向上を図ります。

wget

pacman に初めから入っている機能よりもパワフルなプロキシ設定が必要な場合、wget はとても使い勝手の良い選択肢です。

wget を使うには、まず wgetインストールし、/etc/pacman.conf ファイルの [options] セクションにある以下の行をアンコメントしてください:

XferCommand = /usr/bin/wget --passive-ftp --show-progress -c -q -N %u

/etc/pacman.confwget パラメータを記述する代わりに、wget の設定ファイルを直接修正することも可能です (システム全体のファイルは /etc/wgetrc、ユーザー別のファイルは $HOME/.wgetrc)。

aria2

aria2 はレジューム機能と分割 HTTP/HTTPS/FTP ダウンロードをサポートしている軽量なダウンロードユーティリティです。aria2 を使えば、Arch ミラーに対して複数の HTTP/HTTPS/FTP 接続を同時に確立することができ、ファイルやパッケージのダウンロード速度が向上するはずです。

ノート: pacman の XferCommand で aria2c を使っても複数パッケージの同時ダウンロードは行われません。Pacman はひとつのパッケージごとに XferCommand を呼び出し、それが完了してから次を呼び出すからです。同時に複数のパッケージをダウンロードするには、Powerpill を見て下さい。

aria2 をインストールして、/etc/pacman.conf[options] セクションに以下の行を追加してください:

XferCommand = /usr/bin/aria2c --allow-overwrite=true --continue=true --file-allocation=none --log-level=error --max-tries=2 --max-connection-per-server=2 --max-file-not-found=5 --min-split-size=5M --no-conf --remote-time=true --summary-interval=60 --timeout=5 --dir=/ --out %o %u
ヒント: このページで示されている、aria2 を pacman で使用する設定は、設定を簡単にし、より多くの設定オプションを追加します。

使用されている aria2c のオプションについては aria2c(1) § OPTIONS を見てください。

  • -d, --dir: ダウンロードしたファイルを保存するディレクトリ。
  • -o, --out: ダウンロードしたファイルの出力ファイル名。
  • %o: pacman によって指定されるローカルのファイル名を表す変数。
  • %u: pacman によって指定されるダウンロード URL を表す変数。

他のアプリケーション

pacman で利用できるダウンローダーは他にもあります。以下はそのダウンローダーと、利用するための XferCommand 設定を挙げています:

ユーティリティ

  • isfree — フリーでないパッケージを一覧表示する Bash スクリプト。Parabola のブラックリストをベースとしています。
https://github.com/leo-arch/isfree || isfreeAUR
  • Lostfiles — 孤立したファイルを検知するスクリプト。
https://github.com/graysky2/lostfiles || lostfiles
  • pacutils — libalpm ベースのプログラム用のヘルパーライブラリ。
https://github.com/andrewgregory/pacutils || pacutils
  • pkgfile — あるファイルを使っているパッケージが何かを見つけるツール。
https://github.com/falconindy/pkgfile || pkgfile
  • pkgtop — GNU/Linux 用に開発されたインタラクティブなパッケージマネージャ兼リソースモニター。
https://github.com/orhun/pkgtop || pkgtop-gitAUR
  • Powerpillaria2Reflector を通じて並列分割ダウンロードを行い pacman のダウンロード処理を高速化。
https://xyne.dev/projects/powerpill/ || powerpillAUR
  • repoctl — ローカルリポジトリの管理を補助するツール。
https://github.com/cassava/repoctl || repoctlAUR
  • repose — Arch Linux リポジトリ作成ツール。
https://github.com/vodik/repose || repose
  • snap-pac — openSUSE の YaST のように pacman で自動的に snapper のスナップショットを作成するツール。
https://github.com/wesbarnett/snap-pac || snap-pac
  • vrms-arch — フリーでないパッケージがインストールされているかどうかを教えてくれるバーチャル Richard M. Stallman。
https://github.com/orospakr/vrms-arch || vrms-arch-gitAUR

グラフィカル

警告: PackageKit は既定でシステムのパーミッションを wheel グループに開放するので、一般的な用途ではおすすめできませんFS#50459 および FS#57943 を参照してください。
  • Deepin App Store — DTK で構築された Deepin デスクトップ環境用のサードパーティアプリストア。PackageKit を使用しています。AppStream メタデータ をサポートしています。.
https://github.com/dekzi/dde-store || deepin-store
https://apps.kde.org/discover/ || discover
  • GNOME PackageKit — C で書かれた、PackageKit を使用する GTK 3 パッケージマネージャ。
https://freedesktop.org/software/PackageKit/ || gnome-packagekit
  • pcurses — C++ で書かれた、Curses TUI の pacman ラッパー。
https://github.com/schuay/pcurses || pcursesAUR
  • tkPacman — Tcl で書かれた、Tk の pacman ラッパー。
https://sourceforge.net/projects/tkpacman || tkpacmanAUR
翻訳ステータス: このページは en:pacman/Tips and tricks の翻訳バージョンです。最後の翻訳日は 2024-08-24 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。