訳: &a.kiroh;.24 September 1996.Linux エミュレータのインストール
FreeBSD での Linux エミュレーションは, 大部分の Linux バイナリ(a.out
および ELF フォーマット)を実行できる状態になっています. -STABLE ブラン
チでのエミュレーションでは, Linux DOOM や Mathematica が実行できます.
FreeBSD-current でのエミュレーションは, さらに強化されており, Linux 用
の Quake, Abuse, IDL, netrek など, 多数のソフトウェアが実行できます.
Linux オペレーティングシステムには、特有の機能がいくつかあり, FreeBSD
でサポートされていないものもあります. Linux の /proc ファイルシステム
を使ったバイナリは, FreeBSD では実行できません (FreeBSD で使用可能な
/proc ファイルシステムとは仕様が異なっているためです). また仮想8086モー
ドを有効にするなど, i386 に特有なシステムコールを使っている場合も実行
できません.
カーネルが Linux エミュレーションを使用するように構築されているかを調
べるには, Linux のバイナリを実行してみるのが簡単です.
linux-executable: Exec format error. Wrong Architecture.
このようなエラーメッセージが表示されるようであれば, Linux との互換性は
サポートされていません. カーネルを再構築してインストールする必要があり
ます.
Linux エミュレーションの設定方法は, 使用している FreeBSD のバージョン
によって多少異なっています.
2.1-STABLE への Linux エミュレーションのインストール
2.1-STABLE の GENERIC カーネルは, Linux との互換性を保つように構築
されていません. カーネルの再構築が必要です. 再構築をおこなうには, 2つの方
法があります. 1つは, エミュレータをカーネル自体にスタティックリンクす
る方法. もう1つは, 動的に Linux ローダブルカーネルモジュール(LKM)をロー
ドするようにする方法です.
エミュレータを有効にするには, 以下をコンフィグレーションファイル
(/sys/i386/conf/LINT など) に追加します.
options COMPAT_LINUX
Linux DOOM などのアプリケーションを実行したい場合は, 共有メモリも有効
にしておかなければなりません. 以下を追加します.
options SYSVSHM
Linux のシステムコールを使用するには, 4.3BSD のシステムコールとの互換
性が保たれていることが必要です. 以下の行が含まれていることを確認してく
ださい.
options "COMPAT_43"
LKM を使用せずエミュレータをカーネルにスタティックにリンクしたい場合は,
以下の行を追加します.
options LINUX
の節の記述に
したがって config と, 新しいカーネルのインストールをおこなってください.
LKM を使用する場合は, ローダブルモジュールをインストールしなければなり
ません. カーネルとローダブルモジュールのバージョンが異なると, カーネル
がクラッシュする場合がありますので, 安全を期すためには, カーネルをイン
ストールするごとに, LKM も再インストールしてください.
% cd /usr/src/lkm/linux
% make all install
カーネルと LKM のインストールが終了したら, root で `linux' コマンドを
実行することで LKM をロードできます.
% linux
Linux emulator installed
Module loaded as ID 0
%
LKM がロードされたかどうかを確認するには, `modstat' を実行します.
% modstat
Type Id Off Loadaddr Size Info Rev Module Name
EXEC 0 3 f0baf000 0018 f0bb4000 1 linux_emulator
%
システムブート時に, LKM をロードするようにするには, 2つの方法がありま
す. FreeBSD-current または FreeBSD-STABLE では, /etc/sysconfig を,
linux=YES
のように, NO を YES に変更してください. FreeBSD 2.1 RELEASE およびそれ以
前のバージョンでは, そのような行はありませんので, /etc/rc.local に以下
の行を追加する必要があります.
linux
2.2-current への Linux エミュレーションのインストール
-current では, ``options LINUX'' や ``options COMPAT_LINUX'' を指定する必要
はなくなりました. Linux エミュレーションは LKM(「ローダブルカーネルモジュール」)
を使用して, リブートせず簡単にインストールできます. スタートアッ
プファイルで以下のように指定します.
/etc/sysconfig に以下の行が必要です.
linux=YES
これは結果的に, /etc/rc.i386 の以下の指定を有効にします.
# Start the Linux binary emulation if requested.
if [ "X${linux}" = X"YES" ]; then
echo -n ' '; linux
# XXX BOGUS - Linux script shouldn't make any output on success
fi
実行されたかどうかを確認するには, modstat を使用します.
% modstat
Type Id Off Loadaddr Size Info Rev Module Name
EXEC 0 4 f09e6000 001c f09ec010 1 linux_mod
%
FreeBSD-current システムの中には, modstat の実行がうまくいかないものがあ
るという報告もあります. 何らかの理由で, Linux LKM がロードできな
い場合は,
options LINUX
をカーネルの設定ファイルに指定して, エミュレータをスタティックにリンク
してください.
の節の記述にしたがって config と, 新しいカーネルのインストールをおこ
なってください.
Linux ランタイムライブラリのインストールlinux_lib port を使用してのインストール
多くの Linux アプリケーションはシェアードライブラリを使用しますので,
シェアードライブラリのインストールが終了しなければ, エミュレータのイン
ストールは終わったことになりません. 手動でもインストールできますが,
linux_lib port を使用するのが簡単です.
% cd /usr/ports-current/emulators/linux_lib
% make all install
これで, Linux エミュレータが動作するようになったはずです. 伝説(とメー
ルのアーカイブ :-) によれば, Linux エミュレーションは, ZMAGIC ライブラ
リとリンクされている Linux バイナリに対して, 最もうまく動作するようで
す. Slackware V2.0 などに使われている QMAGIC ライブラリだと, エミュレー
タが胸やけするかもしれません. これを書いている時点(1996年5月)で, ELF
エミュレーションは依然実験段階ですが, かなりうまく動作しているようです.
マイナーバージョンの不一致などを報告するプログラムもありますが, 普通は
問題にならないようです.
手動でのライブラリのインストール
``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-current では, /compat/linux にかかわる動作が多少異なりま
す. -current では, ライブラリだけでなくすべてのファイルが, ``shadow
root'' /compat/linux から検索されます.
Linux のプログラムが必要とするシェアードライブラリを探す必要があるのは,
FreeBSD のシステムに Linux のプログラムをインストールする最初の数回だ
けでしょう. それが過ぎれば, 十分な Linux のシェアードライブラリがシス
テムにインストールされ, 新しくインストールした Linux のバイナリも, 余
計な作業をせずに動作させることができるようになります.
シェアードライブラリの追加
DNS がうまく動作しなかったり, 以下のようなエラーメッセージが表示され
る場合は, /compat/linux/etc/host.conf ファイルを設定する必要があります.
resolv+: "bind" is an invalid keyword
resolv+: "hosts" is an invalid keyword
ファイルの内容を以下のように設定してください.
order hosts, bind
multi on
ここで, order は /etc/hosts を最初に検索し, 次にDNSを検索するように指定
します. /compat/linux/etc/host.conf がインストールされていない場合は,
Linux のアプリケーションは, FreeBSD の /etc/host.conf を使用しようとして,
文法の違いによる警告を表示します. /etc/resolv.conf を使用してネームサー
バを設定していない場合には, `bind' を削除してください.