pacman (日本語)
| 概括 |
|---|
| Pacman は Arch Linux の パッケージマネージャです。パッケージマネージャはソフトウェアのインストール・アップグレード・削除に使われます。この記事では基本的な使い方とトラブルシューティングについて記述します。 |
| 概要 |
| Arch Linux のパッケージは makepkg と、それぞれのパッケージにあわせたカスタムビルドスクリプト (PKGBUILD) でビルドされています。パッケージングされたソフトウェアは pacman でインストールして管理することができます。公式レポジトリにあるソフトウェアの PKGBUILD は ABS ツリーから入手できます。そして、さらに多くの PKGBUILD が(非公式の) Arch User Repository にあります。 |
| 関連記事 |
| Downgrading Packages (日本語) |
| Improve Pacman Performance (日本語) |
| Pacman GUI Frontends (日本語) |
| Pacman Rosetta (日本語) |
| Pacman Tips (日本語) |
| Pacman package signing |
| FAQ (日本語)#パッケージ管理 |
| pacman-key (日本語) |
| Pacnew and Pacsave Files (日本語) |
| 資料 |
| libalpm(3) Manual Page |
| pacman(8) Manual Page |
| pacman.conf(5) Manual Page |
| repo-add(8) Manual Page |
pacman パッケージマネージャは Arch Linux の主要な機能のひとつです。pacman はシンプルなバイナリのパッケージ形式と簡単に利用できるビルドシステムから成っています。pacman のゴールはパッケージ管理を楽にすることであり、公式 Arch レポジトリにあるパッケージや、ユーザー自身が作成したパッケージを容易に管理することができます。
Pacman はマスターサーバーと同期してシステムを最新に保ちます。このサーバー・クライアントモデルによって、シンプルなコマンドだけで必要な依存性を解決してパッケージのダウンロード・インストールをすることができます。
Pacman は C 言語で書かれており .pkg.tar.xz パッケージフォーマットを使います。
設定
pacman の設定は /etc/pacman.conf に記述されています。ここで pacman がどのように動作するかを決めることができます。より詳しい情報は man pacman.conf にあります。
全般設定
全般的な設定は [options] セクションにあります。ここで設定されている項目については man かデフォルトの pacman.conf を参照してください。
アップグレードさせないパッケージを設定
ある特定のパッケージをアップデートさせないようにするには:
IgnorePkg=linux
複数のパッケージを記述するときはスペースで区切るか、IgnorePkg 行を追加してください。
アップグレードさせないグループを設定
パッケージの場合と同様に、アップグレードさせないグループを指定することができます:
IgnoreGroup=gnome
インストールさせないファイルを設定
特定のディレクトリのインストールをさせないようにするには NoExtract リストにディレクトリを加えます。例えば、systemd ユニットのインストールを避けるには:
NoExtract=usr/lib/systemd/system/*
Repositories
/etc/pacman.conf に書かれているように、このセクションではどのレポジトリを使うか定義します。リポジトリはここで直接設定することもできますし、他のファイル (/etc/pacman.d/mirrorlist) から読み込ませることもできます。ただしどれかひとつのファイルを使うようにしてください。ミラーの設定はここを見て下さい。
/etc/pacman.conf
#[testing] #SigLevel = PackageRequired #Include = /etc/pacman.d/mirrorlist [core] SigLevel = PackageRequired Include = /etc/pacman.d/mirrorlist [extra] SigLevel = PackageRequired Include = /etc/pacman.d/mirrorlist #[community-testing] #SigLevel = PackageRequired #Include = /etc/pacman.d/mirrorlist [community] SigLevel = PackageRequired Include = /etc/pacman.d/mirrorlist # もし x86_64 環境で 32 bit アプリケーションを動かしたい時は、 # ここで multilib レポジトリを有効にします。 #[multilib-testing] #SigLevel = PackageRequired #Include = /etc/pacman.d/mirrorlist #[multilib] #SigLevel = PackageRequired #Include = /etc/pacman.d/mirrorlist # An example of a custom package repository. See the pacman manpage for # tips on creating your own repositories. #[custom] #SigLevel = Optional TrustAll #Server = file:///home/custompkgs
パッケージのセキュリティ
Pacman 4 は署名済みのパッケージをサポートしていて、パッケージに追加のセキュリティレイヤーを加えています。SigLevel を使うことでリポジトリ毎に(もしくは全体的に)セキュリティレベルを設定することが可能です。デフォルトの設定では /etc/pacman.conf
SigLevel = Required DatabaseOptionalによって全てのリポジトリで全てのパッケージの署名検証が有効にされています。上述したようにリポジトリ毎に
SigLevel を使うことでこの設定を上書きすることができます。パッケージに署名する方法や署名の検証について詳しくは、ここを見て下さい。
使い方
pacman で何ができるかをちゃんと学びたい場合、man pacman を参照してください。以下にあるのは pacman でできることのほんの一例です。
パッケージのインストール
特定のパッケージのインストール
ひとつ、あるいは複数の(依存を含む)パッケージをインストールするときは:
# pacman -S パッケージ名1 パッケージ名2 ...
異なるリポジトリにそれぞれ同じ名前のパッケージが存在することがあります(例:[extra] リポジトリと [testing] リポジトリ)。このような場合、どちらをインストールするかを明示してください:
# pacman -S extra/パッケージ名
パッケージグループのインストール
パッケージグループに属しているパッケージを同時にインストールすることができます。例えば:
# 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.org/groups/ を見て下さい。
パッケージの削除
あるパッケージを、そのパッケージが必要としていたものを残したまま削除するには:
# pacman -R パッケージ名
削除したいパッケージと、そのパッケージだけが必要としている他のパッケージを一緒に削除するには:
# pacman -Rs パッケージ名
削除したいパッケージと、そのパッケージが必要としている他のパッケージ、さらに削除したいパッケージに依存しているパッケージを削除するには:
# pacman -Rsc パッケージ名
他のパッケージから依存されているパッケージを、依存しているパッケージを削除しないで削除するには:
# pacman -Rdd パッケージ名
デフォルトでは、pacman は削除されたパッケージの設定ファイルを *.pacsave という拡張子をつけてバックアップします。もしこれらのファイルも一緒に削除したい場合:
# pacman -Rn パッケージ名
パッケージのアップグレード
Pacman は以下のコマンドひとつでシステムの全てのパッケージのアップデートができます。システムがどれだけ新しいかによってかかる時間が変わります。このコマンドはレポジトリデータベースと同期してそれからシステムのパッケージをアップデートします(レポジトリにない'ローカル'パッケージは別です):
# pacman -Syu
Pacman は強力なパッケージ管理ツールですが、全ての問題を解決できるわけではありません。混乱したのなら The Arch Way (日本語) を読んで下さい。ユーザーは用心深くなって、システムのメンテナンスの責任を自分でとらなくてはなりません。システムアップデートをしたときは、pacman からの表示を全て読み常識を働かせることが肝要です。もし(ユーザーによって作られた)設定ファイルを新しいパッケージのバージョンにあわせて変更する必要があるときは、ユーザーの設定を上書きするのを回避するために .pacnew ファイルが作られます。Pacman はユーザーにそれらをマージするよう表示します。これらのファイルはユーザーが手動で修正しなくてはなりません。パッケージのアップグレードや削除のあとチェックするのが良いでしょう。詳しくは Pacnew and Pacsave Files (日本語) を見て下さい。
アップグレードするまえに、Arch Linux home page の最新ニュースをチェックしておくとよいでしょう (もしくは RSS フィード, arch-announce mailing list を講読したり Twitter の @archlinux をフォローする): アップデートの際にいつもとは違うユーザーの操作が必要になった時 (pacman から与えられる指示だけでは不十分な場合など)、それに関してニュースが作られているはずです。
もし解決できない問題にあたったときは、フォーラムを検索してみましょう。他の人も同じ問題にぶつかり、解決法を投稿していることがあります。
パッケージ・データベースに問い合わせる
-Q フラグを使って Pacman からローカルデータベースを問い合わせます:
$ pacman -Q --help
同期しているデータベースに問い合わせるには -S フラグを使います:
$ pacman -S --help
Pacman を使ってパッケージ名と説明の両方をデータベースの検索にかけるには:
$ pacman -Ss 検索ワード1 検索ワード2 ...
既にインストールしたパッケージ内を検索するには:
$ pacman -Qs 検索ワード1 検索ワード2 ...
パッケージ名が分かっていれば、より詳しい情報を得ることができます:
$ pacman -Si パッケージ名
既にインストールしたパッケージの情報を得るには:
$ pacman -Qi パッケージ名
-i フラグをふたつ付けることでバックアップファイルの一覧と状態を表示できます:
$ pacman -Qii パッケージ名
あるパッケージによってインストールされたファイルの一覧を得るには:
$ pacman -Ql パッケージ名
インストールされていないパッケージには pkgfile を使って下さい。
あるファイルがどのパッケージによってインストールされたかを調べるには:
$ pacman -Qo /パス/ファイル名
孤立した、他のパッケージに必要とされていないパッケージの一覧を得るには:
$ pacman -Qdt
パッケージの依存のツリーを見るには:
$ pactree パッケージ名
あるパッケージを必要としている全てのパッケージを見るには pkgtools の whoneeds を使います:
$ whoneeds パッケージ名
追加コマンド
システムのアップグレードとパッケージのインストール(ワンライナー):
# pacman -Syu パッケージ名1 パッケージ名2 ...
インストールをしないで、パッケージをダウンロードする:
# pacman -Sw パッケージ名
リポジトリに存在しない'ローカル'のパッケージ (例: AUR のパッケージ) をインストール:
# pacman -U /パス/パッケージ名-version.pkg.tar.xz
リポジトリにない、リモートのパッケージを URI を入力してインストール:
# pacman -U http://www.example.com/repo/example.pkg.tar.xz
現在インストールされていない、パッケージのキャッシュ (/var/cache/pacman/pkg) を削除:
# pacman -Sc
パッケージのキャッシュを全て削除:
# pacman -Scc
部分的なアップグレードはサポートされていません
Arch Linux はローリングリリースであり、常に新しいバージョンのライブラリがレポジトリにプッシュされます。開発者や Trusted User はライブラリにあわせてレポジトリの全てのパッケージをリビルドします。ローカルでパッケージをインストールした場合 (AUR のパッケージなど)、ユーザーは必要に応じて共有ライブラリにあわせてリビルドしなくてはなりません。
つまり部分的なサポートはサポートされていません。pacman -Sy package や、それと同等の pacman -Sy からの pacman -S package などをしないでください。いつでも、パッケージをインストールする前にアップグレードしてください -- 特に pacman が同期レポジトリを更新する時は。同じ理由から、IgnorePkg や IgnoreGroup は気をつけて扱って下さい。
一度部分的なアップグレードがなされると、リンクしていたライブラリが見つからなくなってバイナリが壊れてしまいます。シンボリックリンクを張ることでこの問題を"解決"しようとしてはいけません。ライブラリは後方互換性がないときには soname を受け取ります。単純に、正しくミラーと同期する pacman -Syu で pacman が壊れていないかぎり問題を修正します。
トラブルシューティング
Q: パッケージ XYZ にアップデートしたらシステムが壊れました!
一番重要なことは"やみくもに" Arch のシステムをアップデートしないということです。常時、アップデートされるパッケージの一覧を読みましょう。"重要な"パッケージ (linux, xorg-server など) がアップデートされるのか確認しましょう。もしそうであれば、https://www.archlinux.org/ でニュースをチェックしたり最近のフォーラムの投稿を見て同じ問題が発生している人がいないか確認したりするのが大抵の場合役に立ちます。
パッケージをアップデートすると問題が発生することを予期される・知られている場合は、パッケージ作成者はパッケージがアップデートされた時、pacman が正しいメッセージを表示しているか確認します。アップデート後に問題がおこった時は、pacman の出力をログ (/var/log/pacman.log) を見て再チェックしてください。
Q: パッケージ ABC のアップデートが公開されているはずなのに、pacman はシステムは最新だと言っています!
Q: アップデートでこんなエラーが出ました: "file exists in filesystem"
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 がファイル衝突を検知して、あなたのために、故意に、ファイルを上書きしないようにしているからです。これは仕様であり、欠陥ではありません。
この問題は簡単に解決できます。安全な方法は初めに他のパッケージがファイルを使っていないか確認する (pacman -Qo /path/to/file) ことです。ファイルが他のパッケージによって使われている場合、バグレポートをしてください。他のパッケージによって使われていない場合、'ファイルシステムに存在している'ファイルの名前を変えてもう一度アップデートしてください。うまくいったならば、そのファイルは削除してかまいません。
pacman やフロントエンドを使わずに手動でプログラムをインストールしたときは、プログラムとファイルを削除して pacman を使って正しく再インストールしなくてはなりません。
全てのパッケージはインストールされるとパッケージのメタデータを含んだ /var/lib/pacman/local/$package-$version/files ファイルを作ります。このファイルが壊れている(または空だったり見つからない)と、パッケージをアップデートしようしたときに "file exists in filesystem" エラーが出ます。このようなエラーは大抵一つのパッケージだけが関わっていて、手動で名前を変更してその後削除する代わりに、pacman -S --force パッケージ名 で pacman にファイルを上書きさせることができます。
pacman -Syu --force はしないでください。Q: パッケージのインストール時にこんなエラーが出ました: "not found in sync db"
pacman -Syy で全てのパッケージリストを更新してください。Q: パッケージをインストールする時にエラーが表示されます: "target not found"
pacman -Syy を実行して強制的に全てのパッケージリストを更新してみましょう。 また、パッケージが含まれているリポジトリがあなたのシステムで有効になっていないのかもしれません。例えば、パッケージは multilib リポジトリにあるが、multilib が pacman.conf で有効になっていないということが考えられます。
Q: Pacman が何度も同じパッケージをアップグレードします!
/var/lib/pacman/local/ に二重のエントリがあるためです。pacman -Qi は正しいバージョンを示しますが、pacman -Qu は古いバージョンだと認識してアップグレードしようとします。
解決法: /var/lib/pacman/local/ の問題のあるエントリを削除してください。
Q: アップグレード中に Pacman がクラッシュしました!
- Arch インストールメディアを使って起動してください
- root ファイルシステムをマウントします
-
pacman -Syyを使って pacman のデータベースを更新します -
pacman -r /path/to/root -S packageで壊れたパッケージを再インストールしてください
Q: "make install" を使ってソフトウェアをインストールしましたが、これらのファイルはどのパッケージにも属していません!
--force スイッチをつけると pacman が手動でインストールしたソフトウェアを上書きします (pacman -S --force)。ファイルシステム中の所有されていないファイルを検索するスクリプトについては Pacman Tips (日本語)#ファイルがどのパッケージにも所有されていないことを確認 を見て下さい。
Q: 特定のファイルをもったパッケージが必要です。どのパッケージがそのファイルを持っているかわかりますか?
Q: Pacman が完全に壊れました!どうやったら再インストールできますか?
Q: システムをアップグレードした後、再起動すると "unable to find root device" エラーが出て起動できません
--force オプションを使うと起こりえます)。2つの選択肢があります:
1. Fallback エントリを試す。
- システムが起動したら、コンソールかターミナルから次のコマンド (持ち合わせの linux カーネル用)を入力して initramfs イメージを再生成します:
-
# mkinitcpio -p linux
2. 動かない場合、2012 Arch release (CD/DVD または USB スティック) から起動する:
-
# mount /dev/sdxY /mnt #あなたの root パーティション。 # mount /dev/sdxZ /mnt/boot #/boot パーティションを分割している場合。 # arch-chroot /mnt # pacman -Syu mkinitcpio systemd linux
- カーネル (linux パッケージ) の再インストールは自動的に initramfs イメージを
mkinitcpio -p linuxで再生成します。
別個にやる必要はありません。
- その後は、
exit,umount /mnt/{boot,},rebootと実行してください。
Q: "User <email@gmail.com>" の署名が unknown trust でインストールできません
archlinux-keyring パッケージをアップグレードしてください、pacman -S archlinux-keyring。Q: エラーが発生して
- error: PackageName: signature from "User <email@archlinux.org>" is invalid
- error: failed to commit transaction (invalid or corrupted package (PGP signature))
パッケージがアップグレードされません。
Q: "failed to commit transaction (invalid or corrupted package)" エラーが出ます
/var/cache/pacman/pkg にある *.part ファイル(部分ダウンロードファイル)を見つけたらそれらを削除します (pacman.conf で XferCommand を設定しているとよく起こります)。Q: pacman を使うたびにエラーがでます 'warning: current locale is invalid; using default "C" locale' どうすればいいですか?
Q: Pacman にプロクシ設定を使うようにするにはどうすればいいですか?
$http_proxy, $ftp_proxy etc) を使って下さい。sudo (日本語) と一緒に Pacman を使う時は、環境変数を pacman に渡すように sudo を設定してください。Q: How do I reinstall all packages, retaining information on whether something was explicitly installed or as a dependency?
pacman -S $(pacman -Qnq) (the -S option preserves the installation reason by default). You will then need to reinstall all the foreign packages, which can be listed with
pacman -Qmq.