Index: head/ja_JP.eucJP/books/handbook/linuxemu/chapter.xml =================================================================== --- head/ja_JP.eucJP/books/handbook/linuxemu/chapter.xml (revision 48496) +++ head/ja_JP.eucJP/books/handbook/linuxemu/chapter.xml (revision 48497) @@ -1,1419 +1,1346 @@ - Linux バイナリ互換機能 + &linux; バイナリ互換機能 JimMock再構成と一部の更新: Brian N.Handyオリジナルの文書を執筆: RichMurphey - 訳: &a.jp.kiroh;、1996 年 9 月 24 日 + この章では Linux バイナリ互換機能 バイナリ互換機能 Linux - FreeBSD は、Linux を含む &unix; like - なオペレーティングシステムとのバイナリ互換機能を提供しています。 - 現時点では、一体なぜ FreeBSD が Linux - バイナリを実行できるようにならなければならないのか自問しているのではないでしょうか? - 答えはきわめて簡単です。Linux - は現在コンピュータの世界では最もホットなモノなのでたくさんの会社や開発者たちが - Linux のためだけに開発を行なっています。そのため、残された私たち - FreeBSD ユーザは彼らに対して FreeBSD - ネイティブなアプリケーションも出すように言うしかないのです。 - 問題は、FreeBSD - バージョンも出した場合にどれくらいの数のユーザーが使うのかわからない、 - ということであり、そのため Linux 版のみを開発しているということなのです。 - そこで FreeBSD では Linux バイナリ互換機能が役に立つのです。 + &os; は、&linux; とのバイナリ互換機能を提供しています。 + このバイナリ互換機能により、ユーザは &linux; のバイナリを + &os; システム上にインストールして実行することが可能になります。 + たくさんの会社や開発者たちは、 + &linux; のためだけに開発を行なっていますが、 + バイナリ互換機能により &os; のユーザはすべての &linux; アプリケーションの + 90% を修正なしに実行できます。 + この中には、生産的なアプリケーションやゲームなどが含まれます。 + ある状況においては &linux; バイナリを &linux; で動かすよりも + &os; で動かすほうが良いパフォーマンスが出るという報告もあります。 - 簡単に言ってしまえば、この機能により全ての Linux アプリケーションの - 90% が修正なしに FreeBSD 上で起動できます。 - この中には &staroffice; や Linux 版の - &adobe; &acrobat;, - &realplayer;, - &oracle;, - Doom, - Quake などがあります。 - また、ある状況においては Linux バイナリを Linux で動かすよりも - FreeBSD で動かすほうが良いパフォーマンスが出るという報告もあります。 + しかしながら、いくつかの &linux; + に特有なオペレーティングシステムの機能は &os; + ではサポートされていません。たとえば、 + 仮想 8086 モードを有効にするような &i386; + 特有の呼び出しを過度に使う + &linux; バイナリは &os; では動きません。 - しかしながら、いくつかの Linux に特有な OS の機能は - FreeBSD ではサポートされていません。 - 仮想 8086 モードを有効にするような i386 特有の呼び出しを過度に使うような - Linux バイナリは FreeBSD では動きません。 - この章を読むと、以下のことがわかります。 - Linux バイナリ互換機能を有効にする方法。 + &os; システムで &linux; バイナリ互換機能を有効にする方法。 - Linux 共有ライブラリを追加する方法。 + &linux; 共有ライブラリを追加する方法。 - Linux アプリケーションを - FreeBSD システムにインストールする方法 + &linux; アプリケーションを + &os; システムにインストールする方法 - FreeBSD における Linux 互換機能の実装の詳細。 + &os; における &linux; 互換機能の実装の詳細。 この章を読む前に、以下のことを理解しておく必要があります。 - サードパーティ製ソフトウェアのインストール方法 - () + サードパーティ製ソフトウェア + のインストール方法 インストール - KLD (kernel loadable - object) + Ports Collection - Linux バイナリ互換機能は、デフォルトでは有効ではありません。 - この機能を有効にする最も簡単な方法は、 - linux KLD オブジェクト - (Kernel LoaDable object) を読み込むことです。 - root 権限で、 - 以下のコマンドを打つだけでモジュールを読み込むことができます。 + &linux; ライブラリは、デフォルトでは &os; にインストールされません。 + また、&linux; バイナリ互換機能も、デフォルトでは有効ではありません。 + &linux; ライブラリは、 + &os; Ports Collection を使ってインストールできます。 + &linux; ライブラリを + 手動 + でインストールすることもできます。 - &prompt.root; kldload linux + &linux; ライブラリをインストールする最も簡単な方法は、 + Ports Collection を使う方法です。 + &os; 8.0 以降のシステムでは、 + 以下の port をインストールしてください。 - Linux 互換機能を常に有効にする場合には、 + &prompt.root; cd +/usr/ports/emulators/linux_base-f10 &prompt.root; make install distclean + + + &os; 8.0 よりも前の &os; システムでは、 + かわりに emulators/linux_base-fc4 port + をインストールしてください。 + + + port をインストールしたら、 + linux モジュールを読み込んで、 + &linux; バイナリ互換機能を有効にしてください。 + root 権限で、 + 以下を実行してください。 + + &prompt.root; kldload linux + + &linux; 互換機能を起動時から常に有効にする場合には、 /etc/rc.conf に以下の行を追加してください。 linux_enable="YES" - 望みの KLD モジュールがロードされているか確認したい時には - &man.kldstat.8; コマンドを利用します。 + モジュールがロードされていることを確認するには、 + &man.kldstat.8; コマンドを利用してください。 &prompt.user; kldstat Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko カーネルオプション COMPAT_LINUX - 何らかの理由で Linux KLD をロードしたくない、 - あるいはロードできないような場合には、 + &linux; バイナリ互換機能をカーネルに静的にリンクする場合には、 options COMPAT_LINUX - をカーネルの設定ファイルに指定して、 - Linux バイナリ互換機能をカーネルにスタティックリンクしてください。 + をカーネルコンフィグレーションファイルに追加してください。 そして、 - の記述にしたがって新しいカーネルをインストールしてください。 + の説明にしたがって新しいカーネルをコンパイルしてインストールしてください。 - - Linux ランタイムライブラリのインストール + + 手動でのライブラリのインストール - - Linux - Linux ライブラリのインストール - + &linux; ライブラリのインストールには、 + Ports Collection を使用することが推奨されていますが、 + 手動でインストールすることもできます。 + プログラムが必要とする &linux; + の共有ライブラリとランタイムリンカを /compat/linux + にコピーする必要があります。 + &os; で動作する &linux; プログラムが使用する共有ライブラリは、 + まずこのディレクトリから検索されます。たとえば、 + &linux; のプログラムが /lib/libc.so + をロードしようとした場合には、&os; はまず + /compat/linux/lib/libc.so + を開こうとします。これが存在しない場合には、次に + /lib/libc.so を試します。 + 共有ライブラリは、&linux; の ld.so + が報告するパスではなく、 + /compat/linux/lib + 以下にインストールする必要があります。 - これは、linux_base - port を用いるか、もしくは - 手動で - インストールします。 + 通常は、&linux; + のバイナリが必要とする共有ライブラリを探す必要があるのは、 + &os; のシステムに &linux; + のプログラムをインストールする最初の数回だけです。 + それが過ぎれば、十分な &linux; + の共有ライブラリがシステムにインストールされ、 + 新しくインストールした &linux; + のバイナリも余計な作業をせずに動作させることができるようになります。 - - linux_base の port を用いたインストール - - Ports Collection - - ランタイムライブラリをインストールするには最も簡単な方法です。 - から他の port - をインストールするのと全く同じようにできます。 - - &prompt.root; cd /usr/ports/emulators/linux_base-f10 -&prompt.root; make install distclean - - - &os; 8.0 よりも前の &os; システムでは、emulators/linux_base-f10 - ではなく、emulators/linux_base-fc4 port - を使う必要があります。 - - - これで Linux バイナリ互換機能が使えるはずです。 - いくつかのプログラムはシステムライブラリのマイナーバージョンが違うと文句を言うかもしれませんが一般的には大した問題ではありません。 - - Linux ディストリビューションおよびバージョンに対応して、 - 複数のバージョンの emulators/linux_base port が用意されています。 - インストールを考えている Linux アプリケーションが必要とする条件に近い - port をインストールする必要があります。 - - - - - 手動でのライブラリのインストール - - 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 - 以下にインストールする必要があります。 - - Linux のプログラムが必要とする - シェアードライブラリを探す必要があるのは、FreeBSD - のシステムに Linux - のプログラムをインストールする最初の数回だけでしょう。 - それが過ぎれば、十分な Linux - のシェアードライブラリがシステムにインストールされ、 - 新しくインストールした Linux - のバイナリも余計な作業をせずに動作させることができるようになります。 - - - シェアードライブラリの追加 + 共有ライブラリの追加 共有ライブラリ linux_base port をインストールした後に、 - アプリケーションが必要なライブラリが存在しないというエラーを出したらどうしたらよいでしょうか? - Linux のバイナリがどのシェアードライブラリを必要とし、 - そしてどこで入手できるか、どのように探したらよいでしょうか? - 基本的には、以下の 2 種類の方法があります (以下の手順に従う場合には、 - 必要なインストール作業をおこなう FreeBSD システム上で + アプリケーションが必要な共有ライブラリが存在しないというエラーを出した場合には、 + &linux; + バイナリがどの共有ライブラリを必要としているかを root - として作業をおこなう必要があります)。 + により指定する 2 種類の方法があります。 - Linux システムにアクセス可能ならば、 - そのアプリケーションがどういうシェアードライブラリを必要としているのか調べ、 - 単に FreeBSD にそのライブラリをコピーするだけです。 - 次の例を見てみましょう。 + &linux; システムを利用できるのであれば、 + そのアプリケーションがどういう共有ライブラリを必要としているかを調べ、 + &os; にそのライブラリをコピーしてください。 - FTP を使って Doom - の Linux バイナリを取ってきて、 - アクセスできる Linux システムに置いたとしましょう。 - 次のように ldd linuxdoom - とするだけでどのシェアードライブラリが必要かチェックできます。 + この例では、FTP を使って &linux; システムから + Doom の &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 システムでは以下のようなファイルが必要となります。 + 最後のカラムに表示されているすべてのファイルを + &os; システムの + /compat/linux + の下にコピーして、 + 最初のカラムに示されるファイル名でコピーしたファイルに対してシンボリックリンクを張ります。 + この例では、&os; + システムで以下のようになります。 /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 シェアードライブラリを既にインストールしている場合は、 - 新たにコピーする 必要はありません。 + ldd + の出力の最初のカラムに表示されているメジャーバージョンが同じ + &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 - このように最後の番号が 1 つか 2 つ古いだけならば、普通は + このように最後の番号が 1 つか 2 つ古いだけならば、 + わずかに古いライブラリでもプログラムは動作するはずなので、 /lib/libc.so.4.6.29 をコピーする必要はありません。 - わずかに古いライブラリでもプログラムは動作するはずだからです。 - もちろん、以下のように新しいライブラリと置き換えても構いません。 + しかしながら、libc.so + を置き換えるのが安全です。 /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
- シンボリックリンクのメカニズムは Linux + シンボリックリンクのメカニズムは &linux; バイナリにのみ必要なことに注意してください。 - FreeBSD - のランタイムリンカはメジャーリビジョン番号の一致したライブラリを検索するので、 - ユーザが気にする必要はありません。 + &os; + のランタイムリンカはメジャーリビジョン番号の一致したライブラリを検索します。
- Linux の ELF バイナリのインストール + &linux; の ELF バイナリのインストール Linux ELF バイナリ ELF のバイナリを使うためには、 マークをつける (branding) 作業が必要になります。 - マークのない ELF - バイナリを実行しようとすると以下のようなエラーメッセージを受けとってしまうことでしょう。 + マークのない ELF バイナリを実行しようとすると、 + 以下のようなエラーメッセージが表示されてしまうことでしょう。 &prompt.user; ./my-linux-elf-binary ELF binary type not known Abort - カーネルが FreeBSD の ELF バイナリと Linux - のバイナリとを見分けられるようにするためには、&man.brandelf.1; - ユーティリティを以下のようにして使ってください。 + &os; のカーネルが &os; の ELF バイナリと &linux; + のバイナリとを見分けられるようにするために、&man.brandelf.1; + を以下のようにして使ってください。 &prompt.user; brandelf -t Linux my-linux-elf-binary GNU ツールチェイン - 今では GNU のツールたちが + GNU のツール群が ELF バイナリに自動的に適切なマークを付加するようになったので、 - 今後はこの作業もだんだんと必要なくなってゆくでしょう。 + この作業は通常必要ありません。 - Random Linux RPM ベースのアプリケーションのインストール + &linux; RPM ベースのアプリケーションのインストール - FreeBSD は、(&linux; ports を含む) すべての ports の追跡に使われる独自の - package データベースを持っています。 - そのため、&linux; RPM データベースは必要ありません (対応していません)。 + &os; は、Ports Collection + からインストールされたすべてのソフトウェアの追跡に独自の + package データベースを使っています。 + しかしながら、&linux; RPM データベースには対応していません。 - しかしながら、random &linux; RPM - ベースのアプリケーションをインストールする必要があるのでしたら、 - 以下のように実行してください。 + &linux; RPM ベースのアプリケーションをインストールするには、 + 最初に、archivers/rpm2cpio package または + port をインストールしてください。 + インストールを行うと、 + root + は、以下のコマンドを使うことで、 + .rpm をインストールできます。 &prompt.root; cd /compat/linux &prompt.root; rpm2cpio -q < /path/to/linux.archive.rpm | cpio -id - その後、インストールした ELF - (ライブラリではなく) バイナリに brandelf を実行してください。 - 綺麗にアンインストールできないかもしれませんが、試験の手助けとなります。 + 必要に応じて、インストールした ELF + バイナリに brandelf を実行してください。 + 綺麗にアンインストールできないかもしれませんので注意してください。 ホストネームリゾルバの設定 DNS がうまく動作しなかったり、 - 以下のようなエラーメッセージが表示され - る場合は、/compat/linux/etc/host.conf - ファイルを設定する必要があります。 + 以下のようなエラーメッセージが表示される場合は、 + /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 を最初に検索し、 + この設定では /etc/hosts を最初に検索し、 次に DNS を検索するように指定します。 /compat/linux/etc/host.conf - がインストールされていない場合、 - Linux アプリケーションは FreeBSD の - /etc/host.conf を使用しようとして、 - 文法の違いによる警告を出力します。 + が存在しない場合には、 + &linux; アプリケーションは + /etc/host.conf を使用しようとし、 + &os; の文法とは互換性がないと警告を出力します。 /etc/resolv.conf を利用してネームサーバの設定をしていない場合には、 bind を削除してください。
&mathematica; のインストール Boris Hollas Mathematica 5.X 向けの改訂: アプリケーション Mathematica - この章では、&mathematica; 5.X - Linux 版の FreeBSD へのインストールについて説明します。 + この節では、&linux; 版の + &mathematica; 5.X を + &os; へインストールするプロセスについて説明します。 + &mathematica; + は商用の科学、工学および数学で使われる計算ソフトウェアプログラムです。 + Wolfram + Research から購入できます。 - Linux 版の &mathematica; または - &mathematica; for Students は、Wolfram - (http://www.wolfram.com/) - から直接注文することができます。 - &mathematica; インストーラの実行 最初に、&os; 対して &mathematica; - の Linux バイナリが、Linux ABI を使用していることを指定する必要があります。 + の &linux; バイナリが、&linux; Application Binary Interface + ABI を使用していることを指定してください。 最も簡単な方法は、すべてのマーク付けされていないコマンドに対し、 - デフォルトの ELF ブランドを Linux に設定することです。 + デフォルトの ELF ブランドを &linux; に設定することです。 &prompt.root; sysctl kern.fallback_elf_brand=3 - これにより、&os; はマーク付が行われていない ELF バイナリは - Linux ABI を使用すると見なすので、CDROM から直接インストーラを実行できます。 + これで &os; はマーク付が行われていない ELF バイナリは + &linux; ABI を使用すると見なすので、 + CDROM から直接インストーラを実行できます。 MathInstaller - ファイルをハードディスクにコピーしてください。 + をハードディスクにコピーしてください。 &prompt.root; mount /cdrom &prompt.root; cp /cdrom/Unix/Installers/Linux/MathInstaller /localdir/ このファイルの中で、最初の行の /bin/sh/compat/linux/bin/sh に置き換えてください。 - これにより、インストーラは Linux 版の &man.sh.1; + これにより、インストーラは &linux; 版の &man.sh.1; により実行されるようになります。 次に、テキストエディタもしくは次の節で説明するスクリプトを用いて、 Linux)FreeBSD) に置き換えてください。 この置き換えにより、&mathematica; - のインストーラ (オペレーティングシステムを決定するのに - uname -s を用います) が、 - &os; を Linux like なオペレーティングシステムとして扱うようになります。 + のインストーラが、&os; を &linux;-like + なオペレーティングシステムとして扱うようになります。 MathInstaller を実行すると、 &mathematica; をインストールします。 &mathematica; 実行ファイルの変更 &mathematica; - がインストール中に作成したシェルスクリプトは、使用する前に変更する必要があります。 - &mathematica; の実行ファイルが置かれているディレクトリが - /usr/local/bin とすると、 + がインストール中に作成したシェルスクリプトは、 + 使用する前に変更する必要があります。 + &mathematica; + の実行ファイルが置かれているディレクトリが + /usr/local/bin + とすると、 math, mathematica, Mathematica および MathKernel といったファイルへのシンボリックリンクがこのディレクトリにあります。 - どちらの場合でも、 - 次に、テキストエディタもしくは以下のスクリプトを用いて、 + これらにおいて、 + テキストエディタもしくは以下のスクリプトを用いて、 Linux)FreeBSD) に置き換えてください。 #!/bin/sh cd /usr/local/bin for i in math mathematica Mathematica MathKernel do sed 's/Linux)/FreeBSD)/g' $i > $i.tmp sed 's/\/bin\/sh/\/compat\/linux\/bin\/sh/g' $i.tmp > $i rm $i.tmp chmod a+x $i done &mathematica; パスワードの取得 イーサネット MAC アドレス 初めて &mathematica; を起動すると、 パスワードを尋ねられます。 - Wolfram からパスワードをまだ入手していないのであれば、 + Wolfram Research からパスワードをまだ入手していないのであれば、 インストールディレクトリにある mathinfo - というプログラムを実行して、マシン ID を入手してください。 + というプログラムを実行して、 + マシン ID を入手してください。 このマシン ID は、最初に見つかったイーサネットカードの MAC アドレスのみをベースとして作成されるので、他のコンピュータで - &mathematica; を実行することはできません。 + &mathematica; + を実行することはできません。 - 電子メールや電話、FAX などで Wolfram に登録する時にはこの - マシン ID を渡します。 + Wolfram Research + に登録する時にはこのマシン ID が必要となります。 するといくつかの数字から構成されるパスワードが返されます。 ネットワーク経由での &mathematica; フロントエンドの起動 &mathematica; - は標準フォントセットにない特別な記号 - (積分記号、総和記号、ギリシャ文字など) - を表示するために特殊なフォントを使用します。 - X プロトコルは、これらのフォントが - ローカルマシンに - インストールされていることを要求します。 - これはつまり、ローカルマシンに (CD-ROM や + は標準フォントセットにない特別な記号を表示するために特殊なフォントを使用します。 + Xorg は、 + これらのフォントがローカルマシンにインストールされていることを要求します。 + これはつまり、これらのフォントを CD-ROM や &mathematica; - がインストールされているホストマシンから) - そのフォントをコピーしなければならないということです。 + がインストールされているホストマシンからローカルマシンにコピーしなければならないということです。 これらのフォントは通常、CD-ROM の - /cdrom/Unix/Files/SystemFiles/Fonts - か、もしくはハードディスクの - /usr/local/mathematica/SystemFiles/Fonts - に置かれており、実際に使用されるフォントは Type1 と - X のサブディレクトリに格納されています。 - これらを利用するには次のような二つ方法があります。 + /cdrom/Unix/Files/SystemFiles/Fonts + か、もしくはハードディスクの /usr/local/mathematica/SystemFiles/Fonts + に置かれており、実際に使用されるフォントは + Type1 および + X + サブディレクトリに格納されています。 + これらを利用するには次のようないくつかの方法があります。 - 一つは、フォントファイルをすべて - /usr/X11R6/lib/X11/fonts/ - 以下にある既存のフォントディレクトリにコピーする方法です。 - この場合、fonts.dir にフォント名を追加し、 - 先頭行のフォント総数を変更することも必要になります。 - あるいは、フォントをコピーしたディレクトリで - &man.mkfontdir.1; を実行するだけでもかまいません。 + 一つ目の方法は、フォントファイルを /usr/local/lib/X11/fonts + 以下にある既存のフォントディレクトリにコピーし、 + 新しいフォントを含むディレクトで + &man.mkfontdir.1; を実行してください。 もう一つの方法は、 - /usr/X11R6/lib/X11/fonts/ + /usr/local/lib/X11/fonts にフォントディレクトリごとコピーする方法です。 - &prompt.root; cd /usr/X11R6/lib/X11/fonts + &prompt.root; cd /usr/local/lib/X11/fonts &prompt.root; mkdir X &prompt.root; mkdir MathType1 &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; cd /usr/X11R6/lib/X11/fonts/X +&prompt.root; cp X/* /usr/local/lib/X11/fonts/X +&prompt.root; cp Type1/* /usr/local/lib/X11/fonts/MathType1 +&prompt.root; cd /usr/local/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+ /usr/local/lib/X11/fonts/X +&prompt.root; xset fp+ /usr/local/lib/X11/fonts/MathType1 &prompt.root; xset fp rehash &xorg; サーバを使用しているなら、 - xorg.conf - ファイルに加えることでこれらのフォントを自動的に読み込むことができます。 + /etc/X11/xorg.conf + に加えることでこれらのフォントディレクトリを自動的に読み込むようにできます。 フォント - - /usr/X11R6/lib/X11/fonts/Type1 という - ディレクトリが存在していない場合には、 - 上記例の MathType1 を - Type1 - とすることができます。 + /usr/local/lib/X11/fonts/Type1 + というディレクトリが存在していない場合には、 + 上記例の MathType1Type1 + としてください。 &maple; のインストール Aaron Kaplan 寄稿: Robert Getschmann 感謝: applications Maple &maple;&mathematica; に似た商用の数式処理プログラムです。 - ソフトウェアを http://www.maplesoft.com/ - で購入し、 - ライセンスファイルの登録手続きを行ってください。 - このソフトウェアを FreeBSD にインストールするには、 + このソフトウェアを Maplesoft + で購入し、ライセンスを入手してください。 + このソフトウェアの &linux; 版を &os; にインストールするには、 以下のステップに従ってください。 製品の配布物から INSTALL シェルスクリプトを実行してください。 インストールプログラムからの質問には、 RedHat オプションを選択してください。 一般的なインストールのディレクトリは、/usr/local/maple です。 - &maple; - のライセンスがなければ、 - Maple Waterloo Software (http://register.maplesoft.com") - で登録し、 - /usr/local/maple/license/license.dat - にコピーしてください。 + + ライセンスを + /usr/local/maple/license/license.dat + にコピーしてください。 + - &maple; についてくる - INSTALL_LIC - というインストールシェルスクリプトを実行し、 - FLEXlm - ラインセンスマネージャをインストールしてください。 - ライセンスサーバに対して、 - コンピュータのホスト名を設定してください。 + + &maple; についてくる + INSTALL_LIC + というインストールシェルスクリプトを実行し、 + FLEXlm + ラインセンスマネージャをインストールしてください。 + ライセンスサーバに対して、 + コンピュータのホスト名を設定してください。 + - 以下のパッチを - /usr/local/maple/bin/maple.system.type - ファイルにあててください。 + + 以下のパッチを + /usr/local/maple/bin/maple.system.type + ファイルにあててください。 + ----- snip ------------------ *** maple.system.type.orig Sun Jul 8 16:35:33 2001 --- maple.system.type Sun Jul 8 16:35:51 2001 *************** *** 72,77 **** --- 72,78 ---- # the IBM RS/6000 AIX case MAPLE_BIN="bin.IBM_RISC_UNIX" ;; + "FreeBSD"|\ "Linux") # the Linux/x86 case # We have two Linux implementations, one for Red Hat and ----- snip end of patch ----- "FreeBSD"|\ の後に空白を入れてはいけません。 このパッチにより &maple; は、 - FreeBSD を Linux システムと認識します。 + &os; を &linux; システムと認識します。 bin/maple シェルスクリプトは bin/maple.system.type を呼び出します。 このスクリプトは、uname -a を実行し、 オペレーティングシステムの名前を入手します。 OS 名にから、どのバイナリを使用するかを判断します。 ライセンスサーバを起動してください。 /usr/local/etc/rc.d/lmgrd としてインストールされる、以下のスクリプトは、 lmgrd を起動する便利な方法です。 ----- snip ------------ #! /bin/sh -PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bn +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin PATH=${PATH}:/usr/local/maple/bin:/usr/local/maple/FLEXlm/UNIX/LINUX export PATH LICENSE_FILE=/usr/local/maple/license/license.dat LOG=/var/log/lmgrd.log case "$1" in start) lmgrd -c ${LICENSE_FILE} 2>> ${LOG} 1>&2 echo -n " lmgrd" ;; stop) lmgrd -c ${LICENSE_FILE} -x lmdown 2>> ${LOG} 1>&2 ;; *) echo "Usage: `basename $0` {start|stop}" 1>&2 exit 64 ;; esac exit 0 ----- snip ------------ &maple; - を試験的に起動してください。 + を起動して試験を行ってください。 &prompt.user; cd /usr/local/maple/bin &prompt.user; ./xmaple - maple を使う用意はできました。 - ネイティブ FreeBSD 版を希望していることを - Maplesoft に連絡してください! + 正常に動作することを確認したら、Maplesoft に対し、 + ネイティブ &os; + 版を希望することの連絡を検討してみてください。 落とし穴 - FLEXlm - ライセンスマネージャは、動かすことが難しいツールでもあります。 - http://www.globetrotter.com/ - にも文書が用意されています。 - lmgrd は、 ライセンスファイルに依存し、問題があると core dump してしまいます。 正しいライセンスファイルは以下のようなものです。 # ======================================================= # License File for UNIX Installations ("Pointer File") # ======================================================= SERVER chillig ANY #USE_SERVER VENDOR maplelmg FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \ PLATFORMS=i86_r ISSUER="Waterloo Maple Inc." \ ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \ SN=XXXXXXXXX - シリアル番号およびキーは 'X' に置き換えています。 - chillig は、ホスト名です。 + + この例において、 + シリアル番号およびキーは X + に置き換えています。 + chillig は、ホスト名です。 + ライセンスファイルを編集する際に、 - (ライセンスキーで保護されている) FEATURE - の行を書き換えてしまうと、動かなくなるでしょう。 + FEATURE + の行を書き換えてしまうと、動かなくなるでしょう。 + この行は、ライセンスキーで保護されています。 &matlab; のインストール Dan Pelleg 寄稿: applications MATLAB - この節では、&os; システムへ、Linux 版の + この節では、&os; システムへ、&linux; 版の &matlab; version 6.5 をインストールするプロセスについて説明します。 - &java.virtual.machine; - ( をご覧ください) を除けば、 + で詳細を説明する + &java.virtual.machine; を除けば、 極めてよく動作します。 - Linux 版の &matlab; は、 + &linux; 版の &matlab; は、 MathWorks (http://www.mathworks.com) - から直接注文することができます。 - ライセンスファイルを入手するか、 - ライセンスファイルを作成する手順を確認してください。 - 彼らに対して、ネイティブの &os; 版を必要としていることを伝えてください。 + xlink:href="http://www.mathworks.com/products/matlab/">MathWorks) + から購入しライセンスを入手できます。 + ベンダに対し、ネイティブの &os; 版を必要としていることを伝えてください。 &matlab; のインストール &matlab; をインストールするには、以下のようにしてください。 - インストール CD を挿入して、マウントしてください。 - インストールスクリプトで推奨されているように、 - root になってください。 + インストールスクリプトで推奨されているように、 + root になり、 + インストール CD を挿入し、マウントしてください。 以下のように入力して、インストールスクリプトを実行してください。 &prompt.root; /compat/linux/bin/sh /cdrom/install インストーラはグラフィカルです。 - ディスプレイを表示できないエラーが起きるようでしたら、 + ディスプレイを表示できなければ、 setenv HOME ~USER と実行してください。ここで、 USER は、 &man.su.1; を実行したユーザ名です。 &matlab; ルートディレクトリの入力を求められたら、 /compat/linux/usr/local/matlab と入力してください。 残りのインストールプロセスでの入力を簡単にするために、 - シェルプロンプトで、 - set - MATLAB=/compat/linux/usr/local/matlab + シェルプロンプトで、set + MATLAB=/compat/linux/usr/local/matlab と実行してください。 &matlab; ライセンスを入手時の手順に従い、 ライセンスファイルを編集してください。 - あなたがいつも使っているエディタを使って、 - このファイルを準備してください。 + エディタを使って、このファイルを準備してください。 そして、インストーラが - $MATLAB/license.dat を編集するように尋ねる前に、 $MATLAB/license.dat + を編集するように尋ねる前に、 + $MATLAB/license.dat にコピーしてください。 インストールプロセスを完了してください。 - この時点で、&matlab; + これで &matlab; のインストールは終わりました。 以下の手順は、&os; システムに結びつけるための glue です。 ライセンスマネージャの起動 ライセンスマネージャのスクリプトへのシンボリックリンクを作成してください。 &prompt.root; ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW &prompt.root; ln -s $MATLAB/etc/lmdown /usr/local/etc/lmdown_TMW - スタートアップファイルを - /usr/local/etc/rc.d/flexlm - に作成してください。 + /usr/local/etc/rc.d/flexlm + という名前のスタートアップファイルを作成してください。 以下の例は、配布されている $MATLAB/etc/rc.lm.glnx86 の改良版です。 - 変更点はファイルの位置、Linux + 変更点はファイルの位置、&linux; エミュレーションでライセンスマネージャを起動する点です。 #!/bin/sh case "$1" in start) if [ -f /usr/local/etc/lmboot_TMW ]; then /compat/linux/bin/sh /usr/local/etc/lmboot_TMW -u username && echo 'MATLAB_lmgrd' fi ;; stop) if [ -f /usr/local/etc/lmdown_TMW ]; then /compat/linux/bin/sh /usr/local/etc/lmdown_TMW > /dev/null 2>&1 fi ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac exit 0 ファイルに対し実行の権限を指定してください。 &prompt.root; chmod +x /usr/local/etc/rc.d/flexlm ここで、上記のコマンドの中の、 username を - (root ではなく) - システムに存在するユーザの名前に置き換えてください。 + root + ではないシステムのユーザ名に置き換えてください。 以下のコマンドでライセンスマネージャを起動してください。 &prompt.root; service flexlm start &java; Runtime Environment のリンク &java; Runtime - Environment (JRE) のリンクを、&os; の作業場所に変更してください。 + Environment (JRE) のリンクを、 + &os; の作業場所に変更してください。 &prompt.root; cd $MATLAB/sys/java/jre/glnx86/ &prompt.root; unlink jre; ln -s ./jre1.1.8 ./jre &matlab; 起動スクリプトの作成 以下の起動スクリプトを - /usr/local/bin/matlab + /usr/local/bin/matlab に置いてください。 #!/bin/sh /compat/linux/bin/sh /compat/linux/usr/local/matlab/bin/matlab "$@" その後、 chmod +x /usr/local/bin/matlab コマンドを実行してください。 使用している emulators/linux_base のバージョンによっては、 このスクリプトを実行するとエラーが出ることがあります。 - これを避けるためには、 + エラーを避けるには、 /compat/linux/usr/local/matlab/bin/matlab ファイルを編集して、以下の行を変更してください。 if [ `expr "$lscmd" : '.*->.*'` -ne 0 ]; then - この行 (バージョン 13.0.1 では、410 行目にあります) を、 - 以下に置きかえてください。 + この行を、以下に置きかえてください。 if test -L $newbase; then &matlab; シャットダウンスクリプトの作成 以下のスクリプトは、&matlab; が正常に終了しない問題を解決します。 $MATLAB/toolbox/local/finish.m - ファイルを作成して、以下の一行を加えてください。 + を作成して、以下の一行を加えてください。 ! $MATLAB/bin/finish.sh ここで $MATLAB は、 文字通り入力してください。 同じディレクトリの中には、 finishsav.m および finishdlg.m というファイルがあります。 それらのファイルは、終了する前にワークスペースを保存します。 これらのうちどちらかを使うには、 save コマンドのすぐ後に、 上記の行を挿入してください。 以下の行を含む、 $MATLAB/bin/finish.sh ファイルを作成してください。 #!/compat/linux/bin/sh (sleep 5; killall -1 matlab_helper) & exit 0 ファイルを実行可能に設定してください。 &prompt.root; chmod +x $MATLAB/bin/finish.sh &matlab; を使用する - この時点で、 - matlab を実行できるようになったので、 - 起動して使用してください。 + これで matlab + を実行できるようになりました。 &oracle; のインストール MarcelMoolenaar寄贈: アプリケーション Oracle - - はじめに + このドキュメントでは &oracle; 8.0.5 + および &oracle; 8.0.5.1 Enterprise Edition + の &linux; 版を &os; にインストールするための手順を解説します。 - このドキュメントでは &oracle; 8.0.5 - と &oracle; 8.0.5.1 Enterprise Edition - の Linux 版を FreeBSD にインストールするための手順を解説します。 - - - Linux 環境のインストール + &linux; 環境のインストール まずは Ports Collection から emulators/linux_basedevel/linux_devtools - をインストールしてください。 - もしこれらの ports がうまく動かなければ、package - もしくは Ports Collection - で利用可能な古いバージョンを試してみてください。 + をインストールしてください。 - もし賢いエージェント (intelligent agent) を起動したいなら + intelligent agent を起動したいなら Red Hat Tcl パッケージ tcl-8.0.3-20.i386.rpm - もインストールする必要があるでしょう。 - 公式の RPM port (archivers/rpm) - をインストールするには一般的に次のようにします。 + もインストールしてください。 + archivers/rpm port を使って、 + RPM をインストールするには一般的に次のようにします。 &prompt.root; rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package - package - のインストール時にエラーが出てはいけません。 + このコマンドの実行時に、エラーが出てはいけません。 &oracle; 環境の構築 &oracle; をインストールする前に、 - 適切な環境を設定する必要があります。 - このドキュメントでは、&oracle; - のインストールガイドに書いてあるようなことではなく - FreeBSD で Linux 用 &oracle; - を動かすために特別に必要なことのみを解説します。 + 環境を適切に設定する必要があります。 + この節では、&oracle; + のインストールガイドに書いてあるようなことではなく、 + &os; で &linux; 版の &oracle; + を動かす方法についてのみを解説します。 カーネルのチューニング カーネルのチューニング - &oracle; インストールガイドにあるように、 - シェアードメモリーの最大サイズを設定しなければいけません。 - FreeBSD では SHMMAX を使わないようにしてください。 - SHMMAX は単に SHMMAXPGS - と PGSIZE から計算されるだけなのです。 + &oracle; + インストールガイドにあるように、 + 共有メモリの最大サイズを設定しなければいけません。 + &os; では SHMMAX を使わないようにしてください。 + SHMMAXSHMMAXPGS + および 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 &oracle; 用アカウント - 他のアカウントを作るのと同じように + 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 + $ORACLE_HOME/bin - 全ての環境変数は .profile - で設定することをお勧めします。 - 完璧なサンプルは以下の通りです。 + すべての環境変数は ~/.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 PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin export PATH &oracle; のインストール - インストーラーを起動する前に、/var/tmp - に .oracle - という名前のディレクトリを作る必要がありますが、 - これは Linux エミュレーターにおけるちょっとした不整合のためです。 - このディレクトリは oracle - ユーザーのものにしておきます。 + インストーラを起動する前に、 + oracle ユーザ所有の + /var/tmp/.oracle + という名前のディレクトリを作る必要があります。 これで特に問題なく &oracle; がインストールできるでしょう。 もし問題が起こったら、まずは &oracle; の配布物や設定をチェックしてください。 - &oracle; - のインストールが終わったら次の二つのサブセクションで解説するパッチを当てます。 + &oracle; のインストールが終わったら、 + 次の二つの節で解説するパッチを当ててください。 よくあるトラブルは、TCP - プロトコルアダプターが正しくインストールされていないことです。 - そのため、一切 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 + を起動するのを忘れないようにしてください。 - root.sh へのパッチ + <filename>root.sh</filename> へのパッチ &oracle; をインストールする時、 root で行なう必要のあるいくつかの操作は root.sh と呼ばれるシェルスクリプトに記録されます。 - このスクリプトは、orainst - ディレクトリにあります。次のパッチを root.sh に当てて - 正しい場所にある chown コマンドを使うようにするか、 - 代わりに Linux ネイティブなシェルのもとでスクリプトを走らせましょう。 + このスクリプトは、orainst + にあります。次のパッチを root.sh に当てて、 + &os; の 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 &oracle; を CD-ROM からインストールしない場合は root.sh のソースにパッチを当ててもいいでしょう。 rthd.sh という名前でソースツリーの - orainst というディレクトリにあります。 + orainst + にあります。 - genclntsh へのパッチ + <filename>genclntsh</filename> へのパッチ - genclntsh - スクリプトは一つの共有クライアントライブラリを生成するのに用いられます。 - これはデモを作る時に使われます。PATH + 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 +! PATH=/usr/local/bin:/bin:/usr/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 +! #PATH=/usr/local/bin:/bin:/usr/bin: export PATH # # each product MUST provide a $PRODUCT/admin/shrept.lst &oracle; の起動 - インストラクションに従えば、Linux でと同じように + これまでの手順に従えば、&linux; でと同じように &oracle; を起動できるでしょう。 高度なトピックス - Linux - バイナリ互換機能がどのような仕組みなのか興味がある人はこのセクションを読んでください。 - 以下の文章で説明されていることのほとんどは &a.chat; に投稿された + この節では、&linux; + バイナリ互換機能がどのような仕組みで動作をしているかを説明します。 + 以下の文章は &a.chat; に投稿された Terry Lambert (tlambert@primenet.com) 氏のメール (Message ID: <199906020108.SAA07001@usr09.primenet.com>) をもとにしています。 - - どのように動くのでしょう? + execution class loader - execution class loader + &os; は、実行クラスローダ (execution class loader) + と呼ばれる抽象的な機構を持っています。これは &man.execve.2; + システムコールへの楔という形で実装されています。 - FreeBSD は、“実行クラスローダ (execution class loader) ” - と呼ばれる抽象的な機構を持っています。これは &man.execve.2; - システムコールへの楔という形で実装されています。 + 歴史的には、&unix; のローダはマジックナンバー + (一般的にはファイルの先頭の 4 ないし 8 バイトの部分) + の検査を行ない、システムで実行できるバイナリかどうかを検査し、 + もしそうならバイナリローダを呼び出すというようになっていました。 - FreeBSD は、シェルインタプリタやシェルスクリプトを実行するための - #! ローダを持った単一のプログラムローダではなく、 - ローダのリストを持っているのです。 + もし、そのシステム用のバイナリでない場合には、 + &man.execve.2; システムコールの呼び出しは失敗の戻り値を返し、 + シェルがシェルコマンドとして実行しようと試みていたわけです。 + この仮定は現在利用しているシェルがどのようなものであってもデフォルトでした。 - 歴史的には、&unix; プラットフォーム上の唯一のローダーがマジックナンバー - (一般的にはファイルの先頭の 4 ないし 8 バイトの部分) - の検査を行ないシステムで実行できるバイナリかどうかを検査し、 - もしそうならバイナリローダーを呼び出すというようになっていました。 + 後に &man.sh.1; に変更が加えられ、先頭の 2 バイトを検査した結果 + :\n であれば代わりに &man.csh.1; を呼び出す、 + というようになりました。 - もし、そのシステム用のバイナリでない場合には、 - &man.execve.2; システムコールの呼び出しは失敗の戻り値を返し、 - シェルがシェルコマンドとして実行しようと試みていたわけです。 + &os; は、単一のローダではなく、ローダの一覧を走査します。 + 動作しているシェルインタプリタもしくはシェルスクリプトとして、 + 該当するものが存在しなければ、#! + ローダが用いられます。 - この仮定は現在利用しているシェルがどのようなものであっても変わりません。 + ELF + Solaris - 後に &man.sh.1; に変更が加えられ、先頭の 2 バイトを検査した結果 - :\n であれば代わりに &man.csh.1; を呼び出す、 - というようになりました (この変更は SCO が最初に行なったと思われます)。 + &linux; ABI をサポートするため、&os; は + ELF バイナリを示すマジックナンバを確認します。 + ELF ローダは、特殊なマーク (brand) + があるかどうか探します。 + このマークとは、ELF イメージのコメントセクションのことです。 + SVR4/&solaris; の ELF バイナリには、このセクションは存在しません。 - 現在の FreeBSD は、プログラムローダリストを走査します。 - その際、空白文字までの文字列をインタプリタとして認識する、 - 通常の #! ローダを用いるため、 - 該当するものが存在しなければ最終的に /bin/sh がロードされます。 - ELF + &linux; バイナリを実行するためには、 + &man.brandelf.1; を使って Linux + のマークが付けられていなければなりません。 - Linux ABI をサポートするため、FreeBSD は - ELF バイナリを示すマジックナンバを確認します。 - (ただし、この段階では FreeBSD、&solaris;, Linux、そしてその他の - ELF イメージ形式を使っている OS を区別することはできません)。 - Solaris - - ELF ローダは、特殊なマーク (brand) - があるかどうか探します。 - このマークとは、ELF イメージのコメントセクションのことです。 - SVR4/&solaris; の ELF バイナリには、このセクションは存在しません。 - - Linux バイナリを実行するためには、 - ELF バイナリに &man.brandelf.1; で説明されている - Linux のマークが付けられていなければなりません。 - &prompt.root; brandelf -t Linux file - 上のようにすることで、指定されたファイルは - Linux のマークが付けられ、 - ELF ローダが認識できるようになります。 ELF branding ELF ローダが Linux マークを確認すると、 ローダは proc 構造体内の ある一つのポインタを置き換えます。システムコールは全て、 - このポインタ (伝統的な &unix; システムではこれは構造体の配列 - sysent[] で、システムコールが含まれています) - を通してインデックスされます。 - さらに、そのプロセスには Linux + このポインタを通してインデックスされます。 + さらに、そのプロセスには &linux; カーネルモジュールに必要なシグナルトランポリンコード (訳注: シグナルの伝播を実現するコード) 用の特殊なトラップベクタの設定や、 他の (細かな) 調整のための設定が行なわれます。 - Linux システムコールベクタは、 + &linux; システムコールベクタは、 さまざまなデータに加えて sysent[] エントリーのリストを含んでおり、 それらのアドレスはカーネルモジュール内にあります。 - Linux バイナリがシステムコールを発行する際、トラップコードは + &linux; バイナリがシステムコールを発行する際、トラップコードは proc 構造体を用いてシステムコール関数ポインタを - 解釈します。そして FreeBSD ではなく - Linux 用のシステムコールエントリポイントを得るわけです。 + 解釈します。そして &os; ではなく + &linux; 用のシステムコールエントリポイントを得るわけです。 - さらに、Linux + &linux; モードは状況に応じてファイルシステム本来のルートマウントポイントを置き換えてファイルの参照を行ないます。 これは、 - オプションを指定してマウントされたファイルシステム - (unionfs - ファイルシステムではありません!) - が行なっていることと同じです。 - ファイルを検索する際にはまず - /compat/linux/original-path - ディレクトリを、それから見つけられなかったときにのみ、 - /original-path + オプションを指定してマウントされたファイルシステムが行なっていることと同じです。 + ファイルを検索する際にはまず /compat/linux/original-path + を調べます。見つけられなかったときには、/original-path を調べます。 - こうすることで、他のバイナリを要求するバイナリの実行を可能にしています - (したがって、Linux 用プログラムツールは - Linux ABI サポート環境下で完全に動作するわけです)。 - またこれは、もし対応する Linux バイナリが存在しない場合に - Linux バイナリが FreeBSD バイナリをロードしたり、 + こうすることで、他のバイナリを要求するバイナリの実行を可能にしています。 + たとえば、&linux; 用ツールチェインは + &linux; ABI サポート環境下で完全に動作します。 + またこれは、もし対応する &linux; バイナリが存在しない場合に + &linux; バイナリが &os; バイナリをロードしたり、 実行したりすることが可能であること、 - その Linux バイナリに自分自身が Linux 上で実行されていないことを + その &linux; バイナリに自分自身が &linux; 上で実行されていないことを 気付かせないようにする目的で、&man.uname.1; コマンドを - /compat/linux ディレクトリに置くことができる、 + /compat/linux + ディレクトリに置くことができる、 ということを意味します。 - 要するに、Linux カーネルが FreeBSD カーネルの内部に存在しているわけです。 + 要するに、&linux; カーネルが &os; + カーネルの内部に存在しているわけです。 カーネルによって提供されるサービス全ての実装の基礎となるさまざまな関数は - FreeBSD システムコールテーブルエントリと - Linux システムコールテーブルエントリの両方で共通に利用されています。 + &os; システムコールテーブルエントリと + &linux; システムコールテーブルエントリの両方で共通に利用されています。 これらにはファイルシステム処理、仮想メモリ処理、シグナル伝送、 - System V IPC などが含まれますが、 - FreeBSD バイナリは FreeBSD グルー (訳注: glue; + System V IPC が含まれますが、 + &os; バイナリは &os; グルー (訳注: glue; 二者の間を仲介するという意味) 関数群、 - そして Linux バイナリは Linux グルー関数群を用いる、 - という点だけが異なります (過去に存在したほとんどの OS は、 - 自分自身のためのグルー関数群しか備えていません。 - 前述したように、システムコールを発行する際、 - 各々のプロセスの proc 構造体内にある、 - ローダによって動的に初期化されるポインタを参照してアドレスを得る代わりに、 - 静的でグローバルな sysent[] 構造体の配列に - システムコール関数のアドレスが直接格納されているのです)。 + そして &linux; バイナリは &linux; + グルー関数群を用いる、 + という点だけが異なります。 + &os; のグルー関数群は、 + カーネルの中に静的にリンクされ、 + &linux; のグルー関数群は静的にリンクすることも、 + カーネルモジュールを介して利用することもできるようになっています。 - さて、どちらを本来の FreeBSD ABI (訳注: Applications Binary Interface; - 同じ CPU を利用したコンピュータ間でバイナリを共有するための規約のこと) - と呼ぶべきなのでしょうか? - 実は、どちらが本来のものであるかということを論ずることに意味はありません。 - 基本的に、FreeBSD - グルー関数群はカーネルの中に静的にリンクされていて、 - Linux グルー関数群は静的にリンクすることも、 - カーネルモジュールを介して利用することもできるようになっている、 - という違いがあるだけ (ただしこれは現時点においての話であり、 - 将来のリリースで変更される可能性がありますし、 - おそらく実際に変更されるでしょう) です。 - - あ、「でもこれは本当にエミュレーションと呼べるのか」って? - 答えは「いいえ」です。これは ABI の実装であり、 - エミュレーションとは異なります。 - エミュレータが呼び出されているわけではありません - (シミュレータでもないことをあらかじめ断っておきましょう)。 - - では、これがよく Linux - エミュレーションと呼ばれるのは何故でしょうか? - それはもちろん FreeBSD の売りにするためでもあるのですが、 - 実際には、次のような理由によります。 + 技術的には、これはエミュレーションではなく、 + ABI の実装です。 + よく &linux; エミュレーションと呼ばれるのは、 この機能が初めて実装された頃、 - 動作原理を説明する以外にこの機能を表現する言葉はありませんでした。 - しかし、コードをコンパイルしたりモジュールをロードしない場合、 - 「FreeBSD 上で Linux バイナリを実行する」という表現は、 - 厳密に考えると適切ではありません。 - そこで、その際にロードされているもの自身を表現する言葉 — すなわち - Linux エミュレータが必要だったのです。 - - -
+ この機能を表現する言葉がなかったためです。 + コードをコンパイルしてはいないので、 + &os; 上で &linux; バイナリを実行するという表現は、 + 厳密に考えると適切ではありません。 + +