pacman/ヒントとテクニック

提供: ArchWiki
ナビゲーションに移動 検索に移動

関連記事

以下のヒントや 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