1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml">
5 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
9 <link rel="stylesheet" href="../stylesheets/lfs.css" type="text/css" />
10 <meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
11 <link rel="stylesheet" href="../stylesheets/lfs-print.css" type=
12 "text/css" media="print" />
14 <body class="lfs" id="lfs-6.8">
15 <div class="navheader">
17 Linux From Scratch - Version 6.8
24 <a accesskey="p" href="kernfs.html" title=
25 "仮想カーネルファイルシステムの準備">前のページ</a>
31 <a accesskey="n" href="chroot.html" title="Chroot 環境への移行">次のページ</a>
37 <a accesskey="u" href="chapter06.html" title=
38 "第6章 基本的なソフトウェアのインストール">上に戻る</a>
41 <a accesskey="h" href="../index.html" title=
42 "Linux From Scratch - Version 6.8">ホーム</a>
46 <div class="sect1" lang="ja" xml:lang="ja">
48 <a id="ch-system-pkgmgt" name="ch-system-pkgmgt"></a>6.3. パッケージ管理
51 パッケージ管理についての説明を LFS ブックに加えて欲しいとの要望をよく頂きます。
52 パッケージ管理ツールがあれば、インストールされるファイル類を管理し、パッケージの削除やアップグレードを容易に実現できます。
53 パッケージ管理ツールでは、バイナリファイルやライブラリファイルだけでなく、設定ファイル類のインストールも取り扱います。
54 パッケージ管理ツールをどうしたら・・・ いえいえ本節は特定のパッケージ管理ツールを説明するわけでなく、その利用を勧めるものでもありません。
55 もっと広い意味で、管理手法にはどういったものがあり、どのように動作するかを説明します。
56 あなたにとって最適なパッケージ管理がこの中にあるかもしれません。 あるいはそれらをいくつか組み合わせて実施することになるかもしれません。
57 本節ではパッケージのアップグレードを行う際に発生する問題についても触れます。
60 LFS や BLFS において、パッケージ管理ツールについて触れていない理由には以下のものがあります。
62 <div class="itemizedlist">
66 本書の目的は Linux システムがいかに構築されているかを学ぶことです。 パッケージ管理はその目的からはずれてしまいます。
71 パッケージ管理についてはいくつもの方法があり、それらには一長一短があります。
72 ユーザーに対して満足のいくものを選び出すのは困難です。
78 <a class="ulink" href=
79 "http://www.linuxfromscratch.org/hints/list.html">ヒントプロジェクト (Hints
80 Project)</a> ページに、パッケージ管理についての情報が示されています。 それらが望むものかどうか確認してみてください。
82 <div class="sect2" lang="ja" xml:lang="ja">
87 パッケージ管理ツールがあれば、各種ソフトウェアの最新版がリリースされた際に容易にアップグレードができます。 全般に LFS ブックや
88 BLFS ブックに示されている作業手順に従えば、新しいバージョンへのアップグレードを行っていくことはできます。
89 以下ではパッケージをアップグレードする際に注意すべき点、特に稼動中のシステムに対して実施するポイントについて説明します。
91 <div class="itemizedlist">
95 ツールチェーン (Glibc、GCC、Binutils)
96 のいずれかについて、マイナーバージョンをアップグレードする必要がある場合は、LFS を再構築するのが無難です。
97 この場合、すべてのパッケージの依存関係を考慮して順番に作り直せば実現できる<span class=
98 "emphasis"><em>はず</em></span> ですが、これはあまりお勧めしません。 例えば
99 glibc-2.2.x を glibc-2.3.x にアップグレードする必要がある場合は、再構築するのが無難です。
100 マイクロバージョンをアップグレードする場合は、もっと単純にそのパッケージをインストールし直すだけで動作すると思いますが、保証はありません。
101 例えば glibc-2.3.4 を glibc-2.3.5 にアップグレードする場合、普通は何も問題ないでしょう。
106 共有ライブラリを提供しているパッケージをアップデートする場合で、そのライブラリの名前が変更になった場合は、そのライブラリを動的にリンクしているすべてのパッケージは、新しいライブラリにリンクされるように再コンパイルを行う必要があります。
107 (パッケージのバージョンとライブラリ名との間には相関関係はありません。) 例えば foo-1.2.3
108 というパッケージが共有ライブラリ <code class="filename">libfoo.so.1</code>
109 をインストールするものであるとします。 そして今、新しいバージョン foo-1.2.4 にアップグレードし、共有ライブラリ
110 <code class="filename">libfoo.so.2</code> をインストールするとします。
111 この例では <code class="filename">libfoo.so.1</code>
112 を動的にリンクいるパッケージがあったとすると、それらはすべて <code class=
113 "filename">libfoo.so.2</code> に対してリンクするよう再コンパイルしなければなりません。
114 古いライブラリに依存しているパッケージすべてを再コンパイルするまでは、そのライブラリを削除するべきではありません。
120 <div class="sect2" lang="ja" xml:lang="ja">
125 以下に一般的なパッケージ管理手法について示します。
126 パッケージ管理マネージャを用いる前に、様々な方法を検討し、特にそれぞれの欠点も確認してください。
128 <div class="sect3" lang="ja" xml:lang="ja">
133 そうです。 これもパッケージ管理のやり方の一つです。
134 いろいろなパッケージに精通していて、どんなファイルがインストールされるか分かっている人もいます。
135 そんな人はパッケージ管理ツールを必要としません。
136 あるいはパッケージが更新された際に、システム全体を再構築しようと考えている人なら、やはりパッケージ管理ツールを必要としません。
139 <div class="sect3" lang="ja" xml:lang="ja">
141 6.3.2.2. 異なるディレクトリへのインストール
144 これは最も単純なパッケージ管理のやり方であり、パッケージ管理のためのツールを用いる必要はありません。
145 個々のパッケージを個別のディレクトリにインストールする方法です。 例えば foo-1.1 というパッケージを
146 <code class="filename">/usr/pkg/foo-1.1</code> ディレクトリにインストールし、この
147 <code class="filename">/usr/pkg/foo-1.1</code> に対するシンボリックリンク
148 <code class="filename">/usr/pkg/foo</code> を作成します。
149 このパッケージの新しいバージョン foo-1.2 をインストールする際には <code class=
150 "filename">/usr/pkg/foo-1.2</code>
151 ディレクトリにインストールした上で、先ほどのシンボリックリンクをこのディレクトリを指し示すように置き換えます。
154 <code class="envar">PATH</code>、 <code class=
155 "envar">LD_LIBRARY_PATH</code>、 <code class=
156 "envar">MANPATH</code>、 <code class="envar">INFOPATH</code>、
157 <code class="envar">CPPFLAGS</code> といった環境変数に対しては <code class=
158 "filename">/usr/pkg/foo</code> ディレクトリを加える必要があるかもしれません。
159 もっともパッケージによっては、このやり方では管理できないものもあります。
162 <div class="sect3" lang="ja" xml:lang="ja">
164 6.3.2.3. シンボリックリンク方式による管理
167 これは一つ前に示したパッケージ管理テクニックの応用です。 各パッケージは同様にインストールします。
168 ただし先ほどのようなシンボリックリンクを生成するのではなく <code class="filename">/usr</code>
169 ディレクトリ階層の中に各ファイルのシンボリックリンクを生成します。 この方法であれば環境変数を追加設定する必要がなくなります。
170 シンボリック・リンクを自動生成することもできますが、パッケージ管理ツールの中にはこの手法を使って構築されているものもあります。
171 よく知られているものとして Stow、Epkg、Graft、Depot があります。
174 インストール時には意図的な指示が必要です。 パッケージにとっては <code class=
175 "filename">/usr</code> にインストールすることが指定されたものとなりますが、実際には
176 <code class="filename">/usr/pkg</code> 配下にインストールされるわけです。
177 このインストール方法は単純なものではありません。 例えば今 libfoo-1.1 というパッケージをインストールするものとします。
178 以下のようなコマンドでは、このパッケージを正しくインストールできません。
180 <pre class="userinput">
181 <kbd class="command">./configure --prefix=/usr/pkg/libfoo/1.1
186 インストール自体は動作しますが、このパッケージに依存している他のパッケージは、期待どおりには libfoo
187 を正しくリンクしません。 例えば libfoo をリンクするパッケージをコンパイルする際には <code class=
188 "filename">/usr/lib/libfoo.so.1</code> がリンクされると思うかもしれませんが、実際には
189 <code class="filename">/usr/pkg/libfoo/1.1/lib/libfoo.so.1</code>
190 がリンクされることになります。 正しくリンクするためには <code class="envar">DESTDIR</code>
191 変数を使って、パッケージのインストールをうまく仕組む必要があります。 この方法は以下のようにして行います。
193 <pre class="userinput">
194 <kbd class="command">./configure --prefix=/usr
196 make DESTDIR=/usr/pkg/libfoo/1.1 install</kbd>
199 多くのパッケージは、たいていはこの手法をサポートしていますが、そうでないものもあります。
200 この手法を取り入れていないパッケージに対しては、手作業にてインストールすることが必要になります。
201 またはそういった問題を抱えるパッケージであれば <code class="filename">/opt</code>
202 ディレクトリにインストールする方が容易なことかもしれません。
205 <div class="sect3" lang="ja" xml:lang="ja">
207 6.3.2.4. タイムスタンプによる管理方法
210 この方法ではパッケージをインストールするにあたって、あるファイルにタイムスタンプが記されます。 インストールの直後に
211 <span class="command"><strong>find</strong></span>
212 コマンドを適当なオプション指定により用いることで、インストールされるすべてのファイルのログが生成されます。
213 これはタイムスタンプファイルの生成の後に行われます。 この方法を用いたパッケージ管理ツールとして install-log
217 この方法はシンプルである利点がありますが、以下の二つの欠点があります。
218 インストールの際に、いずれかのファイルのタイムスタンプが現在時刻でなかった場合、そういったファイルはパッケージ管理ツールが正しく制御できません。
219 またこの方法は一つのパッケージだけが、その時にインストールされることを前提とします。
220 例えば二つのパッケージが二つの異なる端末から同時にインストールされるような場合は、ログファイルが適切に生成されません。
223 <div class="sect3" lang="ja" xml:lang="ja">
225 6.3.2.5. インストールスクリプトの追跡管理
228 この方法はインストールスクリプトが実行するコマンドを記録するものです。 これには以下の二種類の手法があります。
231 環境変数 <code class="envar">LD_PRELOAD</code>
232 を使えば、インストール前にあらかじめロードされるライブラリを定めることができます。 パッケージのインストール中には
233 <span class="command"><strong>cp</strong></span>、 <span class=
234 "command"><strong>install</strong></span>、 <span class=
235 "command"><strong>mv</strong></span>
236 など様々な実行モジュールにそのライブラリをリンクさせ、ファイルシステムを変更するようなシステムコールを監視することで、そのライブラリがパッケージを追跡管理できるようになります。
237 この方法を実現するためには、動的リンクする実行モジュールはすべて suid ビット、sgid ビットがオフでなければなりません。
238 事前にライブラリをロードしておくと、インストール中に予期しない副作用が発生するかもしれません。
239 したがって、ある程度のテスト確認を行って、パッケージ管理ツールが不具合を引き起こさないこと、しかるべきファイルの記録を取っておくことが必要とされます。
242 二つめの方法は <span class="command"><strong>strace</strong></span>
243 を用いるものです。 これはインストールスクリプトの実行中に発生するシステムコールを記録するものです。
246 <div class="sect3" lang="ja" xml:lang="ja">
248 6.3.2.6. パッケージのアーカイブを生成する方法
251 この方法では、シンボリックリンク方式によるパッケージ管理にて説明したのと同じように、パッケージが個別のディレクトリにインストールされます。
252 インストールされた後には、インストールファイルを使ってアーカイブが生成されます。
253 このアーカイブはこの後に、ローカルPCへのインストールに用いられ、他のPCのインストールに利用することもできます。
256 商用ディストリビューションが採用しているパッケージ管理ツールは、ほとんどがこの方法によるものです。
257 この方法に従ったパッケージ管理ツールの例に RPM があります。 (これは <a class="ulink" href=
258 "http://www.linux-foundation.org/en/Specifications">Linux
259 Standard Base Specification</a> が規定しています。) また pkg-utils、Debian の
260 apt、Gentoo の Portage システムがあります。 このパッケージ管理手法を LFS システムに適用するヒント情報が
261 <a class="ulink" href=
262 "http://www.linuxfromscratch.org/hints/downloads/files/fakeroot.txt">
263 http://www.linuxfromscratch.org/hints/downloads/files/fakeroot.txt</a>
267 パッケージファイルにその依存パッケージ情報まで含めてアーカイブ生成することは、非常に複雑となり LFS の範疇を超えるものです。
270 Slackware は、パッケージアーカイブに対して <span class=
271 "command"><strong>tar</strong></span> ベースのシステムを利用しています。
272 他のパッケージ管理ツールはパッケージの依存性を取り扱いますが、このシステムは意図的にこれを行っていません。 Slackware
273 のパッケージ管理に関する詳細は <a class="ulink" href=
274 "http://www.slackbook.org/html/package-management.html">http://www.slackbook.org/html/package-management.html</a>
278 <div class="sect3" lang="ja" xml:lang="ja">
280 6.3.2.7. ユーザー情報をベースとする管理方法
283 この手法は LFS に固有のものであり Matthias Benkmann により考案されました。 <a class=
285 "http://www.linuxfromscratch.org/hints/list.html">ヒントプロジェクト
286 (Hints Project)</a> から入手することが出来ます。
287 考え方としては、各パッケージを個々のユーザーが共有ディレクトリにインストールします。
288 パッケージに属するファイル類は、ユーザーIDを確認することで容易に特定出来るようになります。
289 この手法の特徴や短所については、複雑な話となるため本節では説明しません。 詳しくは <a class="ulink" href=
290 "http://www.linuxfromscratch.org/hints/downloads/files/more_control_and_pkg_man.txt">
291 http://www.linuxfromscratch.org/hints/downloads/files/more_control_and_pkg_man.txt</a>
296 <div class="sect2" lang="ja" xml:lang="ja">
298 6.3.3. 他システムへの LFS の配置
301 LFS システムの利点の一つとして、どのファイルもディスク上のどこに位置していても構わないことです。
302 他のコンピュータに対してビルドした LFS の複製を作ろうとするなら、それが同等のアーキテクチャであれば容易に実現できます。 つまり
303 <span class="command"><strong>tar</strong></span> コマンドを使って LFS
304 のルートディレクトリを含むパーティション (LFS の基本的なビルドの場合、非圧縮で 250MB 程度)
305 をまとめ、これをネットワーク転送か、あるいは CD-ROM を通じて新しいシステムにコピーし、伸張 (解凍) するだけです。
306 この場合でも、設定ファイルはいくらか変更することが必要です。 変更が必要となる設定ファイルは以下のとおりです。
307 <code class="filename">/etc/hosts</code>、 <code class=
308 "filename">/etc/fstab</code>、 <code class=
309 "filename">/etc/passwd</code>、 <code class=
310 "filename">/etc/group</code>、 <code class=
311 "filename">/etc/shadow</code>、 <code class=
312 "filename">/etc/ld.so.conf</code>、 <code class=
313 "filename">/etc/scsi_id.config</code>、 <code class=
314 "filename">/etc/sysconfig/network</code>、 <code class=
315 "filename">/etc/sysconfig/network-devices/ifconfig.eth0/ipv4</code>
318 新しいシステムのハードウェアと元のカーネルに差異があるかもしれないため、カーネルを再ビルドする必要があるでしょう。
321 最後に新システムを起動可能とするために <a class="xref" href="../chapter08/grub.html"
322 title="8.4. GRUB を用いたブートプロセスの設定">8.4.「GRUB を用いたブートプロセスの設定」</a>
327 <div class="navfooter">
330 <a accesskey="p" href="kernfs.html" title=
331 "仮想カーネルファイルシステムの準備">前のページ</a>
337 <a accesskey="n" href="chroot.html" title="Chroot 環境への移行">次のページ</a>
343 <a accesskey="u" href="chapter06.html" title=
344 "第6章 基本的なソフトウェアのインストール">上に戻る</a>
347 <a accesskey="h" href="../index.html" title=
348 "Linux From Scratch - Version 6.8">ホーム</a>