Arch Linux の pacman コマンドを使うことのメモ

パッケージマネージャ Pacman のコマンドライン

pacman.jpg

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.confIgnorePkg = という行を追記して指定する。

# /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

  • [2017-06-17 Sat] 追記、言い回しの変更、標語のような見出しをやめた
  • [2017-07-30 Sun] 加筆
  • [2018-01-08 Mon] 便利コマンドラインに追記、アップグレード抑止など加筆
  • [2018-06-07 Thu] pacman ツールが pacman-contrib に移ったことで加筆