解き放たれしソフトウェア

GNU/LinuxなどFLOSSについて書いてみるつもり

【Gentoo】(64bitと32bitの)マルチライブラリ環境について

例えば、パソコン向けとして現在普及しているのはいわゆる x86_64 アーキテクチャです。Gentoo では AMD64 と呼ばれています。 x86_64 アーキテクチャは、64 bit のシステムですが、旧来の32 bit のシステムとの互換性を保っています。 そのため、 x86_64 の CPU を使っていると、 32 bit システム向けに書かれたソフトウェアも動かすことが理論的には可能だということです。

x86_64 に限らずほかにも似たような(32 bitでも64 bitでも動く)状況のアーキテクチャもあるはずです。また、旧来の 32 bit アーキテクチャと互換性がないながらも、64 bit にアップグレードしたアーキテクチャもあるはずです。

しかし、現在のソフトウェアの多くは、外部のライブラリ(共有ライブラリ。Shared Object (.so)、Windows でいうところのDLL(Dynamic Link Library))を利用して動作しています。要は dependency の一種です。 そのため、 32 bitソフトウェアには32 bitのライブラリが、 64 bitソフトウェアには64 bitのライブラリが必要になります。 そのライブラリがまた別のライブラリを利用していたら、その別のライブラリも(以下略)ということになります。

そうして、32 bit と 64 bit の両方のソフトウェアが動作するシステムにするには、その各ソフトウェアを実行する基盤となるライブラリについても、32 bit のライブラリと、64 bit のライブラリの両方をインストールして共存させる必要があります。たとえ同じライブラリであっても、 32 bit 版と 64 bit 版の2種類をインストールすることになります。

こうして、両方のライブラリを共存させる環境のことを、マルチライブラリ環境というわけです。 反対に、一方しか入れられない環境のことをネイティブ環境というわけで、例えば「64ビットネイティブ環境」だとかいうわけです。

Gentoo の場合

Gentooでは、マルチライブラリ環境もネイティブ環境も可能です。

ただし、最初のシステムインストール時にネイティブ環境としてインストールしてしまうとマルチライブラリ環境に変えられません

反対に、マルチライブラリ環境が可能なシステムとしてインストールすれば、実際には「64 bit用ライブラリだけインストールして 32 bit用ライブラリはインストールしない」というシステムを組むことも可能です。もちろん、32 bit用ライブラリをインストールしなければ、(そのライブラリが必要な) 32 bit 向けのソフトウェアは動きません

マルチライブラリ環境のGentooシステムでは、32 bit用ライブラリは主に /usr/lib32/ 以下に、 64 bit用ライブラリは主に /usr/lib64/ 以下にインストールされます。 そして /usr/lib/usr/lib64 を指すようにシンボリックリンクが張られます。

マルチライブラリ環境の構築

さてそこで実際に、同じライブラリについて、 32 bit用と 64 bit用の両方をインストールするには、そのための設定が必要です(つまり、パッケージマネージャに伝えないといけません)。 *1

また同様に、ライブラリを利用していようがいまいが、 32bitの(32bit版も選べる)アプリケーションソフトウェアもまだ存在します。64bit版ではなく32bit版をインストールしたいのならば、そのための設定が必要です。

ちなみに、RedHat系やDebian系ならば、x86_64 のパッケージと i386 のパッケージが別々に提供されています。

Gentoo では同じパッケージで配信しているので、区別するためのフラグが、 "ABI_" で始まる拡張USEフラグ(昨日書いた隠れUSEフラグの一例)です。*2

Project:Multilib/Concepts - Gentoo Wikiを参照してください。

具体的には例えば、 x86系には ABI_X86="32 64 x32" の3種類があり、つまり abi_x86_32 abi_x86_64 abi_x86_x32 の3種類のUSEフラグがあります。

このうち abi_x86_x32 は実験的なものなので通常は指定しないほうがよいでしょう。 ですから、マルチライブラリでインストールしたいときに指定する USE フラグは abi_x86_32 abi_x86_64 の2つです。

もちろん、 /etc/portage/make.conf 内で、ABI_X86="32 64" と書いたり USE フラグ内にabi_x86_32 abi_x86_64としたりして、システム全体に適用してもかまいません。 しかし、グローバルに指定をすると、全てのパッケージにおいてこのフラグが適用され、 64 bitと 32 bitの両方をビルドするという、インストールする度に2倍くらい時間がかかる結果になります。

ですから、32bit版しかない特定のソフトウェアを動かしたいだけならばdependency にあたるパッケージに関してだけ abi_x86_32 abi_x86_64 を(/etc/portage/package.useで)個別に指定する方がよいといえます。 ただし、dependency を芋づる式に精査しないといけないという苦労はありますが……

Gentoo ではマルチライブラリにするとビルドにかかる時間もインストール後のディスクスペースも2倍前後費やしますが、 32bit版しかない古いソフトウェアを動かす手立てはありますよ、という話でした。


この投稿は Gentoo Advent Calendar 2015 - Qiita 13日めの記事です。

年末だからなのか何なのかわかりませんが、心身が疲れ気味の今日このごろです。

*1:ちなみに、以前は 32 bit用ライブラリのビルド済パッケージ("emul-linux-x86"で始まる名称のパッケージ群)が配布されていて手間を省くことも可能でしたが、現在は廃止されましたので(原則に立ち戻って)ビルドする必要があります。

*2:ちなみに "ABI" とは、アプリケーション・バイナリ・インターフェイスの略ですが、詳しい説明はここでは省きます。