FreeBSD ハンドブック : Linux エミュレーション : Linux エミュレータのインストール : Linux ランタイムライブラリのインストール
Previous: 2.2-RELEASE への Linux エミュレーションのインストール
Next: Linux の ELF バイナリをインストールする

22.1.3. Linux ランタイムライブラリのインストール

22.1.3.1. linux_lib port を使用してのインストール

多くの Linux アプリケーションはシェアードライブラリを使用しますので, シェアードライブラリのインストールが終了しなければ, エミュレータのイン ストールは終わったことになりません. 手動でもインストールできますが, linux_lib port を使用するのが簡単です.

% cd /usr/ports/emulators/linux_lib
% make all install

これで, Linux エミュレータが動作するようになったはずです. 伝説(とメー ルのアーカイブ :-) によれば, Linux エミュレーションは, ZMAGIC ライブラ リとリンクされている Linux バイナリに対して, 最もうまく動作するようで す. Slackware V2.0 などに使われている QMAGIC ライブラリだと, エミュレー タが胸やけするかもしれません. マイナーバージョンの不一致などを報告するプログラムもありますが, 普通は 問題にならないようです.

22.1.3.2. 手動でのライブラリのインストール

``ports'' ディストリビューションが手元にない場合は, 手動でライブラ リをインストールする必要があります. プログラムが必要とする Linux のシェ アードライブラリとラインタイムリンカが必要です. また Linux ライブラリ の用の``shadow root'' ディレクトリ, /compat/linux, を作成する必要があ ります. FreeBSD で動作する Linux のプログラムが使用するシェアードライ ブラリは,まずこのファイルツリーから検索されます. 例えば, Linux のプロ グラムが/lib/libc.so をロードしようとした場合には, FreeBSD は, まず /compat/linux/lib/libc.so を開こうとします. 存在にしなかった場合には, 次に /lib/libc.so を試します. シェアードライブラリは, Linux の ld.so が参照するライブラリではなく, /compat/linux/lib 以下にインストールする 必要があります.

FreeBSD 2.2-RELEASE 以降では, /compat/linux にかかわる動作が多少異なって おり, ライブラリだけでなくすべてのファイルが, ``shadow root'' である /compat/linux から検索されるようになっています.

Linux のプログラムが必要とするシェアードライブラリを探す必要があるのは, FreeBSD のシステムに Linux のプログラムをインストールする最初の数回だ けでしょう. それが過ぎれば, 十分な Linux のシェアードライブラリがシス テムにインストールされ, 新しくインストールした Linux のバイナリも, 余 計な作業をせずに動作させることができるようになります.

22.1.3.3. シェアードライブラリの追加

linux_port をインストールした後に, アプリケーションが必要なライブラリ が存在しないというエラーを出したらどうしたらよいでしょうか? Linux のバ イナリがどのシェアードライブラリを必要とし, そしてどこで入手できるか, どのように探したらよいでしょうか? 基本的には, 以下の2種類の方法があり ます(以下の手順にしたがう場合には, 必要なインストール作業をおこなう FreeBSD シ ステム上で root として作業をおこなう必要があります).

Linux システムを使用でき, 必要なシェアードライブラリが調べられる場 合には, 単に FreeBSD のシステムにそのライブラリをコピーするだけで す. 例えば, DOOM の Linux バイナリを ftp で持ってきたとします. 使用で きる Linux システムの上に転送して, `ldd linuxxdoom' とやれば, 必要とす るシェアードライブラリがチェックできます.

% ldd linuxxdoom
libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29

最後のカラムに表示されているすべてのファイルを持って来て, /compat/linux の下 に置き, 最初のカラムに示されるファイル名からシンボリックリンクを張る必 要があります. すなわち, FreeBSD のシステムで, 以下のようなファイルが必 要となります.

/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29

最初のカラムに表示されているファイルと, メジャーバージョンの同じ Linux シェアードライブラリを既にインストールしている場合は, 新たにコピーする 必要はありません. 既にあるライブラリで動作するはずです. ただ, 新しいバー ジョンのシェアードライブラリがある場合は, 新しいものをコピーすることを お奨めします. 新しいライブラリにシンボリックリンクを変更したら, 古いラ イブラリは削除してかまいません.

/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -> libc.so.4.6.27
以上のようなライブラリがインストールされており, 新しいバイナリに対する ldd の出力が以下のようになる場合を考えます。
libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29

このように最後の番号が1つか2つ古いだけならば, 普通は /lib/libc.so.4.6.29 をコピーする必要はありません. わずかに古いライブラ リでも, プログラムは動作するはずだからです. もちろん, 新しいライブラリ と置き換えて, 以下のようにしても構いません.

/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29

シンボリックリンクのメカニズムは, Linux バイナリにのみ必要 なことに注意してください. FreeBSD のランタイムリンカは, メジャーリビジョ ン番号の一致したライブラリを検索しますから, ユーザが気にする必要はあり ません.

22.1.3.4. ld.so の設定 -- FreeBSD 2.2-RELEASE およびそれ以降

このセクションは, FreeBSD 2.2-CURRENT 以降にのみ当てはまります. 2.1-STABLE を使用している方は, 飛ばしてください.

最後に, FreeBSD 2.2-RELEASE を使われている場合は, Linux のランタイムリンカと その設定ファイルがシステムに導入されていることを確認してください. これらのファイルは, FreeBSD システムの適切な位置(/compat/linux ツリー以 下)にコピーされている必要があります.

/compat/linux/lib/ld.so
/compat/linux/etc/ld.so.config

使用できる Linux システムがない場合は, 必要なファイルは近くの FTP サイ トから入手してください. 各種ファイルの入手先についての情報を, 後に付 けておきます. ここでは, 必要なファイルの入手先がわかっているものとしま す.

以下のファイルを取得します(バージョンの不一致を避けるために, すべて同一 の FTP サイトから入手してください). 取得したファイルを /compat/linux 以下にインストールしてください(例えば, /foo/bar は, /compat/linux/foo/bar にインストールされます).

/sbin/ldconfig
/usr/bin/ldd
/lib/libc.so.x.y.z
/lib/ld.so

ldconfig と ldd は, /compat/linux の下にある必要はありません. システム のどこにあっても構いません. ただ, FreeBSD の同名のコマンドと間違えないように 注意してください. /usr/local/bin の中に, ldconfig-linux, ldd-linux とし てインストールするのもよいアイディアでしょう.

/compat/linux/etc/ld.so.conf ファイルを作成し, Linux ラインタイムリンカ がシェアードライブラリを検索するディレクトリを記述してください. このファ イルはプレインテキストファイルで, それぞれの行にディレクトリ名を含みま す. /lib と /usr/lib は標準ですから, 以下のようなディレクトリが追加できま す.

/usr/X11/lib
/usr/local/lib

Linux バイナリが, /lib/libc.so というライブラリを開いた場合, エミュレー タは内部で, ファイル名を /compat/linux/lib/libc.so にマップします. エ ミュレータがライブラリを検索するために, すべての Linux のライブラリ (/compat/linux/lib/libc.so, /compat/linux/usr/X11/lib/libX11.so など) は, /compat/linux 以下にインストールされていなければなりません.

FreeBSD 2.2-RELEASE を使用している場合は, Linux の ldconfig プログラム を実行する必要があります.

% cd /compat/linux/lib
% /compat/linux/sbin/ldconfig

ldconfig はスタティックリンクされていますから, 実行するのにシェアードラ イブラリを必要としません. ldconfig は, /compat/linux/etc/ld.so.cache ファイルを作成し, すべてのシェアードライブラリの名前を格納します. ライ ブラリの追加をおこなった場合には, ldconfig を再実行して, このファイルを作り 直さなければなりません.

2.1-STABLE では, /compat/linux/etc/ld.so.cache をインストールしたり, ldconfig を実行したりしないでください. 2.1-STABLE では, システムコー ルの実装方法が異なるため, ldconfig は使用されません.

これで, libc シェアードライブラリを必要とする Linux バイナリを実行する設 定が終了しました. ldd を ldd 自身に実行してテストしてください. ldd-linux としてインストールしている場合は, 以下のような結果になるはず です.

% ldd-linux `which ldd-linux`
libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29

ここまで終了すれば, 新しい Linux のバイナリをインストールできます. 新しい Linux バイナリをインストールするときは, それがシェアードライブ ラリを必要とするかどうか確認してください. 必要とする場合は, /compat/linux 以下にインストールされているかどうか確認してください. こ れは, Linux の ldd を新しいプログラムに対して実行し, 出力を確認するこ とによりおこなえます. ldd(ldd(1)マニュアルページも参照してください)は, プ ログラムが必要とするシェアードライブラリのリストを, majorname (jumpversion) => fullname という形式で出力します.

fullname のかわりに ``not found'' と出力される場合は, ライブラリの追加をす る必要があります. 必要なライブラリの名前は, majorname に libXXXX.so.N.mm という形式で示されています. Linux の FTP サイトで libXXXX.so.N.mm を探し, インストールしてください. XXXX(名前)とN(メジャー リビジョン番号)は一致している必要があります. マイナー番号 mm は, それほ ど重要ではありませんが, なるべく最新のものをインストールするようにして ください.


FreeBSD ハンドブック : Linux エミュレーション : Linux エミュレータのインストール : Linux ランタイムライブラリのインストール
Previous: 2.2-RELEASE への Linux エミュレーションのインストール
Next: Linux の ELF バイナリをインストールする