Debian パッケージの管理

May 14, 2018

パッケージ管理とは

パッケージのインストール/アンインストールやアップデート作業において、どのようなパッケージがどこにインストールされているかを管理したり、パッケージ間の競合を管理したりする仕組みを提供するのが、パッケージ管理システム。パッケージ管理システムにより、インストールやアンインストール、アップデート作業が容易となる。

パッケージ A に含まれるファイルをパッケージ B が利用している場合、パッケージ A なしではパッケージ B は利用できない。このようにあるパッケージが別のパッケージに依存する関係をパッケージの依存関係と呼ぶ。
また、パッケージ C によってインストールされているファイル D が、すでにパッケージ A によってインストールされているファイル D と競合するため、パッケージ C をインストールすると問題が発生する場合がある。これをパッケージの競合関係と呼ぶ。

パッケージ管理システムは依存関係や競合関係を監視し、依存関係や競合関係を損なうようなインストール/アンインストールには警告を出す。

Linux におけるパッケージ管理は大きく分けて Debian 形式と RPM 形式が存在する。

  • Debian 形式: Debian 系ディストリビューションで利用される形式で、パッケージ管理作業には dpkg コマンドや APT ツールが使用される
  • RPM 形式: Red Hat 系ディストリビューションで利用される形式で、パッケージ管理作業には rpm/yum コマンドが使用される

両者には互換性がないが、alien コマンドで相互に形式を変換することが可能。

パッケージ管理システムを使って、コンパイル済みのバイナリパッケージを扱う場合は、ソースからのインストールとは異なり、動作環境に依存する形となる。
そのため、ディストリビューションやバージョン、CPU アーキテクチャなどの動作環境が一致したパッケージを選択する必要がある。

dpkg コマンドを用いたパッケージ管理

Debian 形式のパッケージファイル名は以下のようになっている。

[書式] tree1.6.0-1i386.deb

それぞれ以下を表している。

tree パッケージの名称
1.6.0 バージョン番号
1 Debian リビジョン番号
i386 CPU アーキテクチャ
deb 拡張子

Debian 形式のパッケージを扱うには dpkg コマンドを用いる。

オプション 説明
-E すでに同バージョンがインストールされていればインストールしない
-G 既に新バージョンがインストールされていればインストールしない
-R (—recursive) ディレクトリ内を再帰的に処理する
アクション 説明
-r パッケージ名 (—remove) 設定ファイルを残してパッケージをアンインストールする
-P パッケージ名 (—purge) 設定ファイルも含め完全にパッケージをアンインストールする
-l 検索パターン (—list) インストール済みパッケージを検索して表示する
-S ファイル名検索パターン (—search) 指定したファイルがどのパッケージからインストールされたかを表示する (パターンにはワイルドカードが使用可能)
-L パッケージ名 (—listfiles) 指定パッケージからインストールされたファイルを一覧表示する
-s パッケージ名 (—status) パッケージの情報を表示する
—configure パッケージ名 展開されたパッケージを構成する
—unpack パッケージ名 パッケージを展開する (インストールはしない)

実際に apache2 のパッケージをダウンロードしてきて、インストールしてみる。

$ wget http://archive.ubuntu.com/ubuntu/pool/main/a/apache2/apache2_2.4.18-2ubuntu3.8_amd64.deb  
--2018-05-13 20:40:37--  http://archive.ubuntu.com/ubuntu/pool/main/a/apache2/apache2_2.4.18-2ubuntu3.8_amd64.deb  
  
$ ls  
apache2_2.4.18-2ubuntu3.8_amd64.deb  
  
$ sudo dpkg -i apache2_2.4.18-2ubuntu3.8_amd64.deb   
(Reading database ... 76940 files and directories currently installed.)  
Preparing to unpack apache2_2.4.18-2ubuntu3.8_amd64.deb ...  
Unpacking apache2 (2.4.18-2ubuntu3.8) over (2.4.18-2ubuntu3) ...  
Setting up apache2 (2.4.18-2ubuntu3.8) ...  
Processing triggers for man-db (2.7.5-1) ...  
Processing triggers for ufw (0.35-0ubuntu2) ...  
Processing triggers for systemd (229-4ubuntu21.1) ...  
Processing triggers for ureadahead (0.100.0-19) ...  
  
...  
  
$ sudo dpkg -s apache2  
Package: apache2  
Status: install ok installed  
Priority: optional  
Section: httpd  
Installed-Size: 490  
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>  
Architecture: amd64  
Version: 2.4.18-2ubuntu3.8  
  
...  
  

-S で指定したファイルがどのパッケージからインストールされたかを表示する。

$ dpkg -S '*/apache2'  
apache2-bin, apache2: /var/lib/apache2  
apache2: /etc/apache2  
apache2-data, apache2: /usr/share/apache2  
apache2: /etc/logrotate.d/apache2  
apache2: /var/log/apache2  
apache2: /usr/share/bug/apache2  
apache2-bin: /usr/sbin/apache2  
apache2: /etc/cron.daily/apache2  
apache2: /usr/share/doc/apache2  
apache2-bin: /usr/lib/apache2  
apache2: /etc/ufw/applications.d/apache2  
apache2: /var/cache/apache2  
apache2: /usr/share/lintian/overrides/apache2  
apache2: /etc/init.d/apache2  

設定ファイルも含めてアンインストール。

$ sudo dpkg --purge apache2  
(Reading database ... 76940 files and directories currently installed.)  
Removing apache2 (2.4.18-2ubuntu3.8) ...  
Purging configuration files for apache2 (2.4.18-2ubuntu3.8) ...  
dpkg: warning: while removing apache2, directory '/var/www/html' not empty so not removed  
Processing triggers for man-db (2.7.5-1) ...  
Processing triggers for ufw (0.35-0ubuntu2) ...  
  
$ dpkg -S '*/apache2'  
apache2-bin: /var/lib/apache2  
apache2-data: /usr/share/apache2  
apache2-bin: /usr/sbin/apache2  
apache2-bin: /usr/lib/apache2  

-L (—listfiles) でパッケージに含まれるファイルを表示。

$ dpkg -L apache2  
/.  
/usr  
/usr/sbin  
/usr/sbin/apache2ctl  
/usr/sbin/a2enmod  
/usr/sbin/a2query  
/usr/share  
/usr/share/apache2  
/usr/share/apache2/apache2-maintscript-helper  
/usr/share/apache2/ask-for-passphrase  

apt-get コマンド

apt-get は APT (Advanced Packaging Tool) というパッケージ管理ツールに含まれるコマンドで、依存関係を調整しながらパッケージのインストール/アップグレード/アンインストールを行う。
インターネット経由で最新パッケージの入手からインストールと依存関係の解決までできる。

オプション 説明
-d ファイルをダウンロードする (インストールはしない)
-s システムを変更せず動作をシミュレートする
サブコマンド 説明
dist-upgrade システムを最新にアップグレードする
install パッケージをインストールまたはアップグレードする
remove パッケージをアンインストールする
update パッケージデータベースを更新する
upgrade システムの全パッケージのうち、他のパッケージを削除しないものをアップグレードする

apt-get コマンドでパッケージ管理を行うには、/etc/apt/sources.list** にパッケージを管理しているサイトの URL を記述する。

$ cat /etc/apt/sources.list  
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to  
# newer versions of the distribution.  
deb http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ xenial main restricted  
deb-src http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ xenial main restricted  
  
## Major bug fix updates produced after the final release of the  
## distribution.  
deb http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ xenial-updates main restricted  
deb-src http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ xenial-updates main restricted  
  
...  
  

/etc/apt/sources.list ファイルの書式は以下の通り。

deb http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ xenial-updates main restricted

deb deb (deb パッケージを取得) または deb-src (ソースを取得)
http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ 取得先の URI
xenial-updates バージョン名
main restricted main: 公式にサポートされるソフトウェア、universe: コミュニティによってメンテナンスされるソフトウェア、restricted: デバイス用のプロプライエタリなドライバ、multiverse: 著作権もしくは法的な問題によって制限されたソフトウェア、contrib: フリーではない依存関係のあるソフトウェア、non-free: 利用と改変再配布に制限のあるソフトウェア
$ sudo apt-get install apache2  
Reading package lists... Done  
Building dependency tree         
Reading state information... Done  
Suggested packages:  
  www-browser apache2-doc apache2-suexec-pristine | apache2-suexec-custom  
The following NEW packages will be installed:  
  apache2  
0 upgraded, 1 newly installed, 0 to remove and 45 not upgraded.  
Need to get 0 B/86.8 kB of archives.  
  
...  
  
$ sudo apt-get remove apache2  
Reading package lists... Done  
Building dependency tree         
Reading state information... Done  
The following packages were automatically installed and are no longer required:  
  apache2-bin apache2-data apache2-utils libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap liblua5.1-0 ssl-cert  
Use 'sudo apt autoremove' to remove them.  
The following packages will be REMOVED:  
  apache2  
0 upgraded, 0 newly installed, 1 to remove and 45 not upgraded.  
  
...  
  

システムを一括して新しいバージョンにアップグレードする。
この際、重要性の高いパッケージをインストールするために既存のパッケージを削除することがある。安定板のマイナーバージョンアップのように、削除の伴わないパッケージのアップグレードを実行するには、apt-get upgrade を実行する。
これは、システムの全パッケージのうち、他のパッケージを削除しないもののみをアップグレードする。

$ sudo apt-get dist-upgrade  
Reading package lists... Done  
Building dependency tree         
Reading state information... Done  
Calculating upgrade... Done  
The following packages were automatically installed and are no longer required:  
  apache2-bin apache2-data apache2-utils libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap liblua5.1-0 ssl-cert  
Use 'sudo apt autoremove' to remove them.  
The following packages will be upgraded:  
  apparmor apport apt apt-transport-https   
  
...  

apt-cache コマンド

apt-cache はパッケージ情報を照会* 検索できるコマンド。パッケージがインストールされている必要はない。

サブコマンド 説明
search キーワード 指定したキーワードを含むパッケージを検索する
show パッケージ名 パッケージについての一般的な情報を表示する
showpkg パッケージ名 パッケージについての詳細な情報を表示する
depends 指定したパッケージの依存関係情報を表示する
$ apt-cache search apache2  
apache2 - Apache HTTP Server  
apache2-bin - Apache HTTP Server (modules and other binary files)  
apache2-data - Apache HTTP Server (common files)  
apache2-dbg - Apache debugging symbols  
apache2-dev - Apache HTTP Server (development headers)  
apache2-doc - Apache HTTP Server (on-site documentation)  
  
...  
  
$ apt-cache show apache2  
Package: apache2  
Architecture: amd64  
Version: 2.4.18-2ubuntu3.8  
Priority: optional  
Section: web  
Origin: Ubuntu  
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>  
Original-Maintainer: Debian Apache Maintainers <debian-apache@lists.debian.org>  
Bugs: https://bugs.launchpad.net/ubuntu/+filebug  
Installed-Size: 490  
Provides: httpd, httpd-cgi  
Pre-Depends: dpkg (>= 1.17.14)  
Depends: lsb-base, procps, perl, mime-support, apache2-bin (= 2.4.18-2ubuntu3.8), apache2-utils (>= 2.4), apache2-data (= 2.4.18-2ubuntu3.8)  
Recommends: ssl-cert  
  
...  
  
$ apt-cache depends apache2  
apache2  
  PreDepends: dpkg  
  Depends: lsb-base  
  Depends: procps  
  Depends: perl  
  Depends: mime-support  
  Depends: apache2-bin  
  Depends: apache2-utils  
  Depends: apache2-data  
  Conflicts: <apache2.2-bin>  
  Conflicts: <apache2.2-common>  
  Recommends: ssl-cert  
  
...  
  

aptitude コマンド

aptitude は apt-get よりも高度な機能を持ったコマンド。正規表現を使ってコマンド検索ができる。

サブコマンド 説明
update
show パッケージ名 パッケージ情報を表示する
search パターン 指定したパターンでパッケージを検索する
install パッケージ名 パッケージをインストールまたはアップグレードする
remove パッケージ名 設定ファイルを残してパッケージをアンインストールする
purge パッケージ名 設定ファイルも含めてパッケージをアンインストールする
download パッケージ名 パッケージファイルをダウンロードする
full-upgrade システムの全パッケージを最新にアップデートする
safe-upgrade システムの全パッケージのうち、他のパッケージを削除しないものをアップグレードする
$ aptitude search "~napache2~i"       
idA apache2-bin                 - Apache HTTP Server (modules and other binary files)  
idA apache2-data               	- Apache HTTP Server (common files)  
idA apache2-utils               - Apache HTTP Server (utility programs for web servers)   
検索パターン 説明
~n 正規表現 パッケージ名が正規表現パターンにマッチするパッケージを検索する
~d 正規表現 パッケージの説明が正規表現パターンにマッチするパッケージを検索する
~V 正規表現 パッケージのバージョンが正規表現パターンにマッチするパッケージを検索する
-i インストール済みのパッケージを検索する
-U 更新可能なパッケージを検索する
-M 自動的にインストールされたパッケージを検索する

 © 2023, Dealing with Ambiguity