Debian系パッケージマネージャーAPTの使用方法
Debian派生LinuxディストリビューションのパッケージマネージャーのAPTの使用方法を整理する。
導入
APT (Advanced Package Tool) はUbuntuを含むDebian派生Linuxディストリビューションで採用されているパッケージ管理システムだ。
UbuntuなどのLinuxで新しくソフトをインストールする場合にお世話になる。ただ,何か問題が発生した場合や,ちょっと調べたいことができた場合にコマンドの体型がわかっておらずいちいち時間がかかっていた。
そこでAPT関係でよく使うコマンドを整理することにする。
参考元の情報源を以下に掲載した。できるだけ公式情報を参照するように努めた。
参考情報の中では,「Chapter 2. Debian package management」と末尾に掲載した各種のmanページが特に参考になった。これを見れば全てわかるという公式ページがあまりなかった。基本的にはコマンドの使い方になるため,やはり最終的にmanページに行き着く。
特に重要なのが,apt (apt-get, apt-cache), apt-file, apt-markだ
。これらの3コマンドさえ使えればだいたいのことができる。
apt
はapt-get
とapt-cache
の内容を含んでおり,できることが多いので初見だと戸惑う。オプションなどはこれらのコマンドの使い方と同じであるため,それらのマニュアルもみる必要がある。
コマンド一覧
目的とコマンドの一覧を以下の表に掲載する。各コマンドの詳細な説明は後の節で説明する。
目的 | コマンド |
---|---|
情報 | apt show <package> |
利用可能バージョンの確認 | apt show -a <package> apt list --all-versions <package> |
検索 | apt search <regex> |
インストール | sudo apt install <package> sudo apt reinstall <package> |
更新 | sudo apt update sudo apt full-upgrade sudo apt install <package> |
削除 | sudo apt remove <package> sudo apt purge <package> sudo apt autoremove sudo apt clean sudo apt autoclean |
インストール済みパッケージの確認 | apt list --installed dpkg -l | grep '^.i' apt-mark showmanual apt-mark showauto |
パッケージ中身の一覧 | dpkg -L <package> apt-file list <package> |
ファイルの該当パッケージの確認 | dpkg -S <file> apt-file search <file> |
依存関係の確認 | apt show <package> | grep Depends apt depends <package> apt rdepends <package> |
パッケージの自動・手動フラグの指定 | apt-mark auto <package> apt-mark manual <package> |
パッケージのhold | apt-mark hold <package> apt-mark unhold <package> apt-mark showhold |
リポジトリーの追加・削除・編集 | sudo add-apt-repository <repository> sudo add-apt-repository -r <repository> sudo apt edit-sources |
パッケージの操作履歴の確認 | cat /var/log/apt/history.log |
ここの一覧を参照すればだいたいやりたいこととコマンドの対応は見つかるだろう。
情報
パッケージの情報の確認にはapt show
コマンドを使用する。
apt show <glob>
apt show -a <glob> | grep Version # show all versions
apt list --all-versions <glob>
apt show
の引数にはパッケージ名を指定する。パッケージ名にはglob (?*
) が利用可能だ。
インストール対象の依存関係やインストール可能なバージョンの確認に重宝する。
apt show
では最新バージョンだけしか表示されない。利用可能な全バージョンを確認するには,-a, --all-versions
オプションを指定する。apt showのベースになっているapt-cache show
ではデフォルトで-a
が有効になっているのだが,apt show
は-a
がデフォルトで無効 (--no-all-versions
) になっているようだ。
apt show -a
の他に,apt list --all-versions
でも利用可能なバージョンを確認できる。利用可能なバージョンを知りたい場合は,こちらのほうが短いのでこちらを使ったほうがいいだろう。
検索
パッケージの検索にはapt-cacheコマンド由来の以下のコマンドを実行する。
apt show <package>
apt list <package>
apt search <regex>
apt show
とapt list
は引数にパッケージ名のglob
を指定でき,パッケージ名の完全一致検索を行う。そして,apt show
はパッケージの詳細情報を,apt list
はパッケージ名を確認できる。
一方,apt search
は引数にパッケージに関する情報の正規表現を指定でき,部分一致検索を行う。パッケージ名だけでなく,パッケージの説明からも検索する。
apt show
は表示内容が多く,検索対象がパッケージ名だけなので,apt search
のほうがパッケージの検索には便利だ。
apt search
では以下の2種類のオプションが使える。
オプション | 説明 |
---|---|
-f, --full | フルの説明を表示する。 |
-n, --names-only | パッケージ名だけを検索する。実質的にapt show *pattern* と同じ検索を行う。 |
デフォルトでは,パッケージ名とパッケージの説明からキーワードを検索して,ヒットしたパッケージ名と短い説明を表示している。ただ,デフォルトだと何にヒットして表示されたのかわからないことがある。
apt search libx
を実行すると以下のようにlibx
がどこにもないパッケージがヒットする。
xtrans-dev/bionic,bionic,now 1.3.5-1 all [installed,automatic] X transport library (development files)
これをapt search -f libx
で実行すると,フルの説明文の中にちゃんとlibx
があることがわかる。
xtrans-dev/bionic,bionic,now 1.3.5-1 all [installed,automatic] X transport library (development files) xtrans includes a number of routines to make X implementations transport-independent; at time of writing, it includes support for UNIX sockets, IPv4, IPv6, and DECnet. . xtrans is not actually a library in itself; it includes .c files which are then used in the compilation of X servers, libraries, et al. . More information about X.Org can be found at: <URL:http://www.X.org> . This module can be found at git://anongit.freedesktop.org/git/xorg/lib/libxtrans
インストール
APTのインストールコマンドがapt install
だ。以下のようにして指定したパッケージをインストールする。
sudo apt install <package>
sudo apt install vim-tiny=2:8.0.1453-1ubuntu1.3
sudo apt install vim-tiny=2:8.0.*
sudo apt install vim-tiny/stable
sudo apt install vim-tiny- # force removed
sudo apt install vim-tiny+ # force installd
sudo apt reinstall <package>
sudo apt build-dep <package>
<package>
の末尾に=
を続けてバージョンを指定できる。/
の後にコード名 (stretch, buster, sid…)やスイート名 (stable, testing, unstable) を指定することもできる。
さらに,apt
のコンフリクト解消の上書き機能として,パッケージ名の末尾に-をつけると削除,+をつけるとインストールする。
<package>
やバージョン部分にはglob (?*
) を使用できるようだ。apt-getのmanには正規表現が使えるとあったが,逆に正規表現は使えなかった。
例えば,sudo apt install vim-*
として関連パッケージをまとめてインストールすることができる。
apt installを実行してパッケージをインストールする際は,インストールの有無を確認される。この確認を省略するには,-y, --yes, --assume-yes
を指定する。
sudo apt reinstall
はパッケージを再インストールする。あまり使うことはないのだが,間違えて設定ファイルを削除した場合や,挙動がおかしくなった場合に使うかもしれない。
apt build-dep
は指定したパッケージをソースコードからのビルドの依存関係を満たすようにパッケージをインストールしたり削除したりする。
APTで用意されていないバージョンのパッケージが必要で,自前ビルドが必要な場合に,関連するビルドツールのインストールに便利だろう。
更新
パッケージに更新に関するコマンドはapt-get由来の以下の4コマンドだ。
sudo apt update
sudo apt upgrade
sudo apt full-upgrade
sudo apt install <package>
apt update
でパッケージのメタ情報を/etc/apt/sources.list
に記載されたリポジトリーから取得して更新する。これにより,新しいパッケージのバージョンなどを把握する。そのため,upgrade
やdist-upgrade
でパッケージを更新するために,これらのコマンドの実行前にupdate
を実行したほうがよい。
インストール後のパッケージを更新するにはapt upgrade
を実行する。このコマンドにより,インストール済みの全パッケージを更新する。その他,不足パッケージを新しくインストール場合がある。ただし,インストール済みパッケージを削除はしない。apt-get upgrade
は新規パッケージをインストールしないのだが,apt upgrade
は新規パッケージをインストールするようになったようだ。
apt full-upgrade
はapt upgrade
と同じくインストール済みの全パッケージを更新する。違いは依存関係の都合で,インストール済みパッケージを削除する場合があるところだ。既存パッケージを削除することがあるので,場合によっては危険なコマンドとなる。そのため,基本的に,パッケージのバージョンを更新する場合はapt upgrade
を実行しておけばいい。なお,apt full-upgrade
はapt-get dist-upgrade
相当のコマンドとなっている。
最後に,apt install
でもパッケージを更新できる。実のところ,upgrade
とfull-upgrade
はAPTで管理しているシステム全体のパッケージが更新対象となる。引数にパッケージを受け付けないことから,パッケージを指定して更新はできない。
更新対象パッケージの量が多くなり通信環境が安定しない場合など,個別にパッケージをインストールしたい場合があるだろう。そういう場合には,apt install
で個別にインストールするしかない (参考:
APTによるパッケージの部分アップグレード)。
削除
インストールしたパッケージの削除にはapt-get由来の以下のコマンドを実行する。
sudo apt remove <package>
sudo apt purge <package>
sudo apt autoremove
sudo apt clean
sudo apt autoclean
remove
は指定したパッケージを削除する。ただし,設定ファイルを残す。一方,purge
は設定ファイルを含めて削除する。次回インストールしたときのために,パッケージのアンインストール時には基本的にはremove
を使ったほうがよいだろう。
apt install
でインストールしたパッケージをremove
やpurge
などで削除した場合,install
で一緒にインストールされた依存関係は残ったままになる。autoremove
は依存関係の都合で自動的にインストールされたパッケージの内,不要になったものを削除してくれる。apt
のコマンドを実行したときに,autoremove
を実行するように表示されることがあるので,そのタイミングで実行しておけばいいだろう。
clean
は追跡済みパッケージファイルのローカルリポジトリーを削除する。/var/cache/apt/archives/
と/var/cache/apt/archives/partial/
にインストールに使用するdebファイルをキャッシュしているので,これらのキャッシュを削除する。
似たclean
とコマンドにautoclean
がある。違いは,キャッシュしているdebファイルの内,もうダウンロードできなくなってキャッシュの機能を果たさないパッケージファイルのみを削除する点だ。
放っておくとキャッシュがずっと残るので,ときどきautoclean
を実行するとよいだろう。もっとも,これらのキャッシュはremove
やautoremove
などで一緒に削除されているような気がするので,autoclean
を実行しなくてもあまり問題ない気もする。
インストール後パッケージの確認
現在のOSにインストールされているパッケージを確認したり,特定のパッケージ内のファイルを調査したい場面がある。この用途にはdpkg
コマンドを主に使う。
dpkg
はdebファイルやインストールしたパッケージに対して操作する。まだインストールしておらず,debファイルがローカルにない場合のパッケージには効果がない。その場合は,後述のapt-file
を使う。
インストール済みパッケージの一覧表示には以下のコマンドを実行する。
apt list --installed
dpkg -l | grep '^.i'
apt-mark showmanual
apt-mark showauto
dpkg -l, --list
で表示されるパッケージの一覧にはフラグがある。2列目のフラグiがインストール済みであることを意味する。grep
検索を挟むの手間なのでapt list --installed
で確認するとよいだろう。
apt-mark
のshowmanual
とshowauto
は,それぞれapt install
などで直接インストールしたパッケージと,依存関係で自動的にインストールされたパッケージを表示する。
指定したパッケージの中身の一覧表示には以下のコマンドを実行する。
dpkg -L/--listfiles <package>
dpkg -L
には正確なパッケージ名が必要なので注意する。事前にapt list --installed
などでパッケージ名を把握しておくとよいだろう。
指定したファイルの該当パッケージの検索には以下のコマンドを実行する。
dpkg -S/--search <glob>
dpkg -S
で普段使っているコマンドやライブラリーがどのパッケージに含まれているかを検索できる。
なお,apt-file
コマンドをインストールできれば,dpkg
とapt list
によるインストール後パッケージの確認も兼ねることできるので,apt-file
コマンドを常用するのもありだろう。
インストール前パッケージの確認
まだインストールしていないパッケージへの検索にはapt-file
コマンドを使うしかない。
apt-file
を使う場合は,apt-file update
かapt update
でパッケージのメタデータを事前に更新しておく。
指定したパッケージの中身の一覧表示 (dpkg -L
相当) には以下のコマンドを実行する。
apt-file list <package>
apt-file show <package>
デフォルトだと完全一致 (-F, --fixed-string
) で検索する。list
とshow
はどちらも同じ意味なので入力しやすい方を使うとよいだろう。
指定したファイルの該当パッケージの検索 (dpkg -S
相当) には以下のコマンドを実行する。
apt-file search <pattern>
apt-file find <pattern>
デフォルトだと部分一致 (--substring-match
) で検索する。
パッケージ名やファイル名の検索には以下のオプションを併用すると便利だろう。
-i, --ignore-case
: 大文字小文字を無視する。-x, --regexp
: 正規表現を使う。
apt-file
を使うタイミングとしては,例えば,ビルド中に依存関係やライブラリが不足しているというメッセージが出たとき,該当ファイルを含むパッケージを探す際に便利だろう。
依存関係の把握
パッケージの依存先を確認するには,apt show, apt depends, apt rdepends
コマンドを使う。
apt show <package> | grep Depends
apt depends <package>
apt rdepends <package>
apt show <package>
で指定したパッケージの依存先を確認できる。この他に,apt depends
で依存先を一覧化できる。
新しくパッケージをインストールする場合に,追加でインストールされるパッケージの把握や,開発中のアプリケーションの依存関係の把握に便利だろう。
apt depends
と似ているがapt rdepends
でパッケージの依存元を一覧化できる。こちらを使うことはあまりないと思うが,指定したパッケージがどんなパッケージに使われているのか,インストール・更新・削除時の影響範囲の把握に使えるだろう。
apt depends
とapt rdepends
では以下のオプションが使用可能だ。
オプション | 説明 |
---|---|
--recurse | 再帰的に依存元を一覧化できる。apt rdepends に--recurse を使用すると量が膨大になるので気をつける。 |
-i, --important | 依存関係の内SuggestsやReplacesの表示を辞め,PreDependsとDependsだけを表示するようになる。 |
--implicit | デフォルトではメタデータ上に明示的に記載された依存関係しか表示しない。このオプションにより,コンフリクトなど遭遇したデータの依存関係も表示する。 |
--installed | 依存関係の情報表示を現在インストール済みのパッケージに限定する。 |
--no-pre-depends, --no-depends, --no-recommends, --no-suggests, --no-conflicts, --no-breaks, --no-replaces, --no-enhances | 指定した種類の依存関係の表示を抑制する。 |
この中では--recurse
と--installed
が便利だろう。
例えば以下のコマンドで指定したパッケージが何のパッケージ経由でインストールされたか特定できる。意図せず自動インストールされたパッケージのアンインストール時に役立つ。
apt rdepends --recurse --installed <package>
なお,apt-rdepends
というapt depends
と同じことを行うコマンドもあるようだ。
自動パッケージの確認
apt install
でパッケージをインストールすると,依存関係の都合で自動的にインストールされるパッケージが存在する。
後々この自動インストールされたパッケージが問題を起こすことがある。apt-mark
はこれらの自動・手動パッケージを管理するコマンドとなっている。
手動パッケージがアンインストールされるなどして不要になった自動パッケージは削除候補となり,apt autoremove
などの自動削除の対象になる。
これらの自動パッケージと手動パッケージはそれぞれ以下のコマンドで確認できる。
apt-mark showauto
apt-mark showmanual
また,パッケージごとに自動・手動のフラグを以下のコマンドで指定できる。
apt-mark auto <package>
apt-mark manual <package>
その他,パッケージのバージョンを固定したい場合などで,dpkg
コマンドによる操作の対象外にしたい場合,以下のコマンドを実行する。
apt-mark hold <package>
apt-mark unhold <package>
apt-mark showhold [<package>]
apt-mark hold
で対象パッケージをhold扱いにしてdpkg
による処理の対象外できる。hold扱いにしたパッケージはapt-mark unhold
でholdから除外できる。apt-mark showhold
でhold扱いのパッケージを確認できる。
リポジトリー操作
APTで使用するパッケージのリポジトリーの設定は/etc/apt/sources.list
か/etc/apt/sources.list.d/
にある。
直接テキストエディターで編集することもできるが,以下のようにadd-apt-repositoryコマンドで編集することもできる。
sudo add-apt-repository 'deb http://myserver/path/to/repo stable myrepo'
sudo add-apt-repository -r ppa:user/repository
引数にリポジトリーを指定して実行する。オプションを指定しない場合,リポジトリーの追加となる。その他,-r, --remove
オプションを指定するとリポジトリーを削除できる。
ただ,既存の登録済みのリポジトリーの確認に,結局自分で/etc/apt/sources.list
を確認する必要があるので,手順でリポジトリーを追加する際の専用コマンドになりそうだ。
その他にapt edit-sources
コマンドがある。このコマンドを実行すると,nano
やvi
などから選ばれたテキストエディターで,基本的なチェックをしながら/etc/apt/sources.list
を編集する。
man
に記載はないが引数に,/etc/apt/sources.list.d/
は以下のファイルを指定することで,その設定ファイルを編集することもできるようだ。
visudo
のAPT版といったところだろう。コマンドの入力が若干短くもなるので,/etc/apt/sources.list
の編集時はsudo apt edit-sources
を実行するのがよいだろう。
なお,sudo apt edit-sources
で選択したテキストエディターを変更したい場合,sudo select-editor
を実行するか,~/.selected_editor
ファイルを削除したり編集する (参考: select-editor(1) — sensible-utils — Debian buster — Debian Manpages)。
ログファイル
APTのログは以下のファイルに格納されている。
ファイル | 説明 |
---|---|
/var/log/dpkg.log | dpkg レベルのパッケージのログ。 |
/var/log/apt/history.log | パッケージのインストール・削除の履歴。 |
/var/log/apt/term.log | APTコマンド実行時の端末への出力内容。 |
/var/log/apt/eipp.log.xz | EIPPのログ (参考: doc/external-installation-planner-protocol.md)。 |
パッケージのインストール履歴をhistory.log
で確認するというのが主な用途だろう。history.log
とterm.log
は毎月ログをローテートしており,.月.gz
という拡張子で最大12月分保存されている。eipp.log.xz
は詳細が不明だった。
なお,APTのログに関してはマニュアルなどの記載がほぼなく,「Chapter 2. Debian package management」で/dpkg.log
とterm.log
について言及があるくらいだった。
情報として参照されていたコードを掲載しておく。
結論
パッケージ管理ツールのAPTについて情報を整理した。目的ごとに情報を整理でき理解が進んだ。
ひとまず,今後APTについて操作を忘れたらこの記事を見て対処したい。
ただし,この他にAPTの設定やオフライン環境を想定したパッケージファイルのダウンロード,ファイルからのインストールなど,不足している情報はある。これらの情報は今のところ必要に迫られていないので,今後必要になったタイミングで情報を追加したい。