パッケージ管理ツールがどのような操作を自動で行ってくれているのか1つずずパッケージをインストールして順を追って解決していきましょう。
# rpm -ivh bind-9.9.4-51.el7_4.1.x86_64.rpm エラー: 依存性の欠如: bind-libs = 32:9.9.4-51.el7_4.1 は bind-32:9.9.4-51.el7_4.1.x86_64 に必要とされています libbind9.so.90()(64bit) は bind-32:9.9.4-51.el7_4.1.x86_64 に必要とされています libdns.so.100()(64bit) は bind-32:9.9.4-51.el7_4.1.x86_64 に必要とされています libisc.so.95()(64bit) は bind-32:9.9.4-51.el7_4.1.x86_64 に必要とされています libisccc.so.90()(64bit) は bind-32:9.9.4-51.el7_4.1.x86_64 に必要とされています libisccfg.so.90()(64bit) は bind-32:9.9.4-51.el7_4.1.x86_64 に必要とされています liblwres.so.90()(64bit) は bind-32:9.9.4-51.el7_4.1.x86_64 に必要とされています
今 DNS サーバである bind パッケージのインストールを試みています。このメッセージは bind をインストールする為には、bind-libs パッケージとダイナミックリンクライブラリ libbind9.so.90 libdns.so.100 … が必要である事を表しています。
注意事項
「ダイナミックリンクライブラリ」(Dynamic Link Library,DLL)動的リンクを使ったライブラリで複数のプログラムから共通に利用できるように種々の機能をプログラムとは分離して実装したものを言います。Windows では、拡張子が「.dll」、Linux では、/usr/lib/libライブラリ名.so.番号 のファイルとして
提供されることが多い。
では、まず bind-libs とはなんだろうか?この場合、bind-libs は、パッケージ名なのでftp サイト等から bind-libs という文字列をキーにファイルを探してみます。
# lftp ftp.kddlabs.co.jp:/pub/Linux/distributions/CentOS/7/updates/x86_64/Packages cd 成功、cwd=/pub/Linux/distributions/CentOS/7/updates/x86_64/Packages lftp ftp.kddlabs.co.jp:/pub/Linux/distributions/CentOS/7/updates/x86_64/Packages> ls bind-libs-9* -rw-rw-r-- 1 ftp ftp 1034180 Aug 24 11:57 bind-libs-9.9.4-51.el7.i686.rpm -rw-rw-r-- 1 ftp ftp 1051116 Aug 24 11:57 bind-libs-9.9.4-51.el7.x86_64.rpm -rw-rw-r-- 1 ftp ftp 1034336 Dec 02 23:34 bind-libs-9.9.4-51.el7_4.1.i686.rpm -rw-rw-r-- 1 ftp ftp 1051224 Dec 02 23:34 bind-libs-9.9.4-51.el7_4.1.x86_64.rpm lftp ftp.kddlabs.co.jp:/pub/Linux/distributions/CentOS/7/updates/x86_64/Packages> mget bind-libs-9.9.4-51.el7_4.1.x86_64.rpm lftp ftp.kddlabs.co.jp:/pub/Linux/distributions/CentOS/7/updates/x86_64/Packages> exit # rpm -ivh bind-9.9.4-51.el7_4.1.x86_64.rpm bind-libs-9.9.4-51.el7_4.1.x86_64.rpm エラー: 依存性の欠如: bind-license = 32:9.9.4-51.el7_4.1 は bind-libs-32:9.9.4-51.el7_4.1.x86_64 に必要とされています
ftp サイトに同じバージョンの bind-libs-9.9.4-51.el7_4.1.x86_64.rpm というパッケージがあったのでこれを使用してみましょう。
しかし次は、bind-libs をインストールするのに bind-license が必要と言われました。その他のライブラリの依存関係が解決されたのは、bind-libs にライブラリが入っていたからのようです。
# rpm -qpl bind-libs-9.9.4-51.el7_4.1.x86_64.rpm /usr/lib64/libbind9.so.90 /usr/lib64/libbind9.so.90.0.8 /usr/lib64/libdns.so.100 /usr/lib64/libdns.so.100.1.1 /usr/lib64/libisc.so.95 /usr/lib64/libisc.so.95.2.1 /usr/lib64/libisccc.so.90 /usr/lib64/libisccc.so.90.0.4 /usr/lib64/libisccfg.so.90 /usr/lib64/libisccfg.so.90.0.7 /usr/lib64/liblwres.so.90 /usr/lib64/liblwres.so.90.0.5
足りない、bind-license を再度ダウンロードしてインストールするとインストールする事が出来ました。
# lftp ftp.kddlabs.co.jp:/pub/Linux/distributions/CentOS/7/updates/x86_64/Packages cd 成功、cwd=/pub/Linux/distributions/CentOS/7/updates/x86_64/Packages lftp ftp.kddlabs.co.jp:/pub/Linux/distributions/CentOS/7/updates/x86_64/Packages> mget bind-license-9.9.4-51.el7_4.1.noarch.rpm lftp ftp.kddlabs.co.jp:/pub/Linux/distributions/CentOS/7/updates/x86_64/Packages> exit [root@localhost ~]# rpm -ivh bind-9.9.4-51.el7_4.1.x86_64.rpm bind-libs-9.9.4-51.el7_4.1.x86_64.rpm bind-license-9.9.4-51.el7_4.1.noarch.rpm 準備しています... ################################# [100%] 更新中 / インストール中... 1:bind-license-32:9.9.4-51.el7_4.1 ################################# [ 33%] 2:bind-libs-32:9.9.4-51.el7_4.1 ################################# [ 67%] 3:bind-32:9.9.4-51.el7_4.1 ################################# [100%]
前置きが長くなってしまいましたが、rpm を手動でインストールするのはいかに骨の折れる作業であるかという事が分かって頂けたかと思います。しかしこれらの難解な作業を簡素化してくれるのがパッケージ管理ツールです。パッケージ管理ツールの「ソフトウェアの追加/削除」Ubuntu Software(ソフトウェア)を使えば bind を選択するだけ、yum であれば、yum install bind, apt であれば apt install bind9 と実行するだけで、たちどころに bindをインストールする際に必要とするパッケージを検出しインストールしてくれるのです。
# yum install bind 読み込んだプラグイン:fastestmirror Loading mirror speeds from cached hostfile * base: ftp.nara.wide.ad.jp * extras: ftp.tsukuba.wide.ad.jp * updates: ftp.tsukuba.wide.ad.jp 依存性の解決をしています --> トランザクションの確認を実行しています。 ---> パッケージ bind.x86_64 32:9.9.4-51.el7_4.1 を インストール --> 依存性の処理をしています: bind-libs = 32:9.9.4-51.el7_4.1 のパッケージ: 32:bind-9.9.4-51.el7_4.1.x86_64 --> 依存性の処理をしています: liblwres.so.90()(64bit) のパッケージ: 32:bind-9.9.4-51.el7_4.1.x86_64 --> 依存性の処理をしています: libisccfg.so.90()(64bit) のパッケージ: 32:bind-9.9.4-51.el7_4.1.x86_64 --> 依存性の処理をしています: libisccc.so.90()(64bit) のパッケージ: 32:bind-9.9.4-51.el7_4.1.x86_64 --> 依存性の処理をしています: libisc.so.95()(64bit) のパッケージ: 32:bind-9.9.4-51.el7_4.1.x86_64 --> 依存性の処理をしています: libdns.so.100()(64bit) のパッケージ: 32:bind-9.9.4-51.el7_4.1.x86_64 --> 依存性の処理をしています: libbind9.so.90()(64bit) のパッケージ: 32:bind-9.9.4-51.el7_4.1.x86_64 --> トランザクションの確認を実行しています。 ---> パッケージ bind-libs.x86_64 32:9.9.4-51.el7_4.1 を インストール --> 依存性の処理をしています: bind-license = 32:9.9.4-51.el7_4.1 のパッケージ: 32:bind-libs-9.9.4-51.el7_4.1.x86_64 --> トランザクションの確認を実行しています。 ---> パッケージ bind-license.noarch 32:9.9.4-50.el7 を 更新 --> 依存性の処理をしています: bind-license = 32:9.9.4-50.el7 のパッケージ: 32:bind-libs-lite-9.9.4-50.el7.x86_64 ---> パッケージ bind-license.noarch 32:9.9.4-51.el7_4.1 を アップデート --> トランザクションの確認を実行しています。 ---> パッケージ bind-libs-lite.x86_64 32:9.9.4-50.el7 を 更新 ---> パッケージ bind-libs-lite.x86_64 32:9.9.4-51.el7_4.1 を アップデート --> 依存性解決を終了しました。 依存性を解決しました ================================================================================================================================================================================================ Package アーキテクチャー バージョン リポジトリー 容量 ================================================================================================================================================================================================ インストール中: bind x86_64 32:9.9.4-51.el7_4.1 updates 1.8 M 依存性関連でのインストールをします: bind-libs x86_64 32:9.9.4-51.el7_4.1 updates 1.0 M 依存性関連での更新をします: bind-libs-lite x86_64 32:9.9.4-51.el7_4.1 updates 733 k bind-license noarch 32:9.9.4-51.el7_4.1 updates 84 k トランザクションの要約 ================================================================================================================================================================================================ インストール 1 パッケージ (+1 個の依存関係のパッケージ) 更新 ( 2 個の依存関係のパッケージ) 総ダウンロード容量: 3.6 M Is this ok [y/d/N]:
なぜ apt や yum は、依存関係を解決し必要なパッケージだけインストールしてくれるのでしょうか?これは rpm が置かれている ftp サーバの repodata というディレクトリに全パッケージの依存関係に関するの情報が圧縮され置かれているからです。
lftp ftp.nara.wide.ad.jp:/pub/Linux/centos/7/updates/x86_64/repodata> ls -rw-rw-r-- 1 ftp-mirror ftp-adm 2221773 Nov 3 19:25 0f55049a677f9a54a61e178424c1173133e30563f68f6cc9a92490698147e3e9-filelists.sqlite.bz2 -rw-rw-r-- 1 ftp-mirror ftp-adm 3735014 Nov 3 19:25 1982b6b2ab3d63c55807ad48abf18b63fc4535d8b5cd4604d13b3e0e296c79ab-primary.sqlite.bz2 -rw-rw-r-- 1 ftp-mirror ftp-adm 2324240 Nov 3 19:19 30dec0c4333d5f1177221b4fdff36f4cb48c792dfad85f74028556aec4f71d68-filelists.xml.gz -rw-rw-r-- 1 ftp-mirror ftp-adm 1988466 Nov 3 19:19 3d50d86b57d4a2d1bc61dbbf7e70c79d6c40e3bbcc7ffa07c9cc73e840564888-primary.xml.gz -rw-rw-r-- 1 ftp-mirror ftp-adm 354438 Nov 3 19:25 7ca3e2f5f75e7591fdc05fd25d702ca99d89e5f99e15227cb477b16b0843f7ab-other.sqlite.bz2 -rw-rw-r-- 1 ftp-mirror ftp-adm 413276 Nov 3 19:25 87e605cc98c0a3f6e51f27e52170d1f9c730d8e26b77474cbb64c564c4ee9119-prestodelta.xml.gz -rw-rw-r-- 1 ftp-mirror ftp-adm 203757 Nov 3 19:19 e6f346e7300c86efd3ba27e36b936ffe1b7e233435351ac3899118fcb6cddf65-other.xml.gz -rw-rw-r-- 1 ftp-mirror ftp-adm 3460 Nov 3 19:25 repomd.xml -rw-rw-r-- 1 ftp-mirror ftp-adm 811 Nov 3 19:25 repomd.xml.asc
yum は、そのデータをローカルディスクにコピーし、そのデータを元に依存関係を解決しているのです。なおこの ftp に置かれている、rpm と repodata を総称してリポジトリと呼びます。
yum が repodata ディレクトリからダウンロードしたデータ。
# cd /var/cache/yum/x86_64/7/ [root@localhost 7]# find . ./base ./base/gen ./base/gen/primary_db.sqlite ./base/packages ./base/mirrorlist.txt ./base/repomd.xml ./base/cachecookie ./base/9346184be1deb727caf4b1ecf4a7949155da5da74af9b92c172687b290a773df-c7-x86_64-comps.xml.gz ./base/0c34273ad0292747ee5e15c047d3e51c67ca59861a446972db45d71abacc7ad7-primary.sqlite.bz2 ./extras ./extras/gen ./extras/gen/primary_db.sqlite ./extras/packages ./extras/mirrorlist.txt ./extras/repomd.xml ./extras/cachecookie ./extras/7ead5010d42a09d8c9230a973faadd2a64030fc051d320a8750d1778bee3838b-primary.sqlite.bz2 ./updates ./updates/gen ./updates/gen/primary_db.sqlite ./updates/packages ./updates/mirrorlist.txt ./updates/repomd.xml ./updates/cachecookie ./updates/42fd4e52ab3b2fda9be280ad901e1597b070cf0c4062ba6581d6b457e5e9e2c1-primary.sqlite.bz2 ./timedhosts ./timedhosts.txt ./.gpgkeyschecked.yum
注意事項
パッケージ管理ツールは、内部で yum, apt をコールしておりパッケージの依存関係を解決方法は yum,apt と同じロジックを利用しています。