「Pacman」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎使い方: "パッケージのインストール/アップグレード/アンインストール時に起こること" を追加)
340行目: 340行目:
 
{{Note|{{ic|pacman -Syu ''package_name'' --asdeps}} のように、アップグレードをするときに {{ic|--asdeps}} や {{ic|--asexplicit}} オプションを使用するのは推奨されません。インストールされるパッケージだけでなく、アップグレードされるパッケージのインストール理由まで変更されてしまうためです。}}
 
{{Note|{{ic|pacman -Syu ''package_name'' --asdeps}} のように、アップグレードをするときに {{ic|--asdeps}} や {{ic|--asexplicit}} オプションを使用するのは推奨されません。インストールされるパッケージだけでなく、アップグレードされるパッケージのインストール理由まで変更されてしまうためです。}}
   
===特定のファイルが含まれているパッケージを検索===
+
=== 特定のファイルが含まれているパッケージを検索 ===
   
 
ファイルデータベースを同期してください:
 
ファイルデータベースを同期してください:
348行目: 348行目:
 
ファイルが含まれているパッケージを検索するには:
 
ファイルが含まれているパッケージを検索するには:
   
$ pacman -Fs pacman
+
{{hc|$ pacman -F pacman|
core/pacman 5.0.1-4
+
core/pacman 5.2.1-1 (base base-devel) [installed]
usr/bin/pacman
+
usr/bin/pacman
usr/share/bash-completion/completions/pacman
+
usr/share/bash-completion/completions/pacman
extra/xscreensaver 5.36-1
+
extra/xscreensaver 5.43-1
usr/lib/xscreensaver/pacman
+
usr/lib/xscreensaver/pacman
  +
}}
   
{{Tip|[[cron]] ジョブや [[systemd/タイマー|systemd タイマー]]を設定してファイルデータベースを定期的同期させることができます。}}
+
{{Tip|{{ic|pacman-filesdb-refresh.timer}} [[起動/有効化]]すれば、ファイルデータベースを週ごとリフレッシュできます。}}
   
 
高度な使い方をしたい場合、全てのファイルと関連するパッケージのデータベースを使用する [[pkgfile]] をインストールしてください。
 
高度な使い方をしたい場合、全てのファイルと関連するパッケージのデータベースを使用する [[pkgfile]] をインストールしてください。

2023年10月18日 (水) 16:34時点における版

関連記事

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

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

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

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

# pacman -D --asdeps package_name

インストール理由を「明示的にインストール」に変えたいときは --asexplicit を使ってください。

ノート: pacman -Syu package_name --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起動/有効化すれば、ファイルデータベースを週ごとにリフレッシュできます。

高度な使い方をしたい場合、全てのファイルと関連するパッケージのデータベースを使用する 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 を参照してください。

カラー出力

コンソールのカラー出力#pacman を見てください。

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

pacman 6.0 はパッケージを同時にダウンロードするオプションを導入しました。この機能を使用するには、/etc/pacman.confParallelDownloads を正の整数に (例:5) など設定する必要があります。このオプションが設定されていない場合、パッケージは順番にダウンロードされます。

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

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

Package (6)             Old Version  New Version  Net Change  Download Size

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

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

ある特定のパッケージをアップデートさせないようにするには:

IgnorePkg=linux

複数のパッケージを記述するときはスペースで区切るか、IgnorePkg 行を追加してください。

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

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

IgnoreGroup=gnome

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

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

NoUpgrade=path/to/file
ノート: パスはパッケージ内のファイルを参照します。したがって、一番最初のスラッシュは必要ありません。

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

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

NoExtract=usr/lib/systemd/system/*

もしくは localepurgeAUR と同じように、英語以外のローカライゼーションのインストールを止めるには:

NoExtract = usr/share/help/* !usr/share/help/en*
NoExtract = usr/share/locale/* !usr/share/locale/en* !usr/share/locale/locale.alias
NoExtract = usr/share/man/* !usr/share/man/man*
NoExtract = usr/share/vim/vim74/lang/*

後ろのルールは前のルールを上書きします。また、! でルールを打ち消すことで、必要なロケールだけを維持できます。

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

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

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

Include = /path/to/common/settings

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

フック

pacman/usr/share/libalpm/hooks/ ディレクトリのフックを処理の前後に実行することができます。さらに pacman.confHookDir オプションでフックディレクトリを指定できます (デフォルトは /etc/pacman.d/hooks です)。フックファイルの名前には必ず .hook を後ろに付ける必要があります。

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

alpm のフックに関する詳細は alpm-hooks(5) の man ページを参照。

リポジトリとミラー

特殊な [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]

error: could not prepare transaction
error: failed to commit transaction (conflicting files)
package: /path/to/file exists in filesystem
Errors occurred, no packages were upgraded.

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

これらのファイルをインストールするために pip などの別のパッケージマネージャーを使用していないことがわかっている場合、通常、問題は簡単に解決できます (ただし、確実にするには、これらのファイルが最初にどのようにしてそこに到達したかを調べる必要があります) 安全な方法は、最初に別のパッケージがファイルを所有しているかどうかを確認することです (pacman -Qo /path/to/file) ファイルが別のパッケージによって所有されている場合は、バグレポートを提出 ファイルが別のパッケージによって所有されていない場合は、ファイルシステムに存在する ファイルの名前を変更し、更新コマンドを再発行します。すべてがうまくいけば、ファイルは削除される可能性があります。重要なのは、pip のような別のパッケージマネージャーがこのファイルを所有している可能性がある場合は、これを実行しないでください。この pacman トランザクションは成功するかもしれませんが、他のパッケージマネージャーで問題を複雑にします。

ただし、pacman を使用せずに、たとえば make install、pip などを使用してプログラムを手動でインストールした場合は、このプログラムとそのすべてのファイルを削除またはアンインストールする必要があります。Pacman ヒント#ファイルがどのパッケージにも含まれていないことを確認 も参照してください。

インストールされたすべてのパッケージには、このパッケージに関するメタデータを含む /var/lib/pacman/local/package-version/files ファイルが提供されます。このファイルが破損しているか、空であるか、行方不明になっている場合、パッケージを更新しようとすると、ファイルがファイルシステムに存在します エラーが発生します。このようなエラーは通常、1 つのパッケージのみに関係します。手動で名前を変更し、後で問題のパッケージに属するすべてのファイルを削除する代わりに、明示的に pacman -S --overwrite glob package を実行して、pacmanglob に一致するファイルを強制的に上書きさせることができます。

警告: 通常、--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 は、パッケージのインストールなど、パッケージデータベースを変更しようとしているときに、/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 dbTarget not found、または Failed retrieving file として現れます。

まず、パッケージが実際に存在することを確認します。パッケージが存在することが確実な場合は、パッケージリストが最新でない可能性があります。 pacman -Syu を実行して、すべてのパッケージリストを強制的に更新してアップグレードしてみてください。また、選択した ミラー が最新であり、リポジトリ が正しく構成されていることも確認してください。

また、パッケージを含むリポジトリがシステム上で有効になっていない可能性もあります。たとえば、パッケージは multilib リポジトリにある可能性がありますが、multilibpacman.conf で有効になっていません。

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

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

パッケージの削除・再インストール・アップグレード中に "database write" エラーを残して pacman がクラッシュする場合:

  1. Arch インストールメディアを使って起動してください。
  2. root でルートファイルシステムをマウントします (mount /dev/sdaX /mnt)。df -h で十分な空き容量があることを確認してください。
  3. proc, sys, dev ファイルシステムもマウントしてください: mount -t proc proc /mnt/proc; mount --rbind /sys /mnt/sys; mount --rbind /dev /mnt/dev
  4. システムがデフォルトのデータベースとディレクトリの場所を使っている場合、root で pacman --root=/mnt --cachedir=/mnt/var/cache/pacman/pkg -Syyu を実行することでシステムの "pacman" データベースを更新してアップグレードすることができます。
  5. アップグレード後、アップグレードがないことと壊れているパッケージを確認してください: find /mnt/usr/lib -size 0
  6. pacman --root /mnt --cachedir=/mnt/var/cache/pacman/pkg -S package で壊れているパッケージを再インストールしてください。

pacman: command not found

pacmanのキャッシュディレクトリをシンボリックリンクしてはいけません。 代わりに別のキャッシュディレクトリを構成するか、バインドマウントを使用してください。 [2]

pacman の手動再インストール

pacman-static を使用

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

固定コメントと PKGBUILD は、バイナリを直接ダウンロードする方法を提供し、 pacman を再インストールしたり、部分的なアップグレードの場合にシステム全体をアップグレードしたりするために使用できます。

外部の pacman を使用する

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

手動で抽出する

警告: 以下の方法でシステムをさらに再起不能にまで壊してしまう可能性があります。#アップグレード中に Pacman がクラッシュしましたに書かれている方法で直らない場合の最後の手段として使ってください。

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

  1. インストールするパッケージを確認
  2. 適当なミラーからパッケージをそれぞれダウンロード
  3. パッケージをルートディレクトリに展開
  4. pacman -S --force でパッケージを再インストールしてパッケージデータベースを更新
  5. フルシステムアップグレードを実行

問題なく動く Arch 環境があるのであれば、以下のコマンドで依存パッケージのリストを確認できます:

$ pacman -Q $(pactree -u pacman)

問題によってはアップデートしなくてはならないパッケージは少数かもしれません。パッケージは以下のようにして展開します:

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

w フラグを使ってインタラクティブモードにしていることに注意してください。インタラクティブで実行しないと重要なファイルを誤って上書きしてしまう可能性があります。また、パッケージは適切な順番で展開するようにしてください。こちらのフォーラムの投稿 には pacman の一部の依存パッケージだけが壊れた時の解決方法の例が載っています。

システムをアップグレードした後、再起動すると "unable to find root device" エラーが出て起動できません

おそらく initramfs がカーネルアップデート中に破損しています(不正に --force オプションを使うと起こりえます)。2つの解決方法があります:

1. Fallback エントリを試す:

ヒント: いずれの理由でエントリを削除した場合でも、ブートローダのメニューが表示された時に Tab キー (Syslinux の場合) や e (GRUBsystemd-boot の場合) を押して、initramfs-linux-fallback.img に名前を変更して Enterb を押して(ブートローダによる)新しいパラメータを使って起動できます。

システムが起動したら、コンソールかターミナルから次のコマンド (持ち合わせの linux カーネル用)を入力して initramfs イメージを再生成します:

# mkinitcpio -p linux

2. それが機能しない場合は、現在の Arch リリース (CD/DVDまたはUSBスティック) から、ルートパーティションとブートパーティションをマウントします。次に、chroot します。

# arch-chroot /mnt
# pacman -Syu mkinitcpio systemd linux
ノート:
  • もしあなたが現在のリリースを持っていなかったり、他の "Live" Linux ディストリビューションを持っていないなら、昔ながらの方法で chroot することができます。もちろん、単に arch-chroot スクリプトを実行するよりも、より多くの入力が必要になります。
  • "pacman" が Could not resolve host で失敗した場合は、 接続の確認 をクリックしてください。
  • arch-chroot または chroot 環境に入れないが、パッケージを再インストールする必要がある場合は、ルートパーティションで "pacman" コマンド pacman--sysroot/mnt-Syu foo bar を使用できます。

カーネル (linux パッケージ) を再インストールすると、自動的に mkinitcpio-p linux で initramfsイメージが再生成されます。これを個別に行う必要はありません。

その後、exitumount/mnt/{boot,} および reboot を実行してください。

pacman を使うたびにエラーが表示されます: 'warning: current locale is invalid; using default "C" locale'

そのエラーは、あなたの locale が正しく設定されていないと言っています。ロケールを見て下さい。

pacman でプロキシ設定を使うにはどうすればいいですか?

環境変数 ($http_proxy, $ftp_proxy など) を使って下さい。sudo と一緒に Pacman を使う時は、環境変数を pacman に渡すように sudo を設定してください。

明示的にインストールしたか依存でインストールしたかの情報を保ちながら、全てのパッケージを再インストールするにはどうすればいいですか

ネイティブのパッケージを全て再インストールするには: pacman -Qnq | pacman -S - (-S オプションはデフォルトでインストールの理由を維持します)。

次に自分で作成したパッケージを全て再インストールしてください、pacman -Qmq でパッケージを確認できます。

"Cannot open shared object file" エラー

以前の pacman トランザクションにより、pacman 自体に必要な共有ライブラリが削除または破損したようです。

この状況から回復するには、必要なライブラリをファイルシステムに手動で解凍する必要があります。まず、不足しているライブラリが含まれているパッケージを見つけて、それを pacman キャッシュ (/var/cache/pacman/pkg/) 内で見つけます。必要な共有ライブラリをファイルシステムに解凍します。これにより、pacman を実行できるようになります。

ここで、壊れたパッケージを 再インストール する必要があります。システムファイルを解凍したばかりで、pacman はそれを認識しないため、--overwrite フラグを使用する必要があることに注意してください。Pacman は、共有ライブラリファイルをパッケージのファイルに正しく置き換えます。

その後、残りのシステムを更新します。

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

pacman がリポジトリのアップデートや同期をできないというネットワークの問題がいくつか報告されています [3] [4]。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 を実行すると、エラーが発生します。

error: could not determine cachedir mount point /var/cache/pacman/pkg
error: failed to commit transaction (not enough free disk space)

これは、chroot に入ったときに chroot ディレクトリがマウントポイントになっていないことが原因で発生することがよくあります。解決策については 既存の Linux からインストール#ミラーを選択して基本ツールをダウンロード のメモを参照してください。バインドマウントを使用して chroot ディレクトリをマウントポイントにする説明と例については、arch-chroot(8) を参照してください。

error: GPGME error: No data

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

参照