Ubuntu Weekly Recipe

第217回 新年度特別企画・Red HatユーザーのためのUbuntuパッケージ管理の心得

この記事を読むのに必要な時間:およそ 5 分

Ubuntuって何?

ここまで話してきて大変いまさらですが,⁠Ubuntuがどういうものか」についてあらためて触れておきましょう。なぜ改めてこれを理解する必要があるかというと,UbuntuとDebian,そしてuniverseパッケージのありかたについて把握するために必要だからです。

Ubuntuは,Debian GNU/Linuxから派生したLinuxディストリビューションの一つです。作り込まれたデスクトップ環境と,独自のユーティリティを搭載したサーバー環境が強みです。

Ubuntuは「Debianベース」ではありますが,Debianとの完全な互換性はありません。Debian用のパッケージはUbuntuでは動かない可能性があります。

Ubuntuの大部分は,Debianのソフトウェアリポジトリに含まれるパッケージと同じソースをもとに,Ubuntu独自にビルドを行ったものです。最初に,なぜこうした処置が必要なのかを把握しておきましょう。教材は,Red Hatユーザーにはお馴染みの「互換ディストリビューション」です注3⁠。

ソースを共用するディストリビューション

Red Hat Enterprise Linux(RHEL)⁠系列」と呼ばれるディストリビューションには,本家にあたるRHELに加えて,⁠互換ディストリビューション」と呼ばれるものが存在します。

こうした互換ディストリビューションは,Red Hat Enterprise LnuxのソースRPM(SRPM)を取得して,⁠手元でビルド」したものを公開しているものです注4⁠。Scientific Linux注5⁠・CentOS・Oracle Linuxなどが該当します。

Index of /pub/redhat/linux/enterpriseからSRPMを入手し,それらをコンパイルするためのビルドファームを作り出せば,理論上は(作業の膨大さを無視すれば)自分で同じようなディストリビューションを制作することもできるでしょう注6⁠。

注3
Ubuntuに直接関係なさそうですが,Ubuntuでもこのあたりの知識が役に立ちます。
注4
実際には単にコンパイルするだけでなく,Red Hatの商標の削除・Red Hat依存の設定の除去といった調整(と,それに伴うエンバグ)が加わっています。
注5
リポジトリレベルで分割されていますが,Scientific Linuxには科学技術計算のためのパッケージが追加されています。なお,⁠Fermilab(FNAL)とCERNが共同で開発している」とされていますが,この数年は開発基盤が分離しており,FNALで開発されているScientific Linux(SL)とCERNで開発されているScientific Linux CERN(SLC⁠⁠,という表現が妥当になりつつあります。なお,SLCはSLとは異なり,CERNで利用することに特化した調整やパッチが加えられており,一般的な互換ディストリビューションとしての利用には向いていません。両研究所のたいていのサーバー・ワークステーションの標準的なLinux機はSL/SLCで構成されているため,これらの研究所のIT予算がなくならない限り(Red HatがSRPMの公開をやめる可能性はないので⁠⁠,開発の中断はなさそうです。ちなみに,LHCのためのコンピューティングシステムもSL/SLCを前提に開発されており,ヘタに中断するよりはリリースを継続した方が低コストになるという現実的な理由から,リリースが中断する可能性はほとんどありません。
注6
ビルドファームには相応の計算機資源が必要となるため,個人で手を出すのは少々厳しいでしょう。

RHEL互換ディストリビューション特有の問題

互換ディストリビューションはその性質上,ビルドに失敗する可能性があります。ここで言う「ビルドの失敗」には,いくつかの意味があります。

典型的なものは,RHELのRPMとは異なる状態でビルドしてしまうことです。

SRPMからのパッケージビルドの何割かは,tarballからの「./configure; make; make install」と同じ処理をしています。./configureはシステム内に存在する各種ヘッダファイルやライブラリを認識して,ビルド時に有効にする機能を自動的に変化させることがあります注7⁠。

これを引き起こすと注8⁠,RHELのバイナリと機能が異なるバイナリが生成される可能性があります注9⁠。

もうひとつの「失敗したビルド」は,⁠バージョン番号を付け損なっている」ケースです。

現在のRHELでは,rpmbuild時に「dist」キーワードを与えてrpmbuildコマンドを実行することでパッケージをビルドします。これはFedora(バージョン文字列に「fcN⁠⁠)とRHEL(同じく「elN」を含む)の間でパッケージをやりとりする際,.specファイルを書き換えずに済むので非常に便利なのですが,もしもキーワードを与えずにビルドしてしまうと,本来期待されているものと異なるバージョン文字列を持ったパッケージができてしまいます。これにより,いくつかの互換ディストリビューションでビルドミスが生じたことがあります注10⁠。この結果として,一部のディストリビューションではlibpngなどのパッケージのバージョンがRHELと食い違う,あるいは「yum-versionfix」プラグインを提供することでバージョン文字列の不整合を解決する,といった手法が用いられています。

注7
たとえばRHEL5系のNTPパッケージでは,avahi関連のヘッダが存在する環境でビルドすると,mdnsが有効になったバイナリが生成されます。
注8
気の利いたパッケージはconfigureを実行する際に期待するコンフィグを定義しておき,生成されるバイナリを制御するので問題は起こりません。
注9
こうした問題を避けるために,Red Hat/Fedoraでは「mock」というchrootを利用したビルド環境構築のためのソフトウェアが提供されています。mockを使うことでchrootした環境の中にminimal版のユーザーランドが構成されるので,そこでビルドを行うことで「本来想定していないヘッダが読み込まれる」といった問題を回避できます。Debianのpbuilder・Vineのvbuilderなども同様のソフトウェアです。
注10
たとえばRHEL4世代のlibpngに「1.2.7-3.1」というバージョンのRPMがリリースされている場合,この問題によるものです。これは本来,⁠1.2.7-3.el4_5.1」となるべきものでした。⁠1.2.7-3%{dist}.1」「%{dist}」の部分が無視されてしまっています。

Ubuntuが独自にビルドを行う理由

Ubuntuが独自にビルドを行っている理由も,こうした「同じソースを元にしているが,齟齬のあるソフトウェア」を作り出してしまう危険性からです。ただし,RHEL互換ディストリビューションとは理由が異なります。

UbuntuはDebianのパッケージとはまったく別に,いくつかの独自のパッケージや,独自にパッチを追加したパッケージを用意しています。カーネルもkernel.ubuntu.comで開発される独自のものを利用しています。また,Ubuntuのリリース時期は,Debianのものとは異なります。Ubuntuは「Debianの不定期なリリース(できあがった時がリリース日⁠⁠」というアプローチへの代替策として,⁠定期的なリリース」を前提にしています。この結果,ソフトウェアの構成はDebianのものとは異なります。単にバージョンが違うだけでなく,準備されているライブラリの機能が違う,といったこともありえるかもしれません。

この結果,そのままではライブラリの不整合で問題を起こす可能性があります。Debianからバイナリをそのまま持ってくると,正常に動作しない可能性がある,ということです。

Ubuntuではこれを回避するため,Debianに含まれるパッケージをDebianからUbuntuのuniverseリポジトリへ「持ってくる」(syncと呼びます⁠⁠,ソフトウェアをビルドし直しています。これにより,Debianとは違うバイナリ状態になる可能性はありますが(ビルド環境が揃っていないので,ビルドすると別のものができあがる⁠⁠,整合性が保たれた状態になります。これは,RHELに対するEPELのあり方によく似ています。EPELはFedoraのSRPMをリビルドしてRHELに持ち込んだもので,Ubuntuにおけるuniverseととてもよく似ている,と言えます。

まとめると,次のようになります。

  • RHELからRHEL互換ディストリビューションを作るプロセスと,DebianからUbuntuを作るプロセスはよく似ている。しかし,意図は異なる。
  • RHEL互換ディストリビューションは,⁠Red Hatと完全に同じ状態」を作ろうとしている。
  • Ubuntuは,⁠Debianとは全く違うが,整合性を持って動く状態」を作ろうとしている。

著者プロフィール

吉田史(よしだふみひと)

Ubuntu Japanese Team Member株式会社創夢所属。システム管理を中心にWindows/PC Unixを併用している。Ubuntu Japanese Teamではパッケージサーバの管理や翻訳などの作業を担当。