CentOS 5.xのOpenLDAP 2.4のrpmが出来るまで

タックス

今回の出来るまでシリーズ(勝手に命名…)は、wingリポジトリを作るきっかけとなったOpenLDAP 2.4のrpmが出来るまでをご紹介したいと思います。
もう3年も前のことなので記憶が曖昧なところもありますが、自分がどのようにして初めてのrpmパッケージを完成させたかを篤とご覧ください。

■ 作るきっかけ

当時CentOS 5が全盛だった2009年の秋頃に、認証でシングルサインオンをOpenLDAPで実現する案件に関わることになりました。
その案件では、マルチマスター構成が要件としてあったため、その機能が実装されているOpenLDAP 2.4系を使わなければなりませんでした。
私は途中からの参加であり状況を把握するため、まず最初にOpenLDAPがどのようにインストールされているのかを訪ねることにしました。
また、プロジェクトメンバーは全員初めてのOpenLDAPだったことから、マルチマスターやその他の設定がうまく動いておらず行き詰っていました。

具体的には、ソースコンパイルに問題があるのではないか、設定に問題があるのではないかなど、様々な議論がされている中で、ソースコンパイルが面倒くさいという話も出てきました。
マルチマスター構成だったため、1台ではなく複数のサーバにインストールしなければならないことと、OpenLDAPがバージョンアップした際にはそれにも対応しなければならないという要件もあったため、非常に悩んでいたと思います。

当時はsrc.rpmをリビルドする程度しかやったことがなかったのですが、rpmを作れば複数のサーバにインストールすることや、アップデート作業も一瞬で終えることができるため提案したところ、自分がrpmを作ることになりました…。

この時にリポジトリという門を叩くことになったのです…。


■ specファイルの中を見る

ソースコンパイルの知識もありながらsrc.rpmをリビルドする程度しか出来なかった自分は、specファイルは難解であることも知っていたし、何よりそんな難解なものなんか触りたくないと思っていました。
(今でもたまに思うが…)
しかも、今から考えてもかなり無謀だと思いますが、あんなややこしいOpenLDAPのrpmを作るなんて、ちょっとやそっとでは作れるはずも無く、ちょっとヤバいかなと思い始めていました。
実際、初めてspecファイルを見た時、「これ何やってんの?」が最初の印象でした。
しかししばらく眺めているうちに「ここにconfigureの設定がある」とか「ここで依存関係にあるパッケージを設定している」など、徐々に目が慣れていきました。


■ 初めての依存関係調査

yumコマンドは非常に便利なコマンドで、インストールしたいrpmがあれば依存関係にあるものも含めて自動でインストールしてくれる優れものです。
しかしrpmを作る立場になるのですから、当然このような依存関係も全て自分で調査して設定しなければならないことは、yumコマンドしか叩かないユーザーでもわかることと思います。
そんな依存関係を調査するには、最初にCentOSをMinimalインストールした状態から開発を始めるのが一番手っ取り早い方法だとすぐに判断出来たので、早速開発環境を整備することになりました。

Minimalインストールは、ものの10分ほどで終わるためすぐに環境を準備することができます。
また、rpmをビルドする際に必要な開発パッケージも簡単にインストール出来ます(rpm-build、gcc、make等)。
その後rpm -q openldapと入力すると、しっかりと2.3.27(当時)のパッケージがインストールされていることを確認。
なるほど、openldapはMinimalインストールでもインストールされるパッケージなんだと、この時初めて知りました。
ところが、次のコマンドを叩いた瞬間に呆然としてしまいました。

# yum remove openldap

openldapをインストールする前に必要なパッケージはspecファイルを見ればわかりますが、openldapに依存しているパッケージを知るには削除することだと思い、このコマンドを叩いてみました。
yum removeコマンドを叩けば指定したパッケージはもちろん、それに依存するパッケージも全て消してくれますが、OpenLDAPの場合は大量に依存しているようで、これ全部消したらCentOS自体が動かなくなるだろうというくらいものすごい量のrpmパッケージが画面に表示されました。

この時思わずNキーを押しましたが、大変な物に手を出してしまったと後悔してしまいました。


■ 他人が作ったrpmを探す

当時はOpenLDAPが2.4.19の頃で、かなり安定してきた頃と思いますが、CentOS 5用のOpenLDAPのrpmを探してみても全く出てきませんでした。
それどころか、当時OpenLDAP 2.4系のrpmなんて標準で搭載したディストリビューションはFedoraくらいで皆無だったと思います。
(ひょっとしたらopenSUSEあたりも対応していたと思いますが、当時そこまで頭が回りませんでした。)

仕方なくFedoraの中でCentOS 5に近い時代のOpenLDAP 2.4系のsrc.rpmを取って来て中身を見ることにしました。
また、CentOS 5標準のsrc.rpmと比較してもそんなに変わりは無かったため、この時は不安もありながらもそのままリビルドしてみることにしました。


■ リビルド、インストール。そして失敗…

specファイルの細かな修正が続き、不慣れなためかなりの時間がかかったと記憶していますが、新しいバージョンでビルド時に作成されるファイルの有無などのエラーに遭遇しながらもどうにかrpmを作るところまで辿りつきました。
そして、渾身のrpm -Uvh openldap-2.4.19-1.el5.x86_64.rpmを叩いた時に、ついに今回の主役が大量に登場。

「liblber-2.3.so.0は○○に必要とされています。」
「libldap-2.3.so.0は○○に必要とされています。」

最初、大量に出てきてしまって、何のことだかさっぱりわかりませんでしたが、調査していくうちにようやくこれらのパッケージがOpenLDAP 2.3に依存していることがわかりました。
(これがyum removeしようとした時に大量に表示された依存関係にあるパッケージの直接的な原因です。)


■ じゃーどうすればいいのか?

そもそも上記のライブラリーのファイル名になっている2.3が、OpenLDAP 2.3系列のライブラリーであることを示しているし、2.4系ではliblber-2.4.so.2(現在)となっているので、単にシンボリックリンクを作ってやればいいのではないかと最初は思いました。
現に他のパッケージのソースコンパイルされた例では恐る恐るではあるが、そういう対応をしているものも検索で引っかかります。
しかし「恐る恐る」というところに引っかかり、自分的には納得の行く答えを見つけ出せずにいました。

悩みに悩んでしばらく調査を続けていた時に、ある一つの光が見え始めました。

/~jeff/openldap/el5 (まだあったのね!)

こ、ここ、これは!?


■ compat-openldapとは何物だ?

現在は検索するといくつか見つけることが出来るのですが、当時CentOS 5用のrpmはこれしか見つけることが出来ませんでした。
早速src.rpmを展開すると2.3系のソースファイルが存在しており、specファイルを見てみると、liblber-2.3.so.0やlibldap-2.3.so.0と言ったライブラリーを、2.3系のソースからビルドしてcompat-openldapというサブパッケージにしていることが分かりました。
つまり、2.3系と2.4系のコンパイルをこの一つのspec内で処理していたのです。

現在公開されているwingリポジトリには、他にも同じような役割をであるCentOS 5用のmysqlclient15やCnetOS 6用のmysqlclient16があります。
CentOS 5標準のmysqlをインストールするとmysql-libsもインストールされ、その中にlibmysqlclient.so.15というライブラリーが存在しますが、このパッケージはperl-DBD-MySQLが必要としているため、例えばmysql55-serverをインストールするとperl-DBD-MySQLとmysqlclient15が同時にインストールされます。
他にもmysqlclient15を必要とするパッケージがいくつか存在しています。
(立ち上げ当初のwingリポジトリにはありませんでしたが、Ver.2へ移行する際にremiでこの形式を取っていたものを、参考にさせて頂きました。)


■ ところでBerkeley DBって何よ

OpenLDAPのsrc.rpmパッケージの中には、db-4.x.x.tar.gzという怪しいDBのプログラムが入っていますが、これはBerkeley DBでありOpenLDAPの情報はこのBerkeley DBに収められています。
以前にもOpenLDAPに関わったことで知ってはいたのですが、CentOS 5標準やjeffさんの物を見るとかなり古いものが収録されていることがわかりました。
しかしBerkeley DBが厄介な代物ということは、これまでの調査の中で分かっていたので、何かしらの対策が必要だと思っていました。
具体的には、

・負荷をかけるとすぐに壊れる
・後方互換性が考慮されていない(つまりアップグレードしたら動かない)

で、実際にrpmが完成しアップグレードの検証の際には、動いてくれないことを確認しました。
要件で、アップグレードの対応もありましたが、Berkeley DBもバージョンアップすることになると、アップグレード作業の負担が大き過ぎます。そのためBerkeley DBのバージョンアップはしない代わりに、現時点で最新のものを使うことになりました(当時は4.8.24あたりだったと思います)。

※ Berkeley DBのバージョンアップを行う際には、slapcatでバックアップを取り、slapaddでリストアしなければなりません。


■ 最大の難敵である依存関係を解決。しかし…

良かった。本当に良かった。
これでBerkeley DBもOpenLDAPも最新版を使ってrpmを作ることが出来ました。
サブパッケージの構成も、マルチマスターなどのモジュール系をopenldap-servers-overlaysというパッケージ名で別パッケージにしましたし、もう完璧だと思っていました。

ところがいざインストールして設定を進めているうちに、なんとMigrationToolsが入っていないことに気付きました。
MigrationToolsとは/etc/passwdや/etc/groupをLDAPに移行してくれる便利なツール。
CentOS 5標準のOpenLDAPには実装されていたのに、Fedoraやjeffさんのrpmから消えていたのです。

続けて調査を行ったところ、FedoraではOpenLDAP 2.4系からMigrationToolsパッケージを切り離したそうで、このようになっているらしいとのこと。
恐らくjeffさんもこのFedoraの意向に従ったのだと思います。

自分的にはどちらでも良かったのですが、やはりCentOS 5とのパッケージ構成の互換という意味では、OpenLDAPのrpmに含めるべきだろうと考えて、CentOS 5標準のspecファイルをお手本にMigrationToolsを実装しました。


■ 初めての自作rpm完成!!!

ついに生まれて初めての自作rpmが完成しました。
インストールもOK(最新より1つ前のバージョンを入れる)
設定もOK
動作もOK
マルチマスターもOK
アップグレードもOK(最新のバージョンを入れる)

無事OpenLDAPのrpmを運用に載せることが出来ました。


■ 自分の中で何かが芽生え始める

今回の案件ではその他に、

・php 5.2.11のrpmがほしい。(どこかからパクってさくっと作成)
・Apache 2.2.15のrpmがほしい。(apr、apr-utilも含めてCentOS 5標準を利用してさくっと作成)
・それぞれ最新版やセキュリティホールが発見されたら対応が必要

などが要件としてあり、今回のOpenLDAPの案件には3つのrpmを必要とする事態となっていました。

このOpenLDAPのrpmを作る以前は、rpmforgeやremiにかなりお世話になっていました。
しかしそれでは補えないようになり、rpmforgeやremiにも無いパッケージが必要になることが徐々に出てきました。
更にFedoraで管理しているepelで、rpmforgeとの間に依存関係が問題になることがありますし、remiではyum update phpをするといきなりphp 5.2や5.3になるというシステム的には致命的なことになることも判明。
(現在はyum update phpをするとphp 5.4系にアップグレードされてしまいます。)

この時、自分の中では標準以外のリポジトリは普通に扱うべきではないと感じ始めていました。
それに加え、ほしいと思ったrpmは検索しまくらないと出てこなかったり、入手出来たとしても後々アップグレードをする際にはどこから手に入れたかを忘れてしまうパッケージもあったりで、管理が非常に面倒になってしまうことから、非常に不便を感じていました。

この時に思いました。
これはもう自作リポジトリを用意するしか無いんじゃないか。と…

これより1ヶ月後、試行錯誤を行った結果、一つのリポジトリが密かに産声を上げたのでした。
そして何より困っている人達にも使って頂いて、便利に使ってもらえればいいじゃないかということで、自宅サーバで公開することにしました。


■ 総評

今から考えるとcompat-openldapはこれで問題無いのですが、openldapはopenldap24というパッケージ名にすれば良かったと思っています。
そうすれば、mysqlやphpのようにopenldap 2.3.43か2.4.xを選択できるように出来ます。
今のままでもバージョン指定でインストールすればいいのですが、yum updateと気軽に出来なくなるのが非常に残念でなりません。
rpmを作っている時は、2.4にアップ出来れば2.3を使う人はいないだろうと思ってましたが、やっぱり互換性を重視するのであれば間違った方法だと思います。

ただ初めてのrpm作成にしては、いきなり難しいパッケージにチャレンジしたにも関わらず、ちゃんと出来ているのは良かったですし、なんと言ってもwingリポジトリを作るきっかけにもなったのは大変有意義だったと思っています。
そのおかげもあり、その後のApacheやPHPのrpmパッケージ作成は、非常にスムーズで特に苦労した点が無かったことも良かったと思っています。

以上がOpenLDAP 2.4のrpmが出来るまでです。
いろいろと感想などもらえるとありがたいです!


■ 次回予告

MariaDBにするか、また別のパッケージも考えています。
苦労したのはphp系なんですが、その他にも書きたいパッケージがあります。

何を書くか公開されるまでわかりませんが、お楽しみに!


以下、参考リンクです。

Wikipedia(Linux)
Wikipedia(CentOS)
Wikipedia(LDAP)
Wikipedia(OpenLDAP)


関連記事


FC2Blog Rankingblogram投票ボタンとれまが人気ブログランキングブログランキング・にほんブログ村へ
くる天 人気ブログランキングにほんブログ村 IT技術ブログ CentOSへ

テーマ : Linux
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

WING☆

Author:WING☆


カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
カウンター
お問い合わせ

名前:
メール:
件名:
本文:

WING☆からのお知らせ
  • CentOS 7設定集
  •    └wingリポジトリ(el7)

  • CentOS 6 x64設定集
  •    └wingリポジトリ(el6)

  • CentOS 5 x64設定集
  •    └wingリポジトリ(el5)



    My Yahoo!に追加

    FC2ブログランキング



    リンク
    ブロとも一覧
    Virtualization & Sever Maniax
    RSSリンクの表示
    QRコード
    QRコード
    ブロとも申請フォーム

    この人とブロともになる