diff --git a/ja_JP.eucJP/books/handbook/linuxemu/chapter.sgml b/ja_JP.eucJP/books/handbook/linuxemu/chapter.sgml
index 8205af6fe8..45d643fdff 100644
--- a/ja_JP.eucJP/books/handbook/linuxemu/chapter.sgml
+++ b/ja_JP.eucJP/books/handbook/linuxemu/chapter.sgml
@@ -1,923 +1,1097 @@
Linux エミュレーション
原作: &a.handy; and &a.rich;
訳: &a.jp.kiroh;.
24 September 1996.
Linux エミュレータのインストール
FreeBSD での Linux エミュレーションは, 大部分の Linux
バイナリ(a.out および ELF
フォーマット)を実行できる状態になっています. 2.1-STABLE ブラン
チでのエミュレーションでは, Linux DOOM や Mathematica
が実行できます. &rel.current;-RELEASE でのエミュレーションは,
さらに強化されており, Linux 用 の Quake, Abuse, IDL, netrek
など, 多数のソフトウェアが実行できます.
Linux
オペレーティングシステムには, 特有の機能がいくつかあり, FreeBSD
でサポートされていないものもあります. Linux の
/proc ファイルシステム を使ったバイナリは,
FreeBSD では実行できません (FreeBSD で使用可能な
/proc
ファイルシステムとは仕様が異なっているためです).
- また仮想8086モー ドを有効にするなど, i386
- に特有なシステムコールを使っている場合も実行 できません.
+ また仮想 8086モードを有効にするなど, i386
+ に特有なシステムコールを使っている場合も実行できません.
Linux エミュレーションの設定方法は, 使用している FreeBSD
- のバージョン によって多少異なっています.
+ のバージョンによって多少異なっています.
2.1-STABLE への Linux エミュレーションのインストール
2.1-STABLE の GENERIC カーネルは,
- Linux との互換性を保つように構築 されていません.
+ Linux との互換性を保つように構築されていません.
カーネルの再構築が必要です. 再構築をおこなうには, 2つの方
法があります. 1つは,
- エミュレータをカーネル自体にスタティックリンクす る方法.
+ エミュレータをカーネル自体にスタティックリンクする方法.
もう1つは, 動的に Linux
ローダブルカーネルモジュール(LKM)をロー
ドするようにする方法です.
エミュレータを有効にするには,
以下をコンフィグレーションファイル
(/sys/i386/conf/LINT など)
に追加します.
options COMPAT_LINUX
Linux DOOM などのアプリケーションを実行したい場合は,
共有メモリも有効 にしておかなければなりません.
以下を追加します.
options SYSVSHM
- Linux のシステムコールを使用するには, 4.3BSD
- のシステムコールとの互換 性が保たれていることが必要です.
- 以下の行が含まれていることを確認してく ださい.
+ Linux のシステムコールを使用するには, 4.3BSD と互換性のある
+ システムコールを備えていることが必要です.
+ 以下の行が含まれていることを確認してください.
options "COMPAT_43"
LKM
- を使用せずエミュレータをカーネルにスタティックにリンクしたい場合は, 以下の行を追加します.
+ を使用せずエミュレータをカーネルに静的リンクしたい場合は, 以下の行を追加します.
options LINUX
FreeBSD
カーネルのコンフィグレーション の節の記述に
したがって config と,
新しいカーネルのインストールをおこなってください.
LKM を使用する場合は,
- ローダブルモジュールをインストールしなければなり ません.
+ ローダブルモジュールをインストールしなければなりません.
カーネルとローダブルモジュールのバージョンが異なると, カーネル
がクラッシュする場合がありますので, 安全を期すためには,
- カーネルをイン ストールするごとに, LKM
+ カーネルをインストールするたびに, LKM
も再インストールしてください.
&prompt.root; cd /usr/src/lkm/linux
&prompt.root; make all install
カーネルと LKM のインストールが終了したら, root で `linux'
コマンドを 実行することで LKM をロードできます.
&prompt.root; linux
Linux emulator installed
Module loaded as ID 0
&prompt.root;
LKM がロードされたかどうかを確認するには,
modstat を実行します.
&prompt.user; modstat
Type Id Off Loadaddr Size Info Rev Module Name
EXEC 0 3 f0baf000 0018 f0bb4000 1 linux_emulator
システムブート時に, LKM をロードするようにするには,
2つの方法がありま
す. FreeBSD 2.2.1-RELEASE または 2.1-STABLE では,
/etc/sysconfig を,
linux=YES
のように, NO を YES に変更してください.
FreeBSD 2.1-RELEASE およびそれ以
前のバージョンでは, そのような行はありませんので,
/etc/rc.local に以下
の行を追加する必要があります.
linux
2.2-RELEASE への Linux エミュレーションのインストール
options LINUX や options
- COMPAT_LINUX を指定する必要 はなくなりました.
+ COMPAT_LINUX を指定する必要はなくなりました.
Linux エミュレーションは
LKM(“ローダブルカーネルモジュール”) を使用して,
リブートせず簡単にインストールできます. スタートアッ
プファイルで以下のように指定します.
/etc/rc.conf
に以下の行が必要です.
linux_enable=YES
これは結果的に, /etc/rc.i386
の以下の指定を有効にします.
# Start the Linux binary emulation if requested.
if [ "X${linux_enable}" = X"YES" ]; then echo -n '
linux'; linux > /dev/null 2>&1
fi
実行されたかどうかを確認するには, modstat
を使用します.
&prompt.user; modstat
Type Id Off Loadaddr Size Info Rev Module Name
EXEC 0 4 f09e6000 001c f09ec010 1 linux_mod
2.2-RELEASE とそれ以降のシステムの中には,
modstat の実行がうまくいかない
ものがあるという報告もあります.
何らかの理由で, Linux LKM がロードできな
い場合は,
options LINUX
をカーネルの設定ファイルに指定して,
エミュレータをスタティックにリンク
してください.
FreeBSDカーネルのコンフィグレーション
の節の記述にしたがって config と,
新しいカーネルのインストールをおこ
なってください.
Linux ランタイムライブラリのインストール
linux_lib port を使用してのインストール
多くの Linux
アプリケーションはシェアードライブラリを使用しますので,
シェアードライブラリのインストールが終了しなければ,
- エミュレータのイン ストールは終わったことになりません.
+ エミュレータのインストールは終わったことになりません.
手動でもインストールできますが, linux_lib port
を使用するのが簡単です.
&prompt.root; cd /usr/ports/emulators/linux_lib
&prompt.root; make all install
これで, Linux
エミュレータが動作するようになったはずです. 伝説(とメー
ルのアーカイブ :-) によれば, Linux
エミュレーションは, ZMAGIC ライブラ リとリンクされている
Linux バイナリに対して, 最もうまく動作するようで す.
Slackware V2.0 などに使われている QMAGIC ライブラリだと,
- エミュレー タが胸やけするかもしれません.
+ エミュレータが胸やけするかもしれません.
マイナーバージョンの不一致などを
報告するプログラムもありますが,
普通は 問題にならないようです.
手動でのライブラリのインストール
“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
のバイナリも, 余
計な作業をせずに動作させることができるようになります.
シェアードライブラリの追加
linux_port をインストールした後に,
アプリケーションが必要なライブラリ
が存在しないというエラーを出したらどうしたらよいでしょうか?
Linux のバ イナリがどのシェアードライブラリを必要とし,
そしてどこで入手できるか, どのように探したらよいでしょうか?
基本的には, 以下の2種類の方法があり
ます(以下の手順にしたがう場合には,
必要なインストール作業をおこなう FreeBSD シ ステム上で root
として作業をおこなう必要があります).
Linux システムを使用でき,
必要なシェアードライブラリが調べられる場 合には, 単に
FreeBSD のシステムにそのライブラリをコピーするだけで す.
例えば, DOOM の Linux バイナリを ftp で持ってきたとします.
使用で きる Linux システムの上に転送して, ldd
linuxxdoom とやれば, 必要とす
るシェアードライブラリがチェックできます.
&prompt.user; 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 のランタイムリンカは,
メジャーリビジョ
ン番号の一致したライブラリを検索しますから,
ユーザが気にする必要はあり ません.
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 プログラム を実行する必要があります.
&prompt.root; cd /compat/linux/lib
&prompt.root; /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
としてインストールしている場合は, 以下のような結果になるはず
です.
&prompt.root; 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
(&man.ldd.1; マニュアルページも参照してください)は, プ
ログラムが必要とするシェアードライブラリのリストを,
majorname
(jumpversion) =>
fullname
という形式で出力します.
fullname のかわりに
not found と出力される場合は,
ライブラリの追加をす る必要があります.
必要なライブラリの名前は, majorname に libXXXX
.so.N.mm
という形式で示されています. Linux の FTP サイトで
libXXXX.so.N.mm
を探し, インストールしてください.
XXXX(名前)とN
(メジャー リビジョン番号)は一致している必要があります.
マイナー番号 mm は, それほ
ど重要ではありませんが,
なるべく最新のものをインストールするようにして
ください.
Linux の ELF バイナリをインストールする
ELF のバイナリを使うためには,
- “焼き印を押す(branding)” 作業が必要になります.
- 焼き印を押していない ELF バイナリを実行しようとすると,
+ “マークをつける(branding)”作業が必要になります.
+ マークのない ELF バイナリを実行しようとすると,
以下のようなエラーメッセージを
うけとってしまうことでしょう.
&prompt.user; ./my-linux-elf-binary
ELF binary type not known
Abort
カーネルが FreeBSD の ELF バイナリと Linux のバイナリとを
見分けられるようにするためには, &man.brandelf.1;
を以下のようにして使ってください:
&prompt.user; brandelf -t Linux my-linux-elf-binary
今ではGNU のツールたちが,
- ELFバイナリに自動的に適切な焼き印を押すようになったので,
+ ELFバイナリに自動的に適切なマークを付加するようになったので,
今後はこの作業もだんだんと必要なくなってゆくでしょう.
ホストネームリゾルバの設定
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 を削除してください.
最後になりますが, 2.1-STABLE を使用している場合は,
RESOLV_HOST_CONF 環境変数を指定して,
アプリケーションにホストテーブル
の検索方法を指定する必要があります. FreeBSD 2.2-RELEASE
かそれ以降を使用している場合 は, スキップしてください.
/bin/csh を使っている場合は,
以下のようにし ます.
&prompt.user; setenv RESOLV_HOST_CONF /compat/linux/etc/host.conf
/bin/shの場合は,
以下のようにします.
&prompt.user; RESOLV_HOST_CONF=/compat/linux/etc/host.conf; export RESOLV_HOST_CONF
必要なファイルを探すには
以下の情報は, この文書が書かれた時点では有効ですが, FTP
サイトの 名前, ディレクトリ, 配布ファイル名などは,
変更されている可能性がありま す.
訳注: ここに取り上げられている FTP サイトは,
日本国内にもミラーサイト が多数存在します. なるべく近くの
FTP サイトからファイルを入手してくだ さい.
Linux は, いくつかのグループが,
それぞれ独自のバイナリ配布セットを作成 して配布しています.
配布セットは, “Slackware” や
“Yggdrasil” など の名前がつけられています.
これらの配布セットは, 多くの FTP サイトから 入手できます.
ファイルが展開されており, 必要なファイルのみを取得できる
場合もありますが,
通常は圧縮された配布セットの形で入手できます. 配布 セットは,
いくつかのサブディレクトリに, gzip で圧縮された tar ファイル
として格納されています. それぞれの配布セットの一次配布先は,
以下の通り です.
sunsite.unc.edu:/pub/Linux/distributions
tsx-11.mit.edu:/pub/linux/distributions
ヨーロッパのミラーサイトの例:
ftp.luth.se:/pub/linux/distributions
ftp.demon.co.uk:/pub/unix/linux
src.doc.ic.ac.uk:/packages/linux/distributions
混乱を避けるために, ここでは Slackware だけを取り上げます.
- この配布セッ トは, 多くのサブディレクトリ内にある
+ この配布セットは, 多くのサブディレクトリ内にある
別々のパッケージから構成されていま す. 通常,
パッケージはインストールプログラムにより自動的に制御されま
すが, “手動で”おこなうことも可能です.
まず配布セットの中の, contents
サブディレクトリの内容を書くにしてください. ここには多く
の小さなテキストファイルが含まれおり,
- それぞれのパッケージの内容が記述 されています.
+ それぞれのパッケージの内容が記述されています.
必要なファイルを探している場合は, まず contents 内のテキ
ストファイルを取得し, そのファイルの中から grep
を使用して検索するのが, 最も速い方法でしょう.
以下に必要となるであろうファイルを, grep を使用
して検索した例を示します.
Library
Package
ld.soldso
ldconfigldso
lddldso
libc.so.4shlibs
libX11.so.6.0xf_lib
libXt.so.6.0xf_lib
libX11.so.3oldlibs
libXt.so.3oldlibs
この場合は, ldso, shlibs, xf_lib, oldlibs
というパッケージが必要なこと がわかります.
それぞれのcontentsファイルの中で, PACKAGE
LOCATION と書いてある行を探してください.
その行に, パッケージが含まれている“ディ スク”,
今回の場合はサブディレクトリ名が書かれています. たとえば,
以下の ようになります.
Package
Location
ldso diska2
shlibs diska2
oldlibs diskx6
xf_lib diskx9
“diskXX”
というのは, 配布セットの
slackware/XX
サブディレクトリ を示します. それ以外の場合は,
contrib サブディレクトリに格納されて
います. 今回の場合は,
以下のファイルを取得すればいいことがわかります (ファイル名は,
配布セットのルートディレクトリからの相対パスで示してあ
ります).
slakware/a2/ldso.tgz
slakware/a2/shlibs.tgz
slakware/x6/oldlibs.tgz
slakware/x9/xf_lib.tgz
gzip で圧縮された tar ファイルから必要なファイルを
/compat/linux ディ
レクトリに格納してください(必要なファイルのみを展開するか,
- あるいは必 要でないファイルを後で削除してください).
+ あるいは必要でないファイルを後で削除してください).
これで作業は終了です.
参照:
ftp.freebsd.org:pub/FreeBSD/2.0.5-RELEASE/xperimnt/linux-emu/README
と
/usr/src/sys/i386/ibcs2/README.iBCS2
FreeBSD への Mathematica のインストール
原作: &a.rich; and &a.chuck;
訳: &a.jp.kiroh;.
この文書は, Mathematica 2.2 の Linux
バイナリディストリビューションを, FreeBSD 2.1
にインストールする方法について説明します.
Mathematica は, そのままでは FreeBSD
をサポートしていませんが, Linux は サポートしています. ですから,
Linux エミュレータの設定が終わってしまえ ば, Mathematica
を動作させる環境はほとんど整ったことになります.
DOS 用のスチューデント版 Mathematica から Linux
バージョンへのアップグレー ド価格は, 執筆時点 (1996年5月) では,
$45.00 です. 直接 Wolfram(電話番号(217) 398-6500)に注文して,
支払いはクレジットカー ドでおこなえます.
Mathematica ディストリビューションの展開
バイナリは, Wolfram から CDROM で配布されています. CDROM
- には, 1ダー スほどの tar ファイルが含まれており,
- それぞれサポートされているアーキテ クチャに対応しています.
+ には, 1ダースほどの tar ファイルが含まれており,
+ それぞれサポートされているアーキテクチャに対応しています.
Linux 用のファイルは, LINUX.TAR です.
例えば /usr/local/Mathematica
以下にインストールする場合は, 以下のようにしま す.
&prompt.root; cd /usr/local
&prompt.root; mkdir Mathematica
&prompt.root; cd Mathematica
&prompt.root; tar -xvf /cdrom/LINUX.TAR
Mathematica パスワードの取得
Mathematica を実行する前に, 使用するマシンに対応した
“machine ID” を Wolfram
から取得する必要があります.
Linux 互換ランタイムライブラリがインストールされており,
mathematica の展 開が終了したら, Install ディレクトリで
mathinfo プログラムを使用す ることで
“machine ID” を得ることができます.
&prompt.root; cd /usr/local/Mathematica/Install
&prompt.root; mathinfo
LINUX: 'ioctl' fd=5, typ=0x89(), num=0x27 not implemented
richc.isdn.bcm.tmc.edu 9845-03452-90255
ここで, richc の “machine ID”
は, 9845-03452-90255 となります. ioctl
のメッセージは無視してください. まだ FreeBSD
では実装されていません. Mathematica
を実行するたびに同様のメッセージが表示されますが, 実際の使
用に問題はありませんので, 無視してかまいません.
電子メールや電話, ファックスなどで Wolfram に
“machine ID” を知らせ て登録すると,
いくつかの番号のグループからなるパスワードが送り返されて
きます. パスワードを, マシン名, ライセンス番号とともに,
- mathpass ファ イルに追加します.
+ mathpass ファイルに追加します.
追加は, 以下のようにおこないます.
&prompt.root; cd /usr/local/Mathematica/Install
&prompt.root; math.install
ライセンス番号と, Wolfram
から送られてきたパスワードを入力を求めます.
入力を間違えたりして, math.install
の実行が失敗しても大丈夫です. mathpass
ファイルを手動で編集して, 情報を訂正してください.
パスワードの入力後, math.install では,
インストール方法を, デフォルト 設定でのインストールか,
- 自分で方法を指定するインストールから選ぶことが できます.
+ 自分で方法を指定するインストールから選ぶことができます.
筆者のようにインストールプログラムを信用していない場合は, 自
分でディレクトリを指定する方を選択するでしょう.
自分で指定するインストー ルを選んだ場合, math.install
自身ではディレクトリの作成はおこないません. 注意してください.
別のウィンドウでシェルを開いて, 指定するディレクトリ
を作成してください. 存在しないディレクトリを指定して,
math.install が インストールに失敗した場合には,
ディレクトリを作成し, math.install を 再び実行してください.
- 筆者らがインストール先に選んだディレクトリは, 以 下の通りです.
+ 筆者らがインストール先に選んだディレクトリは, 以下の通りです.
くれぐれもあらかじめ作成してから,
math.install で指定す
るようにしてください.
/usr/local/Mathematica/bin
for binaries
/usr/local/Mathematica/man/man1
for man pages
/usr/local/Mathematica/lib/X11
for the XKeysymb file
また, システムレコードファイルとして,
/tmp/math.record を使用するように
設定することもできます. このファイルには,
- セッションのログが記録されま す. この設定が終了すると,
+ セッションのログが記録されます. この設定が終了すると,
math.install は残りのファイルを展開して, 必
要な場所に格納します.
Mathematica ノートブックの機能は, X
フロントエンドとして本体とは別に含 まれています. X
フロントエンドを正しくインストールするには,
/usr/local/Mathematica/FrontEnd
ディレクトリに移動し, ./xfe.install シェ
ルスクリプトを実行します.
インストール先を指定しなければなりませんが,
あらかじめ作成する必要はありません. 必要なディレクトリは,
すべて math.install によって作成されているからです.
インストールが終了したら,
/usr/local/Mathematica/bin
ディレクトリに, mathematica という名前の
シェルスクリプトが新たに作成されているはずです.
最後に, Mathematica
がインストールしたシェルスクリプトを修正する必要 があります.
/usr/local/Mathematica/bin
に含まれるすべてのシェルスクリプ
トの先頭部分に以下の行を追加します.
XKEYSYMDB=/usr/local/Mathematica/lib/X11/XKeysymDB; export XKEYSYMDB
これは, Mathematica が使用する Mathematica
バージョンのキーマップファイル XKeysymDB
の場所を指定するものです.
2.1-STABLE を使用している場合は,
以下の行も追加してください.
RESOLV_HOST_CONF=/compat/linux/etc/host.conf; export RESOLV_HOST_CONF
これは, Mathematica に Linux バージョンの host.conf
を使用するように指定し ます. FreeBSD の host.conf の文法は,
Linux のものと異なっているため, この 指定をおこなわないと,
/etc/host.conf
に関わるエラーが発生します.
新しいマニュアルページを利用したい場合は, さらに
/etc/manpath.config ファイ
ルを修正する必要があります. また自分の
~/.cshrc を変更して,
/usr/local/Mathematica/bin
をパスに追加してください.
これでインストール作業はすべて終了です.
mathematica とタイプすれば, 見栄えのする
Mathematica ノートブックが表示されるはずです. Mathematica
には, Motif ユーザインタフェースが含まれますが,
スタティックにリンクさ れているため, Motif
のライブラリは必要ありあません. 頑張って Mathematica
をインストールしてください.
バグ
ノートブックフロントエンドは,
以下のようなエラーメッセージを表示して,
ハングすることがあることが知られています.
File .../Untitled-1.mb appears to be broken for OMPR.257.0
今のところ原因はわかっていませんが,
- このバグが影響を及ぼすのは, ノートブッ クの X window
+ このバグが影響を及ぼすのは, ノートブックの X window System 用
フロントエンドのみです. Mathematica エンジン本体に影響は
ありません. そのため, ``math''
によって起動されるコマンドラインのインタ
フェースを使用している場合は, このバグは関係ありません.
謝辞
&a.sos;と&a.peter;に深く感謝します.
- Linuxエミュレーションが現在の形に あるのは, 彼らのおかげです.
- そして, 彼ら二人にハッパをかけて, 犬のよう に働かせた Michael
+ Linuxエミュレーションが現在の形にあるのは, 彼らのおかげです.
+ そして, 彼ら二人にハッパをかけて, 犬のように働かせた Michael
Smithに. 今やLinuxエミュレーションは, linuxよりうま
くlinuxバイナリを実行できます! :-)
-
+
+
+ エミュレーションはどのような原理で行なっているのですか?
+
+ このセクションは, ほとんどが chat@FreeBSD.org
+ メーリングリストに投稿された
+ Terry Lamberttlambert@primenet.com 氏のメール(Message ID:
+ <199906020108.SAA07001@usr09.primenet.com>)
+ に基づいています.
+
+
+ FreeBSD は, “実行クラスローダ(execution class loader)”
+ と呼ばれる抽象的な機構を持っています. これは &man.execve.2
+ システムコールに追加される形で実装されています.
+
+
+ FreeBSD は, シェルインタプリタやシェルスクリプトを実行するための
+ #! ローダを持った単一のプログラムローダではなく,
+ プログラムローダのリストを備えています.
+
+
+ 歴史的に言って, UNIX プラットフォームでマジックナンバ(一般的にファイル先頭の
+ 4 ないし 8 バイト部分)の検査を行なうのはプログラムローダだけです.
+ プログラムローダは, それがシステムで実行できるバイナリなのか確認して,
+ それが確認できればバイナリローダを呼び出します.
+
+
+ もし, それがそのシステム用のバイナリでない場合には,
+ &man.execve.2; システムコールの呼び出しは失敗の戻り値を返し,
+ シェルがシェルコマンドとして実行しようと試みるわけです.
+
+
+ この仮定は, “現在利用しているシェルがどのようなものであっても”変わりません.
+
+
+ 後になって, &man.sh.1; に変更が加えられました.
+ それは先頭の 2 バイトを検査し, :\n だったら
+ シェルとして代わりに &man.csh.1; を呼び出す, というものです(この変更は
+ SCO が最初に行なったと記憶しているのですが,
+ 間違いであったら指摘して下さい).
+
+
+ 現在の FreeBSD は, プログラムローダリストを走査します.
+ その際, 空白文字までの文字列をインタプリタとして認識する,
+ 通常の #! ローダを用いるため,
+ 該当するものが存在しなければ最終的に /bin/sh がロードされます.
+
+
+
+ Linux バイナリエミュレーションを行なうため, FreeBSD は
+ ELF バイナリを示すマジックナンバを確認します.
+ (ただし, この段階で FreeBSD, Solaris, Linux, そしてその他にも存在する
+ ELF イメージ形式を使っている OS を区別することはできません).
+
+
+ ELF ローダは, 特殊なマーク(brand)があるかどうか探します.
+ このマークとは, ELF イメージのコメントセクションのことです.
+ SVR4/Solaris の ELF バイナリには, このセクションは存在しません.
+
+
+
+ Linux バイナリを実行するためには,
+ ELF バイナリに &man.brandelf.1; で説明されている
+ Linux のマークが
+ 付けられていなければなりません.
+
+
+ &prompt.root; brandelf -t Linux file
+
+ 上のようにすることで, 指定されたファイルは
+ Linux のマークが付けられ,
+ ELF ローダが認識できるようになります.
+
+
+
+ ELF ローダが Linux マークを確認すると,
+ ローダは proc 構造体内の
+ ある一つのポインタを置き換えます. システムコールは全て,
+ この置き換えられたポインタ(伝統的な UNIX システムでは,
+ システムコールが sysent[]
+ 構造体の配列として実装されています)を基準に呼び出されます.
+ またそのプロセスには, Linux カーネルモジュールに必要な
+ シグナルトランポリンコード(訳注:
+ シグナルの伝播を実現するコード)用の特殊なトラップベクタの設定や,
+ 他の(細かな)調整のための設定が行なわれます.
+
+
+
+ Linux システムコールベクタは, さまざまなデータに加えて
+ カーネルモジュール内のアドレスを指す sysent[]
+ エントリのリストを含んでいます.
+
+
+
+ Linux バイナリがシステムコールを発行する際, トラップコードは
+ proc 構造体を用いてシステムコール関数ポインタを
+ 解釈します. そして, FreeBSD ではなく Linux 用の
+ システムコールエントリポイントを得るわけです.
+
+
+
+ さらに Linux エミュレーションは, 状況に応じて
+ ファイルシステム本来のルートマウントポイントを置き換えて
+ ファイルの参照を行ないます.
+ これは, union オプションを指定して
+ マウントされたファイルシステム(unionfs ではありません!)が
+ 行なっていることと同じです.
+ ファイルを検索する際にはまず
+ /compat/linux/original-path
+ ディレクトリを, それから見つけられなかったときにのみ,
+ /original-path
+ を調べます.
+ こうすることで, 他のバイナリを要求するバイナリの実行を可能にしています
+ (したがって, Linux toolchain はエミュレーション環境下で完全に動作するわけです).
+ またこれは, もし対応する Linux バイナリが存在しない場合に
+ Linux バイナリが FreeBSD バイナリをロードしたり, 実行したりすることが可能であること,
+ その Linux バイナリに自分自身が Linux 上で実行されていないことを
+ 気付かせないようにする目的で, &man.uname.1; コマンドを
+ /compat/linux ディレクトリに
+ 置くことができる, ということを意味します.
+
+
+
+ 要するに, Linux カーネルが FreeBSD カーネルの内部に存在しているわけです.
+ カーネルによって提供されるサービス全ての実装の基礎となるさまざまな関数は,
+ FreeBSD システムコールテーブルエントリと
+ Linux システムコールテーブルエントリの
+ 両方で共通に利用されています.
+ これらにはファイルシステム処理, 仮想メモリ処理, シグナル伝送, System V IPC
+ などが含まれますが,
+ FreeBSD バイナリは, FreeBSD グルー(訳注: glue;
+ 二者の間を仲介するという意味)関数群,
+ そして Linux バイナリは Linux グルー関数群を用いる,
+ という点だけが異なります(過去に存在したほとんどの OS は,
+ 自分自身のためのグルー関数群しか備えていません.
+ 前述したように, システムコールを発行する際,
+ 各々のプロセスの proc 構造体内にある,
+ ローダによって動的に初期化されるポインタを参照してアドレスを得る代わりに,
+ 静的でグローバルな sysent[] 構造体の配列に
+ システムコール関数のアドレスが直接格納されているのです).
+
+
+
+ さて, どちらを本来の FreeBSD ABI と呼ぶべきなのでしょうか?
+ 実は, どちらが本来のものであるかということを論ずることに意味はありません.
+ 基本的に, FreeBSD グルー関数群はカーネルの中に静的にリンクされていて,
+ Linux グルー関数群は静的にリンクすることも,
+ カーネルモジュールを介して利用することもできるようになっている,
+ という違いがあるだけ(ただしこれは現時点においての話です.
+ これは将来のリリースで変更される可能性がありますし,
+ おそらく実際に変更されるでしょう)です.
+
+
+
+ あ, 「でもこれは本当にエミュレーションと呼べるのか」って?
+ 答えは「いいえ」です. これは一つの ABI 実装にすぎず,
+ エミュレーションとは異なります. エミュレータ(シミュレータでもないことを
+ あらかじめ断っておきましょう)が呼び出されているわけではありません.
+
+
+
+ では, どうして “Linux エミュレーション” と呼ぶのでしょうか?
+ それはもちろん FreeBSD の売りにするため 8-) でもあるのですが,
+ 実際には, 次のような理由によります.
+ この機能が初めて実装された頃, 動作原理を説明する以外に
+ この機能を表現する言葉はありませんでした.
+ しかし, コードをコンパイルしたりモジュールをロードしない場合,
+ 「FreeBSD 上で Linux バイナリを実行する」言う表現は,
+ 厳密に考えると適切ではありません.
+ そこで, その際にロードされているもの自身を表現する言葉—すなわち
+ “Linux エミュレータ”が必要だったのです.
+
+
+
+