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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
(LANG=C が必要なコマンドがあることの注意の追加)
 
(8人の利用者による、間の58版が非表示)
1行目: 1行目:
  +
{{Lowercase title}}
[[Category:パッケージ管理]]
 
  +
[[Category:パッケージマネージャー]]
 
[[en:Pacman/Tips and tricks]]
 
[[en:Pacman/Tips and tricks]]
[[es:Pacman/Tips and tricks]]
+
[[es:Pacman (Español)/Tips and tricks]]
[[fr:Astuces Pacman]]
+
[[fa:Pacman tips]]
[[it:Pacman/Tips and tricks]]
+
[[fr:Pacman/Trucs et Astuces]]
[[ru:Pacman/Tips and tricks]]
+
[[it:Pacman (Italiano)/Tips and tricks]]
[[tr:Pacman ipuçları]]
+
[[pt:Pacman (Português)/Tips and tricks]]
[[zh-cn:Pacman/Tips and tricks]]
+
[[ru:Pacman (Русский)/Tips and tricks]]
  +
[[zh-hans:Pacman (简体中文)/Tips and tricks]]
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|pacman}}
 
{{Related|pacman}}
12行目: 14行目:
 
{{Related|パッケージの作成}}
 
{{Related|パッケージの作成}}
 
{{Related articles end}}
 
{{Related articles end}}
以下のヒントや pacman 自体の柔軟性を広げる汎用的な手法については、[[Core Utilities]] や [[Bash]] を見てください。
+
以下のヒントや pacman 自体の柔軟性を広げる汎用的な手法については、[[Core Utilities]] や [[Bash]] を見てください。日本語環境において、このページのコマンドのいくつかは ''LANG=C'' を前に付ける必要があります
 
== 外観と利便性の向上 ==
 
 
=== グラフィカルフロントエンド ===
 
 
* {{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'' を使ってパッケージデータベースを操作できるソフトウェア。|http://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]]|あるファイルを使っているパッケージが何かを見つけるツール。|http://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|{{AUR|repose}}}}
 
* {{App|srcpac|ソースからのパッケージのリビルドを自動化するシンプルなツール。|https://projects.archlinux.org/srcpac.git|{{Pkg|srcpac}}}}
 
* {{App|[[Snapper#pacman のトランザクションをスナップショットで記録|snap-pac]]|openSUSE の YaST のように pacman で自動的に snapper のスナップショットを作成するツール。|https://github.com/wesbarnett/snap-pac|{{aur|snap-pac}}}}
 
   
 
== メンテナンス ==
 
== メンテナンス ==
44行目: 23行目:
   
 
=== パッケージをリストアップ ===
 
=== パッケージをリストアップ ===
  +
  +
==== With version ====
   
 
バグを報告したりインストールしたパッケージについて説明するときは、インストール済みのパッケージとそのバージョンのリストを貼り付けると便利です。
 
バグを報告したりインストールしたパッケージについて説明するときは、インストール済みのパッケージとそのバージョンのリストを貼り付けると便利です。
   
 
* 明示的にインストールしたパッケージを全てリストアップ: {{ic|pacman -Qe}}。
 
* 明示的にインストールしたパッケージを全てリストアップ: {{ic|pacman -Qe}}。
  +
* ''group'' グループに含まれるパッケージを全てリストアップ: {{ic|pacman -Sq group}}。
 
* 依存パッケージではない、明示的にインストールしたネイティブのパッケージ (同期データベースに存在するパッケージ) を全てリストアップ: {{ic|pacman -Qent}}。
 
* 依存パッケージではない、明示的にインストールしたネイティブのパッケージ (同期データベースに存在するパッケージ) を全てリストアップ: {{ic|pacman -Qent}}。
 
* 外部からインストールしたパッケージ (手動でダウンロード・インストールしたパッケージ) をリストアップ: {{ic|pacman -Qm}}。
 
* 外部からインストールしたパッケージ (手動でダウンロード・インストールしたパッケージ) をリストアップ: {{ic|pacman -Qm}}。
56行目: 38行目:
 
==== 容量でソート ====
 
==== 容量でソート ====
   
インストールしたパッケージのリストを容量で並び替えたい場合 (ハードドライブの空き容量を増やしたいときに有用):
+
インストールしたパッケージのリストを容量で並び替えたい場合 (
  +
どのパッケージが最大かを把握するのは、ハードドライブの空き容量を増やしたいときに有用です。
  +
各パッケージ単独の容量を取得するか、パッケージとその依存関係の容量を取得するかの二つのオプションがあります。
   
  +
===== パッケージ単独 =====
  +
  +
次のコマンドで、インストールされたパッケージ全てとそれぞれの容量をリストアップします:
  +
$ pacman -Qi | awk '/^Name/{name=$3} /^Installed Size/{print $4$5, name}' | sort -h
  +
  +
===== パッケージとその依存関係 =====
  +
  +
パッケージとその依存関係の合計容量を表示するのは、次の方法があります。
 
* {{Pkg|expac}} をインストールして {{ic|<nowiki>expac -H M '%m\t%n' | sort -h</nowiki>}} を実行。
 
* {{Pkg|expac}} をインストールして {{ic|<nowiki>expac -H M '%m\t%n' | sort -h</nowiki>}} を実行。
 
* {{ic|-c}} オプションを付けて {{Pkg|pacgraph}} を実行。
 
* {{ic|-c}} オプションを付けて {{Pkg|pacgraph}} を実行。
65行目: 57行目:
 
$ expac -S -H M '%k\t%n' ''packages''
 
$ expac -S -H M '%k\t%n' ''packages''
   
{{Grp|base}} や {{Grp|base-devel}} に存在しない明示的にインストールしたパッケージの容量と説明をリストアップするには:
+
{{Pkg|base}} や {{Grp|base-devel}} に存在しない明示的にインストールしたパッケージの容量と説明をリストアップするには:
   
 
$ expac -H M "%011m\t%-20n\t%10d" $(comm -23 <(pacman -Qqen | sort) <(pacman -Qqg base base-devel | sort)) | sort -n
 
$ expac -H M "%011m\t%-20n\t%10d" $(comm -23 <(pacman -Qqen | sort) <(pacman -Qqg base base-devel | sort)) | sort -n
  +
  +
アップグレード対象のパッケージとそのダウンロード容量をリストアップするには:
  +
$ pacman -Quq|xargs expac -S -H M '%k\t%n' | sort -sh
   
 
==== 日付を使う ====
 
==== 日付を使う ====
83行目: 78行目:
 
{{Note|依存パッケージとしてインストールされたが、既にどのパッケージからも必要とされていないパッケージを確認したい場合は[[#使用していないパッケージの削除 (孤立したパッケージ)|使用していないパッケージの削除 (孤立したパッケージ)]] を参照。}}
 
{{Note|依存パッケージとしてインストールされたが、既にどのパッケージからも必要とされていないパッケージを確認したい場合は[[#使用していないパッケージの削除 (孤立したパッケージ)|使用していないパッケージの削除 (孤立したパッケージ)]] を参照。}}
   
{{Grp|base}} や {{Grp|base-devel}} グループに存在しない明示的にインストールしたパッケージをリストアップ:
+
{{Pkg|base}} や {{Grp|base-devel}} グループに存在しない明示的にインストールしたパッケージをリストアップ:
   
 
$ comm -23 <(pacman -Qeq | sort) <(pacman -Qgq base base-devel | sort)
 
$ comm -23 <(pacman -Qeq | sort) <(pacman -Qgq base base-devel | sort)
   
{{Grp|base}} や {{Grp|base-devel}} グループに存在せず、他のパッケージによって必要とされていないインストール済みパッケージをリストアップ:
+
{{Pkg|base}} や {{Grp|base-devel}} グループに存在せず、他のパッケージによって必要とされていないインストール済みパッケージをリストアップ:
   
 
$ comm -23 <(pacman -Qqt | sort) <(pacman -Sqg base base-devel | sort)
 
$ comm -23 <(pacman -Qqt | sort) <(pacman -Sqg base base-devel | sort)
102行目: 97行目:
   
 
$ comm -12 <(pacman -Qtq | sort) <(pacman -Slq ''repo_name'' | sort)
 
$ comm -12 <(pacman -Qtq | sort) <(pacman -Slq ''repo_name'' | sort)
  +
  +
{{Pkg|base}} グループにはなく、Arch Linux ISO には含まれているパッケージをリストアップ:
  +
$ comm -23 <(curl https://git.archlinux.org/archiso.git/tree/configs/releng/packages.x86_64) <(pacman -Qqg base | sort)
  +
  +
==== 開発版パッケージ ====
  +
  +
開発版や不安定版のパッケージを全てリストアップするには、次のコマンドを実行します:
  +
$ pacman -Qq | grep -Ee '-(bzr|cvs|darcs|git|hg|svn)$'
  +
  +
==== パッケージの依存パッケージ ====
  +
  +
パッケージの依存パッケージの一覧を入手したい場合、最も簡単な方法は以下のコマンドの出力を見ることです:
  +
  +
$ pacman -Qi ''package''
  +
  +
自動化させるには、pacman の出力をパースするというエラーの発生しやすい方法を取るのではなく、{{Pkg|expac}} を使ってください:
  +
  +
$ expac -S '%D' ''package''
  +
  +
=== パッケージの閲覧 ===
  +
  +
インストールされているすべてのパッケージを、各パッケージのインスタントプレビューで参照するには:
  +
  +
$ pacman -Qq | fzf --preview 'pacman -Qil {}' --layout=reverse --bind 'enter:execute(pacman -Qil {} | less)'
  +
  +
これは [[fzf]] を使用して、右側にパッケージ情報が表示されたすべてのパッケージを一覧表示する2ペインビューを表示します。
  +
  +
パッケージのリストをフィルタリングするための文字を入力します。矢印キー(または{{ic|Ctrl-j}}/{{ic|Ctrl-k}})を使用してナビゲートします。{{ic|Enter}} を押して、''less'' の下にパッケージ情報を表示します。
  +
  +
fzf を使用して、同様の方法で ''pacman'' にすべてのパッケージ(インストールされているものとまだインストールされていないものの両方)を参照するには、次を使用します。
  +
  +
$ pacman -Slq | fzf --preview 'pacman -Si {}' --layout=reverse
  +
  +
ナビゲーションのキーバインディングは同じですが、{{ic|Enter}} は同じようには機能しません。
   
 
=== パッケージに含まれているファイルを容量を付けてリストアップ ===
 
=== パッケージに含まれているファイルを容量を付けてリストアップ ===
109行目: 138行目:
 
$ pacman -Qlq ''package'' | grep -v '/$' | xargs du -h | sort -h
 
$ pacman -Qlq ''package'' | grep -v '/$' | xargs du -h | sort -h
   
=== ファイルがどのパッケージにも含まれていないこと確認 ===
+
=== どのパッケージにも所有されていないファイル特定する ===
   
 
どのパッケージにも所有されていない謎のファイルが存在する場合 ([[Arch Linux の安定化#パッケージマネージャを使ってソフトウェアをインストールする|パッケージマネージャを使わずにソフトウェアをインストール]]した場合など)、ファイルを見つけ出して消去すると良いでしょう。以下の手順で見つけ出せます:
 
どのパッケージにも所有されていない謎のファイルが存在する場合 ([[Arch Linux の安定化#パッケージマネージャを使ってソフトウェアをインストールする|パッケージマネージャを使わずにソフトウェアをインストール]]した場合など)、ファイルを見つけ出して消去すると良いでしょう。以下の手順で見つけ出せます:
119行目: 148行目:
 
どのパッケージにも含まれない重要なファイル (実行時に生成されるファイルやカスタム設定など) も存在するため、安全に消去できるファイルを選び出す方法としては不適切です。
 
どのパッケージにも含まれない重要なファイル (実行時に生成されるファイルやカスタム設定など) も存在するため、安全に消去できるファイルを選び出す方法としては不適切です。
   
{{Tip|{{AUR|lostfiles}} スクリプトは上記と同じようなことを実行しますが、出力から偽陽性のファイルを取り除くための包括的なブラックリストを使用します。}}
+
{{Tip|{{Pkg|lostfiles}} スクリプトは上記と同じようなことを実行しますが、出力から偽陽性のファイルを取り除くための包括的なブラックリストを使用します。}}
  +
  +
=== パッケージによって作成された所有されていないファイルの追跡 ===
  +
  +
ほとんどのシステムは、次のようないくつかの [http://ftp.rpm.org/max-rpm/s1-rpm-inside-files-list-directives.html#S3-RPM-INSIDE-FLIST-GHOST-DIRECTIVEghost] ファイルをゆっくりと収集します。通常の操作の過程で状態ファイル、ログ、インデックスなどとして。
  +
  +
{{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
  +
}}
  +
  +
次に、root ユーザーとして {{ic|pacreport --unowned-files}} を使用すると、関連するパッケージがインストールされなくなった場合(または新しいファイルが作成された場合)に、所有されていないファイルが一覧表示されます。
  +
  +
さらに、[https://github.com/Cyber​​Shadow/aconfmgr aconfmgr]({{AUR|aconfmgr-git}})を使用すると、スクリプトを使用して、変更されたファイルや孤立したファイルを追跡できます。
   
 
=== 使用していないパッケージの削除 (孤立したパッケージ) ===
 
=== 使用していないパッケージの削除 (孤立したパッケージ) ===
   
''再帰的に''孤立したパッケージその設定ファイル)を削除するは:
+
孤立したパッケージとは、依存関係としてンストーされ、どのパッケージも必要なくなったパッケージです。
   
  +
これらは {{ic|pacman -Rs ''package''}} の代わりに {{ic|pacman -R ''package''}} を使ってパッケージをアンインストールしたり、[[makedepends]] としてパッケージをインストールしたり、パッケージが新しいバージョンで依存関係を削除したりすることで、時間とともにシステムに蓄積されます。
# pacman -Rns $(pacman -Qtdq)
 
   
  +
孤立したファイルとその設定ファイルを再帰的に削除するには:
孤立したパッケージが見つからなかった場合、pacman は {{ic|error: no targets specified}} を出力します。{{ic|pacman -Rns}} に何も引数が指定されていないとこうなります。
 
   
  +
# pacman -Qtdq | pacman -Rns -
{{Note|{{Pkg|pacman}} 4.2.0 現在、{{ic|-Qt}} は本当に孤立しているパッケージしかリストアップしません。他のパッケージによって任意で必要とされているパッケージを含めたい場合、{{ic|-t}} フラグを2回指定してください ({{ic|-Qtt}})。}}
 
   
  +
孤立したパッケージが見つからなかった場合、出力は {{ic|error: argument '-' specified with empty stdin}} となります。これは {{ic|pacman -Rns}} に引数が渡されていないので予想されます。このエラーは {{Pkg|moreutils}} パッケージの {{man|1|ifne}} を2番目のコマンドの前に付けることで回避できます。
{{ic|-Rns}} (や {{ic|-Rnc}}) オプションは直接依存しているパッケージだけを削除し、明示的にインストールされた任意の依存パッケージは削除しません ({{ic|--asdeps}} オプションを使用しなかった場合)。
 
   
  +
{{Note|引数 {{ic|-Qt}} は真の孤立したパッケージのみをリストします。他のパッケージによって ''オプションで'' 必要とされるパッケージを含めるには、{{ic|-t}} フラグを 2 回渡します (''すなわち''、{{ic|-Qtt}})}}
必須ではありませんが、任意の依存パッケージをインストールする際に {{ic| --asdeps}} オプションを使用してインストールすることでシステムメンテナンスが楽になります。実行時やインストール時には何も変化はありませんが、{{ic|--asdeps}} オプションを使用してインストールしておけば、孤立したパッケージを削除するときに一緒に削除されるようになります。任意の依存パッケージをインストールするときは、以下のコマンドを使うようにしましょう:
 
   
  +
{{Tip|''pacman'' のポストトランザクション [[Pacman#Hooks|hook]] に {{ic|pacman -Qtd}} コマンドを追加すると、トランザクションがパッケージを取りこぼした時に通知されます。これはパッケージがリポジトリから削除された時に通知するのに便利です。削除されたパッケージは (明示的にインストールされていない限り) ローカルインストールでも孤立したパッケージになります。孤立したパッケージが見つからない時に "failed to execute command" エラーを避けるには、フックで {{ic|Exec}} に以下のコマンドを使います: {{ic|<nowiki>/usr/bin/bash -c "/usr/bin/pacman -Qtd || /usr/bin/echo '=> None found.'"</nowiki>}}、{{AUR|pacman-log-orphans-hook}} パッケージはそのようなフックをより冗長な命令で提供します。}}
# pacman -S --asdeps <packages that are optional dependencies>
 
   
=== base グループ以外の全てのパッケージを削除する ===
+
=== より多く不要なパッケージを検出する ===
   
  +
場合によっては、上記の方法では、不要なパッケージをすべて検出する ことはできません。例えば、依存性のサイクル ("循環依存"とも呼ばれる)、過剰な依存性 (複数回満たされる)、明示的でないオプションなどです。
base グループを除く全てのパッケージを削除する必要がある場合は、以下のワンライナーを試して下さい:
 
   
  +
このようなパッケージを検出するには:
# pacman -R $(comm -23 <(pacman -Qq | sort) <((for i in $(pacman -Qqg base); do pactree -ul "$i"; done) | sort -u))
 
   
  +
$ pacman -Qqd | pacman -Rsu --print -
上記のワンライナーは [https://bbs.archlinux.org/viewtopic.php?id=130176 こちらのスレッド] に書かれたものが元になっています。
 
  +
  +
リスト内のすべてのパッケージを一度に削除する場合は、{{ic|--print}} 引数を指定せずにコマンドを実行します。
  +
  +
=== 必須パッケージ以外の全てのパッケージを削除する ===
  +
  +
必須パッケージを除くすべてのパッケージを削除する必要がある場合、1つの方法は、必要ではないパッケージのインストール理由を依存関係として設定してから、不要な依存関係をすべて削除することです。
  +
  +
まず、''明示的にインストール'' されたすべてのパッケージについて、インストール理由を ''依存関係としてインストール'' に変更します。
  +
  +
# pacman -D --asdeps $(pacman -Qqe)
  +
  +
次に、インストール理由を、必須パッケージのみの ''明示的にインストール'' に変更します。これらのパッケージをターゲットにしないために、''削除したくない'' パッケージは次のようになります。
  +
  +
# pacman -D --asexplicit base linux linux-firmware
  +
  +
{{Note|
  +
* 削除されないようにするために、上記のコマンドに追加のパッケージを追加することができます。完全に機能する基本システムに必要な他のパッケージの詳細については、 [[インストールガイド#必須パッケージのインストール]] を参照してください。
  +
* これはブートローダのパッケージも削除対象とされます。システムはまだ起動できるはずですが、ブートパラメータはこれ無しでは変更できないかもしれません。
  +
}}
  +
  +
最後に、[[Pacman ヒント#使用していないパッケージの削除 (孤立したパッケージ)]] の手順に従って、''依存関係'' でインストールされたすべてのパッケージを削除します。
   
 
=== 複数のパッケージの依存パッケージリストを取得 ===
 
=== 複数のパッケージの依存パッケージリストを取得 ===
187行目: 265行目:
 
メンテナがパッケージを更新するとき、大抵の場合コミットにはコメントが付けられます。{{AUR|pacolog}} をインストールすることでコマンドラインからコミットメッセージを確認することができます。{{ic|pacolog <package>}} を実行すると、公式リポジトリや AUR のパッケージの最近のコミットメッセージを出力します。
 
メンテナがパッケージを更新するとき、大抵の場合コミットにはコメントが付けられます。{{AUR|pacolog}} をインストールすることでコマンドラインからコミットメッセージを確認することができます。{{ic|pacolog <package>}} を実行すると、公式リポジトリや AUR のパッケージの最近のコミットメッセージを出力します。
   
== インストールとリカバリ ==
+
== インストールとリカバリ ==
   
パッケージを取得・復活させるの方法。
+
パッケージを取得・復活させるの方法。
   
 
=== パッケージを CD/DVD や USB スティックからインストールする ===
 
=== パッケージを CD/DVD や USB スティックからインストールする ===
   
パッケージやパッケージグループをダウンロードするには:
+
パッケージやパッケージグループをダウンロードするには:
   
 
# cd ~/Packages
 
# cd ~/Packages
209行目: 287行目:
 
# mount /dev/sdxY /mnt/repo # USB スティックの場合。
 
# mount /dev/sdxY /mnt/repo # USB スティックの場合。
   
'''2.''' {{ic|pacman.conf}} を編集して他のリポジトリ (例: extra, core, etc.) の''前に''リポジトリを追加してください。この手順は重要です。これで標準のリポジトリに優先して CD/DVD/USB のファイルがインストールされるようになります:
+
'''2.''' {{ic|pacman.conf}} を編集して他のリポジトリ (例: extra, core など) の''前に''リポジトリを追加してください。この手順は重要です。これで標準のリポジトリに優先して CD/DVD/USB のファイルがインストールされるようになります:
   
 
{{hc|# nano /etc/pacman.conf|2=
 
{{hc|# nano /etc/pacman.conf|2=
218行目: 296行目:
 
'''3.''' 最後に、pacman データベースを同期して新しいリポジトリを使えるようにしてください:
 
'''3.''' 最後に、pacman データベースを同期して新しいリポジトリを使えるようにしてください:
   
# pacman -Sy
+
# pacman -Syu
   
 
=== カスタムローカルリポジトリ ===
 
=== カスタムローカルリポジトリ ===
   
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.gz /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.gz /path/to/*.pkg.tar.zst''
   
  +
{{Warning|''repo-add'' は、コマンドラインで渡された順番でエントリをデータベースに追加します。同じパッケージの複数のバージョンが渡された場合、正しいバージョンが最後に追加されるよう注意しなければなりません。特に、シェルによって使用される辞書順はロケール依存であり、''pacman'' によって使用される {{man|8|vercmp}} の順序とは異なるので注意してください。}}
{{Note|If there is a package that needs to be removed from the repository, read up on {{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.xz
  +
├── customrepo.db.tar.xz
  +
├── customrepo.files -> customrepo.files.tar.xz
  +
├── customrepo.files.tar.xz
  +
└── 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.gz pkgname''
  +
  +
ローカルリポジトリを作成できたら、リポジトリを {{ic|pacman.conf}} に追加してください。カスタムリポジトリの例は {{ic|pacman.conf}} 内にあります。リポジトリ名は、データベースのファイル名からファイル拡張子を除いたものになります。上記の例では、リポジトリ名は単に ''repo'' となります。リポジトリの場所を参照するには、{{ic|file://}} URL を使うか、{{ic|<nowiki>http://localhost/path/to/directory</nowiki>}} を使って HTTP 経由で行ってください。
  +
  +
もし良ければ、カスタムリポジトリを[[非公式ユーザーリポジトリ|非公式ユーザリポジトリのリスト]]に追加して、コミュニティがその恩恵を受けられるようにしましょう。
   
 
=== pacman のキャッシュをネットワークで共有する ===
 
=== pacman のキャッシュをネットワークで共有する ===
  +
  +
LAN 上で複数の Arch マシンを使っている場合、パッケージを共有することでダウンロード回数を劇的に減らすことができます。使用しているアーキテクチャが異なるマシン (i686 と x86_64) でキャッシュを共有してはいけません。問題が発生します。
   
 
==== 読み取り専用キャッシュ ====
 
==== 読み取り専用キャッシュ ====
   
  +
{{Note|1=pacman がサーバーから 3 つのパッケージをダウンロードできない場合、代わりに別のミラーが使用されます。https://bbs.archlinux.org/viewtopic.php?id=268066 を参照してください。}}
If you're looking for a quick and dirty solution, you can simply run a standalone webserver which other computers can use as a first mirror: {{ic|darkhttpd /var/cache/pacman/pkg}}. Just add this server at the top of your mirror list. Be aware that you might get a lot of 404 errors, due to cache misses, depending on what you do, but pacman will try the next (real) mirrors when that happens.
 
   
  +
迅速な解決策を探している場合は、他のコンピューターが最初のミラーとして使用できる [https://gist.github.com/willurd/5720255 基本的な一時 Web サーバー] を実行するだけです。
==== 読み書き可能キャッシュ ====
 
   
  +
まず最初に、提供するディレクトリで pacman データベースを利用できるようにします。
{{Tip|See [[pacserve]] for an alternative (and probably simpler) solution than what follows.}}
 
   
  +
# ln -s /var/lib/pacman/sync/*.db /var/cache/pacman/pkg/
複数のコンピュータ間でパッケージを共有するには、ネットワークベースのマウントプロトコルを使って {{ic|/var/cache/pacman/}} を共有します。このセクションでは shfs または sshfs を使ってパッケージキャッシュと関連するライブラリディレクトリを同一ローカルネットワーク上の複数のコンピュータで共有する方法を示します。ネットワークで共有されるキャッシュは、ファイルシステムの選択やその他の要因で、遅くなることがあります。
 
   
  +
次に、このディレクトリの提供を開始します。たとえば、[[Python]] [https://docs.python.org/3/library/http.server.html#http-server-cli http.server] モジュールの場合:
まず、ネットワークをサポートするファイルシステムをインストールしてください。例えば [[sshfs]], [[shfs]], ftpfs, [[Samba|smbfs]], [[NFS|nfs]] など。
 
  +
$ python -m http.server -d /var/cache/pacman/pkg/
   
  +
{{Tip|デフォルトでは、Python {{ic|http.server}} は任意のインターフェイスのポート {{ic|8000}} を待受します。別のポートを使用するか、特定のアドレスにのみバインドするには、パラメータと引数を追加するだけです:
{{Tip|sshfs や shfs を使う場合、[[SSH 鍵]]を読んで下さい。}}
 
   
  +
$ python -m http.server -d /var/cache/pacman/pkg/ --bind 127.0.0.1 8080
Then, to share the actual packages, mount {{ic|/var/cache/pacman/pkg}} from the server to {{ic|/var/cache/pacman/pkg}} on every client machine.
 
  +
}}
   
  +
次に、各クライアントマシンで {{ic|/etc/pacman.d/mirrorlist}} を [[ヘルプ:読み方|追加, 追記, 作成, 編集|編集]] して、このサーバーを最上位のエントリとして追加します。
==== BitTorrent Sync を使って pacman のパッケージキャッシュを同期する ====
 
   
  +
{{hc|/etc/pacman.d/mirrorlist|2=
[[BitTorrent Sync]] はネットワークを介してフォルダを同期する新方法です (LAN でもインターネットでも動作します)。ピアツーピアなのでサーバーを設定する必要はありません: 詳しくはリンクを参照してください。
 
  +
Server = http://''server-ip'':''port''
BitTorrent Sync を使って pacman のキャッシュを共有する方法:
 
  +
...
* まず同期したいマシンに AUR から {{AUR|btsync}} パッケージをインストール。
 
  +
}}
* [[BitTorrent Sync]] の wiki ページや AUR パッケージのインストール手順に従う。
 
** set up BitTorrent Sync to work for the root account. This process requires read/write to the pacman package cache.
 
** make sure to set a good password on btsync's web UI
 
** btsync の systemd デーモンを起動。
 
** in the btsync Web GUI add a new synchronized folder on the first machine and generate a new Secret. Point the folder to {{ic|/var/cache/pacman/pkg}}
 
** Add the folder on all the other machines using the same Secret to share the cached packages between all systems. Or, to set the first system as a master and the others as slaves, use the Read Only Secret. Be sure to point it to {{ic|/var/cache/pacman/pkg}}
 
   
  +
{{Warning|この階層は存在しないため、クエリは失敗します、他のエントリの場合と同様に、このカスタムサーバーに {{ic|/repos/$repo/os/$arch}} を追加しないでください。}}
Now the machines should connect and start synchronizing their cache. Pacman works as expected even during synchronization. The process of syncing is entirely automatic.
 
   
  +
よりスタンドアロンのソリューションをお探しの場合は、{{Pkg|da​​rkhttpd}} が非常に最小限の Web サーバーを提供します。前の {{ic|python}} コマンドを次のように置き換えます。
==== 要らなくなったキャッシュが消えないようにする ====
 
   
  +
$ sudo -u http darkhttpd /var/cache/pacman/pkg --no-server-id
By default, {{Ic|pacman -Sc}} removes package tarballs from the cache that correspond to packages that are not installed on the machine the command was issued on. Because pacman cannot predict what packages are installed on all machines that share the cache, it will end up deleting files that should not be.
 
   
  +
便宜上、darkhttpd を ''systemd'' サービスとして実行することもできます。[[systemd#ユニットファイル]] を参照してください。
To clean up the cache so that only ''outdated'' tarballs are deleted, add this entry in the {{ic|[options]}} section of {{ic|/etc/pacman.conf}}:
 
   
  +
Rust で書かれた小規模な Web サーバーである {{Pkg|miniserve}} も使用できます。
CleanMethod = KeepCurrent
 
   
  +
$ miniserve /var/cache/pacman/pkg
=== インストールしたパッケージのリストのバックアップと復旧 ===
 
   
  +
次に、 miniserve が利用可能な最初の URL を使用して、上記のように {{ic|/etc/pacman.d/mirrorlist}} を編集します。
pacman によってインストールしたパッケージのバックアップを定期的に行うのはグッドプラクティスです。何らかの理由でリカバリーできないシステムクラッシュが発生した時、pacman を使って全く同じパッケージを簡単に新しい環境に再インストールすることができるようになります。
 
   
  +
すでに他の目的で Web サーバーを実行している場合は、代わりにそれをローカルリポジトリサーバーとして再利用できます。たとえば、すでに [[nginx]] でサイトを提供している場合は、ポート 8080 で待受する ''nginx'' サーバーブロックを追加できます。
* まず、ローカルにない現在のパッケージの一覧をバックアップしてください: {{ic|$ pacman -Qqen > pkglist.txt}}
 
   
  +
{{hc|/etc/nginx/nginx.conf|
* {{ic|pkglist.txt}} を USB キーやその他メディア gist.github.com, Evernote, Dropbox などに保存してください。
 
  +
server {
  +
listen 8080;
  +
root /var/cache/pacman/pkg;
  +
server_name myarchrepo.localdomain;
  +
try_files $uri $uri/;
  +
}
  +
}}
   
  +
この変更を加えた後は、必ず {{ic|nginx.service}} の [[再起動]] を行ってください。
* {{ic|pkglist.txt}} ファイルを新しいインストールにコピーして、ファイルが含まれているディレクトリにまで移動してください。
 
   
  +
{{Tip|どの Web サーバーを使用する場合でも、ファイアウォール設定 (存在する場合) で、設定されたポートへの目的のトラフィックの到達が許可され、不要なトラフィックが許可されていないことを確認してください。[[セキュリティ#ネットワークとファイアウォール]]を参照してください。}}
* 次のコマンドを実行することでバックアップリストからインストールを行います: {{ic|# pacman -S $(< pkglist.txt)}}
 
   
  +
==== 読み取り専用キャッシュのオーバーレイマウント ====
上記のようにリストが生成されない場合、おそらく foreign パッケージ (設定したリポジトリに存在しないパッケージ、もしくは AUR のパッケージ) が存在します。
 
   
  +
ローカルネットワーク上の1台のマシンを{{ic|/var/cache/pacman/pkg}} ディレクトリの [[Overlayfs|overlay mount]] 読み取り専用パッケージキャッシュとして使うことができます。このような設定は、このサーバーに他のマシンでも使われる最新のパッケージが適度に包括的にインストールされている場合に有利です。これは低帯域幅のアップストリーム接続の端にある多くのマシンを管理するのに便利です。
そのような場合でも、リストから利用可能なパッケージを全てインストールすることができます:
 
   
  +
例として、このメソッドを使用するには:
# pacman -S --needed $(comm -12 <(pacman -Slq|sort) <(sort badpkdlist) )
 
   
  +
# 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#使用方法]] を参照してください。}}
* {{ic|pacman -Slq}} lists all available softwares, but the list is sorted by repository first, hence the {{ic|sort}} command.
 
* {{ic|comm}} コマンドを動作させるにはファイルをソートする必要があります。
 
* {{ic|-12}} パラメータは両方のエントリで共通する行を表示します。
 
* {{ic|--needed}} スイッチを使うことで既にインストールされているパッケージはスキップされます。
 
   
  +
{{Tip|1={{ic|/tmp/pacman_pkg}} オーバーレイディレクトリをリストすると、"Stale file handle" などのエラーが発生する場合は、オプション {{ic|1=-o redirect_dir=off -oindex=off}} を使用してオーバーレイマウントを試してください。}}
[[yaourt]] を使うことで AUR からリポジトリにないパッケージを全てインストールするのを試行することもできます (何がおこるかわかってない場合は推奨しません):
 
   
  +
この後、オプション {{ic|--cachedir /tmp/pacman_pkg}} を使用して ''pacman'' を実行します。例:
$ yaourt -S --needed $(comm -13 <(pacman -Slq|sort) <(sort badpkdlist) )
 
   
  +
# pacman -Syu --cachedir /tmp/pacman_pkg
最後に、リストに記されていない全てのパッケージをシステム上から削除することができます:
 
   
  +
==== 分散読み取り専用キャッシュ ====
{{Warning|このコマンドは注意して使って下さい、pacman の出力をよくチェックしましょう。}}
 
   
  +
パッケージキャッシュを提供するネットワーク上の他のコンピューターを自動的に検出するための Arch 固有のツールがあります。{{Pkg|pacredir}}、[[pacserve]]、{{AUR|pkgdistcache}}、または {{AUR|paclan}} を試してください。 pkgdistcache は、プレーンな UDP の代わりに Avahi を使用します。これは、WiFi とイーサネット間のブリッジではなくルーティングを行う特定のホームネットワークでより適切に機能する可能性があります。
# pacman -Rsu $(comm -23 <(pacman -Qq|sort) <(sort pkglist))
 
   
  +
歴史的には、[https://bbs.archlinux.org/viewtopic.php?id=64391 PkgD] と [https://github.com/toofishes/multipkg multipkg] がありましたが、現在はメンテナンスされていません。
=== base や base-devel に存在しないダウンロード済みパッケージを一覧 ===
 
   
  +
==== 読み書き可能キャッシュ ====
次のコマンドは {{Grp|base}} や {{Grp|base-devel}} に存在しない、ユーザーが手動でインストールしたパッケージを全て表示します:
 
   
  +
{{Tip|[[pacserve]] を使うことで以下の方法をもっと簡単に実現できます。}}
$ comm -23 <(pacman -Qeq | sort) <(pacman -Qgq base base-devel | sort)
 
   
  +
複数のコンピュータ間でパッケージを共有するには、ネットワークベースのマウントプロトコルを使って {{ic|/var/cache/pacman/}} を共有します。このセクションでは shfs または sshfs を使ってパッケージキャッシュと関連するライブラリディレクトリを同一ローカルネットワーク上の複数のコンピュータで共有する方法を示します。ネットワークで共有されるキャッシュは、ファイルシステムの選択やその他の要因で、遅くなることがあります。
インストールしたパッケージの中で特定のリポジトリに存在しないパッケージを表示するには (例えば {{ic|''repo_name''}}):
 
   
  +
まず、ネットワークをサポートするファイルシステムをインストールしてください。例えば [[sshfs]], [[shfs]], ftpfs, [[Samba|smbfs]], [[NFS|nfs]] など。
$ comm -23 <(pacman -Qtq | sort) <(pacman -Slq ''repo_name'' | sort)
 
   
  +
{{Tip|
インストールしたパッケージの中で {{ic|''repo_name''}} リポジトリに存在するパッケージを表示するには:
 
  +
* sshfs や shfs を使う場合、[[SSH 鍵]]を読んで下さい。
  +
* デフォルトでは、smbfs はファイル名にコロンを使えないので、クライアントは問題のあるパッケージをダウンロードしなおしてしまいます。クライアント側で {{ic|mapchars}} マウントオプションを使用することで解決します。}}
   
  +
それから、サーバーの {{ic|/var/cache/pacman/pkg}} をクライアントマシンの {{ic|/var/cache/pacman/pkg}} にマウントすることでパッケージを共有できます。
$ comm -12 <(pacman -Qtq | sort) <(pacman -Slq ''repo_name'' | sort)
 
   
  +
==== rsync で同期 ====
=== 全てのパッケージの再インストール ===
 
   
  +
ローカル環境でのもう1つのアプローチは、 [[rsync]] です。 キャッシュするサーバーを選択し、 [[Rsync#rsync デーモン|rsync デーモン]] を有効にします。 クライアントでは、rsync プロトコルを介してこの共有と双方向で同期します。 コロンを含むファイル名は、 rsync プロトコルでは問題ありません。
全てのネイティブのパッケージを再インストールするには、次を使って下さい:
 
   
  +
​クライアントのドラフトの例では、共有名に {{ic|uname-m}} と入力し使用することで、アーキテクチャに依存する同期が保証されます。
# pacman -Qenq | pacman -S -
 
  +
# rsync rsync://server/share_$(uname -m)/ /var/cache/pacman/pkg/ ...
  +
# pacman ...
  +
# paccache ...
  +
# rsync /var/cache/pacman/pkg/ rsync://server/share_$(uname -m)/ ...
   
  +
==== nginx を使用する動的なリバースプロキシキャッシュ ====
外部の (AUR) パッケージは別に再インストールする必要があります。外部のパッケージは {{ic|pacman -Qemq}} で一覧できます。
 
   
  +
[[nginx]] を使って公式の上流ミラーへのリクエストをプロキシして結果をローカルディスクにキャッシュすることができます。その後、ファイルへのリクエストは全てローカルのキャッシュから供給されるようになり、大量のサーバーを更新するときでもインターネットのトラフィックを簡単に最小限に抑えることができます。
デフォルトで Pacman はインストールの理由(明示的にインストールしたか、依存でインストールしたか)を維持します。
 
   
  +
{{Warning|この方法には欠点があります。パッケージファイルの相対パスが同じミラーを使う必要があり同じパスを使うようにキャッシュを設定しなければなりません。この例では、相対パスが {{ic|/archlinux/$repo/os/$arch}} のミラーを使用して {{ic|mirrorlist}} のキャッシュの {{ic|Server}} 設定も同じ相対パスとします。}}
=== pacman のローカルデータベースを復元する ===
 
   
  +
この例では、キャッシュサーバーを {{ic|<nowiki>http://cache.domain.local:8080/</nowiki>}} で実行してパッケージを {{ic|/srv/http/pacman-cache/}} に保存します。
ローカルデータベースの復元が必要だと pacman が示す場合:
 
   
  +
キャッシュのディレクトリを作成して nginx からファイルが書き込めるようにパーティションを設定:
* {{ic|pacman -Q}} で何も出力がされず、{{Ic|pacman -Syu}} でシステムが最新だと表示されるとき。
 
* {{ic|pacman -S package}} を使ってパッケージをインストールしようとすると、既にインストールされている依存パッケージのリストが出力される。
 
* ({{Pkg|pacman}} に含まれている) {{ic|testdb}} でデータベースが壊れていると表示される。
 
   
  +
# mkdir /srv/http/pacman-cache
以上の場合、十中八九、インストールしたソフトウェアの pacman データベースである {{ic|/var/lib/pacman/local}} が破損していたり削除されています。これは深刻な問題ですが、以下の手順に従うことで復元することができます。
 
  +
# chown http:http /srv/http/pacman-cache
   
  +
次に、nginx を [https://gist.github.com/anonymous/97ec4148f643de925e433bed3dc7ee7d 動的キャッシュ] として設定 (コマンドについてはコメントを読んでください)。
まず、pacman のログファイルが存在するか確認します:
 
   
  +
最後に、他の Arch Linux サーバーを更新して {{ic|mirrorlist}} ファイルに以下の行を追加して新しいキャッシュを使うように設定:
$ ls /var/log/pacman.log
 
   
  +
{{hc|/etc/pacman.d/mirrorlist|<nowiki>
ログファイルが存在しない場合は、この方法で続行することは不可能です。[https://bbs.archlinux.org/viewtopic.php?pid=670876 Xyne のパッケージ検出スクリプト] を使ってデータベースを再作成してみてください。それができない場合、解決方法としてはシステム全体を再インストールするしかありません。
 
  +
Server = http://cache.domain.local:8080/archlinux/$repo/os/$arch
 
  +
...
==== ログフィルタースクリプト ====
 
{{hc|pacrecover|<nowiki>
+
</nowiki>}}
#!/bin/bash -e
 
   
  +
{{Note|時間と共にディレクトリは膨れ上がるため、古いパッケージを消去できるようにする必要があります。({{ic|pacman}} に含まれている) {{ic|paccache}} を使うことでお好きな基準で消去を自動化することが可能です。例えば、{{ic|find /srv/http/pacman-cache/ -type d -exec paccache -v -r -k 2 -c {} \;}} はキャッシュディレクトリに最新から1つ前のバージョンまでパッケージを保持します。}}
. /etc/makepkg.conf
 
   
  +
==== Pacoloco プロキシキャッシュサーバー ====
PKGCACHE=$((grep -m 1 '^CacheDir' /etc/pacman.conf || echo 'CacheDir = /var/cache/pacman/pkg') | sed 's/CacheDir = //')
 
   
  +
[https://github.com/anatol/pacoloco Pacoloco] は、 pacman リポジトリ用の使いやすいプロキシキャッシュサーバです。​ {{AUR|pacoloco-git}} としてインストールできます。​構成ファイルを開き、pacman ミラーを追加します。:
pkgdirs=("$@" "$PKGDEST" "$PKGCACHE")
 
   
  +
{{hc|/etc/pacoloco.yaml|<nowiki>
while read -r -a parampart; do
 
  +
port: 9129
pkgname="${parampart[0]}-${parampart[1]}-*.pkg.tar.xz"
 
  +
repos:
for pkgdir in ${pkgdirs[@]}; do
 
  +
mycopy:
pkgpath="$pkgdir"/$pkgname
 
  +
urls:
[ -f $pkgpath ] && { echo $pkgpath; break; };
 
  +
- http://mirror.lty.me/archlinux
done || echo ${parampart[0]} 1>&2
 
  +
- http://mirrors.kernel.org/archlinux
done
 
 
</nowiki>}}
 
</nowiki>}}
 
スクリプトを実行可能にしてください:
 
   
  +
{{ic|pacoloco.service}} を [https://wiki.archlinux.jp/index.php/Systemd#.E3.83.A6.E3.83.8B.E3.83.83.E3.83.88.E3.82.92.E4.BD.BF.E3.81.86 再起動] すると、プロキシリポジトリが {{ic|http://<myserver>:9129/repo/mycopy}} で利用できるようになります。
$ chmod +x pacrecover
 
   
  +
==== Flexo プロキシキャッシュサーバー ====
==== パッケージの復旧リストを生成する ====
 
   
  +
[https://github.com/nroi/flexo Flexo] pacman リポジトリ用のさらに別のプロキシキャッシュサーバーです。 Flexo は AUR で利用できます:{{AUR|flexo-git}} インストールしたら、 systemd で {{ic|flexo.service}} サービスを [https://wiki.archlinux.jp/index.php/Systemd#.E3.83.A6.E3.83.8B.E3.83.83.E3.83.88.E3.82.92.E4.BD.BF.E3.81.86 スタート]します。
{{Warning|If for some reason your [[pacman]] cache or [[makepkg]] package destination contain packages for other architectures, remove them before continuation.}}
 
   
  +
Flexo はデフォルトではポート 7878 で動作します。 ​{{ic|/etc/pacman.d/mirrorlist}} の先頭に {{ic|1=Server = http://''myserver'':7878/$repo/os/$arch}} と入力し、pacman が Flexo を介してパッケージをダウンロードできるようにします。
スクリプトを実行してください (任意でパッケージが含まれている追加のディレクトリをパラメータで渡して下さい):
 
   
  +
==== 同期プログラムを使用して pacman パッケージ キャッシュを同期する ====
$ paclog-pkglist /var/log/pacman.log | ./pacrecover >files.list 2>pkglist.orig
 
   
  +
[[Syncthing]] または [[Resilio Sync]] を使用して、''pacman'' キャッシュディレクトリ (つまり、{{ic|/var/cache/pacman/pkg}}) を同期します。
このコマンドで2つのファイルが作成されます: マシンに存在するパッケージファイルが載った {{Ic|files.list}} と、ダウンロードするべきパッケージが載った {{Ic|pkglist.orig}} です。後者ではマシンに存在する、古いバージョンのパッケージのファイルと、新しいバージョンのファイルでミスマッチが発生することがあります。ミスマッチは手動で修正する必要があります。
 
   
  +
==== 不要なキャッシュパージの防止 ====
Here is a way to automatically restrict second list to packages available in a repository:
 
   
  +
デフォルトでは、{{ic|pacman -Sc}} は、コマンドが発行されたマシンにインストールされていないパッケージに対応するパッケージ tarball をキャッシュから削除します。''pacman'' は、キャッシュを共有するすべてのマシンにどのようなパッケージがインストールされるかを予測できないため、削除すべきではないファイルを削除してしまうことになります。
$ { cat pkglist.orig; pacman -Slq; } | sort | uniq -d > pkglist
 
   
  +
''古い'' tarball のみが削除されるようにキャッシュをクリーンアップするには:
重要な ''base'' パッケージが欠けていないか確認して、リストに加えます:
 
   
  +
{{hc|/etc/pacman.conf|2=
$ comm -23 <(pacman -Sgq base) pkglist.orig >> pkglist
 
  +
[options]
  +
CleanMethod = KeepCurrent
  +
}}
   
  +
=== ファイルシステムからパッケージを再作成 ===
Proceed once the contents of both lists are satisfactory, since they will be used to restore pacman's installed package database; {{ic|/var/lib/pacman/local/}}.
 
   
  +
ファイルシステムからパッケージを再作成するには、(pacman に含まれている) ''bacman'' を使います。システム上のファイルがそのまま使われるため、作成されるパッケージにはファイルへの変更も一緒に含まれてしまいます。再作成したパッケージの配布は非推奨です。[[ABS]] や [[Arch Rollback Machine]] を見てください。
==== リカバリを実行する ====
 
   
  +
{{Tip|''bacman'' は {{ic|makepkg.conf}} の {{ic|PACKAGER}}, {{ic|PKGDEST}}, {{ic|PKGEXT}} オプションを使用します。環境変数をエクスポートすることで圧縮ツールのオプションを指定することができます。例えば {{ic|1=XZ_OPT="-T 0"}} は ''xz'' の並列圧縮を有効化します。}}
リカバリのための bash エイリアスを定義してください:
 
   
  +
別のツールとして {{AUR|fakepkg}} も存在します。並列化をサポートしており複数のパッケージを入力することができます。''bacman'' ではどちらもサポートされていません。
# recovery-pacman() {
 
pacman "$@" \
 
--log /dev/null \
 
--noscriptlet \
 
--dbonly \
 
--force \
 
--nodeps \
 
--needed \
 
#
 
}
 
   
  +
=== インストール済みパッケージのリスト ===
{{ic|--log /dev/null}} allows to avoid needless pollution of pacman log, {{Ic|--needed}} will save some time by skipping packages, already present in database, {{Ic|--nodeps}} will allow installation of cached packages, even if packages being installed depend on newer versions. Rest of options will allow '''pacman''' to operate without reading/writing filesystem.
 
   
  +
明示的にインストールされたすべてのパッケージのリストを保持しておくと、たとえばシステムをバックアップしたり、新しいシステムへのインストールを高速化したりするのに役立ちます:
同期データベースを作成:
 
   
# pacman -Sy
+
$ pacman -Qqe > pkglist.txt
   
  +
{{Note|
{{ic|files.list}} からローカルで利用可能なパッケージファイルをインストールしてデータベースの生成を開始:
 
  +
* オプション {{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#フック|hook]] を設定できます。 例:
# recovery-pacman -U $(< files.list)
 
   
  +
[Trigger]
{{ic|pkglist}} から残りをインストール:
 
  +
Operation = Install
  +
Operation = Remove
  +
Type = Package
  +
Target = *
  +
  +
[Action]
  +
When = PostTransaction
  +
Exec = /bin/sh -c '/usr/bin/pacman -Qqe > /etc/pkglist.txt'
   
  +
=== リストからパッケージをインストールする ===
# recovery-pacman -S $(< pkglist)
 
   
  +
以前に保存されたパッケージのリストからパッケージをインストールするには、すでに最新のインストール済みパッケージを再インストールせずに、を実行します。:
Update the local database so that packages that are not required by any other package are marked as explicitly installed and the other as dependences. You will need be extra careful in the future when removing packages, but with the original database lost is the best we can do.
 
   
# pacman -D --asdeps $(pacman -Qq)
+
# pacman -S --needed - < pkglist.txt
# pacman -D --asexplicit $(pacman -Qtq)
 
   
  +
ただし、AURからのものやローカルにインストールされたものなどの外部パッケージがリストに含まれている可能性があります。 外部パッケージをリストから除外するには、前のコマンドラインを次のように拡張できます:
Optionally check all installed packages for corruption:
 
   
  +
# pacman -S --needed $(comm -12 <(pacman -Slq | sort) <(sort pkglist.txt))
# pacman -Qk
 
   
任意で[[#ファイルがどのパッケージにも所有されていないことを確認|ファイルがどのパッケージにも所有されていないこと確認]]てください。
+
最終的に、システムのンストー済みパッケージがリストと一致することを確認し、リスト記載されていないすべてのパッケージを削除ます:
   
  +
# pacman -Rsu $(comm -23 <(pacman -Qq | sort) <(sort pkglist.txt))
全てのパッケージをアップデート:
 
   
  +
{{Tip|これらのタスクは自動化できます。 例えば、これらを参照 {{AUR|bacpac}}, {{AUR|packup}}, {{AUR|pacmanity}}, {{AUR|pug}} }}
# pacman -Su
 
   
  +
=== パッケージから変更された全てのファイルをリストアップ ===
=== 既存のインストールから USB キーを回復させる ===
 
   
  +
ファイルが破損している可能性があるが (例: ソフトウェアあるいはハードウェアの故障)、ファイルが確実に破損しているとは言えない場合、パッケージのハッシュサムを比較すると良いでしょう。{{Pkg|pacutils}} で比較することができます:
If you have Arch installed on a USB key and manage to mess it up (e.g. removing it while it is still being written to), then it is possible to re-install all the packages and hopefully get it back up and working again (assuming USB key is mounted in /newarch)
 
   
  +
# paccheck --md5sum --quiet
# pacman -S $(pacman -Qq --dbpath /newarch/var/lib/pacman) --root /newarch --dbpath /newarch/var/lib/pacman
 
   
  +
データベースのリカバリについては [[#pacman のローカルデータベースを復元する|pacman のローカルデータベースを復元する]]を参照。{{ic|mtree}} ファイルも[[#.pkg ファイルに含まれているファイルを閲覧する|該当するパッケージファイルから {{ic|.MTREE}} として抽出]]できます。
=== .pkg ファイルの中身を展開する ===
 
   
  +
{{Note|悪意のある変更がされている可能性がある場合は気をつけてください。セキュリティ上、ライブメディアを使用したりハッシュサムを別のところから持ってくるなどの用心をすることを推奨します。}}
{{ic|.xz}} で終わっている {{ic|.pkg}} ファイルは tar で固められた圧縮ファイルであり、次のコマンドで解凍できます:
 
   
  +
=== 全てのパッケージの再インストール ===
$ tar xvf package.tar.xz
 
   
  +
全てのネイティブのパッケージを再インストールするには、次を使って下さい:
ファイルを {{ic|.pkg}} から展開したい場合、この方法を使うことができます。
 
   
  +
# pacman -Qnq | pacman -S -
=== .pkg ファイルに含まれているファイルを回覧する ===
 
   
  +
外部の (AUR) パッケージは別に再インストールする必要があります。外部のパッケージは {{ic|pacman -Qmq}} で一覧できます。
例えば、{{Pkg|systemd}} パッケージに入っている {{ic|/etc/systemd/logind.conf}} の中身を見たいのならば:
 
  +
  +
デフォルトで Pacman はインストールの理由(明示的にインストールしたか、依存でインストールしたか)を維持します。
  +
  +
=== pacman のローカルデータベースを復元する ===
  +
  +
[[pacman/ローカルデータベースの復元]]を見てください。
  +
  +
=== 既存のインストールから USB キーを復元する ===
  +
  +
USB キーに Arch をインストールしていて壊してしまった場合 (例: ファイルの書き込み中に取り出してしまった場合など)、全てのパッケージを再インストールして元に戻せる可能性があります (USB キーが {{ic|/newarch}} にマウントされている場合):
  +
  +
# pacman -S $(pacman -Qq --dbpath /newarch/var/lib/pacman) --root /newarch --dbpath /newarch/var/lib/pacman
  +
  +
=== .pkg ファイルに含まれているファイルを閲覧する ===
  +
  +
例えば、{{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
 
$ tar -xOf /var/cache/pacman/pkg/systemd-204-3-x86_64.pkg.tar.xz 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-204-3-x86_64.pkg.tar.xz
   
 
=== 古いパッケージのライブラリを使っているアプリケーションを探す ===
 
=== 古いパッケージのライブラリを使っているアプリケーションを探す ===
   
  +
パッケージをインストールしても、(デーモンやサーバーなど) ずっと実行し続けているプログラムが古いパッケージのライブラリのコードを使用している可能性があります。古いライブラリにセキュリティのバグが存在する場合、プログラムを実行し続けるのは得策ではありません。
Even if you installed a package the existing long-running programs (like daemons and servers) still keep using code from old package libraries. And it is a bad idea to let these programs running if the old library contains a security bug.
 
   
  +
以下のコマンドで古いパッケージのコードを使用しているプログラムを全て見つけることができます:
Here is a way how to find all the programs that use old packages code:
 
   
 
# 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
It will print running program name and old library that was removed or replaced with newer content.
 
   
  +
実行中のプログラムの名前と削除あるいは置換された古いライブラリが出力されます。
== パフォーマンス ==
 
   
  +
=== 必要な言語のコンテンツのみをインストールする ===
=== データベースのアクセス速度を向上させる ===
 
   
  +
多くのパッケージは、ドキュメントと翻訳をいくつかの言語でインストールしようとします。 一部のプログラムは、 {{AUR|localepurge}} などの不要なファイルを削除するように設計されています。これは、パッケージがインストールされた後に実行され、不要なロケールファイルを削除します。 より直接的なアプローチは、 {{ic|pacman.conf}} の {{ic|NoExtract}} ディレクティブを介して提供され、これらのファイルがインストールされないようにします。
Pacman はパッケージの全ての情報を、パッケージごとの小さなファイルに保存しています。データベースのアクセス速度を向上させればデータベースを使う処理 (例: パッケージの検索・パッケージの依存関係の解決) にかかる時間が短くなります。一番安全で簡単な方法は root で次を実行することです:
 
   
  +
{{Warning|1=一部のユーザーは、[https://bbs.archlinux.org/viewtopic.php?id=250846 Xorg] の下でも、ロケールを削除すると [[Special:Permalink/460285#Dangerous NoExtract example|意図しない結果]] が発生したと指摘しました。}}
# pacman-optimize
 
   
  +
次の例では、英語 (US) ファイルをインストールするか、または何もインストールしません。:
小さなファイルをハードディスクのひとつの (物理的な) 場所にまとめて置くことでパッケージにアクセスするときにハードディスクのヘッドがあまり動かなくてもいいようにします。この方法は安全ですが、フールプルーフではありません。ファイルシステムによっては、ディスク上の使用している領域と空の領域がフラグメンテーションを起こすことがあります。さらにアグレッシブな方法として、データベースを最適化する前にインストールされていないパッケージをキャッシュから削除し使われていないリポジトリを削除するという方法があります:
 
  +
  +
{{hc|/etc/pacman.conf|2=
  +
NoExtract = usr/share/help/* !usr/share/help/C/*
  +
NoExtract = usr/share/gtk-doc/html/*
  +
NoExtract = usr/share/locale/* usr/share/X11/locale/*/* usr/share/i18n/locales/* opt/google/chrome/locales/* !usr/share/X11/locale/C/*
  +
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
  +
NoExtract = !usr/share/*locales/trans*
  +
NoExtract = usr/share/man/* !usr/share/man/man*
  +
NoExtract = usr/share/vim/vim*/lang/*
  +
NoExtract = usr/lib/libreoffice/help/en-US/*
  +
NoExtract = usr/share/kbd/locale/*
  +
NoExtract = usr/share/*/translations/*.qm usr/share/qt/translations/*.pak !*/en-US.pak # Qt apps
  +
NoExtract = usr/share/*/locales/*.pak opt/*/locales/*.pak usr/lib/*/locales/*.pak !*/en-US.pak # Electron apps
  +
NoExtract = opt/onlyoffice/desktopeditors/dictionaries/* !opt/onlyoffice/desktopeditors/dictionaries/en_US/*
  +
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 以降、複数のパッケージを同時にダウンロードするオプションは以下だけではないことを言及すべきです。}}
# pacman -Sc && pacman-optimize
 
   
 
=== ダウンロード速度を向上させる ===
 
=== ダウンロード速度を向上させる ===
540行目: 698行目:
 
* {{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://github.com/huydx/hget Githubプロジェクトページのドキュメントを読んで下さい])
  +
  +
== ユーティリティ ==
  +
* {{App|Arch-Update|Gnome-Shell のアップデートインジケータ。|https://github.com/RaphaelRochet/arch-update|{{AUR|gnome-shell-extension-arch-update}}}}
  +
* {{App|Lostfiles|孤立したファイルを検知するスクリプト。|https://github.com/graysky2/lostfiles|{{Pkg|lostfiles}}}}
  +
* {{App|[[Arch Linux の安定化#pacmatic の使用|Pacmatic]]|アップグレードの前に Arch ニュースをチェックして、設定ファイルの変更を警告する pacman ラッパ。|http://kmkeen.com/pacmatic|{{Pkg|pacmatic}}}}
  +
* {{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|[[Powerpill]]|[[aria2]] や [[Reflector]] を通じて並列分割ダウンロードを行い pacman のダウンロード処理を高速化。|https://xyne.archlinux.ca/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}}}}
  +
  +
=== グラフィカルフロントエンド ===
  +
  +
{{Warning|PackageKit は既定でシステムのパーミッションを {{ic|wheel}} グループに開放するので、一般的な用途ではおすすめできません。{{Bug|50459}} および {{Bug|57943}} を参照してください。}}
  +
  +
* {{App|Apper|PackageKit を使用し C++ で書かれた Qt 5 アプリケーションパッケージマネージャ。[https://www.freedesktop.org/wiki/Distributions/AppStream/ AppStream metadata] をサポート。|https://userbase.kde.org/Apper|{{Pkg|apper}}}}
  +
* {{App|Discover|KDE のパッケージ管理ツールのコレクション。PackageKit を使用。[https://www.freedesktop.org/wiki/Distributions/AppStream/ AppStream metadata]、[[Flatpak]] および [[Fwupd]] をサポート。|https://userbase.kde.org/Discover|{{Pkg|discover}}}}
  +
* {{App|GNOME packagekit|GTK ベースのパッケージ管理ツール。|https://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}}}}

2023年10月28日 (土) 20:00時点における最新版

関連記事

以下のヒントや pacman 自体の柔軟性を広げる汎用的な手法については、Core UtilitiesBash を見てください。日本語環境において、このページのコマンドのいくつかは LANG=C を前に付ける必要があります。

目次

メンテナンス

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

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

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

With version

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

  • 明示的にインストールしたパッケージを全てリストアップ: pacman -Qe
  • group グループに含まれるパッケージを全てリストアップ: pacman -Sq group
  • 依存パッケージではない、明示的にインストールしたネイティブのパッケージ (同期データベースに存在するパッケージ) を全てリストアップ: pacman -Qent
  • 外部からインストールしたパッケージ (手動でダウンロード・インストールしたパッケージ) をリストアップ: pacman -Qm
  • ネイティブなパッケージ (同期データベースからインストールしたパッケージ) をリストアップ: pacman -Qn
  • 正規表現でパッケージをリストアップ: pacman -Qs regex
  • 正規表現でカスタム出力形式を使ってパッケージをリストアップ: expac -s "%-30n %v" regex (expac が必要です)。

容量でソート

インストールしたパッケージのリストを容量で並び替えたい場合 ( どのパッケージが最大かを把握するのは、ハードドライブの空き容量を増やしたいときに有用です。 各パッケージ単独の容量を取得するか、パッケージとその依存関係の容量を取得するかの二つのオプションがあります。

パッケージ単独

次のコマンドで、インストールされたパッケージ全てとそれぞれの容量をリストアップします:

$ pacman -Qi | awk '/^Name/{name=$3} /^Installed Size/{print $4$5, name}' | sort -h
パッケージとその依存関係

パッケージとその依存関係の合計容量を表示するのは、次の方法があります。

  • expac をインストールして expac -H M '%m\t%n' | sort -h を実行。
  • -c オプションを付けて pacgraph を実行。

複数のパッケージのダウンロード容量をリストアップするには (packages を空にすると全てのパッケージの情報が出力されます):

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

basebase-devel に存在しない明示的にインストールしたパッケージの容量と説明をリストアップするには:

$ expac -H M "%011m\t%-20n\t%10d" $(comm -23 <(pacman -Qqen | sort) <(pacman -Qqg base base-devel | sort)) | sort -n

アップグレード対象のパッケージとそのダウンロード容量をリストアップするには:

$ pacman -Quq|xargs expac -S -H M '%k\t%n' | sort -sh

日付を使う

expac を使って最後にインストールした20のパッケージをリストアップするには、次のコマンドを実行:

$ 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

指定したグループやリポジトリに存在しないパッケージ

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

basebase-devel グループに存在しない明示的にインストールしたパッケージをリストアップ:

$ comm -23 <(pacman -Qeq | sort) <(pacman -Qgq base base-devel | sort)

basebase-devel グループに存在せず、他のパッケージによって必要とされていないインストール済みパッケージをリストアップ:

$ comm -23 <(pacman -Qqt | sort) <(pacman -Sqg base base-devel | sort)

上記と同じで、説明を付けてリストアップ:

$ expac -HM '%-20n\t%10d' $(comm -23 <(pacman -Qqt | sort) <(pacman -Qqg base base-devel | sort))

指定したリポジトリ repo_name に存在しないインストール済みパッケージをリストアップ:

$ comm -23 <(pacman -Qtq | sort) <(pacman -Slq repo_name | sort)

repo_name リポジトリに含まれているインストール済みパッケージをリストアップ:

$ comm -12 <(pacman -Qtq | sort) <(pacman -Slq repo_name | sort)

base グループにはなく、Arch Linux ISO には含まれているパッケージをリストアップ:

$ comm -23 <(curl https://git.archlinux.org/archiso.git/tree/configs/releng/packages.x86_64) <(pacman -Qqg base | sort)

開発版パッケージ

開発版や不安定版のパッケージを全てリストアップするには、次のコマンドを実行します:

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

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

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

$ pacman -Qi package

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

$ expac -S '%D' package

パッケージの閲覧

インストールされているすべてのパッケージを、各パッケージのインスタントプレビューで参照するには:

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

これは fzf を使用して、右側にパッケージ情報が表示されたすべてのパッケージを一覧表示する2ペインビューを表示します。

パッケージのリストをフィルタリングするための文字を入力します。矢印キー(またはCtrl-j/Ctrl-k)を使用してナビゲートします。Enter を押して、less の下にパッケージ情報を表示します。

fzf を使用して、同様の方法で pacman にすべてのパッケージ(インストールされているものとまだインストールされていないものの両方)を参照するには、次を使用します。

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

ナビゲーションのキーバインディングは同じですが、Enter は同じようには機能しません。

パッケージに含まれているファイルを容量を付けてリストアップ

特定のパッケージが異常な容量を消費していて、どのファイルが容量を食っているのか調べたいときに便利なコマンドです。

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

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

どのパッケージにも所有されていない謎のファイルが存在する場合 (パッケージマネージャを使わずにソフトウェアをインストールした場合など)、ファイルを見つけ出して消去すると良いでしょう。以下の手順で見つけ出せます:

  1. 所有者を確認したいファイルのソート済みリストを作成:
    $ find /etc /opt /usr | sort > all_files.txt
  2. pacman によって追跡されているファイルのソート済みリストを作成 (そしてディレクトリの末尾のスラッシュを削除):
    $ pacman -Qlq | sed 's|/$||' | sort > owned_files.txt
  3. 後者のファイルには存在しない行を確認:
    $ comm -23 all_files.txt owned_files.txt

どのパッケージにも含まれない重要なファイル (実行時に生成されるファイルやカスタム設定など) も存在するため、安全に消去できるファイルを選び出す方法としては不適切です。

ヒント: lostfiles スクリプトは上記と同じようなことを実行しますが、出力から偽陽性のファイルを取り除くための包括的なブラックリストを使用します。

パッケージによって作成された所有されていないファイルの追跡

ほとんどのシステムは、次のようないくつかの [1] ファイルをゆっくりと収集します。通常の操作の過程で状態ファイル、ログ、インデックスなどとして。

pacutilspacreport を使用して、/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

次に、root ユーザーとして pacreport --unowned-files を使用すると、関連するパッケージがインストールされなくなった場合(または新しいファイルが作成された場合)に、所有されていないファイルが一覧表示されます。

さらに、aconfmgr(aconfmgr-gitAUR)を使用すると、スクリプトを使用して、変更されたファイルや孤立したファイルを追跡できます。

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

孤立したパッケージとは、依存関係としてインストールされ、どのパッケージにも必要なくなったパッケージです。

これらは pacman -Rs package の代わりに pacman -R package を使ってパッケージをアンインストールしたり、makedepends としてパッケージをインストールしたり、パッケージが新しいバージョンで依存関係を削除したりすることで、時間とともにシステムに蓄積されます。

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

# pacman -Qtdq | pacman -Rns -

孤立したパッケージが見つからなかった場合、出力は error: argument '-' specified with empty stdin となります。これは pacman -Rns に引数が渡されていないので予想されます。このエラーは moreutils パッケージの ifne(1) を2番目のコマンドの前に付けることで回避できます。

ノート: 引数 -Qt は真の孤立したパッケージのみをリストします。他のパッケージによって オプションで 必要とされるパッケージを含めるには、-t フラグを 2 回渡します (すなわち-Qtt)
ヒント: pacman のポストトランザクション hookpacman -Qtd コマンドを追加すると、トランザクションがパッケージを取りこぼした時に通知されます。これはパッケージがリポジトリから削除された時に通知するのに便利です。削除されたパッケージは (明示的にインストールされていない限り) ローカルインストールでも孤立したパッケージになります。孤立したパッケージが見つからない時に "failed to execute command" エラーを避けるには、フックで Exec に以下のコマンドを使います: /usr/bin/bash -c "/usr/bin/pacman -Qtd || /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
ノート:
  • 削除されないようにするために、上記のコマンドに追加のパッケージを追加することができます。完全に機能する基本システムに必要な他のパッケージの詳細については、 インストールガイド#必須パッケージのインストール を参照してください。
  • これはブートローダのパッケージも削除対象とされます。システムはまだ起動できるはずですが、ブートパラメータはこれ無しでは変更できないかもしれません。

最後に、Pacman ヒント#使用していないパッケージの削除 (孤立したパッケージ) の手順に従って、依存関係 でインストールされたすべてのパッケージを削除します。

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

依存パッケージはアルファベット順でソートされ、重複するパッケージは削除されます。

ノート: ローカルにインストールしたパッケージのツリーを表示したいだけの場合、pacman -Qi を使ってください。
$ pacman -Si packages | awk -F'[:<=>]' '/^Depends/ {print $2}' | xargs -n1 | sort -u

もしくは、expac を使用して:

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

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

システムの設定ファイルをバックアップしたい場合は /etc/ にある全てのファイルをコピーすれば良いですが、普通は変更を加えたファイルだけをバックアップすればそれで足ります。変更が加えられたバックアップファイルは次のコマンドで閲覧できます:

# pacman -Qii | awk '/^MODIFIED/ {print $2}'

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

ヒント: バックアップファイルだけでなく、pacman が認識している全ての変更済みファイルをリストアップしたい場合はパッケージから変更された全てのファイルをリストアップを見てください。

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 base base-devel grub-bios xorg gimp --cachedir .
# repo-add ./custom.db.tar.gz ./*

ダウンロードしたら "Packages" フォルダを CD/DVD に焼くか USB スティック、外部 HDD などにコピーしてください。

インストールするには:

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

# mkdir /mnt/repo
# mount /dev/sr0 /mnt/repo    # CD/DVD の場合
# mount /dev/sdxY /mnt/repo   # USB スティックの場合。

2. pacman.conf を編集して他のリポジトリ (例: extra, core など) の前にリポジトリを追加してください。この手順は重要です。これで標準のリポジトリに優先して CD/DVD/USB のファイルがインストールされるようになります:

# nano /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.gz /path/to/package-1.0-1-x86_64.pkg.tar.zst

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

$ repo-add /path/to/repo.db.tar.gz /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.xz
    ├── customrepo.db.tar.xz
    ├── customrepo.files -> customrepo.files.tar.xz
    ├── customrepo.files.tar.xz
    └── 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.gz pkgname

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

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

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

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

読み取り専用キャッシュ

ノート: pacman がサーバーから 3 つのパッケージをダウンロードできない場合、代わりに別のミラーが使用されます。https://bbs.archlinux.org/viewtopic.php?id=268066 を参照してください。

迅速な解決策を探している場合は、他のコンピューターが最初のミラーとして使用できる 基本的な一時 Web サーバー を実行するだけです。

まず最初に、提供するディレクトリで pacman データベースを利用できるようにします。

# ln -s /var/lib/pacman/sync/*.db /var/cache/pacman/pkg/

次に、このディレクトリの提供を開始します。たとえば、Python http.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
Server = http://server-ip:port
...
警告: この階層は存在しないため、クエリは失敗します、他のエントリの場合と同様に、このカスタムサーバーに /repos/$repo/os/$arch を追加しないでください。

よりスタンドアロンのソリューションをお探しの場合は、da​​rkhttpd が非常に最小限の Web サーバーを提供します。前の python コマンドを次のように置き換えます。

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

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

ローカルネットワーク上の1台のマシンを/var/cache/pacman/pkg ディレクトリの overlay mount 読み取り専用パッケージキャッシュとして使うことができます。このような設定は、このサーバーに他のマシンでも使われる最新のパッケージが適度に包括的にインストールされている場合に有利です。これは低帯域幅のアップストリーム接続の端にある多くのマシンを管理するのに便利です。

例として、このメソッドを使用するには:

# 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 -oindex=off を使用してオーバーレイマウントを試してください。

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

# pacman -Syu --cachedir /tmp/pacman_pkg

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

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

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

読み書き可能キャッシュ

ヒント: pacserve を使うことで以下の方法をもっと簡単に実現できます。

複数のコンピュータ間でパッケージを共有するには、ネットワークベースのマウントプロトコルを使って /var/cache/pacman/ を共有します。このセクションでは shfs または sshfs を使ってパッケージキャッシュと関連するライブラリディレクトリを同一ローカルネットワーク上の複数のコンピュータで共有する方法を示します。ネットワークで共有されるキャッシュは、ファイルシステムの選択やその他の要因で、遅くなることがあります。

まず、ネットワークをサポートするファイルシステムをインストールしてください。例えば sshfs, shfs, ftpfs, smbfs, nfs など。

ヒント:
  • sshfs や shfs を使う場合、SSH 鍵を読んで下さい。
  • デフォルトでは、smbfs はファイル名にコロンを使えないので、クライアントは問題のあるパッケージをダウンロードしなおしてしまいます。クライアント側で mapchars マウントオプションを使用することで解決します。

それから、サーバーの /var/cache/pacman/pkg をクライアントマシンの /var/cache/pacman/pkg にマウントすることでパッケージを共有できます。

rsync で同期

ローカル環境でのもう1つのアプローチは、 rsync です。 キャッシュするサーバーを選択し、 rsync デーモン を有効にします。 クライアントでは、rsync プロトコルを介してこの共有と双方向で同期します。 コロンを含むファイル名は、 rsync プロトコルでは問題ありません。

​クライアントのドラフトの例では、共有名に uname-m と入力し使用することで、アーキテクチャに依存する同期が保証されます。

 # rsync rsync://server/share_$(uname -m)/ /var/cache/pacman/pkg/ ...
 # pacman ...
 # paccache ...
 # rsync /var/cache/pacman/pkg/ rsync://server/share_$(uname -m)/  ...

nginx を使用する動的なリバースプロキシキャッシュ

nginx を使って公式の上流ミラーへのリクエストをプロキシして結果をローカルディスクにキャッシュすることができます。その後、ファイルへのリクエストは全てローカルのキャッシュから供給されるようになり、大量のサーバーを更新するときでもインターネットのトラフィックを簡単に最小限に抑えることができます。

警告: この方法には欠点があります。パッケージファイルの相対パスが同じミラーを使う必要があり同じパスを使うようにキャッシュを設定しなければなりません。この例では、相対パスが /archlinux/$repo/os/$arch のミラーを使用して mirrorlist のキャッシュの Server 設定も同じ相対パスとします。

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

キャッシュのディレクトリを作成して nginx からファイルが書き込めるようにパーティションを設定:

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

次に、nginx を 動的キャッシュ として設定 (コマンドについてはコメントを読んでください)。

最後に、他の Arch Linux サーバーを更新して mirrorlist ファイルに以下の行を追加して新しいキャッシュを使うように設定:

/etc/pacman.d/mirrorlist
Server = http://cache.domain.local:8080/archlinux/$repo/os/$arch
...
ノート: 時間と共にディレクトリは膨れ上がるため、古いパッケージを消去できるようにする必要があります。(pacman に含まれている) paccache を使うことでお好きな基準で消去を自動化することが可能です。例えば、find /srv/http/pacman-cache/ -type d -exec paccache -v -r -k 2 -c {} \; はキャッシュディレクトリに最新から1つ前のバージョンまでパッケージを保持します。

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

Pacoloco は、 pacman リポジトリ用の使いやすいプロキシキャッシュサーバです。​ pacoloco-gitAUR としてインストールできます。​構成ファイルを開き、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 は AUR で利用できます:flexo-gitAUR インストールしたら、 systemd で flexo.service サービスを スタートします。

Flexo はデフォルトではポート 7878 で動作します。 ​/etc/pacman.d/mirrorlist の先頭に Server = http://myserver:7878/$repo/os/$arch と入力し、pacman が Flexo を介してパッケージをダウンロードできるようにします。

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

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

不要なキャッシュパージの防止

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

古い tarball のみが削除されるようにキャッシュをクリーンアップするには:

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

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

ファイルシステムからパッケージを再作成するには、(pacman に含まれている) bacman を使います。システム上のファイルがそのまま使われるため、作成されるパッケージにはファイルへの変更も一緒に含まれてしまいます。再作成したパッケージの配布は非推奨です。ABSArch Rollback Machine を見てください。

ヒント: bacmanmakepkg.confPACKAGER, PKGDEST, PKGEXT オプションを使用します。環境変数をエクスポートすることで圧縮ツールのオプションを指定することができます。例えば XZ_OPT="-T 0"xz の並列圧縮を有効化します。

別のツールとして fakepkgAUR も存在します。並列化をサポートしており複数のパッケージを入力することができます。bacman ではどちらもサポートされていません。

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

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

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

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

[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))
ヒント: これらのタスクは自動化できます。 例えば、これらを参照 bacpacAUR, packupAUR, pacmanityAUR, pugAUR

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

ファイルが破損している可能性があるが (例: ソフトウェアあるいはハードウェアの故障)、ファイルが確実に破損しているとは言えない場合、パッケージのハッシュサムを比較すると良いでしょう。pacutils で比較することができます:

# paccheck --md5sum --quiet

データベースのリカバリについては pacman のローカルデータベースを復元するを参照。mtree ファイルも該当するパッケージファイルから .MTREE として抽出できます。

ノート: 悪意のある変更がされている可能性がある場合は気をつけてください。セキュリティ上、ライブメディアを使用したりハッシュサムを別のところから持ってくるなどの用心をすることを推奨します。

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

全てのネイティブのパッケージを再インストールするには、次を使って下さい:

# pacman -Qnq | pacman -S -

外部の (AUR) パッケージは別に再インストールする必要があります。外部のパッケージは pacman -Qmq で一覧できます。

デフォルトで Pacman はインストールの理由(明示的にインストールしたか、依存でインストールしたか)を維持します。

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

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

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

USB キーに Arch をインストールしていて壊してしまった場合 (例: ファイルの書き込み中に取り出してしまった場合など)、全てのパッケージを再インストールして元に戻せる可能性があります (USB キーが /newarch にマウントされている場合):

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

.pkg ファイルに含まれているファイルを閲覧する

例えば、systemd パッケージに含まれている /etc/systemd/logind.conf の中身をみたい場合:

$ tar -xOf /var/cache/pacman/pkg/systemd-204-3-x86_64.pkg.tar.xz etc/systemd/logind.conf

もしくは vim を使って圧縮ファイルを閲覧することもできます:

$ vim /var/cache/pacman/pkg/systemd-204-3-x86_64.pkg.tar.xz

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

パッケージをインストールしても、(デーモンやサーバーなど) ずっと実行し続けているプログラムが古いパッケージのライブラリのコードを使用している可能性があります。古いライブラリにセキュリティのバグが存在する場合、プログラムを実行し続けるのは得策ではありません。

以下のコマンドで古いパッケージのコードを使用しているプログラムを全て見つけることができます:

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

実行中のプログラムの名前と削除あるいは置換された古いライブラリが出力されます。

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

多くのパッケージは、ドキュメントと翻訳をいくつかの言語でインストールしようとします。 一部のプログラムは、 localepurgeAUR などの不要なファイルを削除するように設計されています。これは、パッケージがインストールされた後に実行され、不要なロケールファイルを削除します。 より直接的なアプローチは、 pacman.confNoExtract ディレクティブを介して提供され、これらのファイルがインストールされないようにします。

警告: 一部のユーザーは、Xorg の下でも、ロケールを削除すると 意図しない結果 が発生したと指摘しました。

次の例では、英語 (US) ファイルをインストールするか、または何もインストールしません。:

/etc/pacman.conf
NoExtract = usr/share/help/* !usr/share/help/C/*
NoExtract = usr/share/gtk-doc/html/*
NoExtract = usr/share/locale/* usr/share/X11/locale/*/* usr/share/i18n/locales/* opt/google/chrome/locales/* !usr/share/X11/locale/C/*
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
NoExtract = !usr/share/*locales/trans*
NoExtract = usr/share/man/* !usr/share/man/man*
NoExtract = usr/share/vim/vim*/lang/*
NoExtract = usr/lib/libreoffice/help/en-US/*
NoExtract = usr/share/kbd/locale/*
NoExtract = usr/share/*/translations/*.qm usr/share/qt/translations/*.pak !*/en-US.pak # Qt apps
NoExtract = usr/share/*/locales/*.pak opt/*/locales/*.pak usr/lib/*/locales/*.pak !*/en-US.pak # Electron apps
NoExtract = opt/onlyoffice/desktopeditors/dictionaries/* !opt/onlyoffice/desktopeditors/dictionaries/en_US/*
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)

ダウンロード速度を向上させる

ノート: ダウンロード速度が極端に遅い場合、使っているミラーが ftp.archlinux.org ではないことを確認してください。2007年の3月からこのサーバーには速度制限がかかっています

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

Pacman に初めから入っているファイルダウンローダの代わりに、他のアプリケーションを使ってパッケージをダウンロードすることで Pacman のパッケージダウンロード速度を上げることができます。

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

# pacman -Syu

Powerpill

Powerpill は Pacman の完全なラッパーで並行・分割ダウンロードを使うことによってダウンロード処理を高速化します。通常の Pacman は一度にひとつのパッケージしかダウンロードしないので、ダウンロードが完了するまで次のダウンロードが始まりません。Powerpill は異なるアプローチを取ります: 同時に可能な限り多くのパッケージをダウンロードしようとします。

Powerpill の wiki ページに基本的な設定・使用方法と、パッケージと上流のリンクがあります。

wget

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

wget を使うには、まず pacman -S wget で wget をインストールして、それから /etc/pacman.conf を編集して次の行を [options] セクションでアンコメントしてください:

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

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

aria2

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

ノート: 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 で使用できるオプションについては man aria2cOPTIONS を見てください。

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

他のアプリケーション

Pacman で利用できるダウンロードアプリケーションは他にもあります:

ユーティリティ

  • Arch-Update — Gnome-Shell のアップデートインジケータ。
https://github.com/RaphaelRochet/arch-update || gnome-shell-extension-arch-updateAUR
  • Lostfiles — 孤立したファイルを検知するスクリプト。
https://github.com/graysky2/lostfiles || lostfiles
  • Pacmatic — アップグレードの前に Arch ニュースをチェックして、設定ファイルの変更を警告する pacman ラッパ。
http://kmkeen.com/pacmatic || pacmatic
  • pacutils — libalpm ベースのプログラムのヘルパーライブラリ。
https://github.com/andrewgregory/pacutils || pacutils-gitAUR
  • pkgfile — あるファイルを使っているパッケージが何かを見つけるツール。
https://github.com/falconindy/pkgfile || pkgfile
  • pkgtools — Arch Linux パッケージ用のスクリプトコレクション。
https://github.com/Daenyth/pkgtools || pkgtoolsAUR
  • Powerpillaria2Reflector を通じて並列分割ダウンロードを行い pacman のダウンロード処理を高速化。
https://xyne.archlinux.ca/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-archAUR

グラフィカルフロントエンド

警告: PackageKit は既定でシステムのパーミッションを wheel グループに開放するので、一般的な用途ではおすすめできません。FS#50459 および FS#57943 を参照してください。
  • Apper — PackageKit を使用し C++ で書かれた Qt 5 アプリケーションパッケージマネージャ。AppStream metadata をサポート。
https://userbase.kde.org/Apper || apper
  • Discover — KDE のパッケージ管理ツールのコレクション。PackageKit を使用。AppStream metadataFlatpak および Fwupd をサポート。
https://userbase.kde.org/Discover || discover
  • GNOME packagekit — GTK ベースのパッケージ管理ツール。
https://www.freedesktop.org/software/PackageKit/ || gnome-packagekit
  • GNOME Software — Gnome ソフトウェアアプリ (GNOME の精選ソフトウェアコレクション)。
https://wiki.gnome.org/Apps/Software || gnome-software
  • pcurses — curses フロントエンドのパッケージ管理ツール。
https://github.com/schuay/pcurses || pcurses
  • tkPacman — Tcl/Tk と X11 にしか依存せず、CLI の pacman を使ってパッケージデータベースを操作できるソフトウェア。
https://sourceforge.net/projects/tkpacman || tkpacmanAUR