RAKUS Developers Blog

株式会社ラクスのエンジニアブログ

yum installで学ぶ! yum の仕組み

はじめに

エンジニアのnorthmkyです。 ラクスに新卒で入社し、今年で2年目になります。
業務ではシステムの運用保守チームに所属しているので断然サーバ周りの作業が多いということで今回はその中でもyumコマンドについてまとめてみました。

おそらくこれを読めば

  • yumrpmとの違いって?とりあえずyum使ってるけど...
  • yum install [package]って打つだけでなんでDL&Installできるの?

という疑問は少し解消されるかと思います。
まだまだ浅い知識なので間違っているところがあれば指摘いただけると嬉しいです。

yumとは

まずものすごく大雑把にいいますとyumは下記になります。

  1. パッケージ管理システム
  2. rpmというパッケージ管理システムをラッパーしている
    • yum = rpm + 「リポジトリ」による自動更新機能 + 依存関係の管理(検出だけじゃない)

yumRedHatディストリビューションのパッケージ管理システムです。
パッケージというのは「ソフトウェアを構成するファイルらをまとめたもの」で、設定ファイルやドキュメント、プログラム本体、プログラム本体が動くためのライブラリなどがそれにあたります。1

Linuxでは「パッケージ読み解き、ソフトウェアを正しく動作させるようにする」「パッケージの情報を管理する」ことでソフトウェアを使える/管理する仕組みを採用していて、今回取り上げるyumLinuxディストリビューションのなかでRedHat系のパッケージ管理システムとなります。

このyumですが実際裏側ではrpmというパッケージ管理システムを使っています。
rpmではできなかった点をyumができるようにしている」という立ち位置になっています。

この出来なかった点が冒頭に述べた

  1. リポジトリ」による自動更新機能
  2. 依存関係の管理(検出だけじゃない)

です。

リポジトリとは

意味のあるまとまりでパッケージを複数格納している場所のことです。
この場所には下記が格納されています。

  • 複数のパッケージ(./*.rpm)
  • そのリポジトリのメタ情報ら(./repodata)

パッケージが複数存在してもその場所はリポジトリとは言えません。メタ情報があってリポジトリとなります。2
yumではこのリポジトリの情報を元にパッケージを検索したり、installを行います。

yum/rpm/リポジトリの関係性

yumrpmリポジトリの配置場所との関係性は下記のようになっています。

f:id:northmky:20171213093542j:plain

yum/etc/yum.repos.d/*.repoに記載されているリポジトリ場所にあるパッケージらに対してrpm経由でDLしたり、インストールしたり、必要であればインストール時に依存関係のあるパッケージを検出して一緒にインストールしたりします。
逆をいえば、/etc/yum.repos.d/*.repo以外のレポジトリは情報がないのでyumは取得することができませんので注意してください。

では、実際によく打つコマンドを例にしてどのようになっているか見てみます。

yum installを見てみる

「このコマンド(ソフトウェア)、インストールしてないからインストールしよう」というのはよくあると思うので
今回はyum isntall [package]を通してどんなことが行われているかを見ていきたいと思います。

f:id:northmky:20171213100704j:plain

大枠の流れは上記のようになっています。

今回はphpをインストールしてみたいと思います。 (OS:CentOS6)

[root@localhost ~]# yum install php

こちらを実行すると、下記のようによく見るインストールしますか?という対話モードになります。 この中身を見ていきましょう。

[root@localhost ~]# yum install php
読み込んだプラグイン:fastestmirror, security
インストール処理の設定をしています
Loading mirror speeds from cached hostfile /* 1.ミラーサイトの中で一番地理的に近いミラーサーバを各レポジトリごとに探す */
 * base: ftp.jaist.ac.jp
 * epel: ftp.jaist.ac.jp
 * extras: ftp.jaist.ac.jp
 * remi-safe: mirrors.mediatemple.net
 * updates: ftp.jaist.ac.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package php.x86_64 0:5.3.3-49.el6 will be インストール
--> 依存性の処理をしています: php-common(x86-64) = 5.3.3-49.el6 のパッケージ: php-5.3.3-49.el6.x86_64
--> 依存性の処理をしています: php-cli(x86-64) = 5.3.3-49.el6 のパッケージ: php-5.3.3-49.el6.x86_64
--> トランザクションの確認を実行しています。
---> Package php-cli.x86_64 0:5.3.3-49.el6 will be インストール
---> Package php-common.x86_64 0:5.3.3-49.el6 will be インストール
--> 依存性解決を終了しました。

依存性を解決しました  /* 2.必要なパッケージ情報を取得する */
=============================================================================================================================
 パッケージ                     アーキテクチャ             バージョン                         リポジトリー              容量
=============================================================================================================================
インストールしています:
 php                            x86_64                     5.3.3-49.el6                       base                     1.1 M
依存性関連でのインストールをします。:
 php-cli                        x86_64                     5.3.3-49.el6                       base                     2.2 M
 php-common                     x86_64                     5.3.3-49.el6                       base                     530 k

トランザクションの要約 
=============================================================================================================================
インストール         3 パッケージ

総ダウンロード容量: 3.8 M
インストール済み容量: 13 M
これでいいですか? [y/N]

1. ミラーサイトの中で一番地理的に近いミラーサーバを各レポジトリごとに探す

結果としてリポジトリの場所(URL)のほとんどが.jpドメインつきなため、一番地理的に近いミラーサイトをレスポンスを計測して選んだというのがわかります。

これはyumが、前述した/etc/yum.repos.d/*.repoリポジトリの情報からインストールするリポジトリの場所を決定しています。ではphpのパッケージが存在する 「base」というリポジトリの情報が記載されているCentOS-Base.repoを見てみます。

CentOS-Base.repo
  1 # CentOS-Base.repo
  2 #
  3 # The mirror system uses the connecting IP address of the client and the
  4 # update status of each mirror to pick mirrors that are updated to and
  5 # geographically close to the client.  You should use this for CentOS updates
  6 # unless you are manually picking other mirrors.
  7 #
  8 # If the mirrorlist= does not work for you, as a fall back you can try the 
  9 # remarked out baseurl= line instead.
 10 #
 11 #
 12 
 13 [base] /* 1.リポジトリ名 */
 14 name=CentOS-$releasever - Base
 15 mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra /* 2.ミラーサイトリスト */
 16 #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
 17 gpgcheck=1
 18 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
 19 
 20 #released updates 
 21 [updates]
 22 name=CentOS-$releasever - Updates
 23 mirrorlist=http://mirrorlist.centos.org/?
 ...
 ...

*.repoの中には基本的にはリポジトリ情報が複数記載されています。
mirrorlistに設定されているURLを実際に叩くと、

[root@localhost ~]# curl 'http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os&infra='
http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/6.9/os/x86_64/
http://ftp.iij.ad.jp/pub/linux/centos/6.9/os/x86_64/
http://mirror.fairway.ne.jp/centos/6.9/os/x86_64/
http://ftp.tsukuba.wide.ad.jp/Linux/centos/6.9/os/x86_64/
http://ftp.riken.jp/Linux/centos/6.9/os/x86_64/
http://ftp.nara.wide.ad.jp/pub/Linux/centos/6.9/os/x86_64/
http://ftp.jaist.ac.jp/pub/Linux/CentOS/6.9/os/x86_64/
http://www.ftp.ne.jp/Linux/packages/CentOS/6.9/os/x86_64/
http://mirror.0x.sg/centos/6.9/os/x86_64/
http://mirror.nus.edu.sg/centos/6.9/os/x86_64/
[root@localhost ~]

ミラーサイトのリストが返ってきます。
このリストからyumは一番近い場所を選定して、リポジトリ内のパッケージを取得する、ということをしているようです。 今回はftp.jaist.ac.jpでした。

2. 必要なパッケージ情報を取得する

phpパッケージを対象にしただけですが、実際には依存してる他パッケージもインストールの準備をしています。 パッケージが依存しているソフトウェアは、パッケージ(.rpm)のSPECファイルというパッケージのメタ情報(ソースバージョンなど)を記載したファイルに記載してあります3 この情報をRPMデータベース(/var/lib/rpm)4と呼ばれるパッケージの情報を保存しておくDBに登録し、install前に検索をかけ、依存関係の有無を見ています。

このような処理が走ったあとでDL&installが行われます。

おわりに

yumについてまとめてみました。
yumとはに記載した

  1. パッケージ管理システム
  2. rpmというパッケージ管理システムをラッパーしている

が伝えることができていれば幸いです。

ネットではチートシートや「rpmよりyumをまずは使うべし」などのハウツーの記事は多いのですが、
改めてどういった仕組み、処理でインストールが行われているかの記事はあまり見なかったので試行錯誤しながら執筆しました。
少しでも知識の助けになれば幸いです。(そして私自身の正しい知識の定着のためにもご指摘頂けると非常に助かります...!!)

Copyright © RAKUS Co., Ltd. All rights reserved.