Linux の 101 試験対策: Debian によるパッケージ管理

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

Linux® システムでパッケージをインストール、アップグレード、および管理する方法を学んでください。この記事で焦点とするパッケージ管理システムは、APT (Advanced Packaging Tool) です。APT は、Debian、そして Debian から派生した Ubuntu などのディストリビューションで使用されています。この記事の内容は、Linux のシステム管理者として認定するための LPI 101 試験に備えるためにも、新しいソフトウェアを追加してシステムを最新の状態に維持する最善の方法を知る上でも役立ちます。

Ian Shields, Senior Programmer, IBM

Ian ShieldsIan Shields は、developerWorks Linux ゾーンの様々な Linux プロジェクトに関わっています。彼はノースキャロライナ州 Research Triangle Park にある IBM のシニア・プログラマーです。1973年にオーストラリアのキャンベラでシステム・エンジニアとして IBM に入社して以来、カナダのモントリオールやノースキャロライナ州 Research Triangle Park で、コミュニケーション・システムやパーベイシブ・コンピューティングに携わってきました。彼はいくつかの特許を保持しています。Australian National University にて純粋数学および哲学で学位を取得し、また North Carolina State University にてコンピューター・サイエンスで修士号と博士号を取得しています。Ian について詳しく知るには、My developerWorks で彼のプロフィールを見てください。


developerWorks 貢献著者レベル

2010年 5月 11日

この連載について

この連載は Linux システム管理タスクの学習に役立つだけでなく、LPIC-1 (Linux Professional Institute Certification レベル 1) 試験に備えるための教材にもなります。

連載の各記事についての説明とリンクについては、developerWorks の LPIC-1 ロードマップを参照してください。現在進行中のこのロードマップは、LPIC-1 試験の最新の目標 (2009年 4月) を反映しています。完成した記事はその都度ロードマップに追加されていきますが、当面は developerWorks の LPI 認定試験対策チュートリアルで同様の教材の以前のバージョンを調べてください。これらのバージョンは、2009年 4月より前の LPIC-1 目標に対応しています。

概要

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

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

この記事は、Linux Professional Institute Junior Level Administration (LPIC-1) 試験 101 の主題 102 の 102.4 の試験対策に役立ちます。この目標の重要度は 3 です。

前提条件

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


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

Ian とつながるには

Ian は developerWorks で人気の高いお馴染みの著者の 1 人です。Ian が書いたすべての developerWorks 記事を閲覧してみてください。また、My developerWorks では、Ian のプロフィールを調べることや、彼やその他の著者、そして他の読者とつながることができます。

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

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

APT、RPM、および YUM (このうち、RPM と YUM は Red Hat システム用のパッケージ管理ツールです) には多くの共通点があります。具体的に言うと、この 3 つではすべて、パッケージのインストールと削除を行うことが可能で、インストールされているパッケージに関する情報はデータベースに保持されます。さらに、いずれも基本的なコマンドライン機能を備えていると同時に、ツールを追加することによって、よりユーザー・フレンドリーなインターフェースを提供することができます。また、インターネットからパッケージを取得できるという共通点もあります。

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


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

例えば、Lisp を習得したいというあなたに、同僚たちが gcl コマンドを使用するように提案したとします。そこであなたは、gcl --helpwhich gcl、あるいは type gcl を使ってみることにしました。けれどもシステムが gcl を見つけられないとすると、リスト 1 のような出力が表示されます。

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

ian@pinguino:~$ gcl --help
The program 'gcl' is currently not installed.  You can install it by typing:
sudo apt-get install gcl
gcl: command not found

ian@pinguino:~$ which gcl

ian@pinguino:~$ type gcl
-bash: type: gcl: not found

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

リスト 2. apt-get コマンドによる gcl のインストール
ian@pinguino:~$ sudo apt-get install gcl
[sudo] password for ian: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  linux-headers-2.6.31-14 linux-headers-2.6.31-14-generic
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
  libreadline5
Suggested packages:
  gcl-doc
The following NEW packages will be installed:
  gcl libreadline5
0 upgraded, 2 newly installed, 0 to remove and 30 not upgraded.
Need to get 47.1MB of archives.
After this operation, 157MB of additional disk space will be used.
Do you want to continue [Y/n]? y
Get:1 http://us.archive.ubuntu.com karmic/main libreadline5 5.2-6 [140kB]
Get:2 http://us.archive.ubuntu.com karmic/universe gcl 2.6.7-45ubuntu1 [47.0MB]
Fetched 47.1MB in 1min 33s (502kB/s)
Preconfiguring packages ...
Selecting previously deselected package libreadline5.
(Reading database ... 142156 files and directories currently installed.)
Unpacking libreadline5 (from .../libreadline5_5.2-6_i386.deb) ...
Selecting previously deselected package gcl.
Unpacking gcl (from .../gcl_2.6.7-45ubuntu1_i386.deb) ...
Processing triggers for man-db ...
Setting up libreadline5 (5.2-6) ...

Setting up gcl (2.6.7-45ubuntu1) ...
install/gcl: Handling install for emacsen flavor emacs22
Loading 00debian-vars...
No /etc/mailname. Reverting to default...
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...
Loading debian-ispell...
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...
Loading /etc/emacs/site-start.d/50gcl.el (source)...
Wrote /usr/share/emacs22/site-lisp/gcl/add-default.elc
Wrote /usr/share/emacs22/site-lisp/gcl/ansi-doc.elc
Wrote /usr/share/emacs22/site-lisp/gcl/dbl.elc
Wrote /usr/share/emacs22/site-lisp/gcl/doc-to-texi.elc
Wrote /usr/share/emacs22/site-lisp/gcl/gcl.elc
Wrote /usr/share/emacs22/site-lisp/gcl/man1-to-texi.elc
Wrote /usr/share/emacs22/site-lisp/gcl/smart-complete.elc
Wrote /usr/share/emacs22/site-lisp/gcl/sshell.elc
install/gcl: Handling install for emacsen flavor emacs23
Loading 00debian-vars...
No /etc/mailname. Reverting to default...
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...
Loading debian-ispell...
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...
Loading /etc/emacs/site-start.d/50gcl.el (source)...
Wrote /usr/share/emacs23/site-lisp/gcl/add-default.elc
Wrote /usr/share/emacs23/site-lisp/gcl/ansi-doc.elc
Wrote /usr/share/emacs23/site-lisp/gcl/dbl.elc
Wrote /usr/share/emacs23/site-lisp/gcl/doc-to-texi.elc
Wrote /usr/share/emacs23/site-lisp/gcl/gcl.elc
Wrote /usr/share/emacs23/site-lisp/gcl/man1-to-texi.elc
Wrote /usr/share/emacs23/site-lisp/gcl/smart-complete.elc
Wrote /usr/share/emacs23/site-lisp/gcl/sshell.elc

Processing triggers for libc-bin ...
ldconfig deferred processing now taking place

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

Unpacking gcl (from .../gcl_2.6.7-45ubuntu1_i386.deb) ...

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

リスト 3. シミュレーションした gcl-doc のインストール
ian@pinguino:~$ sudo apt-get install -s gcl-doc
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  linux-headers-2.6.31-14 linux-headers-2.6.31-14-generic
Use 'apt-get autoremove' to remove them.
The following NEW packages will be installed:
  gcl-doc
0 upgraded, 1 newly installed, 0 to remove and 30 not upgraded.
Inst gcl-doc (2.6.7-45ubuntu1 Ubuntu:9.10/karmic)
Conf gcl-doc (2.6.7-45ubuntu1 Ubuntu:9.10/karmic)

当然のことながら、マニュアル用のパッケージに必須パッケージはありません。


パッケージの保管場所

前のセクションで 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@pinguino:~$ cat /etc/apt/sources.list
#deb cdrom:[Ubuntu 9.10 _Karmic Koala_ - Release i386 (20091028.5)]/ karmic main restrict
ed
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.

deb http://us.archive.ubuntu.com/ubuntu/ karmic main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ karmic main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://us.archive.ubuntu.com/ubuntu/ karmic-updates main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ karmic-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/ karmic universe
deb-src http://us.archive.ubuntu.com/ubuntu/ karmic universe
deb http://us.archive.ubuntu.com/ubuntu/ karmic-updates universe
deb-src http://us.archive.ubuntu.com/ubuntu/ karmic-updates universe

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. gcl 削除のシミュレーション
ian@pinguino:~$ sudo apt-get remove -s gcl
[[sudo] password for ian: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  linux-headers-2.6.31-14 linux-headers-2.6.31-14-generic libreadline5
Use 'apt-get autoremove' to remove them.
The following packages will be REMOVED:
  gcl
0 upgraded, 0 newly installed, 1 to remove and 30 not upgraded.
Remv gcl [2.6.7-45ubuntu1]

前のセクションで gcl の必須パッケージとしてインストールした libreadline5 は自動的に削除されませんが、出力行のうちの 1 つに、このパッケージと 2 つのLinux ヘッダー・パッケージが不要になったことが示されています。apt-getautoremove 関数 (または同等の remove 関数と --auto-remove オプション) を使用すると、指定したパッケージと併せ、依存関係としてインストールされたもののどのインストール済みパッケージにも必要でなくなったすべてのパッケージを削除することができます。削除されるパッケージには、削除しようとしているもの以外のパッケージによってインストールされた依存関係も含まれます。この例でこれに相当するのは、linux-headers-2.6.31-14 および linux-headers-2.6.31-14-generic パッケージです。リスト 6 に、gcl とその依存関係である libreadline5、そして gcl とは無関係の、不要になった 2 つの Linux ヘッダー・パッケージを削除する方法を示します。

リスト 6. gcl と依存関係の削除
ian@pinguino:~$ sudo apt-get autoremove gcl
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  gcl libreadline5 linux-headers-2.6.31-14 linux-headers-2.6.31-14-generic
0 upgraded, 0 newly installed, 4 to remove and 30 not upgraded.
After this operation, 239MB disk space will be freed.
Do you want to continue [Y/n]? y
(Reading database ... 142327 files and directories currently installed.)
Removing gcl ...
remove/gcl: purging byte-compiled files for emacs22
remove/gcl: purging byte-compiled files for emacs23
Removing libreadline5 ...
Removing linux-headers-2.6.31-14-generic ...
Removing linux-headers-2.6.31-14 ...
Processing triggers for man-db ...
Processing triggers for libc-bin ...
ldconfig deferred processing now taking place

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


Debian パッケージの更新

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

リスト 7. 単一パッケージの更新
ian@pinguino:~$ sudo apt-get install  tzdata
[sudo] password for ian: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be upgraded:
  tzdata
1 upgraded, 0 newly installed, 0 to remove and 29 not upgraded.
Need to get 679kB of archives.
After this operation, 0B of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com karmic-updates/main tzdata 2010i-0ubuntu0.9.10 [679kB]
Fetched 679kB in 1s (569kB/s) 
Preconfiguring packages ...
(Reading database ... 124394 files and directories currently installed.)
Preparing to replace tzdata 2010h-0ubuntu0.9.10 (using .../tzdata_2010i-0ubuntu0.9.10_all
.deb) ...
Unpacking replacement tzdata ...
Setting up tzdata (2010i-0ubuntu0.9.10) ...

Current default time zone: 'America/New_York'
Local time is now:      Mon May  3 16:11:57 EDT 2010.
Universal Time is now:  Mon May  3 20:11:57 UTC 2010.
Run 'dpkg-reconfigure tzdata' if you wish to change it.

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

個々のパッケージを更新するのではなく、システム上のすべてのパッケージを更新する場合には、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 コマンドを使うと、すべてのシステム・ユーザーが読み取ることのできるホーム・ディレクトリーを作成することができますが、プライバシー上の理由から読み取り可能なユーザーを制限したいという場合もあります。また、リスト 7 で tzdata パッケージをアップグレードしたときに、dpkg-reconfigure tzdata を実行するとタイムゾーンを変更できるというアドバイスが示されていました。dpkg-reconfigure を実行するには、root 権限が必要です。

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

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

Debian パッケージ情報

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

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

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

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

リスト 8. tzdata パッケージのステータス
ian@pinguino:~$ dpkg -s gcl tzdata
Package: gcl
Status: deinstall ok config-files
Priority: optional
Section: interpreters
Installed-Size: 152848
Maintainer: Ubuntu MOTU Developers <ubuntu-motu@lists.ubuntu.com>
Architecture: i386
Version: 2.6.7-45ubuntu1
Config-Version: 2.6.7-45ubuntu1
Depends: libc6 (>= 2.7), libgmp3c2, libice6 (>= 1:1.0.0), libncurses5 (>= 5.6+20071006-3
), libreadline5 (>= 5.2), libsm6, libx11-6, libxaw7, libxext6, libxmu6, libxt6, tcl8.4 (
>= 8.4.16), tk8.4 (>= 8.4.16), debconf (>= 1.2.0), gcc, emacs22 | emacsen
Suggests: gcl-doc
Conffiles:
 /etc/default/gcl 9301be50652f86b8d3f8b835f6dce03e
 /etc/emacs/site-start.d/50gcl.el 12116c8c8988326764799973a0a7d5ab
Description: GNU Common Lisp compiler
 GNU Common Lisp (GCL) is a Common Lisp compiler and interpreter
 implemented in C, and complying mostly with the standard set
 forth in the book "Common Lisp, the Language I".  It attempts
 to strike a useful middle ground in performance and portability
 from its design around C.
 .
 This package contains the Lisp system itself.  Documentation
 is provided in the gcl-doc package.
Original-Maintainer: Camm Maguire <camm@enhanced.com>

Package: tzdata
Status: install ok installed
Priority: required
Section: libs
Installed-Size: 6276
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: all
Version: 2010i-0ubuntu0.9.10
Replaces: libc0.1, libc0.3, libc6, libc6.1
Provides: tzdata-squeeze
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.
Original-Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>

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

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

リスト 9. libparted パッケージに含まれるファイルを調べる場合
ian@pinguino:~$ dpkg -L libparted
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@pinguino:~$ dpkg -L libparted1.8-12
/.
/lib
/lib/libparted-1.8.so.12.0.0
/usr
/usr/share
/usr/share/doc
/usr/share/doc/libparted1.8-12
/usr/share/doc/libparted1.8-12/copyright
/usr/share/doc/libparted1.8-12/changelog.Debian.gz
/lib/libparted-1.8.so.12

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

リスト 10. 特定のファイルが含まれるパッケージを調べる場合
ian@pinguino:~$ dpkg -S /lib/libparted-1.8.so.12
libparted1.8-12: /lib/libparted-1.8.so.12

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

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

リスト 11. 複雑な dpkg -S の使用例
ian@pinguino:~$ which java
/usr/bin/java
ian@pinguino:~$ ls -l $(which java)
lrwxrwxrwx 1 root root 22 2010-05-03 17:51 /usr/bin/java -> /etc/alternatives/java
ian@pinguino:~$ update-alternatives --display java
java - auto mode
 link currently points to /usr/lib/jvm/java-6-openjdk/jre/bin/java
/usr/lib/jvm/java-6-openjdk/jre/bin/java - priority 1061
 slave java.1.gz: /usr/lib/jvm/java-6-openjdk/jre/man/man1/java.1.gz
Current `best' version is /usr/lib/jvm/java-6-openjdk/jre/bin/java.
ian@pinguino:~$ dpkg -S /usr/lib/jvm/java-6-openjdk/jre/bin/java
openjdk-6-jre-headless: /usr/lib/jvm/java-6-openjdk/jre/bin/java

aptitude の使用

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

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

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

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

パッケージを検索するには、スラッシュ (「/」) キーを使用します。例えば、前に削除した gcl パッケージを再インストールする場合には、「/gcl」と入力するだけでパッケージを検索することができます。検索結果として、gcl パッケージではなく、例えば gcl という文字が含まれる gcl-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 に、お馴染みの gcl パッケージがインストール対象としてマークされている synaptic ユーザー・インターフェースを示します。

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

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

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

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

Debian パッケージの検索

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

リスト 12. apt-cache による Linux ローダーの検索
ian@pinguino:~$ apt-cache search "linux loader"
lilo - LInux LOader - The Classic OS loader can load Linux and others
lilo-doc - Documentation for LILO (LInux LOader)

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

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

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

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

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

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

リスト 13. apt-get を使用してダウンロードだけを行う
ian@pinguino:~$ sudo apt-get install -d gclReading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  libreadline5
Suggested packages:
  gcl-doc
The following NEW packages will be installed:
  gcl libreadline5
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 47.1MB of archives.
After this operation, 157MB of additional disk space will be used.
Do you want to continue [Y/n]? 
Get:1 http://us.archive.ubuntu.com karmic/main libreadline5 5.2-6 [140kB]
Get:2 http://us.archive.ubuntu.com karmic/universe gcl 2.6.7-45ubuntu1 [47.0MB]
Fetched 47.1MB in 7s (6,475kB/s)                                               
Download complete and in download only mode

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

リスト 14. dpkg を使用して .deb の内容を表示する
ian@pinguino:~$ sudo find /var/cache -name "*.deb"
/var/cache/apt/archives/gcl_2.6.7-45ubuntu1_i386.deb
/var/cache/apt/archives/libreadline5_5.2-6_i386.deb
ian@pinguino:~$ sudo dpkg --contents /var/cache/apt/archives/gcl*.deb| grep "/bin/"
drwxr-xr-x root/root         0 2008-12-06 07:42 ./usr/bin/
-rwxr-xr-x root/root       617 2008-12-06 07:42 ./usr/bin/gcl

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

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

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


見つからないコマンド

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

リスト 15. command_not_found_handle
ian@pinguino:~$ 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/bin/python /usr/lib/command-not-found -- $1;
        return $?;
    else
        return 127;
    fi
}

command_not_found_handle 関数が存在する場合には、元のコマンドと元の引数を引数として使ってこの関数が呼び出され、関数の終了ステータスがシェルの終了ステータスになります。この関数が定義されていなければ、Bash シェルはエラー・メッセージを出力し、終了ステータス 127 を返します。通常、この関数が設定されるのはシステムの /etc/bash.bashrc ファイルです。リスト 15 からわかるように、この関数は /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 の詳細と、この連載の他の記事へのリンクについては「参考文献」を参照してください。

参考文献

学ぶために

製品や技術を入手するために

  • Alien パッケージ・コンバーターを入手してください。
  • Debian ホーム・ページから Debian パッケージを入手してください。
  • ご自分に最適な方法で IBM 製品を評価してください。評価の方法としては、製品の試用版をダウンロードすることも、オンラインで製品を試してみることも、クラウド環境で製品を使用することもできます。また、SOA Sandbox では、数時間でサービス指向アーキテクチャーの実装方法を効率的に学ぶことができます。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


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