Index: head/ja_JP.eucJP/books/handbook/linuxemu/chapter.xml =================================================================== --- head/ja_JP.eucJP/books/handbook/linuxemu/chapter.xml (revision 48456) +++ head/ja_JP.eucJP/books/handbook/linuxemu/chapter.xml (revision 48457) @@ -1,1421 +1,1419 @@ 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 バイナリ互換機能が役に立つのです。 簡単に言ってしまえば、この機能により全ての Linux アプリケーションの 90% が修正なしに FreeBSD 上で起動できます。 この中には &staroffice; や Linux 版の - &netscape;, &adobe; &acrobat;, &realplayer;, &oracle;, - &wordperfect;, Doom, Quake などがあります。 また、ある状況においては Linux バイナリを Linux で動かすよりも FreeBSD で動かすほうが良いパフォーマンスが出るという報告もあります。 しかしながら、いくつかの Linux に特有な OS の機能は FreeBSD ではサポートされていません。 仮想 8086 モードを有効にするような i386 特有の呼び出しを過度に使うような Linux バイナリは FreeBSD では動きません。 この章を読むと、以下のことがわかります。 Linux バイナリ互換機能を有効にする方法。 Linux 共有ライブラリを追加する方法。 Linux アプリケーションを FreeBSD システムにインストールする方法 FreeBSD における Linux 互換機能の実装の詳細。 この章を読む前に、以下のことを理解しておく必要があります。 サードパーティ製ソフトウェアのインストール方法 () インストール KLD (kernel loadable object) Linux バイナリ互換機能は、デフォルトでは有効ではありません。 この機能を有効にする最も簡単な方法は、 linux KLD オブジェクト (Kernel LoaDable object) を読み込むことです。 root 権限で、 以下のコマンドを打つだけでモジュールを読み込むことができます。 &prompt.root; kldload linux Linux 互換機能を常に有効にする場合には、 /etc/rc.conf に以下の行を追加してください。 linux_enable="YES" 望みの KLD モジュールがロードされているか確認したい時には &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 をロードしたくない、 あるいはロードできないような場合には、 options COMPAT_LINUX をカーネルの設定ファイルに指定して、 Linux バイナリ互換機能をカーネルにスタティックリンクしてください。 そして、 の記述にしたがって新しいカーネルをインストールしてください。 Linux ランタイムライブラリのインストール Linux Linux ライブラリのインストール これは、linux_base port を用いるか、もしくは 手動で インストールします。 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 システム上で root として作業をおこなう必要があります)。 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/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 のランタイムリンカはメジャーリビジョン番号の一致したライブラリを検索するので、 ユーザが気にする必要はありません。
Linux の ELF バイナリのインストール Linux ELF バイナリ 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 ツールチェイン 今では GNU のツールたちが ELF バイナリに自動的に適切なマークを付加するようになったので、 今後はこの作業もだんだんと必要なくなってゆくでしょう。 Random Linux RPM ベースのアプリケーションのインストール FreeBSD は、(&linux; ports を含む) すべての ports の追跡に使われる独自の package データベースを持っています。 そのため、&linux; RPM データベースは必要ありません (対応していません)。 しかしながら、random &linux; RPM ベースのアプリケーションをインストールする必要があるのでしたら、 以下のように実行してください。 &prompt.root; cd /compat/linux &prompt.root; rpm2cpio -q < /path/to/linux.archive.rpm | cpio -id その後、インストールした ELF (ライブラリではなく) バイナリに brandelf を実行してください。 綺麗にアンインストールできないかもしれませんが、試験の手助けとなります。 ホストネームリゾルバの設定 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 を削除してください。
&mathematica; のインストール Boris Hollas Mathematica 5.X 向けの改訂: アプリケーション Mathematica この章では、&mathematica; 5.X Linux 版の FreeBSD へのインストールについて説明します。 Linux 版の &mathematica; または &mathematica; for Students は、Wolfram (http://www.wolfram.com/) から直接注文することができます。 &mathematica; インストーラの実行 最初に、&os; 対して &mathematica; の Linux バイナリが、Linux ABI を使用していることを指定する必要があります。 最も簡単な方法は、すべてのマーク付けされていないコマンドに対し、 デフォルトの ELF ブランドを Linux に設定することです。 &prompt.root; sysctl kern.fallback_elf_brand=3 これにより、&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)FreeBSD) に置き換えてください。 この置き換えにより、&mathematica; のインストーラ (オペレーティングシステムを決定するのに uname -s を用います) が、 &os; を Linux like なオペレーティングシステムとして扱うようになります。 MathInstaller を実行すると、 &mathematica; をインストールします。 &mathematica; 実行ファイルの変更 &mathematica; がインストール中に作成したシェルスクリプトは、使用する前に変更する必要があります。 &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 からパスワードをまだ入手していないのであれば、 インストールディレクトリにある mathinfo というプログラムを実行して、マシン ID を入手してください。 このマシン ID は、最初に見つかったイーサネットカードの MAC アドレスのみをベースとして作成されるので、他のコンピュータで &mathematica; を実行することはできません。 電子メールや電話、FAX などで Wolfram に登録する時にはこの マシン ID を渡します。 するといくつかの数字から構成されるパスワードが返されます。 ネットワーク経由での &mathematica; フロントエンドの起動 &mathematica; は標準フォントセットにない特別な記号 (積分記号、総和記号、ギリシャ文字など) を表示するために特殊なフォントを使用します。 X プロトコルは、これらのフォントが ローカルマシンに インストールされていることを要求します。 これはつまり、ローカルマシンに (CD-ROM や &mathematica; がインストールされているホストマシンから) そのフォントをコピーしなければならないということです。 これらのフォントは通常、CD-ROM の /cdrom/Unix/Files/SystemFiles/Fonts か、もしくはハードディスクの /usr/local/mathematica/SystemFiles/Fonts に置かれており、実際に使用されるフォントは Type1X のサブディレクトリに格納されています。 これらを利用するには次のような二つ方法があります。 一つは、フォントファイルをすべて /usr/X11R6/lib/X11/fonts/ 以下にある既存のフォントディレクトリにコピーする方法です。 この場合、fonts.dir にフォント名を追加し、 先頭行のフォント総数を変更することも必要になります。 あるいは、フォントをコピーしたディレクトリで &man.mkfontdir.1; を実行するだけでもかまいません。 もう一つの方法は、 /usr/X11R6/lib/X11/fonts/ にフォントディレクトリごとコピーする方法です。 &prompt.root; cd /usr/X11R6/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; 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 &xorg; サーバを使用しているなら、 xorg.conf ファイルに加えることでこれらのフォントを自動的に読み込むことができます。 フォント /usr/X11R6/lib/X11/fonts/Type1 という ディレクトリが存在していない場合には、 上記例の MathType1Type1 とすることができます。 &maple; のインストール Aaron Kaplan 寄稿: Robert Getschmann 感謝: applications Maple &maple;&mathematica; に似た商用の数式処理プログラムです。 ソフトウェアを http://www.maplesoft.com/ で購入し、 ライセンスファイルの登録手続きを行ってください。 このソフトウェアを FreeBSD にインストールするには、 以下のステップに従ってください。 製品の配布物から INSTALL シェルスクリプトを実行してください。 インストールプログラムからの質問には、 RedHat オプションを選択してください。 一般的なインストールのディレクトリは、/usr/local/maple です。 &maple; のライセンスがなければ、 Maple Waterloo Software (http://register.maplesoft.com") で登録し、 /usr/local/maple/license/license.dat にコピーしてください。 &maple; についてくる INSTALL_LIC というインストールシェルスクリプトを実行し、 FLEXlm ラインセンスマネージャをインストールしてください。 ライセンスサーバに対して、 コンピュータのホスト名を設定してください。 以下のパッチを /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 システムと認識します。 bin/maple シェルスクリプトは bin/maple.system.type を呼び出します。 このスクリプトは、uname -a を実行し、 オペレーティングシステムの名前を入手します。 OS 名にから、どのバイナリを使用するかを判断します。 ライセンスサーバを起動してください。 - /usr/local/etc/rc.d/lmgrd.sh + /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=${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 に連絡してください! 落とし穴 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 は、ホスト名です。 ライセンスファイルを編集する際に、 (ライセンスキーで保護されている) FEATURE の行を書き換えてしまうと、動かなくなるでしょう。 &matlab; のインストール Dan Pelleg 寄稿: applications MATLAB この節では、&os; システムへ、Linux 版の &matlab; version 6.5 をインストールするプロセスについて説明します。 &java.virtual.machine; ( をご覧ください) を除けば、 極めてよく動作します。 Linux 版の &matlab; は、 MathWorks (http://www.mathworks.com) から直接注文することができます。 ライセンスファイルを入手するか、 ライセンスファイルを作成する手順を確認してください。 彼らに対して、ネイティブの &os; 版を必要としていることを伝えてください。 &matlab; のインストール &matlab; をインストールするには、以下のようにしてください。 インストール CD を挿入して、マウントしてください。 インストールスクリプトで推奨されているように、 root になってください。 以下のように入力して、インストールスクリプトを実行してください。 &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 と実行してください。 &matlab; ライセンスを入手時の手順に従い、 ライセンスファイルを編集してください。 あなたがいつも使っているエディタを使って、 このファイルを準備してください。 そして、インストーラが $MATLAB/license.dat を編集するように尋ねる前に、 $MATLAB/license.dat にコピーしてください。 インストールプロセスを完了してください。 この時点で、&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.sh + /usr/local/etc/rc.d/flexlm に作成してください。 以下の例は、配布されている $MATLAB/etc/rc.lm.glnx86 の改良版です。 変更点はファイルの位置、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.sh + &prompt.root; chmod +x /usr/local/etc/rc.d/flexlm ここで、上記のコマンドの中の、 username を (root ではなく) システムに存在するユーザの名前に置き換えてください。 以下のコマンドでライセンスマネージャを起動してください。 - &prompt.root; /usr/local/etc/rc.d/flexlm.sh start + &prompt.root; service flexlm start &java; Runtime Environment のリンク &java; Runtime 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 に置いてください。 #!/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 を実行できるようになったので、 起動して使用してください。 &oracle; のインストール MarcelMoolenaar寄贈: アプリケーション Oracle はじめに このドキュメントでは &oracle; 8.0.5&oracle; 8.0.5.1 Enterprise Edition の Linux 版を FreeBSD にインストールするための手順を解説します。 Linux 環境のインストール まずは Ports Collection から emulators/linux_basedevel/linux_devtools をインストールしてください。 もしこれらの ports がうまく動かなければ、package もしくは Ports Collection で利用可能な古いバージョンを試してみてください。 もし賢いエージェント (intelligent agent) を起動したいなら Red Hat Tcl パッケージ tcl-8.0.3-20.i386.rpm もインストールする必要があるでしょう。 公式の RPM port (archivers/rpm) をインストールするには一般的に次のようにします。 &prompt.root; rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package package のインストール時にエラーが出てはいけません。 &oracle; 環境の構築 &oracle; をインストールする前に、 適切な環境を設定する必要があります。 このドキュメントでは、&oracle; のインストールガイドに書いてあるようなことではなく FreeBSD で Linux 用 &oracle; を動かすために特別に必要なことのみを解説します。 カーネルのチューニング カーネルのチューニング &oracle; インストールガイドにあるように、 シェアードメモリーの最大サイズを設定しなければいけません。 FreeBSD では SHMMAX を使わないようにしてください。 SHMMAX は単に SHMMAXPGSPGSIZE から計算されるだけなのです。 従って、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 用のアカウントに特別なのは 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 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; がインストールできるでしょう。 もし問題が起こったら、まずは &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 と呼ばれるシェルスクリプトに記録されます。 このスクリプトは、orainst ディレクトリにあります。次のパッチを 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 &oracle; を 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 バイナリ互換機能がどのような仕組みなのか興味がある人はこのセクションを読んでください。 以下の文章で説明されていることのほとんどは &a.chat; に投稿された Terry Lambert (tlambert@primenet.com) 氏のメール (Message ID: <199906020108.SAA07001@usr09.primenet.com>) をもとにしています。 どのように動くのでしょう? execution class loader 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 がロードされます。 ELF 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 システムコールベクタは、 さまざまなデータに加えて sysent[] エントリーのリストを含んでおり、 それらのアドレスはカーネルモジュール内にあります。 Linux バイナリがシステムコールを発行する際、トラップコードは proc 構造体を用いてシステムコール関数ポインタを 解釈します。そして FreeBSD ではなく Linux 用のシステムコールエントリポイントを得るわけです。 さらに、Linux モードは状況に応じてファイルシステム本来のルートマウントポイントを置き換えてファイルの参照を行ないます。 これは、 オプションを指定してマウントされたファイルシステム (unionfs ファイルシステムではありません!) が行なっていることと同じです。 ファイルを検索する際にはまず /compat/linux/original-path ディレクトリを、それから見つけられなかったときにのみ、 /original-path を調べます。 こうすることで、他のバイナリを要求するバイナリの実行を可能にしています (したがって、Linux 用プログラムツールは Linux ABI サポート環境下で完全に動作するわけです)。 またこれは、もし対応する 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 (訳注: Applications Binary Interface; 同じ CPU を利用したコンピュータ間でバイナリを共有するための規約のこと) と呼ぶべきなのでしょうか? 実は、どちらが本来のものであるかということを論ずることに意味はありません。 基本的に、FreeBSD グルー関数群はカーネルの中に静的にリンクされていて、 Linux グルー関数群は静的にリンクすることも、 カーネルモジュールを介して利用することもできるようになっている、 という違いがあるだけ (ただしこれは現時点においての話であり、 将来のリリースで変更される可能性がありますし、 おそらく実際に変更されるでしょう) です。 あ、「でもこれは本当にエミュレーションと呼べるのか」って? 答えは「いいえ」です。これは ABI の実装であり、 エミュレーションとは異なります。 エミュレータが呼び出されているわけではありません (シミュレータでもないことをあらかじめ断っておきましょう)。 では、これがよく Linux エミュレーションと呼ばれるのは何故でしょうか? それはもちろん FreeBSD の売りにするためでもあるのですが、 実際には、次のような理由によります。 この機能が初めて実装された頃、 動作原理を説明する以外にこの機能を表現する言葉はありませんでした。 しかし、コードをコンパイルしたりモジュールをロードしない場合、 「FreeBSD 上で Linux バイナリを実行する」という表現は、 厳密に考えると適切ではありません。 そこで、その際にロードされているもの自身を表現する言葉 — すなわち Linux エミュレータが必要だったのです。