RHELを題材にソースが見える環境を作る

2009年3月5日(木)
大和 正武

ソースコードを手元においておくには?

 ソースコードを復元するまでの無駄な時間を無くし、トラブル調査の初動からソースコードを閲覧できるように環境整備を実施しましょう。勤務先でRHELを対象にそのような環境を作り、それをsourcesと呼んでいます。sources環境では、調査の対象となる製品のソースコードをすべてファイルシステム上に展開します。ソースコードを閲覧するために特別なコマンドを実行する必要はありません。

sources環境の構築手順

 以下が環境作成の手順です。

1.すべてのsrc.rpmをダウンロードする。

2.ダウンロードしたsrc.rpmを1つ選ぶ。これをパッケージAのバージョンxに対するsrc.rpmであるとする。

3.rpmコマンドで選んだsrc.rpmをインストールする。/usr/src/redhat/SOURCESにソースコードの原型が配置される。

4.rpmbuildコマンドを実行し、ソースコードを復元する。/usr/src/redhat/BUILD/Aに復元されたソースコードが配置される。

5./srv/sources/A/x/BUILDというディレクトリを作成し/usr/src/redhat/BUILD/Aの内容を/srv/sources/A/x/BUILDに移動する。

6./usr/src/redhat/SOURCESおよび/usr/src/redhat/BUILD/A以下のファイルを削除する。

7.ダウンロードしたすべてのsrc.rpmに対して手順2.から6.までの手順を繰り返す。

 手順5.について少し説明が必要です。あるパッケージのあるバージョンのソースコードを読むだけであれば、rpmbuildコマンドの実行が完了した時点で、準備完了です。しかし「パッケージをバージョンアップしたら、動かなくなった」といったトラブルを調査するために、同じパッケージの異なるバージョンのソースコードを読み比べたくなります。

 ところが、異なるバージョンのソースコードをrpmbuildコマンドで復元するには問題があります。パッケージAのバージョンxとバージョンyについて、バージョンx → バージョンyの順序で、ソースコードの復元を試みると両方のバージョンが/usr/src/redhat/BUILD/A以下に配置されてしまい、バージョンxのソースコードをバージョンyのソースコードで上書きしてしまいます。

 こういった問題があるため、バージョンxのソースコードを復元した時点で手順5.を実施し/usr/src/redhat/BUILD/A以下のファイルを別の場所に退避させて、後に展開するバージョンyとの衝突を回避しています。

 以上の手順で、すべてのパッケージのすべてのバージョンに対するソースコードが/srv/sources以下に復元できます。そこで手順8として以下を実行します。

8./srv/sourcesをnfs経由でエクスポートする。

 これで自分だけでなく、同僚も時間を無駄にすることなくソースコードを閲覧できます。

9.sources:/srv/sourcesを/srv/sourcesにマウントする。

 手順9.に従うことによって、どのコンピューター上でも、同じソースコードを参照するのにいつでも同じファイルパスを使うことができます。

 図2は、実際に業務に使っている/srv/sourcesのディレクトリツリー上でbash-2.05-8のソースコードがどこにあるか示しています。紹介した手順で得られるディレクトリツリーに比べて実際の/srv/sources以下の構造はもう少し複雑です。ディレクトリ一覧の取得に時間が短くなるようにパッケージ名の先頭の一文字を使ってハッシングしている、ソースコードの原型についても保持している、といった理由によります。

レッドハット株式会社
レッドハット株式会社 グローバルサービス本部 プラットフォームソリューショングループ GPSコンサルタント。博士(工学)。(無料ではなく自由の意味での)フリーソフトウエア、データとしてソースコードを活用する技術、ヒューマン/コンピューターインタラクション、Lisp/Scheme/S式に関心を持つ。http://www.jp.redhat.com/

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています