タグ別アーカイブ: centos

yumとかリポジトリとかとりまとめ

yumコマンドを用いてよく新しいモジュールをインストールすることって多いと思います。
このコマンド、あまり細部まで理解していなくても検索して出てきたコマンドをそのまま実行してだまってyをタイプしておけば大体の場合動くと思います。

ここで「よし動いた大丈夫」って思っている方は多分この記事を見る必要はないと思います。

実際内部でどういうことが起こっているのか、レポジトリってなに?(epel?remi?)なぜいっぱいあるの?
とか結構疑問はいっぱい出てきます。

今日はその辺のyumを取り巻く環境について調べたいと思います。

yumコマンド概要を理解する

yumとはYellowdog Updater Modifiedの略であり(それはどうでもいいか)パッケージを管理するメタパッケージ管理システムである。
FedoraやCentOSなどRPMベースのディストリビューションの多くでよく利用されている。
Wikipediaから抜粋

レポジトリとは動作の確認できているコンパイル済みのバイナリファイルを集めたストレージのことで、自分でわざわざソースコードの入手・コンパイルなどを行わなくても簡単に導入できます。
またソフトウェアが必要としているソフトウェアの依存性も自動的に検出して、必要な物も一緒にインストールしてくれます。

レポジトリを理解する

CentOSでよくみるレポジトリepelやらremiについて調べましょう。

Red Hat Enterprise Linux (RHEL)向けのパッケージであり、RHELから分岐したディストリビューション(CentOSもここに含まれます)と互換性のあるパッケージです。
目的はFedoraで提供されているパッケージをRHEL系のディストリビューションでも互換性を提供することにあるようです。
Fedoraで提供されている高品質なパッケージをそのまま互換性をのと同時に、プロジェクトに関してもFedoraプロジェクトと同じガイドライン、ルール、ポリシーに従うことを順守しているようです。

またremiについても同様に、有志によって管理されているプロジェクトになります。
公式ページを参照するとremiの目的ですが、最新バージョンのPHPモジュールをFedoraやRHEL系のディストリビューションに提供することとあります。それぞれ目的が異なるんですね。

yumコマンドを理解する

yumでのよく使うコマンドの一例を紹介します。

コマンド 動作
install パッケージをインストールする
update パッケージを更新する
check-update アップデート可能なパッケージ一覧を表示する
remove パッケージをアンインストールする
list インストール可能なパッケージ一覧を表示する
search 指定したキーワードでパッケージを検索する
info パッケージの情報を表示する

リポジトリの追加の仕方を理解する

remiリポジトリを例に順をおって説明していきます。

  • rpmファイルをダウンロードする
  • ネットで検索したりしてremiレポジトリのrpmファイルをダウンロードします。rpmファイルのパスは頻繁に更新されるようなので注意が必要です。

    wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
    

    ここでrpmファイルとは。これまた(RPM Package Manager)とよばれ、Redhatにより開発されたこれまたパッケージ管理システムになります。
    yumは実際にはrpmのラッパーとして動作しており、実際にパッケージのインストールに関してはrpmにより行われます。
    rpmはパッケージをcpio形式で圧縮し、その中にspecファイル・バイナリまたはソースコードが含まれます。またパッケージを管理するためにBerkeley DBを採用していて、これによりローカルのパッケージ情報の管理がなされる。
    specファイルにはパッケージの名前や、概要、依存するパッケージ、バイナリパッケージのインストールパス、インストール前後に実行するスクリプトなどが書かれていて、これによってユーザが意識しなくてもインストールを円滑に行うことができます。

    rpmでは依存するパッケージは提供されますが、その実行はユーザに任せています。この辺りを自動的に解決するのがyumということになります。

  • rpmファイルをインストールする
  • rpm --upgrade --verbose --hash remi-release-6.rpm
    

    インストールされたかどうかを確認するためには下記のコマンドを利用します。

    # rpm -qa | grep remi-release-6
    remi-release-6.5-1.el6.remi.noarch
    

    実際にリポジトリを使用するにはenablerepoと明示的にオプションに指定することや、設定ファイルに優先順位などを記述することで可能になります。
    ここでは試しにremiリポジトリが提供しているphpに関するパッケージをかくにしてみましょう。

    # yum --enablerepo=remi list | grep php
    php.x86_64                                 5.4.32-1.el6.remi            @remi
    php-cli.x86_64                             5.4.32-1.el6.remi            @remi
    php-common.x86_64                          5.4.32-1.el6.remi            @remi
    php-mysql.x86_64                           5.4.32-1.el6.remi            @remi
    php-pdo.x86_64                             5.4.32-1.el6.remi            @remi
    ...
    

    結局内部で何をしているかを理解する(つもりだったがまたの機会に)

    大雑把なことわかったんですが、中身が気になりますので追っていきます。
    確認環境はCentOS6.6になります。

    vi /usr/bin/yum
    --
    #!/usr/bin/python
    import sys
    try:
        import yum
    except ImportError:
        print >> sys.stderr, """\
    There was a problem importing one of the Python modules
    required to run yum. The error leading to this problem was:
    
       %s
    
    Please install a package which provides this module, or
    verify that the module is installed correctly.
    
    It's possible that the above module doesn't match the
    current version of Python, which is:
    %s
    
    If you cannot solve this problem yourself, please go to
    the yum faq at:
      http://yum.baseurl.org/wiki/Faq
    
    """ % (sys.exc_value, sys.version)
        sys.exit(1)
    
    sys.path.insert(0, '/usr/share/yum-cli')
    try:
        import yummain
        yummain.user_main(sys.argv[1:], exit_code=True)
    except KeyboardInterrupt, e:
        print >> sys.stderr, "\n\nExiting on user cancel."
        sys.exit(1)
    

    python。
    ちなみにですがpythonは結構コマンドラインと親和性が高いように思っています。
    デプロイツールの一種にもpythonを拡張したfabricというライブラリがあり、コマンドラインなんかを用意に実行できます。

    そしてyumスクリプトを見ると実態はpythonのラッパーとして動作していることがわかります。

    この続きについてはまた機会があるときに追跡しようと思います。

    本日はyumの周りをざっくり理解してもらえたでしょうか。