Debian系パッケージマネージャーAPTの使用方法

Debian派生LinuxディストリビューションのパッケージマネージャーのAPTの使用方法を整理する。
導入
APT (Advanced Package Tool) はUbuntuを含むDebian派生Linuxディストリビューションで採用されているパッケージ管理システムだ。
UbuntuなどのLinuxで新しくソフトをインストールする場合にお世話になる。ただ,何か問題が発生した場合や,ちょっと調べたいことができた場合にコマンドの体型がわかっておらずいちいち時間がかかっていた。
そこでAPT関係でよく使うコマンドを整理することにする。
参考元の情報源を以下に掲載した。できるだけ公式情報を参照するように努めた。
- Apt – Debian Wiki: 公式サイト。他の情報のリンクが掲載されているだけ。
- AptCLI – Debian Wiki: APTのCLIについて簡単に説明している。ただし,情報が少ない。
- PackageManagementTools – Debian Wiki: Debianのパッケージ管理コマンドの一覧ページ。
- PackageManagement – Debian Wiki: パッケージ管理に関する説明ページ
- Chapter 2. Debian package management: Debianの公式ガイド。けっこう詳しい。
- 第 6 章 メンテナンスと更新、APT ツール: Debian管理者ハンドブック。ここも詳しい。
- APT HOWTO (Obsolete Documentation): 少し古くて情報が少ないが参考にはなる。
- Debian — Debian Users’ Manuals: Debianの公式マニュアル類。
- APT User’s Guide: APTのマニュアル。ただし,情報が少なすぎる。
- aptコマンド(パッケージの管理): APTの細かい使い方が書いてある。
- APT Developers / apt · GitLab: APTのソースコード。
- apt(8) — apt — Debian buster — Debian Manpages: 結局manページが一番かもしれない。
- apt-get(8) — apt — Debian buster — Debian Manpages
- apt-cache(8) — apt — Debian buster — Debian Manpages
- apt-file(1) — apt-file — Debian buster — Debian Manpages
- apt-mark(8) — apt — Debian buster — Debian Manpages
- dpkg(1) — dpkg — Debian buster — Debian Manpages
- dpkg-query(1) — dpkg — Debian buster — Debian Manpages
- add-apt-repository(1) — software-properties-common — Debian buster — Debian Manpages
- sources.list(5) — apt — Debian buster — Debian Manpages
- select-editor(1) — sensible-utils — Debian buster — Debian Manpages
参考情報の中では,「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 updatesudo apt full-upgradesudo apt install <package> | 
| 削除 | sudo apt remove <package>sudo apt purge <package>sudo apt autoremovesudo apt cleansudo apt autoclean | 
| インストール済みパッケージの確認 | apt list --installeddpkg -l | grep '^.i'apt-mark showmanualapt-mark showauto | 
| パッケージ中身の一覧 | dpkg -L <package>apt-file list <package> | 
| ファイルの該当パッケージの確認 | dpkg -S <file>apt-file search <file> | 
| 依存関係の確認 | apt show <package> | grep Dependsapt 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 autocleanremoveは指定したパッケージを削除する。ただし,設定ファイルを残す。一方,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 showautodpkg -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の設定やオフライン環境を想定したパッケージファイルのダウンロード,ファイルからのインストールなど,不足している情報はある。これらの情報は今のところ必要に迫られていないので,今後必要になったタイミングで情報を追加したい。

