🦁

良く分からないyumコマンドについて調べる

2023/06/17に公開

CentOSなどで利用されているyumコマンドについて良く分かっていなかったので、調べたことをまとめる。

yumコマンドを知る前の前提知識

CentOSではソフトウェアパッケージを.rpmというファイル単位で管理している。
.rpmファイル内には複数のファイルが圧縮した形で含まれていて、rpmコマンドで操作できる。
rpm -qpl ~.rpmでは、そのパッケージに含まれてるファイル一覧が出る。
rpm -i ~.rpmでは、そのパッケージに含まれるファイルが展開される。
展開されるというのは、カレントディレクトリに展開されるというわけではなく、事前に展開されるディレクトリがファイルごとに決まっている。
rpmコマンドについては以下の記事で詳しく解説されている。
https://qiita.com/i13ame/items/f585c2c4aed3a8b77d57

実際にやってみた

説明していなかったが、.rpmファイル自体をcurlコマンドやwgetコマンドで事前にローカルにダウンロードしておき、rpm -i ~.rpmとする方法と、rpm -i http://~.rpmのようにURLを指定して.rpmファイル自体のダウンロードはせず、直接インストールを行ってくれる二通りの方法がある。
今回は前者の方法を使用する。
例えば、CentOSの公式リポジトリ ( http://mirror.centos.org/centos/ ) から.rpmファイルをダウンロードしてみる。

[root@localhost ~]# curl -O http://mirror.centos.org/centos/7/os/x86_64/Packages/httpd-2.4.6-95.el7.centos.x86_64.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 2779k  100 2779k    0     0  1375k      0  0:00:02  0:00:02 --:--:-- 1375k
[root@localhost ~]# ls
httpd-2.4.6-95.el7.centos.x86_64.rpm

そのパッケージに含まれているファイル一覧を確認

[root@localhost ~]# rpm -qpl httpd-2.4.6-95.el7.centos.x86_64.rpm
/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.d/README
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
以下略…

rpmコマンドの問題点

rpmコマンドでは、そのインストールしようとしたrpmパッケージに必要なrpmパッケージが事前にインストールされていないと、エラーになる。依存関係のチェックは行われるが、行われるまでで、必要なrpmパッケージのインストールまではしてくれないということだ。

実際にやってみた

gitに必要なrpmパッケージを依存関係も含めてローカルにダウンロード

[root@localhost ~]# yumdownloader --resolve git
読み込んだプラグイン:fastestmirror, langpacks, priorities
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * centos-sclo-rh: ftp.iij.ad.jp
 * centos-sclo-sclo: ftp.iij.ad.jp
 * centosplus: ftp.iij.ad.jp
 * epel: ftp.iij.ad.jp
 * epel-debuginfo: ftp.iij.ad.jp
 * epel-source: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
--> トランザクションの確認を実行しています。
---> パッケージ git.x86_64 0:1.8.3.1-25.el7_9 を インストール
--> 依存性の処理をしています: perl-Git = 1.8.3.1-25.el7_9 のパッケージ: git-1.8.3.1-25.el7_9.x86_64
--> 依存性の処理をしています: rsync のパッケージ: git-1.8.3.1-25.el7_9.x86_64
--> 依存性の処理をしています: perl(Term::ReadKey) のパッケージ: git-1.8.3.1-25.el7_9.x86_64
--> 依存性の処理をしています: perl(Git) のパッケージ: git-1.8.3.1-25.el7_9.x86_64
--> 依存性の処理をしています: perl(Error) のパッケージ: git-1.8.3.1-25.el7_9.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ perl-Error.noarch 1:0.17020-2.el7 を インストール
---> パッケージ perl-Git.noarch 0:1.8.3.1-25.el7_9 を インストール
---> パッケージ perl-TermReadKey.x86_64 0:2.30-20.el7 を インストール
---> パッケージ rsync.x86_64 0:3.1.2-12.el7_9 を インストール
--> 依存性解決を終了しました。
(1/5): perl-TermReadKey-2.30-20.el7.x86_64.rpm                                                                                                                                                                        |  31 kB  00:00:00
(2/5): perl-Git-1.8.3.1-25.el7_9.noarch.rpm                                                                                                                                                                           |  56 kB  00:00:00
(3/5): perl-Error-0.17020-2.el7.noarch.rpm                                                                                                                                                                            |  32 kB  00:00:00
(4/5): rsync-3.1.2-12.el7_9.x86_64.rpm                                                                                                                                                                                | 408 kB  00:00:00
(5/5): git-1.8.3.1-25.el7_9.x86_64.rpm                                                                                                                                                                                | 4.4 MB  00:00:00
[root@localhost ~]# ls
git-1.8.3.1-25.el7_9.x86_64.rpm  perl-Error-0.17020-2.el7.noarch.rpm  perl-Git-1.8.3.1-25.el7_9.noarch.rpm  perl-TermReadKey-2.30-20.el7.x86_64.rpm  rsync-3.1.2-12.el7_9.x86_64.rpm

git-1.8.3.1-25.el7_9.x86_64.rpmのみインストールしようとしてみる

[root@localhost ~]# rpm -i git-1.8.3.1-25.el7_9.x86_64.rpm
エラー: 依存性の欠如:
        perl(Error) は git-1.8.3.1-25.el7_9.x86_64 に必要とされています
        perl(Git) は git-1.8.3.1-25.el7_9.x86_64 に必要とされています
        perl(Term::ReadKey) は git-1.8.3.1-25.el7_9.x86_64 に必要とされています
        perl-Git = 1.8.3.1-25.el7_9 は git-1.8.3.1-25.el7_9.x86_64 に必要とされています
        rsync は git-1.8.3.1-25.el7_9.x86_64 に必要とされています

yumコマンドについて

必要なパッケージをrpmコマンドで一つ一つインストールしていくのはとても面倒くさい。
そこでyumコマンドが、開発された。
yumコマンドは、依存関係を自動で解決してくれて、入れたいパッケージを入れるために必要なパッケージがあれば、勝手に追加インストールしてくれる。
例えば以下のようにすれば、そのrpmパッケージがインストールされ、依存関係があるrpmパッケージがあれば、それも含めてインストールされる。

[root@localhost ~]# yum -y install http://download.webmin.com/download/yum/webmin-1.750-1.noarch.rpm

じゃあこれは何?.rpmファイルを指定していないけど?という疑問がわく。

[root@localhost ~]# yum -y install perl-Net-SSLeay

yumを利用する上で重要になってくる考え方がyumリポジトリの存在である。
リポジトリとはパッケージが格納されている貯蔵庫のようなイメージであり、yumコマンドはその貯蔵庫からパッケージをダウンロードしてインストールする。
WindowsにはMicrosoft Storeというアプリの貯蔵庫があるが、その様なイメージだ。
リポジトリはたくさんあり、公式のリポジトリもあれば、サードパーティー製のパッケージを提供するリポジトリもある。
以下のコマンドでシステムに登録されている全てのリポジトリが表示される。

[root@localhost ~]# yum repolist all

yumコマンドでは通常、.rpmファイルではなく、パッケージ名を指定する。
yumはパッケージ名をもとにリポジトリから対応する.rpmファイルを探し、依存関係を解決しながらインストールやアップグレードを行う。

[root@localhost ~]# rpm -qi nodejs
Name        : nodejs
Epoch       : 1
Version     : 16.18.1
Release     : 3.el7
Architecture: x86_64
Install Date: 2023年06月17日 21時00分32秒
Group       : Development/Languages
Size        : 296889
License     : MIT and ASL 2.0 and ISC and BSD
Signature   : RSA/SHA256, 2022年12月08日 09時44分47秒, Key ID 6a2faea2352c64e5
Source RPM  : nodejs-16.18.1-3.el7.src.rpm
以下略…

上記のように、パッケージ名 ( nodejs ) に対応する.rpmファイル ( nodejs-16.18.1-3.el7.src.rpm ) が確認できる。

Discussion