「Pacman」の版間の差分
(→全般設定: 同期) |
(→フック: 削除 (移動)。) |
||
460行目: | 460行目: | ||
alpm のフックに関する詳細は {{man|5|alpm-hooks}} を参照してください。 |
alpm のフックに関する詳細は {{man|5|alpm-hooks}} を参照してください。 |
||
− | |||
− | ===フック=== |
||
− | |||
− | ''pacman'' は {{ic|/usr/share/libalpm/hooks/}} ディレクトリのフックを処理の前後に実行することができます。さらに {{ic|pacman.conf}} の {{ic|HookDir}} オプションでフックディレクトリを指定できます (デフォルトは {{ic|/etc/pacman.d/hooks}} です)。フックファイルの名前には必ず ''.hook'' を後ろに付ける必要があります。 |
||
− | |||
− | Pacman フックは様々なことに使われています。例えば、{{ic|systemd-sysusers}} と {{ic|systemd-tmpfiles}} を組み合わせてパッケージのインストール時に自動的にシステムユーザーを作成します。例として {{pkg|tomcat8}} パッケージでは {{ic|tomcat8}} という名前のシステムユーザーが必要だと指定されており特定のディレクトリの所有者がこのユーザーになるように設定されています。pacman フックの {{ic|systemd-sysusers.hook}} と {{ic|systemd-tmpfiles.hook}} は {{ic|tomcat8}} パッケージにシステムユーザーと一時ファイルが含まれていることを認識して {{ic|systemd-sysusers}} と {{ic|systemd-tmpfiles}} を実行します。 |
||
− | |||
− | alpm のフックに関する詳細は {{man|5|alpm-hooks}} の man ページを参照。 |
||
=== リポジトリとミラー === |
=== リポジトリとミラー === |
2023年10月18日 (水) 17:20時点における版
関連記事
pacman パッケージマネージャは Arch Linux の主要な機能のひとつです。pacman はシンプルなバイナリのパッケージ形式と簡単に利用できるビルドシステムから成っています。pacman のゴールはパッケージ管理を楽にすることであり、公式リポジトリにあるパッケージや、ユーザー自身が作成したパッケージを容易に管理することができます。
Pacman はマスターサーバーと同期してシステムを最新に保ちます。このサーバー・クライアントモデルによって、シンプルなコマンドだけで必要な依存性を解決してパッケージのダウンロード・インストールをすることができます。
Pacman は C 言語で書かれており、パッケージングに bsdtar(1) tar フォーマットを使用します。
目次
- 1 使い方
- 2 設定
- 3 トラブルシューティング
- 3.1 "Failed to commit transaction (conflicting files)" エラー
- 3.2 "Failed to commit transaction (invalid or corrupted package)" エラー
- 3.3 "Failed to init transaction (unable to lock database)" エラー
- 3.4 インストール時にパッケージを取得できない
- 3.5 アップグレード中に Pacman がクラッシュしました
- 3.6 pacman の手動再インストール
- 3.7 システムをアップグレードした後、再起動すると "unable to find root device" エラーが出て起動できません
- 3.8 pacman を使うたびにエラーが表示されます: 'warning: current locale is invalid; using default "C" locale'
- 3.9 pacman でプロキシ設定を使うにはどうすればいいですか?
- 3.10 明示的にインストールしたか依存でインストールしたかの情報を保ちながら、全てのパッケージを再インストールするにはどうすればいいですか
- 3.11 "Cannot open shared object file" エラー
- 3.12 パッケージのダウンロード時にフリーズする
- 3.13 Failed retrieving file 'core.db' from mirror
- 3.14 error: 'local-package.pkg.tar': permission denied
- 3.15 error: could not determine cachedir mount point /var/cache/pacman/pkg
- 3.16 error: GPGME error: No data
- 4 参照
使い方
pacman で何ができるかをちゃんと学びたい場合、pacman(8) を参照してください。以下にあるのは pacman でできることのほんの一例です。
パッケージのインストール
パッケージとは、以下を含むアーカイブです:
- アプリケーションの (コンパイルされた) 全ファイル
- アプリケーションのメタデータ (アプリケーション名、バージョン、依存関係など)
- pacman によって使用されるインストールファイル及びディレクティブ
- (任意で) 開始/停止スクリプトなど、作業を用意にする追加のファイル
Arch のパッケージマネージャである pacman は、このようなパッケージをインストール、アップデート、そして削除することができます。プログラムを自分でコンパイルしてインストールする代わりにパッケージを使用することには、様々な利点があります:
- 簡単なアップデート: pacman は、アップデートが利用可能になるとすぐに既存のパッケージを更新します。
- 依存関係のチェック: pacman は依存関係を処理してくれます。あなたがすべきことは、インストールしたいプログラムを指定することだけです。pacman はそのプログラムと一緒に他の必要なプログラムもインストールします。
- 綺麗にアンインストール: pacman は、パッケージに含まれる全ファイルのリストを保持します。これにより、パッケージを削除する際に意図せずファイルが残留することはありません。
特定のパッケージのインストール
ひとつ、あるいは複数のパッケージを、依存パッケージも含めてインストールするには、以下のコマンドを実行してください:
# pacman -S パッケージ名1 パッケージ名2 ...
正規表現を使ってパッケージをインストールするには (このフォーラムスレッド を参照):
# pacman -S $(pacman -Ssq パッケージのパターン)
別々のリポジトリ (例: extra と testing) 内に同一のパッケージの複数のバージョンが存在していることがあります。この場合、パッケージ名の前にリポジトリ名を明示する必要があります。例えば extra リポジトリ内のバージョンをインストールするには:
# pacman -S extra/パッケージ名
名前に類似パターンが存在するパッケージをインストールしたい場合、波括弧を使ってパッケージ名を展開することができます。例えば:
# pacman -S plasma-{desktop,mediacenter,nm}
必要に応じて更に複雑なパターンを指定することもできます:
# pacman -S plasma-{workspace{,-wallpapers},pa}
仮想パッケージ
仮想パッケージとは、それ自体は存在していないが、1つ以上のパッケージによって provides (提供) 指定されている特殊なパッケージです。仮想パッケージが存在していることにより、あるパッケージの依存関係として複数の候補が存在している場合に、パッケージは特定のパッケージを依存関係として指定する必要がなくなります。仮想パッケージはその名前を使ってインストールすることはできません。仮想パッケージを provide (提供) するパッケージをインストールすると、その仮想パッケージがシステムにインストールされたことになります。
パッケージグループのインストール
パッケージグループに属しているパッケージをすべて同時にインストールすることができます。例えば:
# 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/ を見て下さい。
パッケージの削除
依存パッケージをすべて残したままパッケージを削除するには:
# pacman -R パッケージ名
削除したいパッケージと、そのパッケージだけが必要としている依存パッケージを一緒に削除するには:
# pacman -Rs パッケージ名
上記のコマンドは、必要とされているパッケージを含んでいるグループを削除する際に、実行を拒否する場合があります。そのような場合は、以下を試してください:
# pacman -Rsu パッケージ名
削除したいパッケージと、そのパッケージの依存パッケージ、さらに削除したいパッケージに依存しているパッケージを削除するには:
# pacman -Rsc パッケージ名
他のパッケージによって必要とされているパッケージを、必要としているパッケージを削除せずに削除するには:
# pacman -Rdd パッケージ名
Pacman は、特定のアプリケーションを削除する際に、重要な設定ファイルを削除せずに .pacsave 拡張子を付けてバックアップします。これらのバックアップファイルの作成を行わないようにするには、-n
オプションを付けてください:
# pacman -Rn パッケージ名
パッケージのアップグレード
Pacman はコマンド一つでシステム上の全パッケージをアップデートできます。この処理に掛かる時間は、システムがどれだけ新しいかによります。以下のコマンドは、リポジトリデータベースを同期し、かつ、システム内のパッケージをアップデートします (ただし、リポジトリに無い"ローカル"のパッケージを除く):
# pacman -Syu
パッケージ・データベースに問い合わせる
Pacman からローカルデータベースに問い合わせるときは -Q
フラグを、同期データベースに問い合わせるときは -S
フラグを、ファイルデータベースに問い合わせるときは -F
フラグを使います。それぞれのフラグのサブオプションについては pacman -Q --help
、pacman -S --help
、pacman -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
あるパッケージの依存関係ツリー (dependency tree) を表示するには (つまり、そのパッケージが必要としているパッケージの木):
$ pactree パッケージ名
あるパッケージの被依存ツリー (dependant tree) を表示するには (つまり、そのパッケージを必要としているパッケージの木)、逆フラグ pactree に渡すか、pkgtoolsAUR の whoneeds を使ってください。
データベースの構造
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/
に保存しますが、これらは古くなってもアンインストールされても自動的に削除されません。これにはいくつかの利点があります:
- パッケージをダウングレードする際に、他の方法 (Arch Linux Archive など) によって以前のバージョンを入手する必要がない。
- アンインストールされたパッケージをキャッシュディレクトリから簡単に直接再インストールでき、リポジトリから新しくダウンロードする必要がない。
しかし、ディレクトリのサイズが大きくなりすぎないようにするために、定期的にキャッシュを手動でクリーンアップする必要があります。
pacman-contrib パッケージで提供されている paccache(8) スクリプトは、インストール済みパッケージとアンインストール済みパッケージのキャッシュ済みバージョンを、最も新しい3つを残して全て削除します (オプションを何も指定しなかった場合):
# paccache -r
paccache.timer
を有効化し起動すれば、週に1度、未使用のパッケージキャッシュを削除してくれます。
何個の新しいバージョンのキャッシュを保持するかを指定することも可能です。最も新しいバージョン1つだけを保持するには:
# paccache -rk1
-u
/--uninstalled
スイッチを加えれば、アンインストールされたパッケージに対象を絞ることもできます。例えば、アンインストールされたパッケージのキャッシュを全て削除するには:
# paccache -ruk0
その他のオプションは paccache -h
を見てください。
また、Pacman にも、パッケージキャッシュと、/etc/pacman.conf
設定ファイルにもはや存在しないリポジトリの残留データベースファイルをクリーンアップする組み込みコマンドが存在します。しかし、pacman では、パッケージキャッシュのバージョンをいくつ残すか指定することができないため、paccache のデフォルトオプションよりも強引です。
現在インストールされていないパッケージのキャッシュと、未使用の同期データベースをを全て削除するには:
# pacman -Sc
全てのキャッシュファイルを削除するには、c
スイッチを2度使用してください。これは最も強引なアプローチであり、キャッシュディレクトリには何も残りません:
# pacman -Scc
さらに、キャッシュをクリーンアップするツールとして pkgcachecleanAUR と pacleanerAUR もあります。
その他のコマンド
パッケージをダウンロードするが、インストールはしない:
# 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 パッケージ名
明示的にインストールしたパッケージが、必須でない機能のための任意の依存パッケージを提供している場合があります。大抵、このコマンドはそのようなパッケージをインストールするために使用されます。
パッケージの再インストールを行っても、デフォルトではインストール理由は変更されません。
明示的にインストールしたパッケージのリストは pacman -Qe
で表示でき、依存パッケージのリストは pacman -Qd
で表示できます。
既にインストールしたパッケージのインストール理由を変更したい場合、以下のコマンドを実行してください:
# pacman -D --asdeps パッケージ名
Use --asexplicit
to do the opposite operation.
特定のファイルが含まれているパッケージを検索
ファイルデータベースを同期してください:
# 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
高度な使い方をしたい場合、全てのファイルと関連するパッケージのデータベースを使用する pkgfile をインストールしてください。
パッケージのインストール/アップグレード/アンインストール時に起こること
成功時のトランザクションは、5つのステップと、トランザクション前と後のフックで構成されます:
- データベースがロックされていない場合、トランザクションを初期化する。
- トランザクション中に追加/削除すべきパッケージを選択する。
- 同期データベース、パッケージ、及びパッケージ間の依存関係のサニティチェックを行い、コマンドラインフラグに基づいてトランザクションの準備をする。
- トランザクションを実行する:
- 必要に応じてパッケージをダウンロードする (
_alpm_sync_load
) - pacman の既存の
PreTransaction
フックが適用される場合、それらのフックを実行する。 - 最終的に置き換えられるパッケージ、衝突するパッケージ、明示的に削除するように指定されたパッケージを削除する。
- 追加するべきパッケージが存在する場合、各パッケージに対して以下を実行する:
- パッケージにインストールスクリプトが存在する場合、そのスクリプトの
pre_install
関数を実行する (アップグレードする場合はpre_upgrade
が、削除される場合はpre_remove
が代わりに実行されます)。 - 以前のバージョンのパッケージのファイルを全て削除する (パッケージをアップグレードまたは削除する場合)。ただし、パッケージによって設定ファイルであると指定されたファイルに関しては、削除しない (pacman/Pacnew と Pacsave を参照)。
- パッケージを解凍し、含まれているファイルをファイルシステムに保存する (パッケージをインストールまたはアップグレードする場合)。新しいパッケージのファイルが、ファイルシステム上の手動で変更された設定ファイル (前のステップを参照) を上書きしてしまう場合、パッケージ側のファイルに別の名前 (.pacnew) を付けて保存する。
- パッケージにインストールスクリプトが存在する場合、
post_install
関数を実行する (アップグレードする場合はpost_upgrade
が、削除される場合はpost_remove
が代わりに実行されます)。
- パッケージにインストールスクリプトが存在する場合、そのスクリプトの
- トランザクションの終わりの時点で存在している
PostTransaction
フックが適用される場合、それらのフックを実行する。
- 必要に応じてパッケージをダウンロードする (
- トランザクション及びトランザクションリソース (つまり、データベースロック) を解放する。
設定
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/*
後ろのルールは前のルールを上書きします。また、!
を前に付けることでルールを無効化できます。
複数の設定ファイルを使用
設定ファイルが複数あって (メインの設定と 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-sysusers
と systemd-tmpfiles
を組み合わせてパッケージのインストール時に自動的にシステムユーザーを作成します。例として tomcat8 パッケージでは tomcat8
という名前のシステムユーザーが必要だと指定されており、特定のディレクトリの所有者がこのユーザーになるように設定されています。pacman フックの systemd-sysusers.hook
と systemd-tmpfiles.hook
は、tomcat8
にユーザが指定されているファイルと一時ファイルが存在していることを認識し、systemd-sysusers
と systemd-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/
でバインドマウントする。
パッケージのセキュリティ
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
を実行して、pacman に glob
に一致するファイルを強制的に上書きさせることができます。
"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
インストール時にパッケージを取得できない
このエラーは、Not found in sync db
、Target not found
、または Failed retrieving file
として現れます。
まず、パッケージが実際に存在することを確認します。パッケージが存在することが確実な場合は、パッケージリストが最新でない可能性があります。 pacman -Syu
を実行して、すべてのパッケージリストを強制的に更新してアップグレードしてみてください。また、選択した ミラー が最新であり、リポジトリ が正しく構成されていることも確認してください。
また、パッケージを含むリポジトリがシステム上で有効になっていない可能性もあります。たとえば、パッケージは multilib リポジトリにある可能性がありますが、multilib は pacman.conf
で有効になっていません。
FAQ# 公式リポジトリにある共用ライブラリはそれぞれどうして一つのバージョンしか用意されてないんですか? も参照してください。
アップグレード中に Pacman がクラッシュしました
パッケージの削除・再インストール・アップグレード中に "database write" エラーを残して pacman がクラッシュする場合:
- Arch インストールメディアを使って起動してください。
- root でルートファイルシステムをマウントします (
mount /dev/sdaX /mnt
)。df -h
で十分な空き容量があることを確認してください。 - proc, sys, dev ファイルシステムもマウントしてください:
mount -t proc proc /mnt/proc; mount --rbind /sys /mnt/sys; mount --rbind /dev /mnt/dev
。 - システムがデフォルトのデータベースとディレクトリの場所を使っている場合、root で
pacman --root=/mnt --cachedir=/mnt/var/cache/pacman/pkg -Syyu
を実行することでシステムの "pacman" データベースを更新してアップグレードすることができます。 - アップグレード後、アップグレードがないことと壊れているパッケージを確認してください:
find /mnt/usr/lib -size 0
。 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 -S --force
でパッケージを再インストールしてパッケージデータベースを更新- フルシステムアップグレードを実行
問題なく動く 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 エントリを試す:
システムが起動したら、コンソールかターミナルから次のコマンド (持ち合わせの linux カーネル用)を入力して initramfs イメージを再生成します:
# mkinitcpio -p linux
2. それが機能しない場合は、現在の Arch リリース (CD/DVDまたはUSBスティック) から、ルートパーティションとブートパーティションをマウントします。次に、chroot します。
# arch-chroot /mnt # pacman -Syu mkinitcpio systemd linux
カーネル (linux パッケージ) を再インストールすると、自動的に mkinitcpio-p linux
で initramfsイメージが再生成されます。これを個別に行う必要はありません。
その後、exit
、umount/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
でパッケージを確認できます。
以前の 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/
を試してください。