diff --git a/ja_JP.eucJP/books/handbook/linuxemu/chapter.sgml b/ja_JP.eucJP/books/handbook/linuxemu/chapter.sgml index 7173b57f58..b270fd0195 100644 --- a/ja_JP.eucJP/books/handbook/linuxemu/chapter.sgml +++ b/ja_JP.eucJP/books/handbook/linuxemu/chapter.sgml @@ -1,1171 +1,778 @@ - Linux モード + Linux バイナリ互換機能 - 寄稿: &a.handy; and &a.rich; + オリジナルは &a.handy; と &a.rich; によるものですが, + &a.jim; が 2000 年 3 月 22 日に再構成と一部の更新を行ないました. 訳: &a.jp.kiroh;, 1996 年 9 月 24 日. - Linux モードのインストール - - FreeBSD における Linux バイナリ互換機能は, 大部分の Linux - バイナリ(a.out および ELF - フォーマット)を実行できる状態になっています. 2.1-STABLE ブラン - チでの Linux バイナリ互換機能は, Linux DOOM や Mathematica - が実行できます. &rel.current;-RELEASE でのエミュレーションは, - さらに強化されており, Linux 用 の Oracle8, - WordPerfect, StarOffice, Acrobat, Quake, Abuse, IDL, - netrek for Linux など, 多数のソフトウェアが実行できます. - - Linux - オペレーティングシステムには, 特有の機能がいくつかあり, FreeBSD - でサポートされていないものもあります. Linux の - /proc ファイルシステムに過度に依存したバイナリは, - FreeBSD では実行できません (FreeBSD で使用可能な - /proc - ファイルシステムとは仕様が異なっているためです). - また仮想 8086モードを有効にするなど, i386 - に特有なシステムコールを使っている場合も実行できません. - - Linux モードの設定方法は, 使用している FreeBSD - のバージョンによっていくらか異なっています. + 概要 + + この章では FreeBSD における Linux バイナリとの互換機能について, + インストール方法やその仕組みを解説します. + + 現時点では, 一体なぜ FreeBSD が Linux バイナリを実行できるようにならなければならないのか自問しているのではないでしょうか? + 答えはきわめて簡単です. Linux は現在コンピューターの世界では最もホットなモノなのでたくさんの会社や開発者たちが + Linux のためだけに開発を行なっています. そのため, 残された我々 + FreeBSD ユーザーは彼らに対して FreeBSD ネイティブなアプリケーションも出すように言うしかないのです. + 問題は, FreeBSD バージョンも出した場合にどれくらいの数のユーザーが使うのかわからない, + ということであり, そのため Linux 版のみを開発しているということなのです. + そこで FreeBSD では Linux バイナリ互換機能が役に立つのです. + + 簡単に言ってしまえば, この機能により全ての Linux アプリケーションの + 90 % が修正なしに FreeBSD 上で起動できます. + この中には Star Office や Linux 版の Netscape, Adobe Acrobat, RealPlayer 5 と 7, + VMWare, Oracle, WordPerfect, Doom, Quake などがあります. + また, ある状況においては Linux バイナリを Linux で動かすよりも + FreeBSD で動かすほうが良いパフォーマンスが出るという報告もあります. + + しかしながら, いくつかの Linux に特有な OS の機能は FreeBSD ではサポートされていません. + 例えば, Linux の /proc ファイルシステムを過度に使うような + Linux バイナリは FreeBSD では動きません (FreeBSD の /proc + ファイルシステムとは異なるのです) し, + 仮想 8086 モードを有効にするような i386 特有の呼び出しも動きません. + + Linux バイナリ互換モードのインストールに関しては次のセクションをご覧ください. + - - 3.0-RELEASE 以降への - Linux バイナリ互換機能のインストール - - options LINUXoptions - COMPAT_LINUX を指定する必要はなくなりました. - Linux バイナリ互換機能は - KLD オブジェクト(“Kernel LoaDable object”) - を使用しているため, インストールの際に再起動する必要はありません. - ただし, スタートアップファイルで以下のように指定する必要があります. - - - - /etc/rc.conf - に以下の行が必要です. - - -linux_enable=YES - - - - これは結果的に, /etc/rc.i386 - の以下の指定を有効にします. - - -# Start the Linux binary compatibility if requested. -if [ "X${linux_enable}" = X"YES" ]; then echo -n ' - linux'; linux > /dev/null 2>&1 -fi - - + + インストール + + 3.0-RELEASE以降であればカーネルのコンフィギュレーションファイルに + options LINUXoptions COMPAT_LINUX + といった行を加える必要はありません. - KLD がきちんとロードされたかどうかを確認するには, - kldstat を使用します. + Linux バイナリ互換機能は今は KLD オブジェクト (Kernel LoaDable object) + として実現されており, リブートしなくても + on-the-fly で組み込むことができるのですが, + /etc/rc.confに次の行を加える必要があります. - &prompt.user; kldstat + linux_enable=YES + + この設定により, /etc/rc.i386 + では次のような操作が行なわれます. + + +# Start the Linux binary compatibility if requested. +# +case ${linux_enable} in +[Yy][Ee][Ss]) + echo -n ' linux'; linux > /dev/null 2>&1 + ;; +esac + + + 望みの KLD モジュールがロードされているか確認したい時には + kldstat を利用します. + + &prompt.user; kldstat Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko 何らかの理由で Linux KLD をロードしたくない, あるいはロードできないような場合には, - - -options LINUX - - をカーネルの設定ファイルに指定して, - Linux バイナリ互換機能をカーネルにスタティックリンク - してください. - - FreeBSDカーネルのコンフィグレーション - の節の記述にしたがって config と, - 新しいカーネルのインストールをおこ - なってください. - - - - - 2.2.2-RELEASE およびそれ以降の 2.2.x 系列への - Linux モードのインストール - - options LINUXoptions - COMPAT_LINUX を指定する必要はなくなりました. - Linux バイナリ互換機能は - LKM(“Loadable Kernel Module”) - を使用しているため, インストールの際に再起動する必要はありません. - ただし, スタートアップファイルで以下のように指定する必要があります. - - - - /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 - - をカーネルの設定ファイルに指定して, - Linux バイナリ互換機能をカーネルにスタティックリンク - してください. - - FreeBSDカーネルのコンフィグレーション - の節の記述にしたがって config と, - 新しいカーネルのインストールをおこ - なってください. - - - - 2.1-STABLE への Linux モードのインストール - - 2.1-STABLE の GENERIC カーネルは, - Linux との互換性を保つように構築されていません. - カーネルの再構築が必要です. 再構築をおこなうには, 2つの方 - 法があります. 1つは, - バイナリ互換機能をカーネル自体にスタティックリンクする方法. - もう1つは, 動的に Linux - ローダブルカーネルモジュール(LKM)をロー - ドするようにする方法です. - - Linux バイナリ互換機能を有効にするには, - 以下をコンフィグレーションファイル - (/sys/i386/conf/LINT など) - に追加します. - - -options COMPAT_LINUX - - Linux DOOM などのアプリケーションを実行したい場合は, - 共有メモリも有効 にしておかなければなりません. - 以下を追加します. - - -options SYSVSHM - - Linux のシステムコールを使用するには, 4.3BSD と互換性のある - システムコールを備えていることが必要です. - 以下の行が含まれていることを確認してください. - - -options "COMPAT_43" - - LKM(Loadable Kernel Module) - を使用せず, バイナリ互換機能をカーネルに - スタティックリンクしたい場合は, 以下の行を追加します. - - -options LINUX - - FreeBSD - カーネルのコンフィグレーション の節の記述に - したがって config と, - 新しいカーネルのインストールをおこなってください. - - 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 - - のように, NOYES - に変更してください. FreeBSD 2.1-RELEASE - およびそれ以前のバージョンでは, そのような行はありませんので, - /etc/rc.local に以下 - の行を追加する必要があります. - - -linux - + options LINUX + をカーネルの設定ファイルに指定して, + Linux バイナリ互換機能をカーネルにスタティックリンクしてください. + そして, FreeBSD カーネルのコンフィギュレーション + の記述にしたがって新しいカーネルをインストールしてください. Linux ランタイムライブラリのインストール - - linux_base port を使用してのインストール + これは, linux_base + の port を用いるか, もしくは 手動でインストールします. + + + linux_base の port を用いたインストール - 多くの Linux - アプリケーションはシェアードライブラリを使用しますので, - シェアードライブラリのインストールが終了しなければ, - エミュレータのインストールは終わったことになりません. - 手動でもインストールできますが, linux_base port - を使用するのが簡単です. + ランタイムライブラリをインストールするには最も簡単な方法です. + ports コレクションから他の port + をインストールするのと全く同じようにできます. &prompt.root; cd /usr/ports/emulators/linux_base -&prompt.root; make all install - - これで, Linux - バイナリ互換機能が動作するようになったはずです. - 聞くところ(とメールのアーカイブ :-) によれば, - Linux バイナリ互換機能は ZMAGIC ライブラリとリンクされている - Linux バイナリに対して, 最もうまく動作するようです. - Slackware V2.0 などに使われている QMAGIC ライブラリだと, - Linux バイナリ互換機能が胸やけするかもしれません. - マイナーバージョンの不一致などを - 報告するプログラムもありますが, - 普通は 問題にならないようです. +&prompt.root; make install distclean + + これで Linux バイナリ互換機能が使えるはずです. + いつかのプログラムはシステムライブラリのマイナーバージョンが違うと文句を言うかもしれませんが一般的には大した問題ではありません. - + 手動でのライブラリのインストール - “ports” - ディストリビューションが手元にない場合は, 手動でライブラ - リをインストールする必要があります. プログラムが必要とする - Linux のシェアードライブラリとランタイムリンカが必要です. - また Linux ライブラリ の用の``shadow root'' ディレクトリ, - /compat/linux, を作成する必要があ - ります. FreeBSD で動作する Linux - のプログラムが使用するシェアードライ - ブラリは,まずこのファイルツリーから検索されます. 例えば, + portsコレクションをインストールしていない場合, + 代わりに手動でライブラリをインストールすることができます. + プログラムが必要とする Linux のシェアードライブラリとランタイムリンカが必要です. + また Linux ライブラリ用の shadow root ディレクトリ, + /compat/linux, を作成する必要があります. + FreeBSD で動作する Linux プログラムが使用するシェアードライブラリは, + まずこのファイルツリーから検索されます. 例えば, Linux のプログラムが /lib/libc.so - をロードしようとした場合には, FreeBSD は, まず + をロードしようとした場合には, 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 のシェアードライブラリがシステムにインストールされ, + 新しくインストールした Linux のバイナリも余計な作業をせずに動作させることができるようになります. シェアードライブラリの追加 linux_base port をインストールした後に, - アプリケーションが必要なライブラリ - が存在しないというエラーを出したらどうしたらよいでしょうか? - Linux のバ イナリがどのシェアードライブラリを必要とし, + アプリケーションが必要なライブラリが存在しないというエラーを出したらどうしたらよいでしょうか? + Linux のバイナリがどのシェアードライブラリを必要とし, そしてどこで入手できるか, どのように探したらよいでしょうか? - 基本的には, 以下の2種類の方法があり - ます(以下の手順にしたがう場合には, + 基本的には, 以下の 2 種類の方法があります (以下の手順に従う場合には, 必要なインストール作業をおこなう FreeBSD システム上で root として作業をおこなう必要があります). - Linux システムを使用でき, - 必要なシェアードライブラリが調べられる場 合には, 単に - FreeBSD のシステムにそのライブラリをコピーするだけで す. - 例えば, DOOM の Linux バイナリを ftp で持ってきたとします. - 使用で きる Linux システムの上に転送して, ldd - linuxxdoom とやれば, 必要とす - るシェアードライブラリがチェックできます. + Linux システムにアクセス可能ならば, + そのアプリケーションがどういうシェアードライブラリを必要としているのか調べ, + 単に FreeBSD にそのライブラリをコピーするだけです. + 次の例を見てみましょう. + + + FTP を使って Doom の Linux バイナリを取ってきて, + アクセスできる Linux システムに置いたとしましょう. + 次のように ldd linuxdoom とするだけでどのシェアードライブラリが必要かチェックできます. &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 の下に置き, + 最初のカラムに示されるファイル名にシンボリックリンクを張ります. + すなわち, FreeBSD システムでは以下のようなファイルが必要となります. - - /compat/linux/usr/X11/lib/libXt.so.3.1.0 + /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.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 の出力が - 以下のようになる場合を考えます. + 従って, 以上のようなライブラリがインストールされており, + 新しいバイナリに対する ldd + の出力が以下のようになる場合を考えます. - libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29 + libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29 - このように最後の番号が1つか2つ古いだけならば, 普通は - /lib/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.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 - というライブラリを開いた場合, Linux ABI サポートは内部で, - ファイル名を /compat/linux/lib/libc.so - にマップします. Linux ABI ローダがライブラリを検索できるよう, - すべての 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 + バイナリにのみ必要なことに注意してください. + FreeBSD のランタイムリンカはメジャーリビジョン番号の一致したライブラリを検索するので, + ユーザが気にする必要はありません. + +
+
- Linux の ELF バイナリをインストールする + 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バイナリに自動的に適切なマークを付加するようになったので, + 今ではGNU のツールたちが + ELF バイナリに自動的に適切なマークを付加するようになったので, 今後はこの作業もだんだんと必要なくなってゆくでしょう. ホストネームリゾルバの設定 DNS がうまく動作しなかったり, 以下のようなエラーメッセージが表示され る場合は, /compat/linux/etc/host.conf - ファイルを設定する必要があります. + ファイルを設定する必要があります. - - resolv+: "bind" is an invalid keyword -resolv+: "hosts" is an invalid keyword + 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 の + ここで, order は /etc/hosts を最初に検索し, + 次にDNSを検索するように指定します. + /compat/linux/etc/host.conf + がインストールされていない場合, + Linux アプリケーションは FreeBSD の /etc/host.conf を使用しようとして, - 文法の違いによる警告を表示します. - /etc/resolv.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://ftp.freebsd.org:pub/FreeBSD/2.0.5-RELEASE/xperimnt/linux-emu/README - - /usr/src/sys/i386/ibcs2/README.iBCS2 - - Mathematica + + Mathematica のインストール - 寄稿: &a.rich;, &a.chuck;. - 改訂: Bojan Bistrovic bojanb@physics.odu.edu. - 訳: &a.jp.kiroh;. + Mathematica 4.0 用に Murray Stokely murray@cdrom.com + がアップデートし, Bojan Bistrovic bojanb@physics.odu.edu + がマージしました. - この章では, Mathematica 2.2 の Linux - バイナリ配布をインストールする方法について説明します. + この章では, Mathematica 4.0 Linux 版の FreeBSD + へのインストールについて説明します. - Mathematica は, そのままでは FreeBSD - をサポートしていません. しかし, Linux は サポートしていますので, - Linux エミュレータの設定が終わってしまえば, Mathematica - を動作させる環境はほとんど整ったことになります. + Linux 版の Mathematica は FreeBSD においても完璧に動きます. + ただ, 実行する際に Linux ABI を用いる必要があることを + FreeBSD に教えるために, Wolfram によって出荷されているバイナリにマーク付け + (branded) をする必要があります. - - Mathematica のインストール - - Mathematica は CDROM で配布されています. - 学生版(student edition)には, Mac, Windows95/NT, Linux 版があり, - プロフェッショナル版(professional edition)には, それらに加えて - Digital Unix, Solaris, IRIX, HPUX, AIX, NeXT 版があります. - CDROM が /cdrom にマウントされている場合, - インストーラは - /cdrom/Unix/Installers に置かれています. - - - - 学生版にはすべての Unix 版のインストーラが含まれていますが, - バイナリは Linux 用のものしか含まれていません. - - - Linux 版インストーラのディレクトリは二つあります. - それは Linux (ELF 版) と - Linux-aout (a.out 版)です. - どちらのインストーラでも動作します(実のところ, どの Unix - 版インストーラでも動きます)が, インストールされるものが異なりますので, - まずどの版をインストールするか決めなければなりません. - a.out 版はそのままでも動きますが, ELF - 版の場合は, すべてのバイナリにマーク付け(branding)をする必要があります(詳細は - &man.brandelf.1; を参照して下さい). - もちろん, ELF 版インストーラを起動する場合には, - そのインストーラ自身にもマーク付けしなければなりませんので, - マークを書き込むためにインストーラをハードディスクにコピーする必要があります. - + Mathematica や Mathematica for Students の Linux 版は Wolfram + (http://www.wolfram.com/) + から直接注文することができます. - - インストール手順は, どの版をインストールする場合でも同様です. - この文書では, a.out 版のインストール例を示します. - - - インストールを開始するには, 次のように実行して下さい. - - &prompt.root; cd /cdrom/Unix/Installers/Linux-aout + + Linux バイナリへのマーク付け (branding) + + Linux 用バイナリは Wolfram の Mathematica CD-ROM の + Unix ディレクトリにあります. + インストーラーを起動する前にこのディレクトリをローカルディスクにコピーし, + &man.brandelf.1; により Linux バイナリにマークを付けます. + + &prompt.root; mount /cdrom +&prompt.root; cp -rp /cdrom/Unix/ /localdir/ +&prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/Kernel/Binaries/Linux/* +&prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/FrontEnd/Binaries/Linux/* +&prompt.root; brandelf -t Linux /localdir/Files/SystemFiles/Installation/Binaries/Linux/* +&prompt.root; cd /localdir/Installers/Linux/ &prompt.root; ./MathInstaller + - - Mathematica 3.0 - ソースツリー(デフォルトは - /usr/local/mathematica)と, - スタートアップスクリプト(デフォルトは - /usr/local/bin)のインストール先を選択します. - このとき, パスワードのインストールを求められるかも知れません. - そこでパスワードのインストールを選択した場合, - MathInstaller はあなたの MathID を表示し, - Mathematica の実行に必要なパスワードとライセンス ID を求めます. - - - - これらは Mathematica の最初の起動時にも再度聞かれますので, - この段階でのパスワードのインストールは省略可能です. - Mathematica が求める質問には, すべてヘルプメッセージがあります. - パスワードの入手には MathID が必要になりますが, - もし書き留めていなければ次のようにして表示させることができます. - - - &prompt.root; ./MathInstaller -info - - あるいは次のようにします. - - &prompt.root; cd /cdrom/Unix/Files/SystemFiles/Installation/Binaries/Linux-aout -&prompt.root; ./mathinfo - - - 出力は, - ホスト名 - ####-#####-##### のようになります. - ####-#####-##### の部分が, あなたの MathID です. - これを用いて, - http://www.wolfram.com/register - (サイトライセンスの場合は - http:/www.wolfram.com/site) - からライセンスを取得することができます. - また, CDROM ケースにあるシールに書かれている $LicenceID も必要です. - これは, - L####-#### - のようになっています. - # は 0 から 9 までの数字です. - サイトライセンスを持っている場合は, ライセンスの種類として - Unix ではなく, Single User - (Mac/Windows)(表示はおかしいですが)を選択する必要があります. - パスワードは電子メールで送られてきます. - もし, すでに Mathematica をライセンスなしでインストールしているなら, - 次のようにタイプすることでここで取得したライセンスをインストールできます. - - - &prompt.root; ./MathInstaller -pass - - Wolfram Research からのメールは, (ヘッダを削除してから) - /usr/local/mathematica/Configuration/Licensing/mathpass - にコピーしておいてください. そうしていない場合には, Mathematica - を起動(端末からは math コマンド, - X のフロントエンドは mathematica - コマンド)した時にパスワードが求められ, - 入力されたパスワードはパスワードファイルに記録されます. - - - - - Linux ファイルシステムからの Mathematica の起動 - - If you have multi-OS box, and you already installed Mathematica - under Linux, you may want to run it directly from that partition. Here - we assume that you already compiled your kernel with - EXT2FS option and mounted your Linux partition at - /linux. - - あなたのマシンに異なる複数の OS が入っていて, - Linux 上ですでに Mathematica がインストールされているような場合には, - そのインストールされたパーティションから直接起動したいと考えるかも知れません. - 以下では, オプション EXT2FS が設定された - カーネルを構築済みで, Linux パーティションが - /linux であるとします. - - - - - まず最初に, スタートアップスクリプトをコピーします. - - &prompt.root; cp /linux/usr/local/bin/math* /usr/local/bin - - - - 次に, math, - mathematica, - Mathematica および - MathKernel - というスクリプトファイルを編集します. - - 行に topdir=/usr/local/mathematica - が含まれていたら, - topdir=/linux/usr/local/mathematica - のように置き換えて下さい. - - - + + Mathematica パスワードの取得 + + Mathematica を起動する前に Wolfram から自分の + マシン ID に対応したパスワードを取得しなければいけません. + + 一旦 Linux 互換ランタイムライブラリをインストールし, + Mathematica を展開すれば Install ディレクトリにある + mathinfo プログラムを起動して + マシン ID を得ることができます. + このマシン ID は, 最初に見つかったイーサネットカードの MAC アドレスをベースに生成されます. + + &prompt.root; cd /localdir/Files/SystemFiles/Installation/Binaries/Linux +&prompt.root; mathinfo +disco.example.com 7115-70839-20412 + + 電子メールや電話, FAXなどでWolfram に登録する時にはこの + マシン ID を渡します. + するといくつかの数字から構成されるパスワードが返されるので, + 他の Mathematica プラットホームでするのと全く同じように最初に + Mathematica を立ち上げる時にその情報を入力します. ネットワーク経由での Mathematica フロントエンドの起動 - Mathematica は標準フォントにない特別な記号(積分記号, 総和記号, - ギリシャ文字など)を表示するために, 特殊なフォントを使用します. + Mathematica は標準フォントセットにない特別な記号 (積分記号, 総和記号, + ギリシャ文字など) を表示するために特殊なフォントを使用します. X プロトコルは, これらのフォントがローカルマシンにインストールされていることを要求します. - これはつまり, ローカルマシンに(CD や Mathematica - のインストールされているホストマシンから)そのフォントをコピーしなければならないということです. - これらのフォントは通常, ハードディスクの - /usr/local/mathematica/SystemFiles/Fonts か, - CDROM の /cdrom/Unix/Files/SystemFiles/Fonts に置かれていて, - 実際に使用されるフォントは Type1 と + これはつまり, ローカルマシンに (CD-ROM や Mathematica + がインストールされているホストマシンから) そのフォントをコピーしなければならないということです. + これらのフォントは通常, CD-ROM の + /cdrom/Unix/Files/SystemFiles/Fonts か, もしくはハードディスクの + /usr/local/mathematica/SystemFiles/Fonts + に置かれており, 実際に使用されるフォントは Type1X のサブディレクトリに格納されています. - これを利用するには, 次のような二つ方法があります. - 一つは, フォントファイルをすべて + これらを利用するには次のような二つ方法があります. + + 一つは, フォントファイルをすべて /usr/X11R6/lib/X11/fonts/ 以下にある既存のフォントディレクトリにコピーする方法です. この場合, fonts.dir にフォント名を追加し, 先頭行のフォント総数を変更することも必要になります. - もう一つの方法は, 次のように + あるいは, フォントをコピーしたディレクトリで + mkfontdir を実行するだけでもかまいません. + + もう一つの方法は, /usr/X11R6/lib/X11/fonts/ - にフォントディレクトリごとコピーする方法です(おそらくこちらの方が望ましいでしょう). - + にフォントディレクトリごとコピーする方法です. - &prompt.root; cd /usr/X11R6/lib/X11/fonts/ + &prompt.root; cd /usr/X11R6/lib/X11/fonts &prompt.root; mkdir X &prompt.root; mkdir MathType1 -&prompt.root; cd /usr/local/mathematica/SystemFiles/Fonts/ +&prompt.root; cd /cdrom/Unix/Files/SystemFiles/Fonts &prompt.root; cp X/* /usr/X11R6/lib/X11/fonts/X -&prompt.root; cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1 +&prompt.root; cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1 +&prompt.root; cd /usr/X11R6/lib/X11/fonts/X +&prompt.root; mkfontdir +&prompt.root; cd ../MathType1 +&prompt.root; mkfontdir - そして, フォントパスを追加します. + そして, フォントパスに新しいフォントディレクトリを追加します. &prompt.root; xset fp+ /usr/X11R6/lib/X11/fonts/X &prompt.root; xset fp+ /usr/X11R6/lib/X11/fonts/MathType1 &prompt.root; xset fp rehash XFree86 サーバを使用しているなら, - /etc/XF86Config を変更することで, - これらのフォントを自動的に読み込むことができます. + /etc/XF86Config に加えることでこれらのフォントを自動的に読み込むことができます. /usr/X11R6/lib/X11/fonts/Type1 という ディレクトリが存在していない場合には, 上記例の MathType1Type1 - とすることができます(これに限らず, どんな名前でもかまいません). - こうすることで, ネットワーク経由で Mathematica - フロントエンドを利用することが可能になります. - これはあらゆる種類の X サーバに適用できる一般的な方法です. - もし, (大部分の FreeBSD/Linux ユーザのように) XFree86 を利用しているなら, - 単に次の行を追加した方が簡単でしょう. - + とすることができます. + + + + + Oracle のインストール + + Marcel Moolenaar 寄贈 + marcel@cup.hp.com + + + はじめに + このドキュメントでは Oracle 8.0.5 と Oracle 8.0.5.1 Enterprise Edition + の Linux 版を FreeBSD にインストールするための手順を解説します. + + + + Linux 環境のインストール + + まずは ports コレクションから linux_base と + linux_devtools をインストールしてください. + これらの ports は FreeBSD 3.2 のリリース後にコレクションに加えれれました. + もし FreeBSD 3.2 もしくはそれよりも古いものを使っている場合は + ports コレクションをアップデートしましょう. ついでに FreeBSD + をアップデートするのもいいでしょう. もし linux_base-6.1 + や linux_devtools-6.1 でうまくいかなければ + 5.2 を試してみてください. + + もし賢いエージェント (intelligent agent) を起動したいなら + Red Hat TCL パッケージ tcl-8.0.3-20.i386.rpm + もインストールする必要があるでしょう. + オフィシャルな RPM パッケージをインストールするには一般的に次のようにします. + + &prompt.root; rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package + + パッケージのインストール時にエラーが出てはいけません. + + + + Oracle 環境の構築 + + Oracleをインストールする前に, 適切な環境を設定する必要があります. + このドキュメントでは, + Oracle のインストールガイドに書いてあるようなことではなく + FreeBSD で Linux 用 Oracle + を動かすために特別に必要なことのみを解説します. + + + カーネルのチューニング + + Oracle インストールガイドにあるように, + シェアードメモリーの最大サイズを設定しなければいけません. + FreeBSD では SHMMAX を使わないようにしてください. + SHMMAX は単に SHMMAXPGS + と PGSIZE から計算されるだけなのです. + 従って, SHMMAXPGS を使うようにしましょう. + インストールガイドに記述されている他のオプションは使えます. + 例えば以下のようにします. + + options SHMMAXPGS=10000 +options SHMMNI=100 +options SHMSEG=10 +options SEMMNS=200 +options SEMMNI=70 +options SEMMSL=61 + + これらのオプションを意図した Oracle の使い方に合わせて設定してください. + + また, + 次のオプションがカーネルのコンフィギュレーションファイルにあることも確認します. + +options SYSVSHM #SysV shared memory +options SYSVSEM #SysV semaphores +options SYSVMSG #SysV interprocess communication + - FontPath "/usr/X11R6/lib/X11/fonts/MathType1" + + + Oracle 用アカウント - + 他のアカウントを作るのと同じように Oracle 用のアカウントを作ります. + Oracle 用のアカウントに特別なのは Linux のシェルを割り当てるところだけです. + /etc/shells/compat/linux/bin/bash + を加え, Oracle 用のアカウントに設定します. + + + + 環境設定 + + ORACLE_HOMEORACLE_SID + といった通常の Oracle 用の変数の他に次の変数も設定しなければなりません. + + + + + + 変数 + + + + + + + LD_LIBRARY_PATH + + $ORACLE_HOME/lib + + + + CLASSPATH + + $ORACLE_HOME/jdbc/lib/classes111.zip + + + + PATH + + /compat/linux/bin +/compat/linux/sbin +/compat/linux/usr/bin +/compat/linux/usr/sbin +/bin +/sbin +/usr/bin +/usr/sbin +/usr/local/bin +$ORACLE_HOME/bin + + + + + + 全ての環境変数は .profile で設定することをお勧めします. + 完璧なサンプルは以下の通りです. + +ORACLE_BASE=/oracle; export ORACLE_BASE +ORACLE_HOME=/oracle; export ORACLE_HOME +LD_LIBRARY_PATH=$ORACLE_HOME/lib +export LD_LIBRARY_PATH +ORACLE_SID=ORCL; export ORACLE_SID +ORACLE_TERM=386x; export ORACLE_TERM +CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip +export CLASSPATH +PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:$ORACLE_HOME/bin +export PATH + + + + + Oracle のインストール + + インストーラーを起動する前に, /var/tmp + に .oracle という名前のディレクトリを作る必要がありますが, + これは Linux エミュレーターにおけるちょっとした不整合のためです. + このディレクトリは誰でもが書けるか, もしくは oracle ユーザーのものにしておきます. + これで特に問題なく Oracle がインストールできるでしょう. + もし問題が起こったら, まずは Oracle の配布物や設定をチェックしてください. + Oracle のインストールが終わったら次の二つのサブセクションで解説するパッチを当てます. + + よくあるトラブルは, TCP プロトコルアダプターが正しくインストールされていないことです. + そのため, 一切 TCP リスナーを起動することができないのです. + 次の操作はこの問題を解決するのに役立ちます. + + &prompt.root; cd $ORACLE_HOME/network/lib +&prompt.root; make -f ins_network.mk ntcontab.o +&prompt.root; cd $ORACLE_HOME/lib +&prompt.root; ar r libnetwork.a ntcontab.o +&prompt.root; cd $ORACLE_HOME/network/lib +&prompt.root; make -f ins_network.mk install + + もう一度 root.sh を起動するのを忘れないように! + + + root.sh へのパッチ + + Oracle をインストールする時, root + で行なう必要のあるいくつかの操作は root.sh + と呼ばれるシェルスクリプトに記録されます. + root.shorainst + ディレクトリにあります. 次のパッチを root.sh に当てて + 正しい場所にある chown コマンドを使うようにするか, + 代わりに Linux ネイティブなシェルのもとでスクリプトを走らせましょう. + + *** orainst/root.sh.orig Tue Oct 6 21:57:33 1998 +--- orainst/root.sh Mon Dec 28 15:58:53 1998 +*************** +*** 31,37 **** +# This is the default value for CHOWN +# It will redefined later in this script for those ports +# which have it conditionally defined in ss_install.h +! CHOWN=/bin/chown +# +# Define variables to be used in this script +--- 31,37 ---- +# This is the default value for CHOWN +# It will redefined later in this script for those ports +# which have it conditionally defined in ss_install.h +! CHOWN=/usr/sbin/chown +# +# Define variables to be used in this script + + CD-ROM からのインストールでない場合は root.sh + のソースにパッチを当ててもいいでしょう. + rthd.sh という名前でソースツリーの + orainst というディレクトリにあります. + + + + genclntsh へのパッチ + + genclntsh スクリプトは一つの共有クライアントライブラリを生成するのに用いられます. + これはデモを作る時に使われます. + PATH の定義をコメントアウトするために次のパッチを当ててください. + + *** bin/genclntsh.orig Wed Sep 30 07:37:19 1998 +--- bin/genclntsh Tue Dec 22 15:36:49 1998 +*************** +*** 32,38 **** +# +# Explicit path to ensure that we're using the correct commands +#PATH=/usr/bin:/usr/ccs/bin export PATH +! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH +# +# each product MUST provide a $PRODUCT/admin/shrept.lst +--- 32,38 ---- +# +# Explicit path to ensure that we're using the correct commands +#PATH=/usr/bin:/usr/ccs/bin export PATH +! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH +# +# each product MUST provide a $PRODUCT/admin/shrept.lst + + + + + Oracle の起動 + + インストラクションに従えば, Linux でと同じように + Oracle を起動できるでしょう. + - Linux モードはどのような原理で動作しているのですか? + 高度なトピックス - このセクションは, ほとんどが freebsd-chat@FreeBSD.org - メーリングリストに投稿された - Terry Lamberttlambert@primenet.com 氏のメール(Message ID: - <199906020108.SAA07001@usr09.primenet.com>) - に基づいています. - + Linux バイナリ互換機能がどのような仕組みなのか興味がある人はこのセクションを読んでください. + 以下の文章で説明されていることのほとんどは &a.chat; に投稿された + Terry Lambert (tlambert@primenet.com) 氏のメール + (Message ID: <199906020108.SAA07001@usr09.primenet.com>). + をもとにしています. + + + どのように動くのでしょう? FreeBSD は, “実行クラスローダ(execution class loader)” と呼ばれる抽象的な機構を持っています. これは &man.execve.2 - システムコールに追加される形で実装されています. + システムコールへの楔という形で実装されています. FreeBSD は, シェルインタプリタやシェルスクリプトを実行するための #! ローダを持った単一のプログラムローダではなく, - プログラムローダのリストを備えています. + ローダのリストを持っているのです. - 歴史的に言って, UNIX プラットフォームでマジックナンバ(一般的にファイル先頭の - 4 ないし 8 バイト部分)の検査を行なうのはプログラムローダだけです. - プログラムローダは, それがシステムで実行できるバイナリなのか確認して, - それが確認できればバイナリローダを呼び出します. - + 歴史的には, UNIX プラットフォーム上の唯一のローダーがマジックナンバー + (一般的にはファイルの先頭の 4 ないし 8 バイトの部分) + の検査を行ないシステムで実行できるバイナリかどうかを検査し, + もしそうならバイナリローダーを呼び出すというようになっていました. - もし, それがそのシステム用のバイナリでない場合には, + もし, そのシステム用のバイナリでない場合には, &man.execve.2; システムコールの呼び出しは失敗の戻り値を返し, - シェルがシェルコマンドとして実行しようと試みるわけです. + シェルがシェルコマンドとして実行しようと試みていたわけです. - この仮定は, “現在利用しているシェルがどのようなものであっても”変わりません. - + この仮定は現在利用しているシェルがどのようなものであっても変わりません. - 後になって, &man.sh.1; に変更が加えられました. - それは先頭の 2 バイトを検査し, :\n だったら - シェルとして代わりに &man.csh.1; を呼び出す, というものです(この変更は - SCO が最初に行なったと思われます). - + 後に &man.sh.1; に変更が加えられ, 先頭の 2 バイトを検査した結果 + :\n であれば代わりに &man.csh.1; を呼び出す, + というようになりました(この変更は SCO が最初に行なったと思われます). 現在の FreeBSD は, プログラムローダリストを走査します. その際, 空白文字までの文字列をインタプリタとして認識する, 通常の #! ローダを用いるため, - 該当するものが存在しなければ最終的に /bin/sh がロードされます. - + 該当するものが存在しなければ最終的に /bin/sh がロードされます. - - Linux ABI をサポートするため, FreeBSD は + Linux ABI をサポートするため, FreeBSD は ELF バイナリを示すマジックナンバを確認します. - (ただし, この段階で FreeBSD, Solaris, Linux, そしてその他にも存在する - ELF イメージ形式を使っている OS を区別することはできません). - + (ただし, この段階では FreeBSD, Solaris, Linux, そしてその他の + ELF イメージ形式を使っている OS を区別することはできません). - ELF ローダは, 特殊なマーク(brand)があるかどうか探します. - このマークとは, ELF イメージのコメントセクションのことです. - SVR4/Solaris の ELF バイナリには, このセクションは存在しません. - + ELF ローダは, 特殊なマーク (brand) があるかどうか探します. + このマークとは, ELF イメージのコメントセクションのことです. + SVR4/Solaris の ELF バイナリには, このセクションは存在しません. - - Linux バイナリを実行するためには, + Linux バイナリを実行するためには, ELF バイナリに &man.brandelf.1; で説明されている - Linux のマークが - 付けられていなければなりません. - + Linux のマークが付けられていなければなりません. &prompt.root; brandelf -t Linux file 上のようにすることで, 指定されたファイルは Linux のマークが付けられ, - ELF ローダが認識できるようになります. - + ELF ローダが認識できるようになります. - - ELF ローダが Linux マークを確認すると, + ELF ローダが Linux マークを確認すると, ローダは proc 構造体内の ある一つのポインタを置き換えます. システムコールは全て, - この置き換えられたポインタ(伝統的な UNIX システムでは, - システムコールが sysent[] - 構造体の配列として実装されています)を基準に呼び出されます. - またそのプロセスには, Linux カーネルモジュールに必要な + このポインタ (伝統的な UNIX システムではこれは構造体の配列 sysent[] + で, システムコールが含まれています) を通してインデックスされます. + さらに, そのプロセスには Linux カーネルモジュールに必要な シグナルトランポリンコード(訳注: - シグナルの伝播を実現するコード)用の特殊なトラップベクタの設定や, - 他の(細かな)調整のための設定が行なわれます. - + シグナルの伝播を実現するコード) 用の特殊なトラップベクタの設定や, + 他の(細かな)調整のための設定が行なわれます. - - Linux システムコールベクタは, さまざまなデータに加えて - カーネルモジュール内のアドレスを指す sysent[] - エントリのリストを含んでいます. - + Linux システムコールベクタは, + さまざまなデータに加えて sysent[] + エントリーのリストを含んでおり, それらのアドレスはカーネルモジュール内にあります. - - Linux バイナリがシステムコールを発行する際, トラップコードは + Linux バイナリがシステムコールを発行する際, トラップコードは proc 構造体を用いてシステムコール関数ポインタを - 解釈します. そして, FreeBSD ではなく Linux 用の - システムコールエントリポイントを得るわけです. - - - - さらに Linux モードは, 状況に応じて - ファイルシステム本来のルートマウントポイントを置き換えて - ファイルの参照を行ないます. - これは, union オプションを指定して - マウントされたファイルシステム(unionfs ではありません!)が - 行なっていることと同じです. + 解釈します. そして FreeBSD ではなく + Linux 用のシステムコールエントリポイントを得るわけです. + + さらに, Linux モードは状況に応じてファイルシステム本来のルートマウントポイントを置き換えてファイルの参照を行ないます. + これは, union オプションを指定してマウントされたファイルシステム + (unionfs ではありません!)が行なっていることと同じです. ファイルを検索する際にはまず /compat/linux/original-path ディレクトリを, それから見つけられなかったときにのみ, /original-path を調べます. こうすることで, 他のバイナリを要求するバイナリの実行を可能にしています (したがって, Linux 用プログラムツールは Linux ABI サポート環境下で完全に動作するわけです). またこれは, もし対応する Linux バイナリが存在しない場合に Linux バイナリが FreeBSD バイナリをロードしたり, 実行したりすることが可能であること, その Linux バイナリに自分自身が Linux 上で実行されていないことを 気付かせないようにする目的で, &man.uname.1; コマンドを - /compat/linux ディレクトリに - 置くことができる, ということを意味します. + /compat/linux ディレクトリに置くことができる, + ということを意味します. - - 要するに, Linux カーネルが FreeBSD カーネルの内部に存在しているわけです. - カーネルによって提供されるサービス全ての実装の基礎となるさまざまな関数は, + 要するに, Linux カーネルが FreeBSD カーネルの内部に存在しているわけです. + カーネルによって提供されるサービス全ての実装の基礎となるさまざまな関数は FreeBSD システムコールテーブルエントリと - Linux システムコールテーブルエントリの - 両方で共通に利用されています. + Linux システムコールテーブルエントリの両方で共通に利用されています. これらにはファイルシステム処理, 仮想メモリ処理, シグナル伝送, System V IPC などが含まれますが, - FreeBSD バイナリは, FreeBSD グルー(訳注: glue; - 二者の間を仲介するという意味)関数群, + FreeBSD バイナリは FreeBSD グルー (訳注: glue; + 二者の間を仲介するという意味) 関数群, そして Linux バイナリは Linux グルー関数群を用いる, という点だけが異なります(過去に存在したほとんどの OS は, - 自分自身のためのグルー関数群しか備えていません. - 前述したように, システムコールを発行する際, - 各々のプロセスの proc 構造体内にある, - ローダによって動的に初期化されるポインタを参照してアドレスを得る代わりに, - 静的でグローバルな sysent[] 構造体の配列に - システムコール関数のアドレスが直接格納されているのです). - - - - さて, どちらを本来の FreeBSD ABI(訳注: Applications Binary Interface; + 自分自身のためのグルー関数群しか備えていません. + 前述したように, システムコールを発行する際, + 各々のプロセスの proc 構造体内にある, + ローダによって動的に初期化されるポインタを参照してアドレスを得る代わりに, + 静的でグローバルな sysent[] 構造体の配列に + システムコール関数のアドレスが直接格納されているのです). + + さて, どちらを本来の FreeBSD ABI (訳注: Applications Binary Interface; 同じ CPU を利用したコンピュータ間でバイナリを共有するための規約のこと) と呼ぶべきなのでしょうか? 実は, どちらが本来のものであるかということを論ずることに意味はありません. 基本的に, FreeBSD グルー関数群はカーネルの中に静的にリンクされていて, Linux グルー関数群は静的にリンクすることも, カーネルモジュールを介して利用することもできるようになっている, - という違いがあるだけ(ただしこれは現時点においての話です. - これは将来のリリースで変更される可能性がありますし, - おそらく実際に変更されるでしょう)です. - + という違いがあるだけ (ただしこれは現時点においての話であり, + 将来のリリースで変更される可能性がありますし, + おそらく実際に変更されるでしょう) です. - - あ, 「でもこれは本当にエミュレーションと呼べるのか」って? - 答えは「いいえ」です. これは一つの ABI 実装にすぎず, - エミュレーションとは異なります. エミュレータ(シミュレータでもないことを - あらかじめ断っておきましょう)が呼び出されているわけではありません. - + あ, 「でもこれは本当にエミュレーションと呼べるのか」って? + 答えは「いいえ」です. これは ABI の実装であり, + エミュレーションとは異なります. エミュレータが呼び出されているわけではありません + (シミュレータでもないことをあらかじめ断っておきましょう). - - では, これが良く “Linux エミュレーション” と呼ばれるのは何故でしょうか? + では, これがよく Linux エミュレーションと呼ばれるのは何故でしょうか? それはもちろん FreeBSD の売りにするため 8-) でもあるのですが, 実際には, 次のような理由によります. - この機能が初めて実装された頃, 動作原理を説明する以外に - この機能を表現する言葉はありませんでした. + この機能が初めて実装された頃, + 動作原理を説明する以外にこの機能を表現する言葉はありませんでした. しかし, コードをコンパイルしたりモジュールをロードしない場合, - 「FreeBSD 上で Linux バイナリを実行する」言う表現は, + 「FreeBSD 上で Linux バイナリを実行する」という表現は, 厳密に考えると適切ではありません. そこで, その際にロードされているもの自身を表現する言葉—すなわち - “Linux エミュレータ”が必要だったのです. - - - -
+ Linux エミュレータが必要だったのです. + + +