よくわからないエンジニア

よく分からないエンジニアの日々の記録

よくわからないエンジニア

yumについて

「yumってなにやってるの?」

運良く(悪く?)三十手前の社会人にも関わらず、私には直属の後輩が出来た事が無い。
ただ、そう遠くない未来に私に後輩が出来たとしよう。
無垢な瞳で冒頭の質問を投げかけられた時、私は正解を答えられる自信が無い。
この非常に格好悪い事態を回避する為、この度yumについて調べてみた。

yumについて真剣に考えてみた

今日まで幾度と無く使用してきた魔法のコマンド、
yum install xxxxx
よくわからないエンジニアを助けてきてくれたyumに敬意を表し、
yumが何をしているのか真剣に調べてみた。

そもそもyumってなに?

ざっくりしたyumのイメージとして、

  • パッケージ(apacheとかphpとか)をインストールしてくれる
  • パッケージに必要なものもまとめて入れてくれる(依存関係の解決)
  • 指定されたどこかのサーバにパッケージを取りにいってる(リポジトリ)

頭が痛くなるような理解度である。

リポジトリについて

まずはパッケージを探しに行く先であるリポジトリについて、 /etc/yum.repo.d/以下に定義されている。

色々試してみた

CentOS-Base.repoに記述されていたもの全てにenabled=0をつけてみた。 この状態でyum installを使ってみる。

# yum install tree
Loaded plugins: fastestmirror, security
Setting up Install Process
Loading mirror speeds from cached hostfile
Nothing to do

有効なリポジトリが無いのでyumは何も出来ない。
次にCentOS-Base.repoをコピーした、Testを置いてみたが同様のエラーが発生。
なのでTest.repoに名前を変更した結果が以下

# yum install httpd
Loaded plugins: fastestmirror, security
Setting up Install Process
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
Repository contrib is listed more than once in the configuration
Loading mirror speeds from cached hostfile
Nothing to do

怒られたが反応は変わった。どうやらxxxx.repoの形式であれば反応してくれるらしい。
Test.repoのenabled=0を外し、base等をtest1~3に変更してみた。

# yum install httpd
Loaded plugins: fastestmirror, security
Setting up Install Process
Loading mirror speeds from cached hostfile
 * test1: www.ftp.ne.jp
 * test2: mirror.oasis.onnetcorp.com
 * test3: www.ftp.ne.jp
test1                                                                                                                           | 3.7 kB     00:00
test2                                                                                                                           | 3.4 kB     00:00
test3                                                                                                                           | 3.4 kB     00:00
Resolving Dependencies
There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them.
--> Running transaction check
---> Package httpd.x86_64 0:2.2.15-47.el6.centos.4 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=======================================================================================================================================================
 Package                        Arch                            Version                                           Repository                      Size
=======================================================================================================================================================
Installing:
 httpd                          x86_64                          2.2.15-47.el6.centos.4                            test2                          831 k

Transaction Summary
=======================================================================================================================================================
Install       1 Package(s)

Total download size: 831 k
Installed size: 2.9 M
Is this ok [y/N]:

動いたbaseとかupdatesじゃなくても問題無いらしい。 どうやら[base]とかの記載は/var/cache/yum/以下に作成されるディレクトリの名前だけな気がする。

specファイルについて

普段はろくに考えもせず、 EPELとかremiとか追加しているのだが、
ちゃんと挙動を理解した上で、必要そうな作業をやってみる事にした。
で今回調べててはじめて知ったのが、specファイルの存在。
specファイルに記述されている内容に従って、
yumやrpmはパッケージをインストールしているらしい。
いつもEPELリポジトリを追加するときは、

#yum install epel-release
 or
#rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

って何も考えずにやっていました。
specファイルはソースの中にあるらしいので、
以下コマンドで入手&取り出しを試みる。

#yumdownloader --source epel-release
#mkdri epel-test
#cd epel-test
#rpm2cpio ../epel-release-6-8.src.rpm |cpio -id
#ls
GPL  RPM-GPG-KEY-EPEL-6  epel-release.spec  epel-testing.repo  epel.repo  macros.ghc-srpm

さっそくspecファイルの中身を見てみる。

#cat epel-release.spec
Name:           epel-release
Version:        6
Release:        8
Summary:        Extra Packages for Enterprise Linux repository configuration

Group:          System Environment/Base
License:        GPLv2

# This is a Red Hat maintained package which is specific to
# our distribution.  Thus the source is only available from
# within this srpm.
URL:            http://dl.fedoraproject.org/pub/epel/
Source0:        http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
Source1:        GPL
Source2:        epel.repo
Source3:        epel-testing.repo
Source4:        macros.ghc-srpm

BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

BuildArch:     noarch
Requires:      redhat-release >=  %{version}
Conflicts:     fedora-release

%description
This package contains the Extra Packages for Enterprise Linux (EPEL) repository
GPG key as well as configuration for yum and up2date.

%prep
%setup -q  -c -T
install -pm 644 %{SOURCE0} .
install -pm 644 %{SOURCE1} .

%build


%install
rm -rf $RPM_BUILD_ROOT

#GPG Key
install -Dpm 644 %{SOURCE0} \
    $RPM_BUILD_ROOT%{_sysconfdir}/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

# yum
install -dm 755 $RPM_BUILD_ROOT%{_sysconfdir}/yum.repos.d
install -pm 644 %{SOURCE2} %{SOURCE3}  \
    $RPM_BUILD_ROOT%{_sysconfdir}/yum.repos.d

# rpm macros for koji
install -Dpm 644 %{SOURCE4} \
    $RPM_BUILD_ROOT%{_sysconfdir}/rpm/macros.ghc-srpm

%clean
rm -rf $RPM_BUILD_ROOT

%post
# Not needed for el6 as sources has been removed
#echo "# epel repo -- added by epel-release " \
#    >> %{_sysconfdir}/sysconfig/rhn/sources
#echo "yum epel http://download.fedora.redhat.com/pub/epel/%{version}/\$ARCH" \
#    >> %{_sysconfdir}/sysconfig/rhn/sources

%postun
#sed -i '/^yum\ epel/d' %{_sysconfdir}/sysconfig/rhn/sources
#sed -i '/^\#\ epel\ repo\ /d' %{_sysconfdir}/sysconfig/rhn/sources


%files
%defattr(-,root,root,-)
%doc GPL
%config(noreplace) /etc/yum.repos.d/*
/etc/pki/rpm-gpg/*
/etc/rpm/macros.ghc-srpm

そんなわけで、なんとなくyum/rpm周りの動きが見えてきた。
次回は実践編でspecファイルであれこれしてみようと思います。