pacman

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

関連記事

pacman パッケージマネージャは Arch Linux の主要な機能のひとつです。pacman はシンプルなバイナリのパッケージ形式と簡単に利用できるビルドシステムから成っています。pacman のゴールはパッケージ管理を楽にすることであり、公式リポジトリにあるパッケージや、ユーザー自身が作成したパッケージを容易に管理することができます。

Pacman はマスターサーバーと同期してシステムを最新に保ちます。このサーバー・クライアントモデルによって、シンプルなコマンドだけで必要な依存性を解決してパッケージのダウンロード・インストールをすることができます。

Pacman は C 言語で書かれており、パッケージングに bsdtar(1) tar フォーマットを使用します。

ヒント: pacman パッケージには makepkgvercmp(8) などのツールが含まれています。pactreecheckupdates など、他の有用なツールは pacman-contrib パッケージに含まれています (以前pacman パッケージに含まれていました)。ツールの一覧を見るには pacman -Ql pacman pacman-contrib | grep -E 'bin/.+' を実行してください。

目次

使い方

pacman で何ができるかをちゃんと学びたい場合、pacman(8) を参照してください。以下にあるのは pacman でできることのほんの一例です。

ヒント: 他の Linux ディストリビューションを使ったことがある場合、Pacman 比較表の記事が役に立つでしょう。

パッケージのインストール

パッケージとは、以下を含むアーカイブです:

  • アプリケーションの (コンパイルされた) 全ファイル
  • アプリケーションのメタデータ (アプリケーション名、バージョン、依存関係など)
  • pacman によって使用されるインストールファイル及びディレクティブ
  • (任意で) 開始/停止スクリプトなど、作業を容易にする追加のファイル

Arch のパッケージマネージャである pacman は、このようなパッケージをインストール、アップデート、そして削除することができます。プログラムを自分でコンパイルしてインストールする代わりにパッケージを使用することには、様々な利点があります:

  • 簡単なアップデート: pacman は、アップデートが利用可能になるとすぐに既存のパッケージを更新します。
  • 依存関係のチェック: pacman は依存関係を処理してくれます。あなたがすべきことは、インストールしたいプログラムを指定することだけです。pacman はそのプログラムと一緒に他の必要なプログラムもインストールします。
  • 綺麗にアンインストール: pacman は、パッケージに含まれる全ファイルのリストを保持します。これにより、パッケージを削除する際に意図せずファイルが残留することはありません。
ノート:
  • パッケージには、任意の依存パッケージが設定されていることがあります。必ずインストールする必要はありませんが、インストールすることで機能が追加されます。pacman は、パッケージのインストール時に任意の依存パッケージのリストを表示しますが、そのリストは pacman.log に残りません。#パッケージ・データベースに問い合わせる コマンドを使うことで、パッケージの任意の依存パッケージを見ることができます。
  • 他のパッケージの (任意の) 依存パッケージとしてパッケージをインストールする場合 (つまり、そのパッケージ自体は必要としていない場合)、--asdeps オプションを使用することを推奨します。詳しくは #インストール理由 セクションを参照。
警告: Arch でパッケージのインストールをする際に、システムのアップグレードをせずにパッケージリストを更新することは避けてください (例えば、公式リポジトリでパッケージが見つからなくなった時など)。実際の場面でいうと、pacman -Syu パッケージ名 の代わりに pacman -Sy パッケージ名 を実行してはいけないということです。これを実行すると依存関係に問題が発生する可能性があります。システムメンテナンス#部分的なアップグレードはサポートされていませんBBS#89328 を参照。

特定のパッケージのインストール

ひとつ、あるいは複数のパッケージを、依存パッケージも含めてインストールするには、以下のコマンドを実行してください:

# pacman -S パッケージ名1 パッケージ名2 ...

正規表現を使ってパッケージをインストールするには (このフォーラムスレッド を参照):

# pacman -S $(pacman -Ssq パッケージのパターン)

別々のリポジトリ (例: extratesting) 内に同一のパッケージの複数のバージョンが存在していることがあります。この場合、パッケージ名の前にリポジトリ名を明示する必要があります。例えば extra リポジトリ内のバージョンをインストールするには:

# pacman -S extra/パッケージ名

名前に類似パターンが存在するパッケージをインストールしたい場合、波括弧を使ってパッケージ名を展開することができます。例えば:

# pacman -S plasma-{desktop,mediacenter,nm}

必要に応じて更に複雑なパターンを指定することもできます:

# pacman -S plasma-{workspace{,-wallpapers},pa}
仮想パッケージ

仮想パッケージとは、それ自体は存在していないが、1つ以上のパッケージによって provides (提供) 指定されている特殊なパッケージです。仮想パッケージが存在していることにより、あるパッケージの依存関係として複数の候補が存在している場合に、パッケージは特定のパッケージを依存関係として指定する必要がなくなります。仮想パッケージはその名前を使ってインストールすることはできません。仮想パッケージを provide (提供) するパッケージをインストールすると、その仮想パッケージがシステムにインストールされたことになります。

ヒント: 複数の候補が存在する場合、候補のリストは、pacman.conf 内に現れるリポジトリの順番でソートされ、そして同一のリポジトリ内にも複数の候補が存在する場合はさらにアルファベット順にソートされます。

パッケージグループのインストール

パッケージグループに属しているパッケージをすべて同時にインストールすることができます。例えば:

# pacman -S gnome

を実行すると gnome グループからインストールしたいパッケージを選択するように表示されます。

パッケージグループには大量のパッケージが含まれており、しばしばインストールしたいパッケージはそのうちの少しだけということがあるかもしれません。インストールするパッケージの番号を全て入力するという方法でもよいですが、以下のような構文を使うことで簡単にパッケージを選択することが可能です:

Enter a selection (default=all): 1-10 15

以上で1番から10番までと15番のパッケージがインストールされます。

Enter a selection (default=all): ^5-8 ^2

以上で5番から8番までと2番のパッケージ以外の全てのパッケージをインストールします。

どのパッケージが gnome グループに属しているか見るには:

$ pacman -Sg gnome

どのようなパッケージグループがあるかは https://www.archlinux.jp/groups/ を見て下さい。

ノート: グループの中にインストール済みのパッケージがある場合でも、グループにあわせて再インストールされます。--needed オプションを使うことで無視できます。

パッケージの削除

依存パッケージをすべて残したままパッケージを削除するには:

# pacman -R パッケージ名

削除したいパッケージと、そのパッケージだけが必要としている依存パッケージを一緒に削除するには:

# pacman -Rs パッケージ名
警告: グループ (例えば gnome) を削除する場合、このコマンドはそのグループ内のパッケージのインストール理由を無視します。グループを指定した場合、そのグループ内のパッケージを分けて指定したかのように振る舞うからです。依存関係のインストール理由は依然として考慮されます。

上記のコマンドは、必要とされているパッケージを含んでいるグループを削除する際に、実行を拒否する場合があります。そのような場合は、以下を試してください:

# pacman -Rsu パッケージ名

削除したいパッケージと、そのパッケージの依存パッケージ、さらに削除したいパッケージに依存しているパッケージを削除するには:

警告: この操作は再帰的です。潜在的に必要とされているパッケージも削除してしまう可能性があるので、注意して使用しなければなりません。
# pacman -Rsc パッケージ名

他のパッケージによって必要とされているパッケージを、必要としているパッケージを削除せずに削除するには:

警告: 以下の操作はシステムを破壊する可能性があり、使用は避けるべきです。システムメンテナンス#特定の pacman コマンドを避けてください を参照してください。
# pacman -Rdd パッケージ名

Pacman は、特定のアプリケーションを削除する際に、重要な設定ファイルを削除せずに .pacsave 拡張子を付けてバックアップします。これらのバックアップファイルの作成を行わないようにするには、-n オプションを付けてください:

# pacman -Rn パッケージ名
ノート: Pacman は、アプリケーション自身が作成した設定ファイルを削除しません (例えば、ホームディレクトリ内の "ドットファイル")。

パッケージのアップグレード

警告:

Pacman はコマンド一つでシステム上の全パッケージをアップデートできます。この処理に掛かる時間は、システムがどれだけ新しいかによります。以下のコマンドは、リポジトリデータベースを同期し、かつ、システム内のパッケージをアップデートします (ただし、リポジトリに無い"ローカル"のパッケージを除く):

# pacman -Syu

パッケージ・データベースに問い合わせる

Pacman からローカルデータベースに問い合わせるときは -Q フラグを、同期データベースに問い合わせるときは -S フラグを、ファイルデータベースに問い合わせるときは -F フラグを使います。それぞれのフラグのサブオプションについては pacman -Q --helppacman -S --helppacman -F --help を見てください。

Pacman はデータベースからパッケージを検索することができます。パッケージ名と説明の両方を検索するには:

$ pacman -Ss 検索ワード1 検索ワード2 ...

場合によっては、-s の組み込みの ERE (拡張正規表現) によって、余計な検索結果が大量に出てきてしまうことがあるでしょう。そのようなときは検索対象をパッケージ名だけに絞ってみてください:

$ pacman -Ss '^vim-'

既にインストール済みのパッケージから検索するには:

$ pacman -Qs 検索ワード1 検索ワード2 ...

リモートパッケージからパッケージファイルの名前で検索するには:

$ pacman -F 検索ワード1 検索ワード2 ...

パッケージ名を指定して詳細な情報を得るには:

$ pacman -Si パッケージ名

ローカルにインストールされているパッケージの詳細な情報を得るには:

$ pacman -Qi パッケージ名

-i フラグを2つ付けることで、バックファイルのリストとバックアップファイルの変更状態も同時に表示できます:

$ pacman -Qii パッケージ名

あるパッケージによってインストールされたファイルの一覧を得るには:

$ pacman -Ql パッケージ名

リモートパッケージによってインストールされるファイルのリストを得るには:

$ pacman -Fl パッケージ名

あるパッケージによってインストールされたファイルが存在しているか確認するには:

$ pacman -Qk パッケージ名

k フラグを2つ付けると、より徹底したチェックが行われます。

データベースを検索して、あるファイルがどのパッケージに属しているかを調べるには:

$ pacman -Qo /パス/ファイル名

あるファイルがどのリモートパッケージに属しているかデータベースに問い合わせるには:

$ pacman -F /パス/ファイル名

他のパッケージに必要とされていないパッケージ (孤児) の一覧を得るには:

$ pacman -Qdt

明示的にインストールしたパッケージで、依存関係として必要とされていないパッケージを全て表示するには:

$ pacman -Qet

その他の例については pacman/ヒントとテクニック を参照してください。

Pactree

ノート: pactree(8)pacman パッケージの一部ではなくなりました。代わりに、pacman-contrib でインストールできます。

あるパッケージの依存関係ツリー (dependency tree) を表示するには (つまり、そのパッケージ必要としているパッケージの木):

$ pactree パッケージ名

あるパッケージの被依存ツリー (dependant tree) を表示するには (つまり、そのパッケージ必要としているパッケージの木)、逆フラグ pactree に渡すか、pkgtoolsAURwhoneeds を使ってください。

データベースの構造

pacman データベースは通常、/var/lib/pacman/sync にあります。/etc/pacman.conf で指定された各リポジトリに対して、対応するデータベースファイルがこのディレクトリ内に存在します。データベースファイルは、パッケージごとに 1 つのディレクトリを含む gzip 圧縮された tar アーカイブです。たとえば、which パッケージの場合は次のようになります:

$ tree which-2.21-5
which-2.21-5
|-- desc

desc ファイルには、パッケージの説明、依存関係、ファイルサイズ、MD5 ハッシュなどのメタデータが含まれています。

パッケージキャッシュの削除

Pacman は、ダウンロードしたファイルを /var/cache/pacman/pkg/ に保存しますが、これらは古くなってもアンインストールされても自動的に削除されません。これにはいくつかの利点があります:

  1. パッケージをダウングレードする際に、他の方法 (Arch Linux Archive など) によって以前のバージョンを入手する必要がない。
  2. アンインストールされたパッケージをキャッシュディレクトリから簡単に直接再インストールでき、リポジトリから新しくダウンロードする必要がない。

しかし、ディレクトリのサイズが大きくなりすぎないようにするために、定期的にキャッシュを手動でクリーンアップする必要があります。

pacman-contrib パッケージで提供されている paccache(8) スクリプトは、インストール済みパッケージとアンインストール済みパッケージのキャッシュ済みバージョンを、最も新しい3つを残して全て削除します (オプションを何も指定しなかった場合):

# paccache -r

paccache.timer有効化起動すれば、週に1度、未使用のパッケージキャッシュを削除してくれます。

ヒント: pacman のトランザクションの度にこの操作を自動で実行するフックを作成することもできます。フックを導入する pacman-cleanup-hookAURインストールすることもできます。フックの例もあります。

何個の新しいバージョンのキャッシュを保持するかを指定することも可能です。最も新しいバージョン1つだけを保持するには:

# paccache -rk1

-u/--uninstalled スイッチを加えれば、アンインストールされたパッケージに対象を絞ることもできます。例えば、アンインストールされたパッケージのキャッシュを全て削除するには:

# paccache -ruk0

その他のオプションは paccache -h を見てください。

また、Pacman にも、パッケージキャッシュと、/etc/pacman.conf 設定ファイルにもはや存在しないリポジトリの残留データベースファイルをクリーンアップする組み込みコマンドが存在します。しかし、pacman では、パッケージキャッシュのバージョンをいくつ残すか指定することができないため、paccache のデフォルトオプションよりも強引です。

現在インストールされていないパッケージのキャッシュと、未使用の同期データベースをを全て削除するには:

# pacman -Sc

全てのキャッシュファイルを削除するには、c スイッチを2度使用してください。これは最も強引なアプローチであり、キャッシュディレクトリには何も残りません:

# pacman -Scc
警告: ディスクの空き容量がどうしても必要でない限り、インストール済みパッケージとアンインストール済みパッケージのキャッシュを全て削除することは避けるべきです。さもないと、パッケージをダウングレードしたり再インストールしたりするためにファイルを再ダウンロードしなければならなくなってしまいます。

さらに、キャッシュをクリーンアップするツールとして pkgcachecleanAURpacleanerAUR もあります。

その他のコマンド

パッケージをダウンロードするが、インストールはしない:

# pacman -Sw パッケージ名

リモートリポジトリ以外の'ローカル'のパッケージをインストールする (例えば、AUR のパッケージ):

# pacman -U /path/to/package/package_name-version.pkg.tar.zst

ローカルパッケージのコピーを pacman のキャッシュに保持するには:

# pacman -U file:///path/to/package/package_name-version.pkg.tar.zst

(pacman の設定ファイルに記述されているリポジトリ以外の) 'リモート'パッケージをインストールする:

# pacman -U http://www.example.com/repo/example.pkg.tar.zst

ドライラン

Pacman は、インストールされるパッケージと削除されるパッケージを一覧表示して、操作を行う前にユーザに許可を求めます。

--print (短いバージョンは -p) を使用することで、-S-U-R のアクションを行わずに、パッケージの一覧を処理可能な形式で表示できます。

--print-format を追加すれば、このリストを様々な形にフォーマットできます。例えば、--print-format %n は、パッケージのバージョン無しでパッケージの一覧を表示します。

インストール理由

pacman データベースでは、インストールしたパッケージはインストール理由によって2つのグループに分別されます:

  • 明示的にインストール: pacman-S-U コマンドによって文字通り指定されたパッケージ。
  • 依存パッケージ: pacman のインストールコマンドにパッケージの名前は指定されず、明示的にインストールした他のパッケージから必要とされたためにインストールされたパッケージ。

パッケージのインストール時、以下のようにすることでインストール理由を依存パッケージに強制的に変えることができます:

# pacman -S --asdeps パッケージ名

明示的にインストールしたパッケージが、必須でない機能のための任意の依存パッケージを提供している場合があります。大抵、このコマンドはそのようなパッケージをインストールするために使用されます。

ヒント: 任意の依存パッケージを --asdeps でインストールすると、孤立したパッケージを削除するときに pacman によって任意の依存パッケージも削除されるようになります。

パッケージのインストールを行っても、デフォルトではインストール理由は変更されません。

明示的にインストールしたパッケージのリストは pacman -Qe で表示でき、依存パッケージのリストは pacman -Qd で表示できます。

既にインストールしたパッケージのインストール理由を変更したい場合、以下のコマンドを実行してください:

# pacman -D --asdeps パッケージ名

Use --asexplicit to do the opposite operation.

ノート: pacman -Syu パッケージ名 --asdeps のように、アップグレードをするときに --asdeps--asexplicit オプションを使用するのは推奨されません。インストールされるパッケージだけでなく、アップグレードされるパッケージのインストール理由まで変更されてしまうためです。

特定のファイルが含まれているパッケージを検索

ファイルデータベースを同期してください:

# pacman -Fy

ファイルが含まれているパッケージを検索するには:

$ pacman -F pacman
core/pacman 5.2.1-1 (base base-devel) [installed]
    usr/bin/pacman
    usr/share/bash-completion/completions/pacman
extra/xscreensaver 5.43-1
    usr/lib/xscreensaver/pacman
ヒント: pacman-filesdb-refresh.timer (pacman-contrib パッケージに同梱されています) を起動/有効化すれば、ファイルデータベースを週ごとにリフレッシュできます。

高度な使い方をしたい場合、全てのファイルと関連するパッケージのデータベースを使用する pkgfile をインストールしてください。

パッケージのインストール/アップグレード/アンインストール時に起こること

成功時のトランザクションは、5つのステップと、トランザクション前と後のフックで構成されます:

  1. データベースがロックされていない場合、トランザクションを初期化する。
  2. トランザクション中に追加/削除すべきパッケージを選択する。
  3. 同期データベース、パッケージ、及びパッケージ間の依存関係のサニティチェックを行い、コマンドラインフラグに基づいてトランザクションの準備をする。
  4. トランザクションを実行する:
    1. 必要に応じてパッケージをダウンロードする (_alpm_sync_load)
    2. pacman の既存の PreTransaction フックが適用される場合、それらのフックを実行する。
    3. 最終的に置き換えられるパッケージ、衝突するパッケージ、明示的に削除するように指定されたパッケージを削除する。
    4. 追加するべきパッケージが存在する場合、各パッケージに対して以下を実行する:
      1. パッケージにインストールスクリプトが存在する場合、そのスクリプトの pre_install 関数を実行する (アップグレードする場合は pre_upgrade が、削除される場合は pre_remove が代わりに実行されます)。
      2. 以前のバージョンのパッケージのファイルを全て削除する (パッケージをアップグレードまたは削除する場合)。ただし、パッケージによって設定ファイルであると指定されたファイルに関しては、削除しない (pacman/Pacnew と Pacsave を参照)。
      3. パッケージを解凍し、含まれているファイルをファイルシステムに保存する (パッケージをインストールまたはアップグレードする場合)。新しいパッケージのファイルが、ファイルシステム上の手動で変更された設定ファイル (前のステップを参照) を上書きしてしまう場合、パッケージ側のファイルに別の名前 (.pacnew) を付けて保存する。
      4. パッケージにインストールスクリプトが存在する場合、post_install 関数を実行する (アップグレードする場合は post_upgrade が、削除される場合は post_remove が代わりに実行されます)。
    5. トランザクションの終わりの時点で存在している PostTransaction フックが適用される場合、それらのフックを実行する。
  5. トランザクション及びトランザクションリソース (つまり、データベースロック) を解放する。

設定

Pacman の設定は /etc/pacman.conf に記述します。ここで、pacman がどのように動作するかを設定することができます。この設定ファイルに関するより詳しい情報は pacman.conf(5) にあります。

全般設定

全般的な設定は [options] セクションにあります。ここで設定できる項目については pacman.conf(5) を読むか、デフォルトの pacman.conf ファイルを見てください。

アップデートする前にバージョンを比較

利用可能なパッケージの新旧のバージョンを確認したい場合、/etc/pacman.conf の "VerbosePkgLists" という行をアンコメントしてください。pacman -Syu の出力が以下のようになります:

パッケージ (6)          古いバージョン  新しいバージョン  最終的な変化 ダウンロード容量

extra/libmariadbclient  10.1.9-4        10.1.10-1             0.03 MiB         4.35 MiB
extra/libpng            1.6.19-1        1.6.20-1              0.00 MiB         0.23 MiB
extra/mariadb           10.1.9-4        10.1.10-1             0.26 MiB        13.80 MiB

並列ダウンロードを有効にする

Pacman 6.0 から、パッケージを同時にダウンロードするオプションが導入されました。この機能を使用するには、/etc/pacman.conf 内の [options] セクションにある ParallelDownloads オプションを正の整数 (例えば 5) に設定する必要があります。このオプションが設定されていない場合、パッケージは一つずつ順番にダウンロードされます。

アップグレードさせないパッケージを設定

警告: 部分的なアップグレードはサポートされていないので、パッケージのアップグレードをスキップする際は気をつけてください。。

システムをアップグレードする際に特定のパッケージをアップグレードシないようにするには、[options] セクションに以下の行を追加してください:

IgnorePkg=linux

複数のパッケージを指定する場合は、スペースで区切るか、IgnorePkg 行を追加してください。また、グロブパターンも使用できます。一度に限ってパッケージをアップグレードしないようにするには、コマンドラインで --ignore オプションを使用してください (複数のパッケージを指定する場合は、コンマで区切ってください)。

pacman -S を使えば、依然として対象のパッケージをアップグレードすることが可能です。この場合、pacman はパッケージが IgnorePkg 文に含まれていることを知らせてくれます。

アップグレードさせないパッケージグループを設定

警告: 部分的なアップグレードはサポートされていないので、パッケージグループのアップグレードをスキップする際は気をつけてください。。

パッケージの場合と同様に、アップグレードさせないパッケージグループを指定することもできます:

IgnoreGroup=gnome

アップグレードさせないファイルを設定

NoUpgrade ディレクティブで指定されたファイルは、パッケージのインストール/アップグレードの際に変更を加えられなくなり、代わりに新しいファイルは .pacnew 拡張子が付けられてインストールされます。

NoUpgrade=path/to/file

以下のようにして複数のファイルを指定することができます:

NoUpgrade=path/to/file1 path/to/file2
ノート: パスはパッケージアーカイブ内のファイルを示します。なので、一番最初にスラッシュを置かないでください。

インストールさせないファイルを設定

特定のディレクトリをインストールさせないようにするには、NoExtract リストにそのディレクトリを加えてください。例えば、systemd ユニットをインストールさせないようにするには:

NoExtract=usr/lib/systemd/system/*

後ろのルールは前のルールを上書きします。また、! を前に付けることでルールを無効化できます。

ヒント: Pacman は、localepurgebleachbit によってロケールが削除されたパッケージをアップデートする際に、ロケールが存在しないという警告メッセージを表示します。警告を表示しないようにするには、pacman.confCheckSpace オプションをコメントアウトしてください。ただし、容量チェックの機能が全てのパッケージで無効化されることに注意してください。

複数の設定ファイルを使用

設定ファイルが複数あって (メインの設定と testing リポジトリを有効にした設定がある場合など)、設定ファイルのオプションを共有したい場合、設定ファイルで Include オプションを宣言することができます。例:

Include = /path/to/common/settings

/path/to/common/settings は共有したいオプションが存在するファイルに置き換えてください。

フック

Pacman は /usr/share/libalpm/hooks/ ディレクトリ内に存在するフックをトランザクションの前後に実行することができます。その他のフックディレクトリを指定したい場合は、pacman.conf 内で HookDir オプションを使ってください (デフォルトは /etc/pacman.d/hooks です)。フックファイルの名前には必ず .hook を後ろに付ける必要があります。Pacman フックはインタラクティブではありません。

Pacman フックは様々なことに使われています。例えば、systemd-sysuserssystemd-tmpfiles を組み合わせてパッケージのインストール時に自動的にシステムユーザーを作成します。例として tomcat8 パッケージでは tomcat8 という名前のシステムユーザーが必要だと指定されており、特定のディレクトリの所有者がこのユーザーになるように設定されています。pacman フックの systemd-sysusers.hooksystemd-tmpfiles.hook は、tomcat8 にユーザが指定されているファイルと一時ファイルが存在していることを認識し、systemd-sysuserssystemd-tmpfiles を実行します。

alpm のフックに関する詳細は alpm-hooks(5) を参照してください。

リポジトリとミラー

特殊な [options] セクションを除いて、pacman.conf 内の他の [セクション] には、使用するパッケージリポジトリを定義します。リポジトリとはパッケージの論理的な集合であり、それらのパッケージは1つ以上のサーバに物理的に保存されています。このような理由から、各サーバはリポジトリのミラーと呼ばれます。

リポジトリは公式非公式に分けられています。設定ファイル内でのリポジトリの順番は重要です。2つのリポジトリに同じ名前のパッケージが存在する場合、それらのバージョン番号に関わらず、設定ファイル内で最初に来るリポジトリが、その後に来るリポジトリよりも優先されます。リポジトリを使用するには、そのリポジトリを追加した後に、まずシステム全体をアップグレードする必要があります。

各リポジトリセクションではミラーのリストを定義します: ミラーのリストを直接記述することもできますし、Include ディレクティブを使って外部の専用のファイルを使うこともできます。例えば、公式リポジトリのミラーは /etc/pacman.d/mirrorlist からインクルードされます。ミラーの設定については記事 ミラー を参照してください。

パッケージのキャッシュディレクトリ

Pacman は、ダウンロードしたパッケージファイルをキャッシュに保存します。キャッシュは、pacman.conf[options] セクション内の CacheDir で示されるディレクトリ内です (設定されていない場合、/var/cache/pacman/pkg/ がデフォルトで使用されます)。

キャッシュディレクトリは、(たとえ、インストールされているパッケージの最新のバージョンのみを保持しているとしても) 時間とともに肥大化する場合があります。

キャッシュディレクトリを他のより好都合な場所に移動したい場合は、以下のどれかを行ってください:

  • pacman.conf 内の CacheDir オプションで新しいディレクトリを設定する。末尾のスラッシュを残しておくことを忘れないでください。これが推奨される方法です
  • /var/cache/pacman/pkg/ に専用のパーティションや Btrfs サブボリュームをマウントする。
  • 選択したディレクトリを /var/cache/pacman/pkg/ でバインドマウントする。
警告: /var/cache/pacman/pkg/ ディレクトリを他の場所へのシンボリックリンクにしないでください。Pacman の誤動作の原因になります。特に、pacman が自分自身をアップデートしようとしている場合です。

パッケージのセキュリティ

Pacman はパッケージの署名をサポートしていて、パッケージにセキュリティレイヤーを加えています。デフォルトの設定では SigLevel = Required DatabaseOptional によって全てのリポジトリで全てのパッケージの署名検証が有効にされています。リポジトリ毎に SigLevel を使うことでこの設定を上書きすることができます。パッケージに署名する方法や署名の検証について詳しくは、pacman-key を見てください。

トラブルシューティング

"Failed to commit transaction (conflicting files)" エラー

次のエラーが表示される場合: [1]

エラー: 処理を完了できませんでした (衝突しているファイル)
package: /path/to/file がファイルシステムに存在しています
エラーが発生したため、パッケージは更新されませんでした。

これは、pacman がファイルの衝突を検出し、仕様によりファイルを上書きしないために発生します。これは仕様によるものであり、欠陥ではありません。

通常、この問題の解決法は自明です (とはいえ、なぜこれらのファイルがそこに存在しているのかを念の為に調べてみるべきでしょう)。まず、他のパッケージがそのファイルを所有していないか調べるのが安全です (pacman -Qo /path/to/file)。そのファイルが他のパッケージによって所有されている場合、バグレポートを提出してください。そのファイルが他のパッケージのよって所有されていない場合、"ファイルシステムに存在している"方のファイルの名称を変更し、アップデートのコマンドを再度実行してください。問題がなければ、そのファイルは削除しても良いです。

何らかのプログラムを pacman を使用せずに (例えば make install などで) 手動でインストールしている場合、プログラム自体とそのプログラムに属するファイルを全て削除しなければなりません。pacman/ヒントとテクニック#どのパッケージにも所有されていないファイルを特定する も参照してください。

インストールされたパッケージは、そのパッケージに関するメタデータを含む /var/lib/pacman/local/package-version/files ファイルを提供します。このファイルが破損している、空である、または存在しない場合、パッケージの更新時に file exists in filesystem エラーが発生します。そのようなエラーは通常、1つのパッケージだけが原因です。原因のパッケージに属するファイルの名前を変えて後で削除する代わりに、pacman -S --overwrite glob package を実行して glob にマッチするファイルを上書きすることもできます。

警告: 通常、--overwrite スイッチの使用は避けてください。システムメンテナンス#特定の pacman コマンドを避けてください を参照してください。

"Failed to commit transaction (invalid or corrupted package)" エラー

/var/cache/pacman/pkg/ から .part ファイル (部分的にダウンロードされたパッケージ) を探し、そのファイルを削除してください (これは、pacman.conf でカスタムの XferCommand を使用した場合に起こりやすいです):

# find /var/cache/pacman/pkg/ -iname "*.part" -delete

また、archlinux-keyring が古く、pacman が署名を検証できない場合にも、このエラーが発生することがあります。この問題を解決方法と防止方法は pacman/パッケージの署名#システムの定期的な更新 を参照してください。

"Failed to init transaction (unable to lock database)" エラー

pacman がパッケージデータベースを変更する際に (パッケージのインストール時など)、pacman はロックファイル /var/lib/pacman/db.lck を作成します。これにより、複数の pacman インスタンスが同時にパッケージデータベースを変更してしまうことを防ぎます。

pacman がデータベースの変更中に中断されてしまった場合、古いロックファイルが残ってしまう可能性があります。pacman インスタンスが実行中でないことが確実である場合は、ロックファイルを削除してください:

# rm /var/lib/pacman/db.lck
ヒント: fuser /var/lib/pacman/db.lck を root として実行すれば、ロックファイルを使用しているプロセスが存在するか調べることができます。

インストール時にパッケージを取得できない

具体的には次のようなエラーです: Not found in sync db対象が見つかりませんでしたファイルの取得に失敗しました

まず、パッケージが実際に存在することを確認してください。パッケージが存在することが確実であるならば、パッケージデータベースが古いのかもしれません。pacman -Syu を実行して、パッケージデータベースを更新してシステムをアップグレードしてみてください。また、ミラーが最新であり、リポジトリが正しく設定されていることも確認してください。

また、インストールしたいパッケージが含まれているリポジトリがシステムで有効化されていない可能性もあります。例えば、パッケージが multilib リポジトリにあるが、pacman.confmultilib が有効化されていない場合、このエラーが発生します。

FAQ#公式リポジトリにある共用ライブラリはそれぞれどうして一つのバージョンしか用意されてないんですか? も参照してください。

アップグレード中に pacman がクラッシュしてしまった

pacman が "database write" (データベース書き込み) エラーが発生してクラッシュし、その後、パッケージのアンインストール/再インストール/アップグレードができなくなってしまった場合、以下を行ってください:

  1. Arch Linux のインストールメディアを起動してください。システム上の pacman と同じバージョンかより新しいものを使うために、最近のメディアを使うことが望ましいです。
  2. システムのルートファイルシステムをマウントしてください (例えば、mount /dev/sdaX /mnt を root として実行してください)。そして、df -h を実行してファイルシステムに十分な空き領域が存在することを確認してください。
  3. ファイルシステム proc、sys、dev もマウントしてください: mount -t proc proc /mnt/proc; mount --rbind /sys /mnt/sys; mount --rbind /dev /mnt/dev
  4. システムにおいてデータベースの場所とディレクトリの場所がデフォルトである場合、pacman --sysroot /mnt -Syu を root として実行すればシステムの pacman データベースを更新してシステムをアップグレードすることができます。
  5. アップグレードしたら、アップグレードされていない壊れているパッケージがないかチェックしてください: find /mnt/usr/lib -size 0
  6. そのようなパッケージが依然として存在する場合は、そのパッケージを再インストールしてください: pacman --sysroot /mnt -S package

pacman: command not found

/var/cache/pacman/pkg がシンボリックリンクである場合、pacman は自己アップデート時に同じディレクトリを作成しようとするため、このシンボリックリンクは削除されます。これにより、アップデートが失敗します。その結果、/usr/bin/pacmanpacman パッケージに含まれる他のコンテンツが消えてしまいます (訳注: #パッケージのインストール/アップグレード/アンインストール時に起こること の 4.2 を参照)。

/var/cache/pacman/pkgpacman によって管理されているため、シンボリックリンクにしないでください。代わりに CacheDir オプションを使うか、このディレクトリをバインドマウントしてください (#パッケージのキャッシュディレクトリ を参照)。

この問題が既に発生していて、システムが壊れてしまっている場合、pacman パッケージに含まれる /usr 内のコンテンツを手動で展開して pacman を復元し、その後、適切に pacman を再インストールしてください。詳細は FS#73306関連するフォーラムのスレッドを参照してください。

Pacman の手動再インストール

pacman-static を使う

pacman-staticAURpacman を静的にコンパイルしたものなので、システム上のライブラリが機能していなくても実行できます。これは、部分的なアップグレードによって pacman が実行できなくなってしまった場合にも便利です。

pacman-staticAUR パッケージのページにある固定コメントと PKGBUILD には、バイナリを直接ダウンロードする方法が記されています。pacman を再インストールしたり、部分的なアップグレードが起こった際にシステム全体をアップグレードしたりする際にこの方法が使えます。

外部の pacman を使う

pacman-static でさえも動作しない場合は、外部の pacman を使用してリカバリできます。最も簡単な方法の一つは、archiso を使い、--sysroot--root でマウントポイントを指定することです。--sysroot に必要なファイルシステムをマウントする方法については、Chroot#chroot を使う を参照してください。

手動で抽出する

警告: この方法では、一歩間違うとシステムの状態をさらに悪化させてしまいます。#アップグレード中に pacman がクラッシュしてしまった に書かれてある方法を使えない場合の最後の手段としてのみ、以下を行ってください。

pacman がどうしようもなく破壊されたとしても、最新のパッケージを手動でダウンロードして適切な場所に展開することで修復が可能です。以下のような手順で行います:

  1. インストールすべき pacman の依存関係を調べる。
  2. それぞれの依存パッケージをミラーからダウンロードする。
  3. 各パッケージをルートディレクトリに展開する。
  4. pacman -S --overwrite を実行してパッケージデータベースを更新することで、パッケージを再インストールする。
  5. システムの完全なアップグレードを行う。

正常に動作している Arch システムがあれば、以下のコマンドで pacman の依存関係リストを見ることができます:

$ pacman -Q $(pactree -u pacman)

しかし、発生している問題によっては、それらの依存パッケージのうち数個だけをアップデートすれば良い場合もあります。パッケージは以下のようにして展開します:

# tar -xvpwf package.tar.zst -C / --exclude .PKGINFO --exclude .INSTALL --exclude .MTREE --exclude .BUILDINFO

注意点として、w フラグを使用してインタラクティブモードにしてください。非インタラクティブモードでは、重要なファイルが問答無用で上書きされてしまうかもしれないので、非常に危険です。また、パッケージを展開する順番には注意を払ってください (つまり、依存パッケージを先に展開してください)。このフォーラムの投稿には、pacman のいくつかの依存関係だけが壊れてしまった場合のこの手順の例が書かれてあります。

再起動後に "Unable to find root device" エラー

カーネルの更新中に initramfs が破損してしまった可能性が高いです (pacman--overwrite オプションを不適切に使用すると、起こることがあります)。この状況から抜け出す方法は2つあります。1つ目は、fallback エントリです。

ヒント: Fallback エントリを削除してしまった場合、ブートローダのパラメータを変えれば Fallback イメージを起動できます。ブートローダのメニューが表示されたときに、Syslinux の場合は Tab を、GRUB と systemd-boot の場合は e を押してエントリの編集画面を開き、initramfs イメージ名を initramfs-linux-fallback.img に変更して Enterb (キーはブートローダーに依ります) を押してください。

システムが起動したら、コンソールかターミナルから以下のコマンドを実行して initramfs イメージを再ビルドしてください (以下のコマンドは標準の linux カーネルの場合です):

# mkinitcpio -p linux

これでうまく行かなかった場合、最新の Arch リリース (CD/DVD あるいは USB スティック) を起動し、ルートパーティションとブートパーティションをそれぞれ /mnt/mnt/bootマウントしてください。そして、arch-chroot を使ってルートパーティションに chroot してください:

# arch-chroot /mnt
# pacman -Syu mkinitcpio systemd linux
ノート:
  • 最新の Arch リリースを持っていない場合や、Arch 以外の "ライブ" Linux ディストリビューションしかない場合、昔ながらの方法で chroot することができます。当然、arch-chroot スクリプトを実行する場合よりも、たくさん入力しなければなりません。
  • pacmanCould not resolve host というエラーで失敗してしまう場合、インターネット接続を確認してください
  • パッケージを再インストールする必要があるが、arch-chroot や chroot の環境に入れない場合、コマンド pacman --sysroot /mnt -Syu foo bar を使えば、別のルートパーティションから pacman を使うことができます。

カーネル (linux パッケージ) を再インストールすれば、mkinitcpio -p linux が実行されて initramfs イメージが再生成されます。イメージの再生成を別途行う必要はありません。

その後、exitumount /mnt/{boot,} 、そして reboot を実行することが推奨されます。

"Warning: current locale is invalid; using default "C" locale" エラー

このエラーメッセージが言っている通り、ロケールが正しく設定されていません。ロケールの記事を参照してください。

Pacman がプロキシの設定に従わない

関連する環境変数 ($http_proxy$ftp_proxy など) が設定されていることを確認してください。pacmansudo で実行する場合、環境変数を pacman に渡すように sudo を設定する必要があります。また、dirmngr の設定ファイル /etc/pacman.d/gnupg/dirmngr.conf で、鍵をリフレッシュする際にプロキシの設定に従うようにする honor-http-proxy オプションが存在していることも確認してください。

パッケージが明示的にインストールされたか依存関係としてインストールされたかの情報を保持しつつ、全パッケージを再インストールするには?

ネイティブなパッケージ (つまり、同期データベース内に存在するパッケージ) を全て再インストールするには、pacman -Qnq | pacman -S -pacman -S $(pacman -Qnq) を実行してください (-S オプションはデフォルトでインストール理由を維持します)。

次に、外部のパッケージを全て再インストールする必要があります。これらのパッケージの一覧は pacman -Qmq で得られます。

"Cannot open shared object file" エラー

どうやら、以前の pacman トランザクションで、pacman 自体が必要とする共有ライブラリが削除されたか破損したようです。

この問題を解決するには、必要なライブラリをファイルシステム上に手動で展開する必要があります。まず、必要なライブラリを含むパッケージを調べ、pacman キャッシュ (/var/cache/pacman/pkg/) からそのパッケージを見つけてください。そして、その共有ライブラリをファイルシステム上へ展開してください。これで pacman が実行できるようになりました。

その後、壊れたパッケージを再インストールする必要があります。注意点として、システムファイルがファイルシステム上に展開されたことを pacman は知らないため、--overwrite フラグを使用する必要があります。Pacman は、先程の共有ライブラリファイルをパッケージのものに適切に置き換えてくれます。

やるべきことは以上です。あとはシステムの残りも更新してください。

パッケージのダウンロード時にフリーズする

pacman がリポジトリのアップデートや同期をできないというネットワークの問題がいくつか報告されています [2] [3]。Arch Linux のインストール時にこの問題が発生する場合、pacman のデフォルトのファイルダウンローダを置き換えることで解決します (詳しくは pacman のパフォーマンスの向上を参照)。VirtualBox で Arch Linux をゲスト OS としてインストールする時にこの問題が起こる場合、マシンのプロパティで NAT の代わりに Host interface を使うことで解決します。

Failed retrieving file 'core.db' from mirror

ミラーを正しく設定しているにも関わらずこのエラーが発生する場合、別のネームサーバーを設定してみてください。

error: 'local-package.pkg.tar': permission denied

pacman -U を使用して sshfs のマウントポイント上にパッケージをインストールしようとしてこのエラーが発生する場合、インストールしたいパッケージをローカルのディレクトリに移動し、もう一度インストールしてみてください。

error: could not determine cachedir mount point /var/cache/pacman/pkg

Chroot 環境内で pacman -Syu などを実行した際に以下のエラーが発生する場合:

エラー: キャッシュディレクトリ /var/cache/pacman/pkg のマウントポイントを決定できませんでした
エラー: 処理を完了できませんでした (空き容量が足りません)

このエラーのよくある原因は、chroot したディレクトリがマウントポイントでないことです。解決策は、既存の Linux からインストール#基本ツールをダウンロード に書かれてあるノートを見てください。また、arch-chroot(8) には、バインとマウントを使って chroot ディレクトリをマウントポイント化する方法について例と共に説明されています。

error: GPGME error: No data

パッケージを更新できず、このエラーが発生する場合は、更新する前に rm -r /var/lib/pacman/sync/ を実行してみてください。

Sync ファイルを削除しても問題が解決しない場合は、更新する前に file /var/lib/pacman/sync/* を実行して sync ファイルが gzip compressed data であることを確認してください。ルーターかプロキシが、ダウンロードしたデータを破損させているのかもしれません。

Sync ファイルが正しい種類であった場合、ミラーサーバー側に問題があるのかもしれません。pacman-conf -r corepacman-conf -r extra でミラーサーバーを確認してください。表示された URL の一番最初のものをブラうさの URL 欄にペーストし、ファイルの一覧が表示されるか確かめてください。ミラーがエラーを返した場合、/etc/pacman.d/mirrorlist 内のそのミラーをコメントアウトしてください。

参照

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