maehachi08 Anything Blog

2012年05月16日
ソースをRPMビルドしてみる(第1回)

ソースからRPMパッケージをビルド

勤務先ではサーバソフトウェアからperlモジュールやPEARライブラリなど数多くのものをソースから独自にビルドしてRPMパッケージを作成しています。
また、自宅環境にPuppetをインストールした際に、設定ファイルを/etc/puppetディレクトリ以下に、マニフェストファイルを/var/lib/puppet/dataディレクトリ以下に置きたいと思っています。
そこで、今回から何回かに分けてRPMビルド方法を記事にしたいと思います。

RPMパッケージであることのメリット

ソースで入れれるならソースから入れたら?って思う人もいるでしょう。でもRPMパッケージ管理システムで管理できる利点を考慮すると、ソースでしか配布されていない最新バージョンであっても、必要に応じてRPMビルドする労力をかけたほうがいいと思います
具体的には以下のような利点があります。


  • 削除が簡単(ソースから入れたらインストールディレクトリやリンクファイルを手動で削除しないと駄目)

  • rpm -qaコマンドでバージョンを含めたインストール履歴が確認できる

  • 一度パッケージ化すると再配布が容易(yumレポジトリに入れてyumコマンドで入れることも可能)

  • Puppetで適用できる(packageプロバイダとしてyumを使用可能)

  • </ul

    RPMビルドに必要な環境を準備

    RPMをビルドするツールであるrpmbuildをインストールする必要があります。

    # yum -y install rpm-build
    Loaded plugins: fastestmirror, security
    Loading mirror speeds from cached hostfile
     * base: ftp.iij.ad.jp
     * extras: ftp.iij.ad.jp
     * updates: www.ftp.ne.jp
    Setting up Install Process
    Resolving Dependencies
    --> Running transaction check
    ---> Package rpm-build.x86_64 0:4.8.0-19.el6 will be updated
    ---> Package rpm-build.x86_64 0:4.8.0-19.el6_2.1 will be an update
    --> Processing Dependency: rpm = 4.8.0-19.el6_2.1 for package: rpm-build-4.8.0-19.el6_2.1.x86_64
    --> Running transaction check
    ---> Package rpm.x86_64 0:4.8.0-19.el6 will be updated
    --> Processing Dependency: rpm = 4.8.0-19.el6 for package: rpm-libs-4.8.0-19.el6.x86_64
    --> Processing Dependency: rpm = 4.8.0-19.el6 for package: rpm-python-4.8.0-19.el6.x86_64
    ---> Package rpm.x86_64 0:4.8.0-19.el6_2.1 will be an update
    --> Running transaction check
    ---> Package rpm-libs.x86_64 0:4.8.0-19.el6 will be updated
    ---> Package rpm-libs.x86_64 0:4.8.0-19.el6_2.1 will be an update
    ---> Package rpm-python.x86_64 0:4.8.0-19.el6 will be updated
    ---> Package rpm-python.x86_64 0:4.8.0-19.el6_2.1 will be an update
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    =============================================================================================
     Package              Arch             Version                       Repository         Size
    =============================================================================================
    Updating:
     rpm-build            x86_64           4.8.0-19.el6_2.1              updates           124 k
    Updating for dependencies:
     rpm                  x86_64           4.8.0-19.el6_2.1              updates           898 k
     rpm-libs             x86_64           4.8.0-19.el6_2.1              updates           309 k
     rpm-python           x86_64           4.8.0-19.el6_2.1              updates            53 k
    
    Transaction Summary
    =============================================================================================
    Upgrade       4 Package(s)
    
    Total download size: 1.4 M
    Downloading Packages:
    (1/4): rpm-4.8.0-19.el6_2.1.x86_64.rpm                                | 898 kB     00:00
    (2/4): rpm-build-4.8.0-19.el6_2.1.x86_64.rpm                          | 124 kB     00:00
    (3/4): rpm-libs-4.8.0-19.el6_2.1.x86_64.rpm                           | 309 kB     00:00
    (4/4): rpm-python-4.8.0-19.el6_2.1.x86_64.rpm                         |  53 kB     00:00
    ---------------------------------------------------------------------------------------------
    Total                                                        1.3 MB/s | 1.4 MB     00:01
    Running rpm_check_debug
    Running Transaction Test
    Transaction Test Succeeded
    Running Transaction
      Updating   : rpm-4.8.0-19.el6_2.1.x86_64                                               1/8
      Updating   : rpm-libs-4.8.0-19.el6_2.1.x86_64                                          2/8
      Updating   : rpm-build-4.8.0-19.el6_2.1.x86_64                                         3/8
      Updating   : rpm-python-4.8.0-19.el6_2.1.x86_64                                        4/8
      Cleanup    : rpm-python-4.8.0-19.el6.x86_64                                            5/8
      Cleanup    : rpm-build-4.8.0-19.el6.x86_64                                             6/8
      Cleanup    : rpm-4.8.0-19.el6.x86_64                                                   7/8
      Cleanup    : rpm-libs-4.8.0-19.el6.x86_64                                              8/8
    
    Updated:
      rpm-build.x86_64 0:4.8.0-19.el6_2.1
    
    Dependency Updated:
      rpm.x86_64 0:4.8.0-19.el6_2.1                  rpm-libs.x86_64 0:4.8.0-19.el6_2.1
      rpm-python.x86_64 0:4.8.0-19.el6_2.1
    
    Complete!
    

    RPMビルド専用ユーザを作成します。

    # groupadd -g 3000 rpmbuilder
    # useradd -g 3000 -u 3000 rpmbuilder
    

    作業ディレクトリを作成します。

    # su - rpmbuilder
    
    $ id
    uid=3000(rpmbuilder) gid=3000(rpmbuilder) 所属グループ=3000(rpmbuilder)
    
    $ pwd
    /home/rpmbuilder
    
    $ mkdir -p rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
    
    $ ls -lR rpmbuild/
    rpmbuild/:
    合計 20
    drwxrwxr-x 2 rpmbuilder rpmbuilder 4096  5月 16 00:28 2012 BUILD
    drwxrwxr-x 2 rpmbuilder rpmbuilder 4096  5月 16 00:28 2012 RPMS
    drwxrwxr-x 2 rpmbuilder rpmbuilder 4096  5月 16 00:28 2012 SOURCES
    drwxrwxr-x 2 rpmbuilder rpmbuilder 4096  5月 16 00:28 2012 SPECS
    drwxrwxr-x 2 rpmbuilder rpmbuilder 4096  5月 16 00:28 2012 SRPMS
    
    rpmbuild/BUILD:
    合計 0
    
    rpmbuild/RPMS:
    合計 0
    
    rpmbuild/SOURCES:
    合計 0
    
    rpmbuild/SPECS:
    合計 0
    
    rpmbuild/SRPMS:
    合計 0
    

    rpmbuildコマンドはホームディレクトリに.rpmmacrosファイルが存在するときはそのファイルを参照します。.rpmmacrosファイルはマクロ変数を定義することが出来ます。今回は通常「/usr/src/redhat」で作業するところを、rpmbuilderユーザのホームディレクトリで作業ができるように設定します。

    $ id
    uid=3000(rpmbuilder) gid=3000(rpmbuilder) 所属グループ=3000(rpmbuilder)
    
    $ pwd
    /home/rpmbuilder
    
    $ echo '%_topdir %(echo $HOME)/rpmbuild' > .rpmmacros
    
    ## .el5 => CentOS-5 または .el4 => CentOS-4
    $ echo '%dist .el5' >> .rpmmacros
    
    ## CPU判別が正常に出来ない場合の対策
    $ #echo 'buildarchtranslate: i586: i586' > .rpmrc
    $ #echo 'buildarchtranslate: i686: i686' >> .rpmrc
    $ #echo 'buildarchtranslate: athlon: athlon' >> .rpmrc
    
    

    今日はここまで!
    次回はApache httpd web serverのソースhttpd-2.4.2.tar.gzを用いてRPMビルドにチャレンジしてみたいと思います。