玩式草子─ソフトウェアとたわむれる日々

第17回64ビット化への遠い道程その2]

いつの間にか2010年もあと数週間を残すのみとなりました。さすがに12月の声を聞くと身辺もあれこれ多忙となってきて、Plamo Linux関連の作業も停滞気味ではありますが、今回は前回の続きで、CLFSのx86-64用環境からPlamo Linux用の64ビット環境を構築していくあたりの話を紹介しましょう。

CLFS版x86-64用開発環境

前回紹介したように、CLFS(Cross Linux From Scratch)の64ビット環境は

  1. 32ビット環境上で64ビット用のバイナリを生成するクロスコンパイラの構築
  2. 上記クロスコンパイラを用いて64ビット用のミニマム開発環境を構築
  3. 作成したミニマム開発環境上に移行して、正式な64ビット環境を構築

という手順になります。このうち1.と2.の段階は前回紹介しましたので、今回は3.の段階からになります。

前回の最後に紹介したように、2.で作成した64ビット用の開発環境に移行するには、カーネル自体もx86-64用にコンパイルされている必要があります。そのため1.で作ったクロスコンパイラ環境でx86-64用にカーネルをビルドし、CLFS環境をホストしているPlamo-4.73環境をそのカーネルで再起動することにしました。

前回紹介したように、今回開発機用に導入したCore i7などx86-64機能を持つCPUでは、64ビット用のロングモードの中に32ビット用のバイナリを動かす互換モードが用意されており、x86-64用のカーネルでも32ビット用のPlamo-4.73環境をそのまま動かすことができます。

この特徴を使えば、通常のPlamo-4.73環境の中でchroot機能を使って64ビット用の開発環境を動かすことができ、1つのターミナル内を64ビット環境にして、その周囲では32ビット用のブラウザやエディタを動かしながら開発作業を進めることも可能です。

図1 Plamo-4.73内のCLFS x86-64環境
図1 Plamo-4.73内のCLFS x86-64環境

図では左側のターミナル内が64ビット環境になっており、CLFSの手順に従ってビルドした64ビット用GCC(/tools/bin/gcc)はバージョン4.5.1、右側のターミナル内はホスト側のPlamo-4.73の環境で、GCCは4.3.5になっています。

この状態では、chrootしている64ビット環境内からはホスト側の32ビット環境を見ることはできませんが、ホスト側の32ビット環境からは64ビット環境も1つのディレクトリ以下に見えるので、必要なソースコードやパッチファイルは32ビット環境でダウンロードして64ビット環境に送り込むことも可能です。

全くのゼロから環境を構築する場合は手順を十分に考慮しないと「ダウンロードするためのコマンドをダウンロードしなければならない」といったニワトリと卵的な問題がよく生じるのですが、x86-64の機能で32ビット環境を併存させておけば、必要な処理は32ビット環境で行い、結果だけを64ビット環境に持ってくることも容易なので作業効率は断然良くなります。このあたりもx86環境と互換性を持たないIA64アーキテクチャに比べてx86-64アーキテクチャが急速に普及した大きな理由でしょう。

さて、次はこうやって用意したミニマム開発環境を使って正式な64ビット環境を構築していく3.の段階になります(CLFSのドキュメントではV-9,10⁠⁠。

CLFSの手順では、すでに2.の段階で64ビットネィティブで動く開発環境がビルドできていますが、2.の段階で作った環境は--prefix=/toolsで作った限定版なので、一般的な環境用にするためには再度--prefix=/usrでGCC等もビルドし直すことになります。

また、今回は64ビット用バイナリと32ビット用バイナリの双方を動かすことができるmultilib環境を構築するつもりですので、eglibcやzlib, e2fsprogsなど、主要なライブラリは32ビット用と64ビット用の双方をビルドすることになります。このような作業には新たに導入したCore i7のCPUパワーの面目躍如といったところです。

パッケージをビルドしていく順番やコンパイル時の設定等はCLFSのドキュメントに詳しく記載されていますが、かいつまんで紹介するならば、multilib用にビルドするソフトウェアは、いったん32ビット用に設定してビルド、インストールしてから、再度64ビット用に設定してビルド、インストールし直す、という手順になります。その結果、32ビット用のライブラリ類は/usr/lib/に、64ビット用のライブラリは/usr/lib64/に分離されますが、/usr/bin/ 等にインストールされる一般コマンドは後からインストールされる64ビット用のバイナリで上書きされるので、それらのコマンドは64ビット版が利用されるようになります。

CLFSのV-10節をざっと数えたところ32ビット用のライブラリもビルドするソフトウェアはeglibcやzlib, util-linux-ng等21種、64ビット版のみをビルドするパッケージがbashやsed等、32種ありました。これら合わせて53種のソフトウェアを--prefix=/usrを指定してビルド、インストールしていくことで、CLFSの正式環境が完成します。

Plamo Linux用64ビットパッケージ

前回から長々とCLFSの手順を紹介してきましたが、この作業の本来の目的はPlamo用の64ビット開発環境を作ることです。前節までの作業で、CLFS用に用意したパーティション上の /usr/bin/ 等には64ビット用の開発ツール一式が揃ったので、これらのツールを使っていよいよPlamo用の64ビット版パッケージを作っていくことになります。

Plamoの場合、パッケージ形式はシンプルなtgz形式なのでCLFSが提供している基本環境だけでも作成できそうです。また、パッケージを管理するinstallpkgremovepkgといったツールもシェルスクリプトなので、単にコピーして持ってくるだけで十分でしょう。

そう考えて、作成したCLFS環境をバックアップした上で、Plamo-4.73から/sbin/installer/以下のファイルをコピーしてPlamo用のビルド環境を整えました。また、CLFSの設定方法を参考にPlamoBuildスクリプトを改造して、ヘッダ部のarch=..の指定に応じてconfigure時やビルド時に使うオプションを変更するようにしました。

一例を紹介してみると、bash-4.1用のPlamoBuildスクリプトのヘッダ部はこのようになっています。

 #!/bin/sh
 ##############################################################
 url='http://ftp.gnu.org/gnu/bash/bash-4.1.tar.gz'
 pkgbase=bash
 vers=4.1
 arch=x86_64
 # arch=i586
 build=P1
 src=bash-4.1
 OPT_CONFIG='--bindir=/bin --without-bash-malloc --with-installed-readline'
 DOCS='ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL NEWS README'
 patchfiles='bash-4.1-branch_update-1.patch'
 compress=txz
 ##############################################################

この部分で設定しているarch=...の指定は、従来はパッケージ名のアーキテクチャ部にしか使っていませんでしたが、ビルド時に32ビット用と64ビット用を区別するために、この指定を使ってスクリプト中で target と libdir という変数を使い、処理を変えるようにしてみました。

 if [ $arch = "x86_64" ]; then
     target="-m64"
     libdir="lib64"
 else
     target="-m32"
     libdir="lib"
 fi

これらの変数は、configure時に利用され、指定に応じてライブラリの位置やバイナリファイルの出力形式を変更します。

if [ -x configure ] ; then
  export PKG_CONFIG_PATH=/usr/X11R7/${libdir}/pkgconfig:/usr/${libdir}/pkgconfig:/usr/share/pkgconfig
  export LDFLAGS='-Wl,--as-needed' 
   CC="gcc -isystem /usr/include $target" CXX="g++ -isystem /usr/include $target " \
     ./configure --prefix=/usr --libdir=/usr/${libdir} --sysconfdir=/etc --localstatedir=/var --mandir='${prefix}'/share/man ${OPT_CONFIG[$i]}

この指定で、x86-64用にはgccコマンドが-m64オプションで起動され、ライブラリは/usr/lib64/を参照し、それ以外の場合はgccコマンドが-m32オプションで起動され、ライブラリは/usr/lib/を参照することになります。

このような処理を追加することでビルドスクリプトは多少複雑になりますが、パッケージ管理の観点からもビルドスクリプトは共有できた方が都合がいいので、次のバージョンのPlamoでは1つのビルドスクリプトで32ビット用と64ビット用のパッケージを生成できるようにする予定です。

一方、32ビット用と64ビット用のライブラリを含むmultilib用パッケージは、1つのビルドスクリプトで作るよりは2つのビルドスクリプトを流す方が簡単そうなので、現在は32ビット用のスクリプトと64ビット用のスクリプトの2つを使って作成するようにしています。ただし、multilibのあり方も含めて、このあたりの仕様は固まっていないので、将来的には変更される可能性大です。

なお、ヘッダ部の最後にcompress=txzという指定が見えるように、次のバージョンのPlamoではパッケージの圧縮形式にgzip以外にもbzip2xzが使えるようにパッケージ管理ツールを修正しています。

CLFSに従ってさまざまなソフトウェアをビルドしてきた経験があるので、ビルドスクリプトの修正は思ったよりも簡単に進みました。そう考えると、64ビット用の開発環境としてCLFSを選んだのは、遠回りのように見えて実は近道だったのかも知れません。

さて、PlamoBuildスクリプトの修正もほぼ固まってきたので、まずはCLFSと同等の環境をPlamoなパッケージで賄うために、CLFSでインストールした各ソフトウェアをPlamoBuildスクリプトでパッケージ化してインストールし直し、⁠CLFSなPlamo」とでも言うべき環境を構築してみました。

P-Plamo64

前節までで、とりあえずPlamo Linuxの64ビット版開発用環境ができたので、次はこの環境を使って既存のパッケージを64ビット化していくことになります。

Plamoは小規模なディストリビューションなものの、収録しているパッケージは1000を越えていて、これら全てを独力で64ビット化するのは現実的ではありません。64ビット化の作業には関係者(メンテナ)の力を借りたいところですが、そのためには64ビット用の開発環境を共有する必要があります。

64ビット用の開発環境はとりあえず手元では動いているものの、現状ではインストーラなどは用意できていないので、64ビット用のパッケージのみを公開しても開発環境を構築するのはかなり大変です。また、64ビット用の開発環境を利用するにはx86-64用にビルドされたカーネルも必要になるので、64ビット用のパッケージを updatepkg 等でインストールするだけ、というわけには行きません。

さて、どうしたものか…、としばらく考えましたが、64ビット用カーネルも含めた環境はP-Plamoのような独立環境にしてしまうのが手っ取り早そうなので、手元で作成した開発環境そのものをP-Plamoの手法を用いて固めることにしました。

P-Plamoは何度も作っているので作成は手慣れたものです。まず、VirtualBox等の仮想環境上にPlamo-4.73をインストールします。通常のP-PlamoだとKDE環境まで含めた大規模な環境ですが、今回はパッケージの開発ができればいいのでかなり小規模な環境にしました。

動作に必要な設定を行った上で、仮想環境上に構築したファイルシステムをNFSを経由して外部に取り出し、その環境に chroot して新しく作成した64ビット版のパッケージをアップデートインストールしていきます。libcをPlamo-4.73のglibc-2.10.2からmultilib版のeglibc-2.12に入れ替える際は多少心配でしたが、64ビット版に同梱の32ビット版ライブラリが既存の32ビットアプリケーションの動作を問題なく支えてくれました。

用意できている64ビット版パッケージへの更新を終えて完成した環境をsquashfsに固めて、x86-64カーネルと必要なモジュールドライバを更新したinitrdを組み合わせて、起動可能なDVDイメージにまとめました。このイメージをDVDに焼いて、x86-64機能を持ったCPUを積んだPCで起動すれば新しく作成した64ビット用の開発環境が利用できます。

図2 Plamo64開発環境のP-Plamo版
図2 Plamo64開発環境のP-Plamo版

この環境はPlamo-4.73に64ビット版パッケージの開発環境を上書きしたような構成になっているので、viのような64ビット化されていないパッケージは32ビット版のままという混在環境ですが、32ビット版のコマンドもmultilibな機能で動作するはずなので、とりあえずこの状態でメンテナ向けに公開することにしました。

Plamo64の現状

かなり不十分な状態なものの、上記64ビット用の開発環境を公開したところ、さっそくメンテナの人たちからの反応があり、64ビット用パッケージを分散開発することになりました。そうなると今度は作業の重複が気になります。そこで急ごしらえですが、64ビット用パッケージの作成状況や作成予約をするためのページを用意しました。

図3 Plamo64の進捗状況表示ページ
図3 Plamo64の進捗状況表示ページ

このページではFTPサーバにアップロードされたパッケージを元に、32ビット版と64ビット版の開発状況を表示しています。当初は64ビット版パッケージの進捗状況を表示して作成の励みにする程度のつもりでしたが、メンテナの方からのパッチで古いバージョンのまま放置されている32ビット版パッケージも区別できるようになりました。

現在、64ビット版の作成に力点を置いているので32ビット版は取り残され気味ですが、一通り64ビット版パッケージがまとまれば32ビット版も追従する形で更新していく予定です。

最後に、手元の64ビット環境の現状を紹介しましょう。

現在、細部は未調整なものの、X11R7.6RC1 + gtk+2.22.1 上で、自前でビルドしたXfce4.8 pre1やgimp-2.6.10、バイナリで配布されているgoogle-chromeやVirtualBoxの64ビット版が動く程度にはなってきていて、⁠とりあえず動く64ビット環境を年内に作る」という目標は達成できた感じです。

図4 手元の64ビット環境の現状
図4 手元の64ビット環境の現状

ただしこの環境は、カーソルキーやPage Up/Downあたりのキーが認識されなかったり、Xfceは動作はするものの終了できないといった致命的な問題があるため、一般に公開できるレベルに仕上げるにはもうしばらくかかりそうです。

おすすめ記事

記事・ニュース一覧