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 LINUXoptions - 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 のランタイムリンカは, メジャーリビジョ ン番号の一致したライブラリを検索しますから, ユーザが気にする必要はあり ません. <filename>ld.so</filename> の設定 — 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 ldconfigldd は, /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 バイナリを実行する設 定が終了しました. lddldd 自身に実行してテストしてください. 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 エミュレータ”が必要だったのです. + + + +