From owner-svn-doc-all@freebsd.org Mon Mar 21 11:22:07 2016 Return-Path: Delivered-To: svn-doc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id E02CDAD86C1; Mon, 21 Mar 2016 11:22:06 +0000 (UTC) (envelope-from ryusuke@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 931BBBAA; Mon, 21 Mar 2016 11:22:06 +0000 (UTC) (envelope-from ryusuke@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u2LBM5JJ040995; Mon, 21 Mar 2016 11:22:05 GMT (envelope-from ryusuke@FreeBSD.org) Received: (from ryusuke@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u2LBM5L0040994; Mon, 21 Mar 2016 11:22:05 GMT (envelope-from ryusuke@FreeBSD.org) Message-Id: <201603211122.u2LBM5L0040994@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: ryusuke set sender to ryusuke@FreeBSD.org using -f From: Ryusuke SUZUKI Date: Mon, 21 Mar 2016 11:22:05 +0000 (UTC) To: doc-committers@freebsd.org, svn-doc-all@freebsd.org, svn-doc-head@freebsd.org Subject: svn commit: r48449 - head/ja_JP.eucJP/books/handbook/linuxemu X-SVN-Group: doc-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-doc-all@freebsd.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "SVN commit messages for the entire doc trees \(except for " user" , " projects" , and " translations" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Mar 2016 11:22:07 -0000 Author: ryusuke Date: Mon Mar 21 11:22:05 2016 New Revision: 48449 URL: https://svnweb.freebsd.org/changeset/doc/48449 Log: - Merge the following from the English version: r38506 -> r40735 head/ja_JP.eucJP/books/handbook/linuxemu/chapter.xml Modified: head/ja_JP.eucJP/books/handbook/linuxemu/chapter.xml Modified: head/ja_JP.eucJP/books/handbook/linuxemu/chapter.xml ============================================================================== --- head/ja_JP.eucJP/books/handbook/linuxemu/chapter.xml Mon Mar 21 09:02:14 2016 (r48448) +++ head/ja_JP.eucJP/books/handbook/linuxemu/chapter.xml Mon Mar 21 11:22:05 2016 (r48449) @@ -3,7 +3,7 @@ The FreeBSD Documentation Project The FreeBSD Japanese Documentation Project - Original revision: r38506 + Original revision: r40735 $FreeBSD$ --> @@ -24,7 +24,11 @@ この章では - Linux バイナリ互換機能 + + Linux + バイナリ互換機能 + + バイナリ互換機能 Linux @@ -34,11 +38,13 @@ なオペレーティングシステムとのバイナリ互換機能を提供しています。 現時点では、一体なぜ FreeBSD が Linux バイナリを実行できるようにならなければならないのか自問しているのではないでしょうか? - 答えはきわめて簡単です。 - Linux は現在コンピュータの世界では最もホットなモノなのでたくさんの会社や開発者たちが + 答えはきわめて簡単です。Linux + は現在コンピュータの世界では最もホットなモノなのでたくさんの会社や開発者たちが Linux のためだけに開発を行なっています。そのため、残された私たち - FreeBSD ユーザは彼らに対して FreeBSD ネイティブなアプリケーションも出すように言うしかないのです。 - 問題は、FreeBSD バージョンも出した場合にどれくらいの数のユーザーが使うのかわからない、 + FreeBSD ユーザは彼らに対して FreeBSD + ネイティブなアプリケーションも出すように言うしかないのです。 + 問題は、FreeBSD + バージョンも出した場合にどれくらいの数のユーザーが使うのかわからない、 ということであり、そのため Linux 版のみを開発しているということなのです。 そこで FreeBSD では Linux バイナリ互換機能が役に立つのです。 @@ -49,12 +55,14 @@ &adobe; &acrobat;, &realplayer;, &oracle;, - &wordperfect;, Doom, + &wordperfect;, + Doom, Quake などがあります。 また、ある状況においては Linux バイナリを Linux で動かすよりも FreeBSD で動かすほうが良いパフォーマンスが出るという報告もあります。 - しかしながら、いくつかの Linux に特有な OS の機能は FreeBSD ではサポートされていません。 + しかしながら、いくつかの Linux に特有な OS の機能は + FreeBSD ではサポートされていません。 仮想 8086 モードを有効にするような i386 特有の呼び出しを過度に使うような Linux バイナリは FreeBSD では動きません。 @@ -91,7 +99,8 @@ インストール - KLD (kernel loadable object) + KLD (kernel loadable + object) Linux バイナリ互換機能は、デフォルトでは有効ではありません。 この機能を有効にする最も簡単な方法は、 @@ -114,13 +123,13 @@ Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko + カーネルオプション COMPAT_LINUX - - 何らかの理由で Linux KLD をロードしたくない、 + 何らかの理由で Linux KLD をロードしたくない、 あるいはロードできないような場合には、 options COMPAT_LINUX をカーネルの設定ファイルに指定して、 @@ -130,6 +139,7 @@ Id Refs Address Size Name Linux ランタイムライブラリのインストール + Linux Linux ライブラリのインストール @@ -140,23 +150,23 @@ Id Refs Address Size Name 手動で インストールします。 - - linux_base の port を用いたインストール - Ports Collection - - ランタイムライブラリをインストールするには最も簡単な方法です。 - から他の port - をインストールするのと全く同じようにできます。 + + linux_base の port を用いたインストール + + Ports Collection + + ランタイムライブラリをインストールするには最も簡単な方法です。 + から他の port + をインストールするのと全く同じようにできます。 - &prompt.root; cd /usr/ports/emulators/linux_base-f10 + &prompt.root; cd /usr/ports/emulators/linux_base-f10 &prompt.root; make install distclean - &os; 8.0 よりも前の &os; システムでは、 - emulators/linux_base-f10 + &os; 8.0 よりも前の &os; システムでは、emulators/linux_base-f10 ではなく、emulators/linux_base-fc4 port + role="package">emulators/linux_base-fc4 port を使う必要があります。 @@ -165,7 +175,7 @@ Id Refs Address Size Name Linux ディストリビューションおよびバージョンに対応して、 複数のバージョンの emulators/linux_base port が用意されています。 + role="package">emulators/linux_base port が用意されています。 インストールを考えている Linux アプリケーションが必要とする条件に近い port をインストールする必要があります。 @@ -176,7 +186,8 @@ Id Refs Address Size Name ports コレクションをインストールしていない場合、 代わりに手動でライブラリをインストールすることができます。 - プログラムが必要とする Linux のシェアードライブラリとランタイムリンカが必要です。 + プログラムが必要とする Linux + のシェアードライブラリとランタイムリンカが必要です。 また Linux ライブラリ用の shadow root ディレクトリ、 /compat/linux を作成する必要があります。 FreeBSD で動作する Linux プログラムが使用するシェアードライブラリは、 @@ -195,12 +206,15 @@ Id Refs Address Size Name シェアードライブラリを探す必要があるのは、FreeBSD のシステムに Linux のプログラムをインストールする最初の数回だけでしょう。 - それが過ぎれば、十分な Linux のシェアードライブラリがシステムにインストールされ、 - 新しくインストールした Linux のバイナリも余計な作業をせずに動作させることができるようになります。 + それが過ぎれば、十分な Linux + のシェアードライブラリがシステムにインストールされ、 + 新しくインストールした Linux + のバイナリも余計な作業をせずに動作させることができるようになります。 シェアードライブラリの追加 + 共有ライブラリ linux_base port をインストールした後に、 @@ -221,7 +235,8 @@ Id Refs Address Size Name FTP を使って Doom の Linux バイナリを取ってきて、 アクセスできる Linux システムに置いたとしましょう。 - 次のように ldd linuxdoom とするだけでどのシェアードライブラリが必要かチェックできます。 + 次のように ldd linuxdoom + とするだけでどのシェアードライブラリが必要かチェックできます。 &prompt.user; ldd linuxxdoom libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0 @@ -229,10 +244,10 @@ libX11.so.3 (DLL Jump 3.1) => /usr/X1 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 -> libXt.so.3.1.0 @@ -262,7 +277,8 @@ libc.so.4 (DLL Jump 4.5pl26) => /lib/ このように最後の番号が 1 つか 2 つ古いだけならば、普通は /lib/libc.so.4.6.29 - をコピーする必要はありません。わずかに古いライブラリでもプログラムは動作するはずだからです。 + をコピーする必要はありません。 + わずかに古いライブラリでもプログラムは動作するはずだからです。 もちろん、以下のように新しいライブラリと置き換えても構いません。 /compat/linux/lib/libc.so.4.6.29 @@ -274,7 +290,8 @@ libc.so.4 (DLL Jump 4.5pl26) => /lib/ シンボリックリンクのメカニズムは Linux バイナリにのみ必要なことに注意してください。 - FreeBSD のランタイムリンカはメジャーリビジョン番号の一致したライブラリを検索するので、 + FreeBSD + のランタイムリンカはメジャーリビジョン番号の一致したライブラリを検索するので、 ユーザが気にする必要はありません。 @@ -284,6 +301,7 @@ libc.so.4 (DLL Jump 4.5pl26) => /lib/ Linux の ELF バイナリのインストール + Linux ELF バイナリ @@ -291,7 +309,8 @@ libc.so.4 (DLL Jump 4.5pl26) => /lib/ ELF のバイナリを使うためには、 マークをつける (branding) 作業が必要になります。 - マークのない ELF バイナリを実行しようとすると以下のようなエラーメッセージを受けとってしまうことでしょう。 + マークのない ELF + バイナリを実行しようとすると以下のようなエラーメッセージを受けとってしまうことでしょう。 &prompt.user; ./my-linux-elf-binary ELF binary type not known @@ -351,7 +370,8 @@ multi on Linux アプリケーションは FreeBSD の /etc/host.conf を使用しようとして、 文法の違いによる警告を出力します。 - /etc/resolv.conf を利用してネームサーバの設定をしていない場合には、 + /etc/resolv.conf + を利用してネームサーバの設定をしていない場合には、 bind を削除してください。 @@ -477,7 +497,8 @@ done がインストールされているホストマシンから) そのフォントをコピーしなければならないということです。 これらのフォントは通常、CD-ROM の - /cdrom/Unix/Files/SystemFiles/Fonts か、もしくはハードディスクの + /cdrom/Unix/Files/SystemFiles/Fonts + か、もしくはハードディスクの /usr/local/mathematica/SystemFiles/Fonts に置かれており、実際に使用されるフォントは Type1X のサブディレクトリに格納されています。 @@ -557,39 +578,40 @@ done は &mathematica; に似た商用の数式処理プログラムです。 ソフトウェアを http://www.maplesoft.com/ + xlink:href="http://www.maplesoft.com/">http://www.maplesoft.com/ で購入し、 ライセンスファイルの登録手続きを行ってください。 このソフトウェアを FreeBSD にインストールするには、 以下のステップに従ってください。 - - 製品の配布物から INSTALL - シェルスクリプトを実行してください。 - インストールプログラムからの質問には、 - RedHat オプションを選択してください。 - 一般的なインストールのディレクトリは、 + 製品の配布物から 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; + のライセンスがなければ、 + 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 *************** @@ -652,30 +674,30 @@ exit 0 &maple; を試験的に起動してください。 - &prompt.user; cd /usr/local/maple/bin + &prompt.user; cd /usr/local/maple/bin &prompt.user; ./xmaple - maple を使う用意はできました。 - ネイティブ FreeBSD 版を希望していることを - Maplesoft に連絡してください! + maple を使う用意はできました。 + ネイティブ FreeBSD 版を希望していることを + Maplesoft に連絡してください! - - 落とし穴 + + 落とし穴 - - FLEXlm - ライセンスマネージャは、動かすことが難しいツールでもあります。 - http://www.globetrotter.com/ - にも文書が用意されています。 - - lmgrd は、 - ライセンスファイルに依存し、問題があると - core dump してしまいます。 - 正しいライセンスファイルは以下のようなものです。 + + FLEXlm + ライセンスマネージャは、動かすことが難しいツールでもあります。 + http://www.globetrotter.com/ + にも文書が用意されています。 + + lmgrd は、 + ライセンスファイルに依存し、問題があると + core dump してしまいます。 + 正しいライセンスファイルは以下のようなものです。 -# ======================================================= + # ======================================================= # License File for UNIX Installations ("Pointer File") # ======================================================= SERVER chillig ANY @@ -687,30 +709,30 @@ FEATURE Maple maplelmg 2000.0831 permane ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \ SN=XXXXXXXXX - シリアル番号およびキーは 'X' に置き換えています。 - chillig は、ホスト名です。 - - ライセンスファイルを編集する際に、 - (ライセンスキーで保護されている) FEATURE - の行を書き換えてしまうと、動かなくなるでしょう。 - - - + シリアル番号およびキーは 'X' に置き換えています。 + chillig は、ホスト名です。 - - - &matlab; のインストール - - - - Dan - Pelleg - - 寄稿: - - - - + ライセンスファイルを編集する際に、 + (ライセンスキーで保護されている) FEATURE + の行を書き換えてしまうと、動かなくなるでしょう。 + + + + + + + &matlab; のインストール + + + + Dan + Pelleg + + 寄稿: + + + + applications @@ -725,7 +747,8 @@ FEATURE Maple maplelmg 2000.0831 permane 極めてよく動作します。 Linux 版の &matlab; は、 - MathWorks (http://www.mathworks.com) + MathWorks (http://www.mathworks.com) から直接注文することができます。 ライセンスファイルを入手するか、 ライセンスファイルを作成する手順を確認してください。 @@ -749,9 +772,11 @@ FEATURE Maple maplelmg 2000.0831 permane インストーラはグラフィカルです。 ディスプレイを表示できないエラーが起きるようでしたら、 - setenv HOME ~USER + setenv HOME + ~USER と実行してください。ここで、 - USER は、&man.su.1; を実行したユーザ名です。 + USER は、 + &man.su.1; を実行したユーザ名です。 @@ -765,17 +790,20 @@ FEATURE Maple maplelmg 2000.0831 permane 残りのインストールプロセスでの入力を簡単にするために、 シェルプロンプトで、 - set MATLAB=/compat/linux/usr/local/matlab + set + MATLAB=/compat/linux/usr/local/matlab と実行してください。 &matlab; - ライセンスを入手時の手順に従い、ライセンスファイルを編集してください。 + ライセンスを入手時の手順に従い、 + ライセンスファイルを編集してください。 - あなたがいつも使っているエディタを使って、このファイルを準備してください。 + あなたがいつも使っているエディタを使って、 + このファイルを準備してください。 そして、インストーラが $MATLAB/license.dat を編集するように尋ねる前に、 $MATLAB/license.dat @@ -796,6 +824,7 @@ FEATURE Maple maplelmg 2000.0831 permane ライセンスマネージャの起動 + ライセンスマネージャのスクリプトへのシンボリックリンクを作成してください。 @@ -811,7 +840,8 @@ FEATURE Maple maplelmg 2000.0831 permane 以下の例は、配布されている $MATLAB/etc/rc.lm.glnx86 の改良版です。 - 変更点はファイルの位置、Linux エミュレーションでライセンスマネージャを起動する点です。 + 変更点はファイルの位置、Linux + エミュレーションでライセンスマネージャを起動する点です。 #!/bin/sh case "$1" in @@ -924,14 +954,14 @@ exit 0 これらのうちどちらかを使うには、 save コマンドのすぐ後に、 上記の行を挿入してください。 - + - - 以下の行を含む、 - $MATLAB/bin/finish.sh - ファイルを作成してください。 + + 以下の行を含む、 + $MATLAB/bin/finish.sh + ファイルを作成してください。 - #!/compat/linux/bin/sh + #!/compat/linux/bin/sh (sleep 5; killall -1 matlab_helper) & exit 0 @@ -969,6 +999,7 @@ exit 0 はじめに + このドキュメントでは &oracle; 8.0.5&oracle; 8.0.5.1 Enterprise Edition の Linux 版を FreeBSD にインストールするための手順を解説します。 @@ -977,20 +1008,25 @@ exit 0 Linux 環境のインストール - まずは Ports Collection から emulators/linux_base と - devel/linux_devtools をインストールしてください。 - もしこれらの ports がうまく動かなければ、package もしくは Ports Collection + まずは Ports Collection から emulators/linux_base と + devel/linux_devtools + をインストールしてください。 + もしこれらの ports がうまく動かなければ、package + もしくは Ports Collection で利用可能な古いバージョンを試してみてください。 もし賢いエージェント (intelligent agent) を起動したいなら Red Hat Tcl パッケージ tcl-8.0.3-20.i386.rpm もインストールする必要があるでしょう。 - 公式の RPM port (archivers/rpm) + 公式の RPM port (archivers/rpm) をインストールするには一般的に次のようにします。 &prompt.root; rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package - package のインストール時にエラーが出てはいけません。 + package + のインストール時にエラーが出てはいけません。 @@ -998,13 +1034,14 @@ exit 0 &oracle; をインストールする前に、 適切な環境を設定する必要があります。 - このドキュメントでは、 - &oracle; のインストールガイドに書いてあるようなことではなく + このドキュメントでは、&oracle; + のインストールガイドに書いてあるようなことではなく FreeBSD で Linux 用 &oracle; を動かすために特別に必要なことのみを解説します。 カーネルのチューニング + カーネルのチューニング &oracle; インストールガイドにあるように、 @@ -1029,7 +1066,7 @@ options SEMMSL=61 また、 次のオプションがカーネルのコンフィギュレーションファイルにあることも確認します。 -options SYSVSHM #SysV shared memory + options SYSVSHM #SysV shared memory options SYSVSEM #SysV semaphores options SYSVMSG #SysV interprocess communication @@ -1038,12 +1075,15 @@ options SYSVMSG #SysV interprocess commu &oracle; 用アカウント - 他のアカウントを作るのと同じように oracle + 他のアカウントを作るのと同じように + oracle 用のアカウントを作ります。 - oracle 用のアカウントに特別なのは + oracle + 用のアカウントに特別なのは Linux のシェルを割り当てるところだけです。 - /etc/shells/compat/linux/bin/bash - を加え、oracle 用のアカウントに設定します。 + /etc/shells に + /compat/linux/bin/bash を加え、oracle 用のアカウントに設定します。 @@ -1055,8 +1095,8 @@ options SYSVMSG #SysV interprocess commu - - + + 変数 @@ -1081,15 +1121,15 @@ options SYSVMSG #SysV interprocess commu 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 + /compat/linux/sbin + /compat/linux/usr/bin + /compat/linux/usr/sbin + /bin + /sbin + /usr/bin + /usr/sbin + /usr/local/bin + $ORACLE_HOME/bin @@ -1099,7 +1139,7 @@ $ORACLE_HOME/bin で設定することをお勧めします。 完璧なサンプルは以下の通りです。 -ORACLE_BASE=/oracle; export ORACLE_BASE + ORACLE_BASE=/oracle; export ORACLE_BASE ORACLE_HOME=/oracle; export ORACLE_HOME LD_LIBRARY_PATH=$ORACLE_HOME/lib export LD_LIBRARY_PATH @@ -1123,13 +1163,15 @@ export PATH これは Linux エミュレーターにおけるちょっとした不整合のためです。 このディレクトリは oracle ユーザーのものにしておきます。 - これで特に問題なく &oracle; がインストールできるでしょう。 + これで特に問題なく &oracle; + がインストールできるでしょう。 もし問題が起こったら、まずは &oracle; の配布物や設定をチェックしてください。 &oracle; のインストールが終わったら次の二つのサブセクションで解説するパッチを当てます。 - よくあるトラブルは、TCP プロトコルアダプターが正しくインストールされていないことです。 + よくあるトラブルは、TCP + プロトコルアダプターが正しくインストールされていないことです。 そのため、一切 TCP リスナーを起動することができないのです。 次の操作はこの問題を解決するのに役立ちます。 @@ -1145,16 +1187,16 @@ export PATH root.sh へのパッチ - &oracle; をインストールする時、 - root - で行なう必要のあるいくつかの操作は root.sh - と呼ばれるシェルスクリプトに記録されます。 - このスクリプトは、orainst - ディレクトリにあります。次のパッチを root.sh に当てて - 正しい場所にある chown コマンドを使うようにするか、 - 代わりに Linux ネイティブなシェルのもとでスクリプトを走らせましょう。 + &oracle; をインストールする時、 + root + で行なう必要のあるいくつかの操作は root.sh + と呼ばれるシェルスクリプトに記録されます。 + このスクリプトは、orainst + ディレクトリにあります。次のパッチを root.sh に当てて + 正しい場所にある chown コマンドを使うようにするか、 + 代わりに Linux ネイティブなシェルのもとでスクリプトを走らせましょう。 - *** orainst/root.sh.orig Tue Oct 6 21:57:33 1998 + *** orainst/root.sh.orig Tue Oct 6 21:57:33 1998 --- orainst/root.sh Mon Dec 28 15:58:53 1998 *************** *** 31,37 **** @@ -1218,7 +1260,8 @@ export PATH 高度なトピックス - Linux バイナリ互換機能がどのような仕組みなのか興味がある人はこのセクションを読んでください。 + Linux + バイナリ互換機能がどのような仕組みなのか興味がある人はこのセクションを読んでください。 以下の文章で説明されていることのほとんどは &a.chat; に投稿された Terry Lambert (tlambert@primenet.com) 氏のメール (Message ID: <199906020108.SAA07001@usr09.primenet.com>) @@ -1226,49 +1269,48 @@ export PATH どのように動くのでしょう? + 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 がロードされます。 + 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 を区別することはできません)。 + Linux ABI をサポートするため、FreeBSD は + ELF バイナリを示すマジックナンバを確認します。 + (ただし、この段階では FreeBSD、&solaris;, Linux、そしてその他の + ELF イメージ形式を使っている OS を区別することはできません)。 Solaris - ELF ローダは、特殊なマーク (brand) があるかどうか探します。 - このマークとは、ELF イメージのコメントセクションのことです。 - SVR4/&solaris; の ELF バイナリには、このセクションは存在しません。 + ELF ローダは、特殊なマーク (brand) + があるかどうか探します。 + このマークとは、ELF イメージのコメントセクションのことです。 + SVR4/&solaris; の ELF バイナリには、このセクションは存在しません。 Linux バイナリを実行するためには、 ELF バイナリに &man.brandelf.1; で説明されている @@ -1280,91 +1322,100 @@ export PATH Linux のマークが付けられ、 ELF ローダが認識できるようになります。 - 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 エミュレータが必要だったのです。 + 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 エミュレータが必要だったのです。