パッケージマネージャ Pacman のコマンドライン
Arch Linux のパッケージマネージャ Pacman は豊富な機能でパッケージ管理を楽に、便利にしてくれる。その恩恵にあずかるため起動オプションを組み合わせたりするのだけれど、高機能ゆえのそういうことが私にはちょっと複雑なことなんである。それと、 Pacman には pacman
コマンド以外の便利なツールも存在する。
詳細は man page がいいけれど、私はちょっと気になったところをメモしていたから、それをかようにまとめていくことにした。
pacman の基本的コマンドライン
パッケージの検索
pacman -Ss [REGEXP]
pacman -Si PACKAGE
例として xterm
というパッケージ名をキーワードとして、全リポジトリで検索してみる。
$ pacman -Ss xterm ... extra/libutempter 1.1.6-2 [インストール済み] Interface for terminal emulators such as screen and xterm to record user sessions to utmp and wtmp files extra/xterm 330-1 [インストール済み] X Terminal Emulator community/ajaxterm 0.11-9 A web based terminal ...
指定したキーワードが、パッケージ名とディスクリプションのフィールドで検索される。当然、キーワードを含むものが複数表示されることだってある。
検索結果の表示内容は、
リポジトリ名 / パッケージ名 バージョン (グループ名) [インストール状況] ディスクリプション
のようになる。
-Ss
では正規表現を扱えるから、以下のようにするとスッキリな結果を返してはくれる。
$ pacman -Ss '^xterm$' extra/xterm 330-1 [インストール済み] X Terminal Emulator
しかしピンポイントで存在を確認するということなら -Si
でパッケージ情報表示を利用するのもいい。
$ pacman -Si xterm リポジトリ : extra 名前 : xterm バージョン : 330-1 説明 : X Terminal Emulator アーキテクチャ : x86_64 URL : http://invisible-island.net/xterm/ ...
-v
を加えて -Siv
とするといま少し多くの情報を付加してくれる。
さてもう一例として、 高品質フォント(TrueType 、 OpenType )を探したい場合、 font
というキーワードだとコアフォントやツール類もひっかかってくる。そこで、
$ pacman -Ss '[ot]tf'
などとしてみるといい具合に絞れるかも知れない。
ところで前述の通り、検索結果には合理的にリポジトリ名やディスクリプションまで表示してくれるけれど、パッケージ名だけの方がありがたい時もある。そんな時は -q
を加えて以下のようにしてみると、大分見通しがよくなる。ワンライナーやスクリプトで引数として渡す時なんかに便利そうだ。
$ pacman -Ssq '[ot]tf' | sort ... otf-ipafont otf-overpass ttf-anonymous-pro ttf-arphic-ukai ...
パッケージのインストール
pacman -S PACKAGE [PACKAGE ...]
パッケージのインストールはもっとも簡単なオプション構成でいける。
$ sudo pacman -S xterm
スペースで区切れば複数のパッケージを指定できる。
$ sudo pacman -S xterm tmux
指定したものがパッケージグループの名前だった場合、インストールできるパッケージの選択が促される。
$ sudo pacman -S i3 :: There are 4 members in group i3: :: Repository community 1) i3-wm 2) i3blocks 3) i3lock 4) i3status Enter a selection (default=all):
上の例なら、単に Enter を押せば i3
グループに含まれる4つのパッケージが全てインストールされるし、一部をインストールするなら番号で指定する。例えば 3) i3lock
だけインストールしたくない場合、 1-2 4
あるいは ^3
というように指定する。
パッケージのアンインストール
pacman -Rs PACKAGE [PACKAGE ...]
-Rs
でそのパッケージだけが依存するパッケージも一緒にアンインストールしてくれる。
$ sudo pacman -Rs xterm
取り除きたいパッケージだけが依存するパッケージというのは無用なことも多いかと思う。
そうでないなら pacman -R
でアンインストールすれば、依存パッケージはそのまま残される。
パッケージ更新リスト
checkupdates
インストール済みのパッケージのうちアップグレードがペンディングになっているもの、すなわち、今どのパッケージがバージョンアップできるものか知るには checkupdates
コマンドを使うといい。場合により多少のモッサリ感は否めないのだが、安全である(後述)。
checkupdates
コマンドは pacman-contrib
パッケージに含まれており、利用するにはこのパッケージをインストールする必要がある。
$ sudo pacman -S pacman-contrib
実行すると一覧で、インストール済みのバージョンとアップグレードバージョンを併記してくれる。
$ checkupdates avahi 0.6.32-3 -> 0.7-1 bison 3.0.4-2 -> 3.0.4-3 blosc 1.11.3-3 -> 1.12.0-1 ...
パッケージ更新(バージョンアップ)
pacman -Syu
リストを眺めてよしじゃあ全部更新しようということになったら、以下のようにしてインストール済みパッケージのアップグレードを行う。
$ sudo pacman -Syu
これでローカルパッケージデータベースの更新とともに、全ての更新可能なパッケージがアップグレードされる。
AUR (Arch User Repository)を利用するには Yaourt (基本的に Pacman と同じように扱える)を使うが、 AUR パッケージのアップグレードについては明示的に -a
( --aur
)を指定しなければならない。
$ yaourt -Syua
パッケージリスト更新はアップグレードに伴うべきであること
Arch ユーザはすべからくパッケージリスト更新に勤しむべし、とは言い過ぎであろうか。
Arch Linux は、ローリング・リリースであることもあってかパッケージリポジトリの更新が早い。これをメリットと考えて恩恵にあずかろうとするならば、パッケージ更新(アップグレード)はローカルパッケージデータベース更新の上に立つ、ということがより確かでなければならないとは言えるだろう。
だけれど、パッケージ更新を行わずにパッケージデータベースのみを新しくして、検索なんかしてみようと思うことはないだろうか。実際に -Sy
( --sync --refresh
) というオプションで実行は可能だ。
しかし、前述のことの上では -Syu
( -Sy
+ --upgrade
)によって既に行われていることをもう一度行うだけなので、意味の無いこととも言える。
ArchWiki によると、部分的なアップグレードはサポートされない( ArchWiki – Partial upgrades are unsupported )とあり、 -Sy
してすぐに -S <package>
( -Sy <package>
も同様)はしないで、という警告のような文言がうかがえる。(なおこの場合 -Syi
や -Sys
なども -Sy
と同様なことだろう。)
これは、最新のパッケージデータベースによりインストールされるパッケージと、古いパッケージデータベースに基づいてインストールされていたパッケージ群とでは、釣り合わないことがあるというようなことだ。
自由な Arch に御法度などあるわけもないが、しかし釣り合いのとれない状態は既に依存解決で問題を抱えている可能性があるということである。
つまり -Sy
したならアップグレード、だったら最初から sudo pacman -Syu
とするのが良いということになるだろうか。
なお、アップグレードすればそれはそれで、パッケージ依存とは全く別の不具合を招くこともある。デメリットと表裏一体の宿命と言えるが、それ自体が Arch Linux の醍醐味のひとつだと捉えるべきかもしれない( … などと今更のように言うのは、野暮のようでもある)。
その味わいのために checkupdates
コマンドで更新リストを確認し、コミュニティの情報に耳を傾けておきましょう、ということなのであろう。
リスト強制更新とアップグレード
-y
( --refresh
)オプションは2つ並べるとパッケージデータベースを強制的に更新する。つまり -Sy
の強力版が -Syy
ということとなる。前述のことがあるからこれだけを行使するのはなるべく控えるが、以下ではこのオプションは有用。パッケージリストを強制更新しつつパッケージをアップグレードする。
$ sudo pacman -Syyu
AURの場合は yaourt -Sya
でリスト更新だから、強制更新は -Syya
となる。強制更新しつつパッケージアップグレードするには、
$ yaourt -Syyua
となる。
Pacman のキャッシュ管理
Pacman は基本的にアンインストールしたものやアップグレードで古くなったバージョンについても、パッケージアーカイブを全て残す仕組みとなっている。 /var/cache/pacman/pkg
に *.pkg.tar.xz
という書庫ファイルで保存されているものがそれだ。
$ ls -lh /var/cache/pacman/pkg/zsh* -rw-r--r-- 1 root root 1.9M Nov 20 2016 /var/cache/pacman/pkg/zsh-5.2-2-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 1.9M Dec 14 2016 /var/cache/pacman/pkg/zsh-5.3-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 1.9M Dec 23 04:42 /var/cache/pacman/pkg/zsh-5.3.1-1-x86_64.pkg.tar.xz -rw-r--r-- 1 root root 1.9M Mar 21 18:43 /var/cache/pacman/pkg/zsh-5.3.1-2-x86_64.pkg.tar.xz
だから、パッケージアップグレードを繰り返すにつれキャッシュディレクトリは当然のごとく肥大していく。
$ du -sh /var/cache/pacman/pkg 4.2G /var/cache/pacman/pkg
多少の容量の無駄は気にしないとしても、このキャッシュは時日経過に伴って増えこそすれ減ることはないものだから、時々気にしてシェイプアップしたほうがいい。
もっとも、パッケージ不具合などで古いパッケージにダウングレード(後述)せざるを得ない場合もある。そもそもキャッシュを残す仕組みはそのための安全策でもある。だからパッケージキャッシュの全てを削除するのでなく、せめて数バージョンは残しておいた方が良いとされている。
ここでは主に paccache
というコマンドを使ったキャッシュお掃除の方法を記すが、このコマンドは前述の checkupdates
などと同じく利用には pacman-contrib
パッケージのインストールを要する。
$ sudo pacman -S pacman-contrib
キャッシュを数代残して掃除する
paccache -r
paccache
は簡単かつ安全にキャッシュを削除してくれる。また dry-run オプション -d
( --dryrun
)があるので事前にどれくらい節約できるかを確認できる。
$ paccache -d ==> finished dry run: 354 candidates (disk space saved: 1.03 GiB)
デフォルトでは最新3代のバージョンを残すが、 -k
( --keep
)オプションで残す世代数を指定できる。例えば最新2代だけを残すなら -k2
( --keep 2
)を付け加える。
$ paccache -dk2 ==> finished dry run: 1104 candidates (disk space saved: 2.64 GiB)
実際にキャッシュ掃除するには -d
を -r
( --remove
)にさしかえて実行する。今回は3代残すことにしよう。
$ sudo paccache -r ==> finished: 354 packages removed (disk space saved: 1.03 GiB)
…キャッシュのメンテナンスなんて忘れていたもので、久しぶりにやってみたところでけっこうな容量節約とあいなった。
アンインストール済みパッケージのキャッシュを削除する
paccache -ruk0
paccache -r
( -rk3
) は、残っているキャッシュ全てについて3代残すということ。つまりそれは、アンインストールしたパッケージについても残す、ということである。
アンインストールしたならキャッシュも必要なくなることの方が多いと思うが、これはこれで明示的に削除しなければ、キャッシュは居座ったままなのだ。
-u
( --uninstalled
)オプションは処理対象をアンインストールしたものだけにする。全てを削除するなら -k0
と組み合わせればいいから、
$ sudo paccache -ruk0
とすればいい。もちろん -d
オプションも使える。
キャッシュを一掃する
pacman -Sc
paccache
でのキャッシュ管理を記したが、 pacman
コマンドでもキャッシュを削除できる。ただし、パッケージキャッシュを大事にとっておく立場(面倒くさいだけ?)としては、あまり平生に使うものではないかと思う。
pacman -Sc
( --sync --clean
)を実行すると、アンインストールしたパッケージのキャッシュを全て削除する。このアンインストールしたパッケージとは、アップグレードによって古くなったバージョンのキャッシュをも指すわけであり、すなわちインストール済みパッケージのキャッシュ1代のみを残して後は全て削除するということである。
さらに -c
を連ねて pacman -Scc
とすれば、インスコアンスコかかわらず全てのキャッシュを削除する。
このように極力残さないような指定で、世代管理の考え方がなくなってしまう。ただし記憶装置の残量事情で切羽詰まっているといったようなケースでは、一気にキャッシュを消してしまうなど考えられることだろう。コマンドラインも短くていい(怖いとも言える)。
Pacman でのパッケージダウングレード
前述の通り Pacman はインストールしたパッケージをキャッシュディレクトリ /var/cache/pacman/pkg
に貯留していくから、アップグレードした後で「しまった動かない」となってもキャッシュに残された古いバージョンへダウングレードできる。
ダウングレード
pacman -U PACKAGE_FILE
例えば Emacs が 25.1 になったけれどうまくない、残されたキャッシュ内の 24.5 にダウングレードしたいなぁという場合は以下のようにする。
$ sudo pacman -U /var/cache/pacman/pkg/emacs-24.5-4-x86_64.pkg.tar.xz
アップグレード抑止
pacman -Syu --ignore PACKAGE
しかし、このままでは次のアップグレードの時にまた Emacs がアップグレードされてしまう。これを抑止するには --ignore <package>
オプションを用いる。
$ sudo pacman -Syu --ignore emacs
複数のパッケージを指定するには --ignore emacs,zsh,tmux
のようにカンマで区切る。
ただしこれはコマンドラインで都度指定することなので、一時的な抑止にはよくっても毎回やるんではミスしやすいかも。そういうことなら、あらかじめ設定ファイルに書き込んで指定する方法を採れば杞憂はなくなる。 /etc/pacman.conf
に IgnorePkg =
という行を追記して指定する。
# /etc/pacman.conf ... IgnorePkg = emacs ...
複数パッケージを抑止したいんなら複数行記してもいいし、スペースで区切って IgnorePkg = emacs zsh tmux
のようにしたっていい。
この方法を採った場合は、 checkupdates
の一覧にも表示されないようになる。
Pacman の便利なコマンドライン
pacman
コマンドは必ずオプションを伴うが、このオプションの構成がちょっと複雑というか、最初はとっつきにくいところがある。慣れてしまえばその多機能さに万能感すら覚えるほどだが、はじめのうちは複雑なオプションの羅列をみただけで嫌になってしまうこともあるかもしれない。
理解のコツとしてまず、pacman コマンドラインのオプション構成はほとんどの場合 オペレーション
+ オプション
という組み合わせであることを承知することだ。さらにパッケージやファイル名などを ターゲット
として指定することで細かい指定や情報をとることができる。
pacman OPERATION [OPTIONS] [TARGETS]
## e.g. pacman -Ss xterm pacman --sync --search xterm
オペレーションは全部で8個あり、ダッシュに大文字アルファベットを1文字連ねて表す(man では、これらにヘルプの -h
/ --help
を合わせた9個が OPERATIONS として紹介されている)。
また、ロング文字列オプションにも対応しており、キーストロークが増えるものの意味が判りやすい。
オペレーション | 機能 |
---|---|
-S / --sync |
パッケージの同期(主に ダウンロード-インストール-依存解決 を意味する) |
-Q / --query |
ローカルパッケージ(インストール済みパッケージ)の問い合わせ |
-R / --remove |
ローカルパッケージの削除 |
-U / --upgrade |
パッケージの追加インストールやアップグレードと依存解決 |
-T / --deptest |
依存テストツール |
-D / --database |
パッケージ属性編集、ローカルデータベースのチェック |
-F / --files |
ファイルデータベースの問い合わせ |
-V / --version |
Pacman のバージョン情報(伴うオプションは無視するもよう) |
一般によく利用するオペレーションは -S
-Q
-R
-U
の4つであろう。
どのようなオペレーションがあるのかを大体押さえておいて、あとはこれに連ねるオプションを検討していく。
理解のコツの2つ目として、オペレーションに連ねるオプションは、オペレーション毎に設けられた簡易ヘルプを参照しながら検討するといい。
pacman OPERATION --help
例えば -S
に繋げられるオプションを知りたければ pacman -Sh
(あるいは pacman --sync --help
)とやるとオプションの一覧と概略が表示される。
$ pacman -Sh 使用方法: pacman {-S --sync} [オプション] [パッケージ] オプション: -b, --dbpath <path> データベースのパスを指定 -c, --clean キャッシュディレクトリから古いパッケージを削除 (-cc で全てのキャッシュを削除) -d, --nodeps 依存バージョンチェックをスキップ (-dd で全てのチェックをスキップ) -g, --groups パッケージグループに含まれているパッケージを全て表示 (-gg で全てのグループとそのパッケージを表示) -i, --info パッケージ情報を表示 (-ii で詳細情報を表示) ... ...
オペレーション毎のサマリーなので、 man とはまた違ったまとめ方となっていて、判りやすい。
さて、判りやすいヘルプがあるとは言っても、どんな組み合わせでどんな機能を提供してくれるのかまでは、調べるか経験するかしかないだろう。
そこでよく使うものや便利そうなオプションの組み合わせを以下に集めてみた(基本的コマンドラインとかぶるものもある)。理解のためロングネームオプションも併記するようにした。
リポジトリの検索
- リポジトリのパッケージを検索する
pacman -Ss [REGEXP] pacman --sync --search [REGEXP]
$ pacman -Ss rxvt-unicode community/rxvt-unicode 9.22-2 [インストール済み] A unicode enabled rxvt-clone terminal emulator (urxvt) community/rxvt-unicode-terminfo 9.22-2 [インストール済み] Terminfo files for urxvt community/urxvt-perls 2.2-1 [インストール済み] URL and Mouseless text selection for rxvt-unicode
普通にキーワード検索すると沢山マッチすることも多いけれど、-s (–search) の引数には正規表現が使えるのでピンポイントでマッチさせることはできる。
$ pacman -Ss '^rxvt-unicode$' community/rxvt-unicode 9.22-2 [インストール済み] A unicode enabled rxvt-clone terminal emulator (urxvt)
- パッケージ情報を表示する
pacman -Si PACKAGE [PACKAGE ...] pacman --sync --info PACKAGE [PACKAGE ...]
-i は連ねると情報量を増やして表示する。
$ pacman -Si rxvt-unicode
$ pacman -Sii xterm
インストールとアップデート
- パッケージのインストール
pacman -S PACKAGE [PACKAGE ...] pacman --sync PACKAGE [PACKAGE ...]
$ sudo pacman -S xterm
パッケージグループ名を指定した場合、インストールできるパッケージの選択が促される。
以下のように、アップグレードしつつ指定パッケージをインストールということも可能。
$ sudo pacman -Syu xterm
- アップデートとアップグレード
pacman -Syu [PACKAGE ...] pacman --sync --refresh --sysupgrade [PACKAGE ...]
パッケージリストのアップデートとともにインストールされているパッケージのアップグレードを行う。
$ sudo pacman -Syu
また
-y
(--refresh
)オプションを2つ連ねるとローカルパッケージリストを強制更新する。$ sudo pacman -Syyu
インストール済みパッケージを調べる
-Q
( --query
) はインストール済みパッケージについてのオペレーションを行う。
pacman -Q
を実行すると全てのインストール済みパッケージを一覧表示してくれる。
パッケージ名を引数で渡すとパッケージ名とそのバージョンナンバーを表示する。
$ pacman -Q xterm xterm 335-1
しかし、これはパッケージ名をそのまま検索するだけなので、完全一致するものが見つからなければエラーを返してくる(終了コード 1
)だけだ。これでは検索しにくいだろうから、やはり以下のように -s
などのオプションで機能を足しながら使う。
- インストール済みパッケージを検索する
-s
を付与するとキーワード検索が可能になる。pacman -Qs REGEXP pacman --query --search REGEXP
-Ss
ではリポジトリを検索するが、-Qs
ではローカルコンピュータにインストールされているパッケージを対象にキーワード検索するわけだ。これも引数に正規表現が使える。$ pacman -Qs '^xterm' local/xterm 327-1 X Terminal Emulator
- インストール済みパッケージの情報を表示する
pacman -Qi PACKAGE [PACKAGE ...] pacman --query --info PACKAGE [PACKAGE ...]
-i はふたつ連ねると情報量を増やして表示する。
$ pacman -Qi rxvt-unicode $ pacman -Qii xterm
- ファイルを保有するパッケージを調べる
pacman -Qo FILE pacman --query --owns FILE
コマンドやドキュメントがどのパッケージのものなのか知りたい時には -Qo を使う。
指定したファイルやディレクトリがどのパッケージが保有するものかを表示する。
$ pacman -Qo als /usr/bin/als is owned by atool 0.39.0-5 $ pacman -Qo /usr/share/doc/ranger/config /usr/share/doc/ranger/config/ is owned by ranger 1.8.1-1
- パッケージがインストールしたファイルの一覧
パッケージがインストールしたファイルの一覧
pacman -Ql <pkg>
- パッケージファイルの情報を表示する
-Qp <package_file> ( –query –file )
以下のようにするとパッケージファイルのパッケージ名とバージョンを表示してくれる。
$ pacman -Qp /var/cache/pacman/pkg/atool-0.39.0-4-any.pkg.tar.xz atool 0.39.0-4
多くの場合はパッケージファイル名から推測できることが表示されるだけなのだが、以下の応用例は使える。
- パッケージファイル内のパッケージ情報を表示
-Qpi
(--query --file --info
)$ pacman -Qpi /var/cache/pacman/pkg/atool-0.39.0-4-any.pkg.tar.xz 名前 : atool バージョン : 0.39.0-4 説明 : A script for managing file archives of various types ...
- パッケージファイル内のファイルを覗く
-Qpl
(--query --file --list
)$ pacman -Qpl /var/cache/pacman/pkg/atool-0.39.0-4-any.pkg.tar.xz atool /usr/ atool /usr/bin/ atool /usr/bin/acat atool /usr/bin/adiff ...
- パッケージファイル内のパッケージ情報を表示
- 公式リポジトリ以外からインストールしたパッケージ
-Qm
(--query --foreign
)syncデータベースにないもののリスト、すなわち手動インストールしたもの、あるいは AUR からインストールしたもののリストを表示する。
yaourt
で -a ( –aur ) を付与して使うと情報が少し増える。$ pacman -Qm
$ yaourt -Qma
Sources and Revisions
Sources
Revisions
- 追記、言い回しの変更、標語のような見出しをやめた
- 加筆
- 便利コマンドラインに追記、アップグレード抑止など加筆
pacman
ツールがpacman-contrib
に移ったことで加筆