目次


Linux の 101 試験対策

Debian によるパッケージ管理

新しいソフトウェアを追加して、システムを最新の状態に維持する

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: Linux の 101 試験対策

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:Linux の 101 試験対策

このシリーズの続きに乞うご期待。

概要

このチュートリアルでは、Linux システム上で Debian パッケージ管理ツールを使用してパッケージを管理する方法を学びます。この記事で説明する内容は以下のとおりです。

  • Debian バイナリー・パッケージをインストール、再インストール、アップグレード、および削除する方法
  • 特定のファイルやライブラリーが含まれるパッケージを、該当するパッケージがインストールされていなくても検出する方法
  • パッケージに関する情報 (バージョン、内容、依存関係、パッケージ整合性、インストール状況など) を、該当するパッケージがインストールされていなくても取得する方法

このチュートリアルは、Linux Professional Institute の Linux Server Professional (LPIC-1) 101 試験の主題 102 の 102.4 の試験対策に役立ちます。この試験項目の重要度は 3 です。

パッケージの管理について

かつて、Linux プログラムの多くはソース・コードとして配布されていました。このソース・コードを、ユーザーが必要な man ページ、構成ファイルなどと併せてビルドして 1 つのプログラム、あるいは一連のプログラムに組み込むという仕組みでしたが、最近では、ほとんどの Linux ディストリビューターが事前にビルドされたプログラムを使用しています。これらのプログラムのセットが、パッケージと呼ばれるものです。パッケージは、該当するディストリビューションにすぐにインストールできる状態で配布されます。このチュートリアルでは、パッケージのインストール、更新、削除を支援するパッケージ管理ツールについて説明します。このチュートリアルで焦点とするパッケージ管理システムは、Debian と Debian から派生した Ubuntu などのディストリビューションで使用されている Apt (Advanced Package Tool) です。この連載の別のチュートリアル「Linux の 101 試験対策: RPM および YUM によるパッケージ管理」では、Red Hat のパッケージ管理ツールについて説明しています。

ユーザーの目から見ると、基本的なパッケージ管理機能は一連のコマンドで提供されています。Linux の使い易さを向上させようとする Linux 開発者たちの努力の末、基本ツールは他のツールによって補完されるようになりました。その一例は GUI ツールです。GUI ツールによって、基本ツールの複雑さはある程度、エンド・ユーザーから隠されます。このチュートリアルともう 1 つのチュートリアル「Linux の 101 試験対策: RPM および YUM によるパッケージ管理」では、基本ツールを焦点としていますが、基本ツール以外のツールについても、皆さんが詳しく調べられるように取り上げています。

前提条件

この連載のチュートリアルを最大限に活用するには、Linux の基礎知識と、チュートリアルに記載されたコマンドを演習できる実際の Linux システムが必要です。プログラムのバージョンによって出力のフォーマットに違いが出てくる場合もあるため、コマンドの実行結果は必ずしもここに記載するリストや図とまったく同じであるとは限りません。特に、記載する出力のほとんどは、お使いのシステムにインストールされているパッケージによって大きく左右されます。チュートリアルの出力と実際の出力が違っているとしても、重要な共通点は認識できるはずです。このチュートリアルにおける例は、32 ビット Ubuntu 14.04 LTS システムでの例です。

Debian パッケージのインストール

Linux システムをインストールするときには、さまざまなパッケージをインストールするのが通常です。インストールする一連のパッケージは、システムの用途 (サーバー、デスクトップ、または開発者のワークステーションなど) に合わせてカスタマイズすることができます。そしてある時点で、機能を追加するために新しいパッケージをインストールしなければならなくなったり、既存のパッケージの更新や、不要になったパッケージの削除や、新しいパッケージがリリースされたことで廃止されたパッケージの削除が必要になったりすることがあります。以降のセクションでは、これらのタスクを行う方法を説明するとともに、特定のコマンドが含まれている可能性のあるパッケージを見つけるなどといった、タスクに関連する課題に取り組みます。

例えば、Fortran プログラムをコンパイルしたいというあなたに、同僚たちが gfortran コマンドを使用するように提案したとします。そこであなたは、gfortran –helpwhich gfortran、あるいは type gfortran を使ってみることにしました。けれどもシステムが gfortran を見つけられないとすると、リスト 1 のような出力が表示されます。

リスト 1. 見つからない gfortran コマンド
ian@attic-u14:~$ gfortran --help
bash: gfortran: command not found

ian@attic-u14:~$ gfortran --help
The program 'gfortran' is currently not installed. You can install it by typing:
sudo apt-get install gfortran

ian@attic-u14:~$ which gfortran

ian@attic-u14:~$ type gfortran
bash: type: gfortran: not found

リスト 1 の 2 番目の出力に参考になる解決策が示されなかった場合には、同僚のところに戻って、どのパッケージをインストールしたら良いかを尋ねることもできますし、単純に gfortran コマンドは gfortran パッケージにあるだろうと見当をつけることもできます。大抵、この見当は外れませんが、いつも当たるとは限りません。正しいパッケージを見つける方法については後で説明しますが、この例で使用するのは gfortran パッケージです。このパッケージをインストールするには、install オプションを指定した apt-get コマンドを使用します (リスト 2 を参照)。apt-get コマンドは、依存関係を満たすために必要な追加パッケージを判断してから、インストールするすべてのパッケージをリストアップします。その時点で、インストールを続行するかどうかを尋ねるプロンプトが出されます。以下の例では「y」と応答し、gfortran、そして追加で必要なパッケージとして gfortran-4.8、libgfortran-4.8-dev、libgfortran3 をインストールしています。

リスト 2. apt-get コマンドによる gfortran のインストール
ian@attic-u14:~$ sudo apt-get install gfortran
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  gfortran-4.8 libgfortran-4.8-dev libgfortran3
Suggested packages:
  gfortran-multilib gfortran-doc gfortran-4.8-multilib gfortran-4.8-doc
  libgfortran3-dbg
The following NEW packages will be installed:
  gfortran gfortran-4.8 libgfortran-4.8-dev libgfortran3
0 upgraded, 4 newly installed, 0 to remove and 23 not upgraded.
Need to get 0 B/5,039 kB of archives.
After this operation, 17.6 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Selecting previously unselected package libgfortran3:i386.
(Reading database ... 202395 files and directories currently installed.)
Preparing to unpack .../libgfortran3_4.8.4-2ubuntu1~14.04_i386.deb ...
Unpacking libgfortran3:i386 (4.8.4-2ubuntu1~14.04) ...
Selecting previously unselected package libgfortran-4.8-dev:i386.
Preparing to unpack .../libgfortran-4.8-dev_4.8.4-2ubuntu1~14.04_i386.deb ...
Unpacking libgfortran-4.8-dev:i386 (4.8.4-2ubuntu1~14.04) ...
Selecting previously unselected package gfortran-4.8.
Preparing to unpack .../gfortran-4.8_4.8.4-2ubuntu1~14.04_i386.deb ...
Unpacking gfortran-4.8 (4.8.4-2ubuntu1~14.04) ...
Selecting previously unselected package gfortran.
Preparing to unpack .../gfortran_4%3a4.8.2-1ubuntu6_i386.deb ...
Unpacking gfortran (4:4.8.2-1ubuntu6) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Setting up libgfortran3:i386 (4.8.4-2ubuntu1~14.04) ...
Setting up libgfortran-4.8-dev:i386 (4.8.4-2ubuntu1~14.04) ...
Setting up gfortran-4.8 (4.8.4-2ubuntu1~14.04) ...
Setting up gfortran (4:4.8.2-1ubuntu6) ...
update-alternatives: using /usr/bin/gfortran to provide /usr/bin/f95 (f95) in auto mode
Processing triggers for libc-bin (2.19-0ubuntu6.6) ...

リスト 2 の出力を見ると、apt-get はどこかから (場所については後で説明します) パッケージのリストを読み取って依存関係のツリーを作成した後、現在インストールされていない必須のパッケージが gfortran-4.8、libgfortran-4.8-dev、libgfortran3 であると判断していることがわかります。また、パッケージとして gfortran-multilib、gfortran-doc、gfortran-4.8-multilib、gfortran-4.8-doc、libgfortran3-dbg をインストールするよう推奨しています。さらにディスク領域の使用状況などの要約情報を示し、インストールを続行するかどうかを尋ねるプロンプトを出してから、gfortran を必須パッケージと一緒にインストールするという流れになっています。通常、Debian パッケージには .deb という拡張子が付いています。以下の行から、Debian パッケージがダウンロードされ、解凍されていることがわかります。

Preparing to unpack .../gfortran-4.8_4.8.4-2ubuntu1~14.04_i386.deb ...
Unpacking gfortran-4.8 (4.8.4-2ubuntu1~14.04) ...

パッケージをインストールするのではなく、パッケージが他のパッケージに依存しているかどうかを調べたいとしたら、どうすればよいでしょう?その場合には、apt-get コマンドで -s (simulate (シミュレート) の略) オプションを使用します。これと同等の機能を持つオプションには、--just-print および \--dry-run があります。これらのオプションについての詳細は、man ページを参照してください。リスト 3 に、gfortran-doc パッケージのインストールをシミュレーションした場合の出力を記載します。

リスト 3. シミュレーションした gfortran-doc のインストール
ian@attic-u14:~$ sudo apt-get install -s gfortran-doc
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  gfortran-4.8-doc
The following NEW packages will be installed:
  gfortran-4.8-doc gfortran-doc
0 upgraded, 2 newly installed, 0 to remove and 23 not upgraded.
Inst gfortran-4.8-doc (4.8.4-2ubuntu1~14.04 Ubuntu:14.04/trusty-updates [all])
Inst gfortran-doc (4:4.8.2-1ubuntu6 Ubuntu:14.04/trusty [i386])
Conf gfortran-4.8-doc (4.8.4-2ubuntu1~14.04 Ubuntu:14.04/trusty-updates [all])
Conf gfortran-doc (4:4.8.2-1ubuntu6 Ubuntu:14.04/trusty [i386])

ご覧のように、gfortran-doc というドキュメント・パッケージには gfortran-4.8-doc パッケージが必要ですが、gfortran-4.8-doc パッケージは gfortran-doc パッケージを必要とはしていません。ご自分で試してみてください。

パッケージの保管場所

前のセクションで Debian パッケージをインストールする方法を学びましたが、パッケージはどこにあるのでしょうか。apt-getはどうやってパッケージをダウンロードしてくる場所を知るのでしょうか。apt-get はどこかからパッケージのリストを読み取ると説明しましたが、その場所を知るための出発点は /etc/apt/sources.list です。このリストが apt-get にパッケージの検索先を指示します。CD-ROM や ローカル・ファイルシステムが検索先として指示される場合もあれば、http または ftp を使ってネットワークで検索する場合もあります。他のソースは、/etc/apt/sources.list.d ディレクトリーに追加することができます。

リスト 4 に、私のシステムに置かれている /etc/apt/sources.list から抜粋した冒頭の数行を記載します。最初の行のディストリビューション CD がコメントアウトされている (行頭の #) ことに注意してください。あまり頻繁に更新されていない新しいパッケージをいくつかインストールしなければならない場合には、この行のコメントを外して、ディストリビューション CD や DVD からインストールすればよいですが、ブロードバンド・ネットワーク接続を使用している場合、あるいは頻繁に更新しなければならない場合には、/etc/apt/sources.list に指定されたネットワーク・ソースから最新レベルの追加パッケージをダウンロードしたほうが効率的です。

リスト 4. /etc/apt/sources.list
ian@attic-u14:~$ cat /etc/apt/sources.list
#deb cdrom:[Ubuntu 14.04.2 LTS _Trusty Tahr_ - Release i386 (20150218.1)]/ trusty main restricted

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://us.archive.ubuntu.com/ubuntu/ trusty main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ trusty main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://us.archive.ubuntu.com/ubuntu/ trusty-updates main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ trusty-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://us.archive.ubuntu.com/ubuntu/ trusty universe
deb-src http://us.archive.ubuntu.com/ubuntu/ trusty universe
deb http://us.archive.ubuntu.com/ubuntu/ trusty-updates universe
deb-src http://us.archive.ubuntu.com/ubuntu/ trusty-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu 
## team, and may not be under a free licence. Please satisfy yourself as to 
## your rights to use the software. Also, please note that software in 
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://us.archive.ubuntu.com/ubuntu/ trusty multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ trusty multiverse
deb http://us.archive.ubuntu.com/ubuntu/ trusty-updates multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ trusty-updates multiverse

apt-get や同様のツールは、ローカル・データベースを使用してインストール済みパッケージを判断します。これらのツールは、インストール済みパッケージのレベルと入手可能なレベルとを比較するために、入手可能なレベルに関する情報を /etc/apt/sources.list に記載されたソースから取得してローカル・システムに保管します。ローカル・データベースに保管された情報を /etc/apt/sources.list に指定されたソースと同期させるには、apt-get update コマンドを使用します。このコマンドは、パッケージをインストールまたは更新する前に実行してください。また、/etc/apt/sources.list を変更した場合、またはファイルを /etc/apt/sources.list.d に追加した場合には、その後に必ずこのコマンドを実行しなければなりません。

Debian パッケージの削除

パッケージを削除するには、apt-get コマンドに remove を指定します。パッケージの削除の実行シミュレーションをした様子をリスト 5 に示します。

リスト 5. gfortran パッケージの削除のシミュレーション
ian@attic-u14:~$ sudo apt-get remove -s gfortran
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  gfortran-4.8 libgfortran-4.8-dev libgfortran3
Use 'apt-get autoremove' to remove them.
The following packages will be REMOVED:
  gfortran
0 upgraded, 0 newly installed, 1 to remove and 23 not upgraded.
Remv gfortran [4:4.8.2-1ubuntu6]

前のセクションで gfortran の必須パッケージとしてインストールした gfortran-4.8、libgfortran-4.8-dev、libgfortran3 は、実際には自動的に削除されませんが、出力にはこれらのパッケージが不要になったことが示されています。apt-getautoremove 関数 (または同等の remove 関数と --auto-remove オプション) を使用すると、指定したパッケージと併せ、依存関係としてインストールされたもののどのインストール済みパッケージにも必要でなくなったすべてのパッケージを削除することができます。削除されるパッケージには、削除しようとしているもの以外のパッケージによってインストールされた依存関係も含めることができます。リスト 6 に、gfortran パッケージとその依存関係の削除をシミュレーションした様子を示します。gfortran だけを削除した後、それによって新たに依存性がなくなった依存関係を apt-get autoremove によってクリーンアップしています。

リスト 6. gfortran パッケージと依存関係の削除
ian@attic-u14:~$ # Simulate removal of gfortran and dependencies
ian@attic-u14:~$ sudo apt-get autoremove -s gfortran
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  gfortran gfortran-4.8 libgfortran-4.8-dev libgfortran3
0 upgraded, 0 newly installed, 4 to remove and 23 not upgraded.
Remv gfortran [4:4.8.2-1ubuntu6]
Remv gfortran-4.8 [4.8.4-2ubuntu1~14.04]
Remv libgfortran-4.8-dev [4.8.4-2ubuntu1~14.04]
Remv libgfortran3 [4.8.4-2ubuntu1~14.04]
ian@attic-u14:~$ # Remove just gfortran
ian@attic-u14:~$ sudo apt-get remove gfortran
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  gfortran-4.8 libgfortran-4.8-dev libgfortran3
Use 'apt-get autoremove' to remove them.
The following packages will be REMOVED:
  gfortran
0 upgraded, 0 newly installed, 1 to remove and 23 not upgraded.
After this operation, 33.8 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 202421 files and directories currently installed.)
Removing gfortran (4:4.8.2-1ubuntu6) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
ian@attic-u14:~$ # Autoremove unneeded packages
ian@attic-u14:~$ sudo apt-get autoremove
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  gfortran-4.8 libgfortran-4.8-dev libgfortran3
0 upgraded, 0 newly installed, 3 to remove and 23 not upgraded.
After this operation, 17.6 MB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 202416 files and directories currently installed.)
Removing gfortran-4.8 (4.8.4-2ubuntu1~14.04) ...
Removing libgfortran-4.8-dev:i386 (4.8.4-2ubuntu1~14.04) ...
Removing libgfortran3:i386 (4.8.4-2ubuntu1~14.04) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Processing triggers for libc-bin (2.19-0ubuntu6.6) ...

ご覧のように、パッケージ名を指定しないで apt-getautoremove 関数を使用すると、インストールされたけれども不要になったため使用されていないすべてのパッケージがシステムから削除されます。また、apt-get purge オプションを使って構成情報を削除することもできます。詳細については、man ページを参照してください。

Debian パッケージの更新

個々のパッケージを更新する場合には、再度 install オプションを指定した apt-get を使用します。リスト 7 に、私のシステムにインストールされている ghostscript パッケージを例に、パッケージの更新方法を示します。必須パッケージである ghostscript-x と libgs9 も更新されることに注意してください。パッケージを更新する前には必ず apt-get update を実行して、ローカル・データベースに入手可能な最新の更新を反映してください。

リスト 7. 単一パッケージの更新
ian@attic-u14:~$ sudo apt-get install ghostscript
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  ghostscript-x libgs9
Suggested packages:
  hpijs
The following packages will be upgraded:
  ghostscript ghostscript-x libgs9
3 upgraded, 0 newly installed, 0 to remove and 20 not upgraded.
Need to get 0 B/1,967 kB of archives.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] y
(Reading database ... 202535 files and directories currently installed.)
Preparing to unpack .../ghostscript_9.10~dfsg-0ubuntu10.3_i386.deb ...
Unpacking ghostscript (9.10~dfsg-0ubuntu10.3) over (9.10~dfsg-0ubuntu10.2) ...
Preparing to unpack .../ghostscript-x_9.10~dfsg-0ubuntu10.3_i386.deb ...
Unpacking ghostscript-x (9.10~dfsg-0ubuntu10.3) over (9.10~dfsg-0ubuntu10.2) ...
Preparing to unpack .../libgs9_9.10~dfsg-0ubuntu10.3_i386.deb ...
Unpacking libgs9 (9.10~dfsg-0ubuntu10.3) over (9.10~dfsg-0ubuntu10.2) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Setting up libgs9 (9.10~dfsg-0ubuntu10.3) ...
Setting up ghostscript (9.10~dfsg-0ubuntu10.3) ...
Setting up ghostscript-x (9.10~dfsg-0ubuntu10.3) ...
Processing triggers for libc-bin (2.19-0ubuntu6.6) ...

すべてのパッケージの更新、または新しいディストリビューションへのアップグレード

個々のパッケージを更新するのではなく、システム上のすべてのパッケージを更新する場合には、apt-get upgrade コマンドを使用します。同様に、apt-get dist-upgrade はディストリビューションを新しいレベルにマイグレードするのにも役立ちます。

apt-get のその他の機能およびオプションについての詳細は、man ページを参照してください。

APT 構成 — apt.conf ファイル

apt-get の man ページを見てみると、多数のオプションがあることがわかります。apt-get コマンドを何度も使用してみて、デフォルト・オプションが好ましくないと判断した場合には、新しいデフォルトを /etc/apt/apt.conf に設定することができます。スクリプトが apt.conf ファイルを問い合わせるには、apt-config プログラムを使用することができます。apt.conf ファイルおよび apt-config プログラムについての詳細は、man ページを参照してください。

Debian パッケージの構成変更

APT に組み込まれている debconf という機能は、インストールされた後にパッケージの構成を行います。この機能を使用するパッケージの場合 (すべてのパッケージがこの機能を使用するわけではありません)、インストールした後にパッケージの構成を変更することができます。パッケージを再構成するのに最も簡単な方法は、dpkg-reconfigure コマンドを使用することです。例えば、adduser コマンドを使うと、すべてのシステム・ユーザーが読み取ることのできるホーム・ディレクトリーを作成することができますが、プライバシー上の理由でそうすることを望まない場合もあります。同様に、tzdata パッケージは dpkg-reconfigure tzdata を実行することによる、タイムゾーンの変更をサポートしています。dpkg-reconfigure を実行するには、root 権限が必要です。

図 1 には、sudo dpkg-reconfigure tzdata を実行すると最初に尋ねられる質問が示されています。あらかじめ設定されているデフォルトは、この図のように America ではなく、お使いのシステムを反映したデフォルトになっている場合もあります。このテキスト・モードの画面をナビゲートするには、Tab キーとカーソル移動キーを使用します。

図 1. dpkg-reconfigure を使用したタイムゾーンの設定変更
dpkg-reconfigure tzdata コマンドを実行すると表示される、タイムゾーンの選択項目を示すスクリーン・ショット
dpkg-reconfigure tzdata コマンドを実行すると表示される、タイムゾーンの選択項目を示すスクリーン・ショット

リスト 8 に示すように、パッケージの現在の構成を表示するために、debconf-show を実行することもできます。

リスト 8. debconf-show を使用して tzdata の構成を表示する
ian@attic-u14:~$ sudo debconf-show tzdata
  tzdata/Zones/Pacific:
  tzdata/Zones/Europe:
  tzdata/Zones/Indian:
  tzdata/Zones/Australia:
* tzdata/Areas: America
  tzdata/Zones/Arctic:
  tzdata/Zones/Atlantic:
* tzdata/Zones/Etc: UTC
* tzdata/Zones/America: New_York
  tzdata/Zones/US:
  tzdata/Zones/Africa:
  tzdata/Zones/SystemV:
  tzdata/Zones/Antarctica:
  tzdata/Zones/Asia:

Debian パッケージ情報

ここからは、パッケージに関する情報を取得するためのツールを取り上げます。これらのツールのなかには他の機能を持つものもありますが、ここでは情報を取得する方法に焦点を絞ります。

dpkg によるパッケージのステータス情報の取得

APT システムには、dpkg という別のツールも組み込まれています。dpkg は中間レベルのパッケージ管理ツールであり、パッケージのインストールと削除を行えるだけでなく、パッケージのステータス情報を表示することもできます。dpkg の構成は、/etc/dpkg/dpkg.cfg で制御することができます。また、ホーム・ディレクトリー内に置かれた .dpkg.cfg ファイルを使って詳細な構成を行うことも可能です。

dpkg ツールはファイルシステム内の /var/lib/dpkg ツリーに含まれる多数のファイルを使用します。そのうち、システム上のパッケージに関するステータス情報が含まれているのは /var/lib/dpkg/status ファイルです。リスト 9 では dpkg -s を使用して、以前のセクションで更新した tzdata パッケージと、同じく以前のセクションで削除した gfortran パッケージのステータス情報を表示しています。構成が残っている場合は (そのようなことも、ときにはあります)、purge オプションを使用すると、ダウンロードしたパッケージをキャッシュから消去し、構成情報を削除することができます。

リスト 9. tzdata パッケージのステータス
ian@attic-u14:~$ dpkg -s gfortran tzdata
dpkg-query: package 'gfortran' is not installed and no information is available

Package: tzdata
Status: install ok installed
Priority: required
Section: libs
Installed-Size: 1538
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: all
Multi-Arch: foreign
Version: 2015d-0ubuntu0.14.04
Replaces: libc0.1, libc0.3, libc6, libc6.1
Provides: tzdata-jessie
Depends: debconf (>= 0.5) | debconf-2.0
Description: time zone and daylight-saving time data
 This package contains data required for the implementation of
 standard local time for many representative locations around the
 globe. It is updated periodically to reflect changes made by
 political bodies to time zone boundaries, UTC offsets, and
 daylight-saving rules.
Homepage: http://www.iana.org/time-zones
Original-Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.

パッケージとパッケージに含まれるファイルに関する情報の取得

パッケージに含まれているファイルや、特定のファイルがどのパッケージに属しているかを調べたいことがあるかもしれませんが、そのような場合にはいずれも dpkg を使用します。リスト 10 に、dpkg -L を使用して、libparted パッケージによってインストールされたファイル (ディレクトリーを含む) を表示する場合を示します。ほとんどのパッケージについては、特定のバージョンを指定しなくても、パッケージ名を指定するだけで十分ですが、なかには複数のバージョンが用意されているパッケージもあります。このようなパッケージについては、dpkg を使ってパッケージの情報を問い合わせる際に、詳細なパッケージ名を指定する必要があるかもしれません。

リスト 10. libparted パッケージに含まれるファイルを調べる場合
ian@attic-u14:~$ dpkg -L libparted
dpkg-query: package 'libparted' is not installed
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.
ian@attic-u14:~$ dpkg -L libparted0debian1 
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/libparted0debian1
/usr/share/doc/libparted0debian1/changelog.Debian.gz
/usr/share/doc/libparted0debian1/copyright
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/libparted0debian1
/lib
/lib/i386-linux-gnu
/lib/i386-linux-gnu/libparted.so.0.0.1
/lib/i386-linux-gnu/libparted.so.0

特定のファイルが含まれているパッケージを見つけるには、dpkg の -S オプションを使用します (リスト 11 を参照)。この場合、パッケージ名はファイル名の左側に表示されます。

リスト 11. 特定のファイルが含まれるパッケージを調べる場合
ian@attic-u14:~$ dpkg -S /lib/i386-linux-gnu/libparted.so.0
libparted0debian1:i386: /lib/i386-linux-gnu/libparted.so.0

場合によっては、ファイルがどのパッケージにも属されていないかのように表示されることがあります。その場合、パッケージがどこにあるのかを突き止めるために、追加で調査が必要になります。例えばインストールのセットアップのステップでは、シンボリック・リンクを作成するなどのタスクが行われる可能性があります。シンボリック・リンクは、パッケージの内容としては表示されません。比較的最近のことですが、Linux システムに、update-alternatives コマンドを使って管理する alternatives システムが追加されました。alternatives は java などのコマンドに対して頻繁に作成されます (java コマンドは、openJDK、Oracle、あるいは IBM の Java によるコマンドの可能性があります)。

リスト 12 では、which コマンドを使用して java を実行しようとすると何が呼び出されるかを調べた後、ls コマンドを使用して java コマンドのシンボリック・リンクが何に対して張られているのかを確認しています。/etc/alternatives ディレクトリーへリンクが張られているということは、alternatives システムを使用していることを示唆していることから、update-alternatives コマンドを使用して詳細情報を調べています。最後に dpkg -S コマンドで java コマンドが openjdk-7-jre-headless に含まれていることを確認しています。alternatives システムをセットアップするには、openjdk-7-jre-headless パッケージに含まれるポストインストール・スクリプトを使うという方法もあります。

リスト 12. 複雑な dpkg -S の使用例
ian@attic-u14:~$ which java
/usr/bin/java
ian@attic-u14:~$ dpkg -S /usr/bin/java
dpkg-query: no path found matching pattern /usr/bin/java
ian@attic-u14:~$ ls -l $(which java)
lrwxrwxrwx 1 root root 22 Jul 24 18:06 /usr/bin/java -> /etc/alternatives/java
ian@attic-u14:~$ update-alternatives --display java
java - auto mode
  link currently points to /usr/lib/jvm/java-7-openjdk-i386/jre/bin/java
/usr/lib/jvm/java-7-openjdk-i386/jre/bin/java - priority 1071
  slave java.1.gz: /usr/lib/jvm/java-7-openjdk-i386/jre/man/man1/java.1.gz
Current 'best' version is '/usr/lib/jvm/java-7-openjdk-i386/jre/bin/java'.
ian@attic-u14:~$ dpkg -S /usr/lib/jvm/java-7-openjdk-i386/jre/bin/java
openjdk-7-jre-headless:i386: /usr/lib/jvm/java-7-openjdk-i386/jre/bin/java

aptitude の使用

前述のとおり、パッケージのステータス情報は /var/lib/dpkg/status に保持されます。また、dpkg はパッケージの情報を表示する以外の操作にも使えることを説明しました。代わってこのセクションで取り上げるのは、aptitude コマンドです。このコマンドは、APT パッケージ管理機能を操作するための、テキスト・ベースの全画面表示のインターフェースを提供します (ncurses を使用)。aptitude がインストールされていない場合には、apt-get を使用して aptitude をインストールすることができます。aptitude ではパッケージをインストールまたは削除できる他、パッケージを常に最新の状態にするか、あるいは現状のまま維持するかなどを示すステータス・フラグを制御することができます。aptitude コマンドを (root として) 実行すると、 図 2 のような画面が表示されます。

図 2. aptitude の実行
aptitude コマンドを実行すると表示される、入手可能なパッケージを表示するスクリーン・ショット
aptitude コマンドを実行すると表示される、入手可能なパッケージを表示するスクリーン・ショット

Enter キーを押して選択項目を展開または折り畳んだ後、ctrl-t を使ってメニュー・バーにアクセスしてください。 図 3 には、さまざまな更新があるなかで、私のシステムに適用できる更新の 1 つとして、新しいカーネル・バージョン 3.16.0.43.34 が示されています。左側の列に示されている「i」は、現在、このパッケージをインストールするとアップグレードできる状況であることを意味します。「Help (ヘルプ)」メニュー項目を選択すると、使用できる各種のオプションについての説明が表示されます。オプションには、パッケージを更新せずに現行のレベルで維持するというオプション、パッケージを削除するというオプション、または自動的にインストールして自動削除の対象にするというオプションがあります。以前のセクションで apt-getautoremove オプションについて触れましたが、これで、自動削除の対象となるパッケージを確認または制御する方法がわかったはずです。フラグの値を変更するには、「Help (ヘルプ)」で説明しているキーボード・ショートカットを使用するか、「Package (パッケージ)」メニュー項目を使用してください。

図 3. aptitude の実行とパッケージ・フラグの確認
aptitude コマンドを実行すると表示される、入手可能な更新とそれぞれのパッケージ・フラグを示すスクリーン・ショット
aptitude コマンドを実行すると表示される、入手可能な更新とそれぞれのパッケージ・フラグを示すスクリーン・ショット

パッケージを検索するには、スラッシュ (「/」) キーを使用します。例えば、前に削除した gfortran パッケージを再インストールする場合には、「/gfortran」と入力するだけでパッケージを検索することができます。検索結果として、gfortran パッケージではなく、例えば gfortran という文字が含まれる gfortran-doc が示された場合には、「n」キーを押して次の検索結果に進んでください。該当するパッケージが見つかったら、「Package (パッケージ)」メニューを使用して、そのパッケージにインストール対象としてのマークを付けます。

作業が完了したら、「Action (アクション)」 -> 「Install/remove packages (パッケージをインストール/削除)」を選択して (または、「G」を押すという方法もあります)、変更内容をシステムに適用します。変更内容を適用したくない場合には、中止オプションをクリックすることもできます。

メニュー・バーの「Help (ヘルプ)」を選択するか、または「?」(疑問符) を入力すると、いつでもヘルプを使用することができます。ヘルプを終了するには、「Q」キーを押します。

その他のツールによる Debian のアップグレード

前のセクションで説明したように、aptitude は、個々のパッケージをインストールまたは削除する場合だけでなく、システム上のすべてのパッケージを最新レベルにアップグレードする場合にも利用することができます。

aptitude の他にも、Debian システムには対話型のパッケージ管理インターフェースとして dselect、synaptic、update-manager、gnome-apt、wajig があります。このうち synaptic は、X Window System 用のグラフィカル・アプリケーションです。 図 4 に、お馴染みの gfortran パッケージがインストール対象としてマークされている synaptic ユーザー・インターフェースを示します。

図 4. synaptic を使用した gfortran のインストール
synaptic のパッケージ管理インターフェースを示すスクリーン・ショット
synaptic のパッケージ管理インターフェースを示すスクリーン・ショット

「Apply (適用)」ボタンをクリックすると、gfortran パッケージがインストールされ、更新が予定されているその他すべてのパッケージが更新されます。パッケージ・リストを最新の内容にするには、「Reload (再ロード)」ボタンをクリックします。GUI インターフェースを使い慣れているとしたら、apt-get、dpkg、あるいは dselect よりも synaptic のほうが使い易いと感じるかもしれません。

お使いのシステムに、update-manager が組み込まれている場合もあります。これは、システムを最新の状態に維持できるようにすることを目的に作成された X Window System アプリケーションです。このアプリケーションは、システムにインストールされていると定期的に起動されるため、システムを更新し忘れることがありません。Update Manager では、 図 3 に示されている一連の更新は 図 5 のように表示されます。aptitude の場合と同じく、更新は分類して表示されるので、どの更新が重要なセキュリティー更新であるかがわかります。 .

図 5. Update Manager の例
Update Manager のインターフェースを示すスクリーン・ショット
Update Manager のインターフェースを示すスクリーン・ショット

Debian パッケージの検索

Debian のパッケージ管理に関する最後のトピックとして、これからパッケージの検索方法について検討します。通常、この記事で説明した apt-get やその他のツールは、使用可能なパッケージのリストのなかかから必要となる可能性のある Debian パッケージを事前に把握します。この記事ではまだ使用していませんでしたが、システム上のパッケージ情報を検索するのに役立つコマンドとして、apt-cache があります。apt-cache では、正規表現を使って検索することができます (正規表現についての詳細は、「Linux の 101 試験対策: 正規表現を使用したテキスト・ファイルの検索」を参照)。リスト 13 に一例として、Linux ローダーが含まれるパッケージの名前を調べる方法を記載します。

リスト 13. apt-cache による Linux ローダーの検索
ian@attic-u14:~$ apt-cache search "linux loader"
lilo - LInux LOader - the classic OS boot loader
lilo-doc - LInux LOader - Documentation for the classic OS boot loader

前に説明した aptitude と synaptic も検索ツールを提供しています。synaptic を使用する場合、検索メニューには、パッケージ名だけを検索するオプションと、パッケージ名だけでなくパッケージの説明も検索するオプションがあることに注意してください。

これらのツールを使用してもパッケージが見つからない場合には、Debian のサイト (リンクについては、「参考文献」を参照) や他のインターネット・サイトに記載されているパッケージのリストから、パッケージが見つかる場合もあります。

大多数のパッケージ・ツールがパッケージに関して提供できる情報量は、パッケージがインストール済みの場合に比べ、パッケージがインストールされていない場合は大幅に減ります (例えばパッケージに含まれるファイルのリストなど)。まだインストールしていないプログラムが含まれるパッケージを検索する必要がある場合には、以下の方法があります。

  • プログラムが含まれている可能性のあるパッケージを推測し、パッケージをインストールせずにダウンロードだけして、ダウンロードしたパッケージ問い合わせを行う。
  • インターネットを検索する。
  • このチュートリアルの「見つからないコマンド」セクションで説明する command-not-found 機能を試してみる。

apt-get コマンドには、パッケージをダウンロードするだけで、インストールは行わない -d オプションがあります。また、--print-uris オプションを指定すると、パッケージのダウンロード元、そしてパッケージのチェックサムが表示されます。現行のチェックサムは SHA256 チェックサムの可能性が高いため、sha256sum コマンドを使用すれば、ダウンロードしたパッケージの完全性をチェックすることができます。URI とチェックサムの情報はパッケージをダウンロードした後には表示されないので、この情報はパッケージをダウンロードする前に取得してください。

一例として、gfortran コマンドが実際に gfortran パッケージに含まれているかどうかを調べたいとします。その場合には、リスト 14 に示すように apt-get を使用して gfortran パッケージをインストールすることはせずにダウンロードだけします。

リスト 14. apt-get を使用してダウンロードだけを行う
ian@attic-u14:~$ sudo apt-get install -d gfortran
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  gfortran-4.8 libgfortran-4.8-dev libgfortran3
Suggested packages:
  gfortran-multilib gfortran-doc gfortran-4.8-multilib gfortran-4.8-doc
  libgfortran3-dbg
The following NEW packages will be installed:
  gfortran gfortran-4.8 libgfortran-4.8-dev libgfortran3
0 upgraded, 4 newly installed, 0 to remove and 20 not upgraded.
Need to get 0 B/5,039 kB of archives.
After this operation, 17.6 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Download complete and in download only mode

パッケージをダウンロードしたら、dpkg--info オプションを使ってパッケージ情報を表示するか、あるいは --contents オプションを指定して、パッケージによってインストールされるファイルをリストアップします。ダウンロードしたパッケージ・ファイルは、通常 /var/cache/apt/archives/ に置かれます。リスト 15 に、ダウンロードしたパッケージ・ファイルを見つけて、そのファイルによってインストールされるバイナリーを調べる方法を示します (パッケージ・ファイルは .../bin/... ディレクトリーにインストールされるという前提です)。

リスト 15. dpkg を使用して .deb の内容を表示する
ian@attic-u14:~$ sudo find /var/cache -name "gfort*.deb"
/var/cache/apt/archives/gfortran_4%3a4.8.2-1ubuntu6_i386.deb
/var/cache/apt/archives/gfortran-4.8_4.8.4-2ubuntu1~14.04_i386.deb
ian@attic-u14:~$ sudo dpkg --contents \
> /var/cache/apt/archives/gfortran_4%3a4.8.2-1ubuntu6_i386.deb |
>  grep "/bin/"
drwxr-xr-x root/root         0 2014-04-07 18:49 ./usr/bin/
lrwxrwxrwx root/root         0 2014-04-07 18:49 ./usr/bin/gfortran -> gfortran-4.8
lrwxrwxrwx root/root         0 2014-04-07 18:49 ./usr/bin/i686-linux-gnu-gfortran -> gfortran-4.8

apt-get 以外の手段で .deb ファイルを見つけてダウンロードしたら、dpkg -iを実行してファイルをインストールすることができます。

APT アーカイブにダウンロードしたパッケージをインストールしないことにした場合は、apt-get clean を実行してダウンロードしたパッケージ・ファイルをすべて消去します。

以上の方法をすべて試してもパッケージが見つからない場合は、パッケージのソースとしてもう 1 つの可能性が考えられます。例えば、検索しているプログラムが、.deb ではなく、RPM としてパッケージ化されている場合を考えてみてください。その場合には、パッケージ・フォーマットを変換できる alien プログラムを試してみることができます。ただし、alien プログラムではすべてのパッケージ管理システムのすべての機能を別のフォーマットに変換できるわけではありません。使用する場合には、alien プログラムのマニュアルをよく読んでください。alien コマンドが含まれているパッケージを見つけるには、このチュートリアルで学んだことを活かしてください。

見つからないコマンド

リスト 1 に話を戻すと、gfortran コマンドを取得するために、どのパッケージをインストールすればよいかを伝える親切なメッセージがありましたが、どのようにしてそのパッケージがわかったのでしょうか? Bash シェルでコマンドを検索すると、コマンドが見つからない場合には、シェルが command_not_found_handle というシェル関数を検索します。リスト 16 に、この関数が私の Ubuntu 14 システムでどのように定義されているかを示します。

リスト 16. command_not_found_handle
ian@attic-u14:~$ type command_not_found_handle
command_not_found_handle is a function
command_not_found_handle () 
{ 
    if [ -x /usr/lib/command-not-found ]; then
        /usr/lib/command-not-found -- "$1";
        return $?;
    else
        if [ -x /usr/share/command-not-found/command-not-found ]; then
            /usr/share/command-not-found/command-not-found -- "$1";
            return $?;
        else
            printf "%s: command not found\n" "$1" 1>&2;
            return 127;
        fi;
    fi
}

command_not_found_handle 関数が存在する場合には、元のコマンドと元の引数を引数として使ってこの関数が呼び出され、関数の終了ステータスがシェルの終了ステータスになります。この関数が定義されていなければ、Bash シェルはエラー・メッセージを出力し、終了ステータス 127 を返します。通常、この関数が設定されるのはシステムの /etc/bash.bashrc ファイルです。リスト 16からわかるように、この関数は /usr/lib/command-not-found の有無をチェックし、存在する場合はこれを Python スクリプトとして実行します。/usr/lib/command-not-found が存在しないとしたら、その原因はおそらく、この関数を提供する command-not-found パッケージがシェル・セッションの開始後に削除されたためです。その場合、command_not_found_handle 関数は標準のシステムの振る舞いを模倣して終了ステータス 127 を返します。

PackageKit

パッケージのインストールについての説明を締めくくるには、PackageKit について触れないわけにはいきません。PackageKit はソフトウェアを簡単にインストール、更新できるようにするために設計された、クロス・プラットフォームのシステムで、さまざまなディストリビューションで使用されているソフトウェア・グラフィカル・ツールをまとめて 1 つに統合することを目的としています。PackageKit は、システムが起動したデーモンを使用します。つまり、デーモンは必要なときにだけ起動されるということです。Packagekit には Gnome 対応のバージョン (gnome-packagekit) と KDE 対応のバージョン (KPackageKit) があります。

この記事では、Debian パッケージ管理システムのほんの一部を説明しただけにすぎません。Debian にはパッケージ管理システムの他にも多くの機能があります。Debian の詳細と、この連載の他のチュートリアルへのリンクについては「参考文献」を参照してください。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=1024621
ArticleTitle=Linux の 101 試験対策: Debian によるパッケージ管理
publish-date=01072016