- Merge the following from the English version:

r38506 -> r40735	head/ja_JP.eucJP/books/handbook/linuxemu/chapter.xml
This commit is contained in:
Ryusuke SUZUKI 2016-03-21 11:22:05 +00:00
parent b00e24a84d
commit cb9e811ee4
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=48449

View file

@ -3,7 +3,7 @@
The FreeBSD Documentation Project
The FreeBSD Japanese Documentation Project
Original revision: r38506
Original revision: r40735
$FreeBSD$
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="linuxemu">
@ -24,7 +24,11 @@
<sect1 xml:id="linuxemu-synopsis">
<title>この章では</title>
<indexterm><primary>Linux バイナリ互換機能</primary></indexterm>
<indexterm><primary>Linux
バイナリ互換機能</primary>
</indexterm>
<indexterm>
<primary>バイナリ互換機能</primary>
<secondary>Linux</secondary>
@ -34,11 +38,13 @@
なオペレーティングシステムとのバイナリ互換機能を提供しています。
現時点では、一体なぜ FreeBSD が Linux
バイナリを実行できるようにならなければならないのか自問しているのではないでしょうか?
答えはきわめて簡単です。
Linux は現在コンピュータの世界では最も<quote>ホットなモノ</quote>なのでたくさんの会社や開発者たちが
答えはきわめて簡単です。Linux
は現在コンピュータの世界では最も<quote>ホットなモノ</quote>なのでたくさんの会社や開発者たちが
Linux のためだけに開発を行なっています。そのため、残された私たち
FreeBSD ユーザは彼らに対して FreeBSD ネイティブなアプリケーションも出すように言うしかないのです。
問題は、FreeBSD バージョンも出した場合にどれくらいの数のユーザーが使うのかわからない、
FreeBSD ユーザは彼らに対して FreeBSD
ネイティブなアプリケーションも出すように言うしかないのです。
問題は、FreeBSD
バージョンも出した場合にどれくらいの数のユーザーが使うのかわからない、
ということであり、そのため Linux 版のみを開発しているということなのです。
そこで FreeBSD では Linux バイナリ互換機能が役に立つのです。</para>
@ -49,12 +55,14 @@
<application>&adobe;&nbsp;&acrobat;</application>,
<application>&realplayer;</application>,
<application>&oracle;</application>,
<application>&wordperfect;</application>, <application>Doom</application>,
<application>&wordperfect;</application>,
<application>Doom</application>,
<application>Quake</application> などがあります。
また、ある状況においては Linux バイナリを Linux で動かすよりも
FreeBSD で動かすほうが良いパフォーマンスが出るという報告もあります。</para>
<para>しかしながら、いくつかの Linux に特有な OS の機能は FreeBSD ではサポートされていません。
<para>しかしながら、いくつかの Linux に特有な OS の機能は
FreeBSD ではサポートされていません。
仮想 8086 モードを有効にするような i386 特有の呼び出しを過度に使うような
Linux バイナリは FreeBSD では動きません。</para>
@ -91,7 +99,8 @@
<sect1 xml:id="linuxemu-lbc-install">
<title>インストール</title>
<indexterm><primary>KLD (kernel loadable object)</primary></indexterm>
<indexterm><primary>KLD (kernel loadable
object)</primary></indexterm>
<para>Linux バイナリ互換機能は、デフォルトでは有効ではありません。
この機能を有効にする最も簡単な方法は、
@ -114,13 +123,13 @@
Id Refs Address Size Name
1 2 0xc0100000 16bdb8 kernel
7 1 0xc24db000 d000 linux.ko</screen>
<indexterm>
<primary>カーネルオプション</primary>
<secondary>COMPAT_LINUX</secondary>
</indexterm>
<para>
何らかの理由で Linux KLD をロードしたくない、
<para>何らかの理由で Linux KLD をロードしたくない、
あるいはロードできないような場合には、
<literal>options COMPAT_LINUX</literal>
をカーネルの設定ファイルに指定して、
@ -130,6 +139,7 @@ Id Refs Address Size Name
<sect2>
<title>Linux ランタイムライブラリのインストール</title>
<indexterm>
<primary>Linux</primary>
<secondary>Linux ライブラリのインストール</secondary>
@ -140,23 +150,23 @@ Id Refs Address Size Name
<link linkend="linuxemu-libs-manually">手動で</link>
インストールします。</para>
<sect3 xml:id="linuxemu-libs-port">
<title>linux_base の port を用いたインストール</title>
<indexterm><primary>Ports Collection</primary></indexterm>
<sect3 xml:id="linuxemu-libs-port">
<title>linux_base の port を用いたインストール</title>
<para>ランタイムライブラリをインストールするには最も簡単な方法です。
<xref linkend="ports"/> から他の port
をインストールするのと全く同じようにできます。</para>
<indexterm><primary>Ports Collection</primary></indexterm>
<screen>&prompt.root; <userinput>cd /usr/ports/emulators/linux_base-f10</userinput>
<para>ランタイムライブラリをインストールするには最も簡単な方法です。
<xref linkend="ports"/> から他の port
をインストールするのと全く同じようにできます。</para>
<screen>&prompt.root; <userinput>cd /usr/ports/emulators/linux_base-f10</userinput>
&prompt.root; <userinput>make install distclean</userinput></screen>
<note>
<para>&os;&nbsp;8.0 よりも前の &os; システムでは、
<filename
role="package">emulators/linux_base-f10</filename>
<para>&os;&nbsp;8.0 よりも前の &os; システムでは、<filename
role="package">emulators/linux_base-f10</filename>
ではなく、<filename
role="package">emulators/linux_base-fc4</filename> port
role="package">emulators/linux_base-fc4</filename> port
を使う必要があります。</para>
</note>
@ -165,7 +175,7 @@ Id Refs Address Size Name
<note><para>Linux ディストリビューションおよびバージョンに対応して、
複数のバージョンの <filename
role="package">emulators/linux_base</filename> port が用意されています。
role="package">emulators/linux_base</filename> port が用意されています。
インストールを考えている Linux アプリケーションが必要とする条件に近い
port をインストールする必要があります。</para></note>
@ -176,7 +186,8 @@ Id Refs Address Size Name
<para><quote>ports</quote> コレクションをインストールしていない場合、
代わりに手動でライブラリをインストールすることができます。
プログラムが必要とする Linux のシェアードライブラリとランタイムリンカが必要です。
プログラムが必要とする Linux
のシェアードライブラリとランタイムリンカが必要です。
また Linux ライブラリ用の <quote>shadow root</quote> ディレクトリ、
<filename>/compat/linux</filename> を作成する必要があります。
FreeBSD で動作する Linux プログラムが使用するシェアードライブラリは、
@ -195,12 +206,15 @@ Id Refs Address Size Name
シェアードライブラリを探す必要があるのは、FreeBSD
のシステムに Linux
のプログラムをインストールする最初の数回だけでしょう。
それが過ぎれば、十分な Linux のシェアードライブラリがシステムにインストールされ、
新しくインストールした Linux のバイナリも余計な作業をせずに動作させることができるようになります。</para>
それが過ぎれば、十分な Linux
のシェアードライブラリがシステムにインストールされ、
新しくインストールした Linux
のバイナリも余計な作業をせずに動作させることができるようになります。</para>
</sect3>
<sect3>
<title>シェアードライブラリの追加</title>
<indexterm><primary>共有ライブラリ</primary></indexterm>
<para><filename>linux_base</filename> port をインストールした後に、
@ -221,7 +235,8 @@ Id Refs Address Size Name
<para>FTP を使って <application>Doom</application>
の Linux バイナリを取ってきて、
アクセスできる Linux システムに置いたとしましょう。
次のように <command>ldd linuxdoom</command> とするだけでどのシェアードライブラリが必要かチェックできます。</para>
次のように <command>ldd linuxdoom</command>
とするだけでどのシェアードライブラリが必要かチェックできます。</para>
<screen>&prompt.user; <userinput>ldd linuxxdoom</userinput>
libXt.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libXt.so.3.1.0
@ -229,10 +244,10 @@ libX11.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>
<indexterm><primary>シンボリックリンク</primary></indexterm>
<para>最後のカラムに表示されているすべてのファイルを持って来て、
<filename>/compat/linux</filename> の下に置き、
最初のカラムに示されるファイル名にシンボリックリンクを張ります。
すなわち、FreeBSD システムでは以下のようなファイルが必要となります。</para>
<para>最後のカラムに表示されているすべてのファイルを持って来て、
<filename>/compat/linux</filename> の下に置き、
最初のカラムに示されるファイル名にシンボリックリンクを張ります。
すなわち、FreeBSD システムでは以下のようなファイルが必要となります。</para>
<screen>/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -&gt; libXt.so.3.1.0
@ -262,7 +277,8 @@ libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>
<para>このように最後の番号が 1 つか 2 つ古いだけならば、普通は
<filename>/lib/libc.so.4.6.29</filename>
をコピーする必要はありません。わずかに古いライブラリでもプログラムは動作するはずだからです。
をコピーする必要はありません。
わずかに古いライブラリでもプログラムは動作するはずだからです。
もちろん、以下のように新しいライブラリと置き換えても構いません。</para>
<screen>/compat/linux/lib/libc.so.4.6.29
@ -274,7 +290,8 @@ libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>
<note>
<para>シンボリックリンクのメカニズムは Linux
バイナリに<emphasis>のみ</emphasis>必要なことに注意してください。
FreeBSD のランタイムリンカはメジャーリビジョン番号の一致したライブラリを検索するので、
FreeBSD
のランタイムリンカはメジャーリビジョン番号の一致したライブラリを検索するので、
ユーザが気にする必要はありません。</para>
</note>
</blockquote>
@ -284,6 +301,7 @@ libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>
<sect2>
<title>Linux の ELF バイナリのインストール</title>
<indexterm>
<primary>Linux</primary>
<secondary>ELF バイナリ</secondary>
@ -291,7 +309,8 @@ libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>
<para>ELF のバイナリを使うためには、
<quote>マークをつける (branding)</quote> 作業が必要になります。
マークのない ELF バイナリを実行しようとすると以下のようなエラーメッセージを受けとってしまうことでしょう。</para>
マークのない ELF
バイナリを実行しようとすると以下のようなエラーメッセージを受けとってしまうことでしょう。</para>
<screen>&prompt.user; <userinput>./my-linux-elf-binary</userinput>
ELF binary type not known
@ -351,7 +370,8 @@ multi on</programlisting>
Linux アプリケーションは FreeBSD の
<filename>/etc/host.conf</filename> を使用しようとして、
文法の違いによる警告を出力します。
<filename>/etc/resolv.conf</filename> を利用してネームサーバの設定をしていない場合には、
<filename>/etc/resolv.conf</filename>
を利用してネームサーバの設定をしていない場合には、
<literal>bind</literal> を削除してください。</para>
</sect2>
</sect1>
@ -477,7 +497,8 @@ done</programlisting>
がインストールされているホストマシンから)
そのフォントをコピーしなければならないということです。
これらのフォントは通常、CD-ROM の
<filename>/cdrom/Unix/Files/SystemFiles/Fonts</filename> か、もしくはハードディスクの
<filename>/cdrom/Unix/Files/SystemFiles/Fonts</filename>
か、もしくはハードディスクの
<filename>/usr/local/mathematica/SystemFiles/Fonts</filename>
に置かれており、実際に使用されるフォントは <filename>Type1</filename>
<filename>X</filename> のサブディレクトリに格納されています。
@ -557,39 +578,40 @@ done</programlisting>
<application>&mathematica;</application>
に似た商用の数式処理プログラムです。
ソフトウェアを <link
xlink:href="http://www.maplesoft.com/">http://www.maplesoft.com/</link>
xlink:href="http://www.maplesoft.com/">http://www.maplesoft.com/</link>
で購入し、
ライセンスファイルの登録手続きを行ってください。
このソフトウェアを FreeBSD にインストールするには、
以下のステップに従ってください。</para>
<procedure>
<step><para>製品の配布物から <filename>INSTALL</filename>
シェルスクリプトを実行してください。
インストールプログラムからの質問には、
<quote>RedHat</quote> オプションを選択してください。
一般的なインストールのディレクトリは、<filename
<procedure>
<step><para>製品の配布物から <filename>INSTALL</filename>
シェルスクリプトを実行してください。
インストールプログラムからの質問には、
<quote>RedHat</quote> オプションを選択してください。
一般的なインストールのディレクトリは、<filename
class="directory">/usr/local/maple</filename> です。</para></step>
<step><para><application>&maple;</application>
のライセンスがなければ、
Maple Waterloo Software (<link
xlink:href="http://register.maplesoft.com">http://register.maplesoft.com"</link>) で登録し、
<filename>/usr/local/maple/license/license.dat</filename>
にコピーしてください。</para></step>
<step><para><application>&maple;</application>
のライセンスがなければ、
Maple Waterloo Software (<link
xlink:href="http://register.maplesoft.com">http://register.maplesoft.com"</link>)
で登録し、
<filename>/usr/local/maple/license/license.dat</filename>
にコピーしてください。</para></step>
<step><para><application>&maple;</application> についてくる
<filename>INSTALL_LIC</filename>
というインストールシェルスクリプトを実行し、
<application>FLEXlm</application>
ラインセンスマネージャをインストールしてください。
ライセンスサーバに対して、
コンピュータのホスト名を設定してください。</para></step>
<step><para><application>&maple;</application> についてくる
<filename>INSTALL_LIC</filename>
というインストールシェルスクリプトを実行し、
<application>FLEXlm</application>
ラインセンスマネージャをインストールしてください。
ライセンスサーバに対して、
コンピュータのホスト名を設定してください。</para></step>
<step><para>以下のパッチを
<filename>/usr/local/maple/bin/maple.system.type</filename>
ファイルにあててください。</para>
<programlisting> ----- snip ------------------
<step><para>以下のパッチを
<filename>/usr/local/maple/bin/maple.system.type</filename>
ファイルにあててください。</para>
<programlisting> ----- 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
<step><para><application>&maple;</application>
を試験的に起動してください。</para>
<screen>&prompt.user; <userinput>cd /usr/local/maple/bin</userinput>
<screen>&prompt.user; <userinput>cd /usr/local/maple/bin</userinput>
&prompt.user; <userinput>./xmaple</userinput></screen>
<para>maple を使う用意はできました。
ネイティブ FreeBSD 版を希望していることを
Maplesoft に連絡してください!</para></step>
<para>maple を使う用意はできました。
ネイティブ FreeBSD 版を希望していることを
Maplesoft に連絡してください!</para></step>
</procedure>
<sect2>
<title>落とし穴</title>
<sect2>
<title>落とし穴</title>
<itemizedlist>
<listitem><para><application>FLEXlm</application>
ライセンスマネージャは、動かすことが難しいツールでもあります。
<link
xlink:href="http://www.globetrotter.com/">http://www.globetrotter.com/</link>
にも文書が用意されています。</para></listitem>
<itemizedlist>
<listitem><para><application>FLEXlm</application>
ライセンスマネージャは、動かすことが難しいツールでもあります。
<link
xlink:href="http://www.globetrotter.com/">http://www.globetrotter.com/</link>
にも文書が用意されています。</para></listitem>
<listitem><para><command>lmgrd</command> は、
ライセンスファイルに依存し、問題があると
core dump してしまいます。
正しいライセンスファイルは以下のようなものです。</para>
<listitem><para><command>lmgrd</command> は、
ライセンスファイルに依存し、問題があると
core dump してしまいます。
正しいライセンスファイルは以下のようなものです。</para>
<programlisting># =======================================================
<programlisting># =======================================================
# License File for UNIX Installations ("Pointer File")
# =======================================================
SERVER chillig ANY
@ -687,30 +709,30 @@ FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \
SN=XXXXXXXXX</programlisting>
<note><para>シリアル番号およびキーは 'X' に置き換えています。
chillig は、ホスト名です。</para></note>
<note><para>シリアル番号およびキーは 'X' に置き換えています。
chillig は、ホスト名です。</para></note>
<para>ライセンスファイルを編集する際に、
(ライセンスキーで保護されている) <quote>FEATURE</quote>
の行を書き換えてしまうと、動かなくなるでしょう。</para></listitem>
</itemizedlist>
</sect2>
</sect1>
<para>ライセンスファイルを編集する際に、
(ライセンスキーで保護されている) <quote>FEATURE</quote>
の行を書き換えてしまうと、動かなくなるでしょう。</para></listitem>
</itemizedlist>
</sect2>
</sect1>
<sect1 xml:id="linuxemu-matlab">
<info>
<title>&matlab; のインストール</title>
<authorgroup>
<author>
<personname>
<firstname>Dan</firstname>
<surname>Pelleg</surname>
</personname>
<contrib>寄稿: </contrib>
</author>
<!-- daniel+handbook@pelleg.org -->
</authorgroup>
</info>
<sect1 xml:id="linuxemu-matlab">
<info>
<title>&matlab; のインストール</title>
<authorgroup>
<author>
<personname>
<firstname>Dan</firstname>
<surname>Pelleg</surname>
</personname>
<contrib>寄稿: </contrib>
</author>
<!-- daniel+handbook@pelleg.org -->
</authorgroup>
</info>
<indexterm>
<primary>applications</primary>
@ -725,7 +747,8 @@ FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
極めてよく動作します。</para>
<para>Linux 版の <application>&matlab;</application> は、
MathWorks (<link xlink:href="http://www.mathworks.com">http://www.mathworks.com</link>)
MathWorks (<link
xlink:href="http://www.mathworks.com">http://www.mathworks.com</link>)
から直接注文することができます。
ライセンスファイルを入手するか、
ライセンスファイルを作成する手順を確認してください。
@ -749,9 +772,11 @@ FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
<tip>
<para>インストーラはグラフィカルです。
ディスプレイを表示できないエラーが起きるようでしたら、
<command>setenv HOME ~<replaceable>USER</replaceable></command>
<command>setenv HOME
~<replaceable>USER</replaceable></command>
と実行してください。ここで、
<replaceable>USER</replaceable> は、&man.su.1; を実行したユーザ名です。</para>
<replaceable>USER</replaceable> は、
&man.su.1; を実行したユーザ名です。</para>
</tip>
</step>
@ -765,17 +790,20 @@ FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
<tip>
<para>残りのインストールプロセスでの入力を簡単にするために、
シェルプロンプトで、
<command>set MATLAB=/compat/linux/usr/local/matlab</command>
<command>set
MATLAB=/compat/linux/usr/local/matlab</command>
と実行してください。</para>
</tip>
</step>
<step>
<para><application>&matlab;</application>
ライセンスを入手時の手順に従い、ライセンスファイルを編集してください。</para>
ライセンスを入手時の手順に従い、
ライセンスファイルを編集してください。</para>
<tip>
<para>あなたがいつも使っているエディタを使って、このファイルを準備してください。
<para>あなたがいつも使っているエディタを使って、
このファイルを準備してください。
そして、インストーラが
<filename>$MATLAB/license.dat</filename> を編集するように尋ねる前に、
<filename>$MATLAB/license.dat</filename>
@ -796,6 +824,7 @@ FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
<sect2>
<title>ライセンスマネージャの起動</title>
<procedure>
<step>
<para>ライセンスマネージャのスクリプトへのシンボリックリンクを作成してください。</para>
@ -811,7 +840,8 @@ FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
以下の例は、配布されている
<filename>$MATLAB/etc/rc.lm.glnx86</filename>
の改良版です。
変更点はファイルの位置、Linux エミュレーションでライセンスマネージャを起動する点です。</para>
変更点はファイルの位置、Linux
エミュレーションでライセンスマネージャを起動する点です。</para>
<programlisting>#!/bin/sh
case "$1" in
@ -924,14 +954,14 @@ exit 0</programlisting>
これらのうちどちらかを使うには、
<literal>save</literal> コマンドのすぐ後に、
上記の行を挿入してください。</para></tip>
</step>
</step>
<step>
<para>以下の行を含む、
<filename>$MATLAB/bin/finish.sh</filename>
ファイルを作成してください。</para>
<step>
<para>以下の行を含む、
<filename>$MATLAB/bin/finish.sh</filename>
ファイルを作成してください。</para>
<programlisting>#!/compat/linux/bin/sh
<programlisting>#!/compat/linux/bin/sh
(sleep 5; killall -1 matlab_helper) &amp;
exit 0</programlisting>
</step>
@ -969,6 +999,7 @@ exit 0</programlisting>
<sect2>
<title>はじめに</title>
<para>このドキュメントでは <application>&oracle; 8.0.5</application>
<application>&oracle; 8.0.5.1 Enterprise Edition</application>
の Linux 版を FreeBSD にインストールするための手順を解説します。</para>
@ -977,20 +1008,25 @@ exit 0</programlisting>
<sect2>
<title>Linux 環境のインストール</title>
<para>まずは Ports Collection から <filename role='package'>emulators/linux_base</filename>
<filename role='package'>devel/linux_devtools</filename> をインストールしてください。
もしこれらの ports がうまく動かなければ、package もしくは Ports Collection
<para>まずは Ports Collection から <filename
role='package'>emulators/linux_base</filename>
<filename role='package'>devel/linux_devtools</filename>
をインストールしてください。
もしこれらの ports がうまく動かなければ、package
もしくは Ports Collection
で利用可能な古いバージョンを試してみてください。</para>
<para>もし賢いエージェント (intelligent agent) を起動したいなら
Red Hat Tcl パッケージ <filename>tcl-8.0.3-20.i386.rpm</filename>
もインストールする必要があるでしょう。
公式の <application>RPM</application> port (<filename role='package'>archivers/rpm</filename>)
公式の <application>RPM</application> port (<filename
role='package'>archivers/rpm</filename>)
をインストールするには一般的に次のようにします。</para>
<screen>&prompt.root; <userinput>rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package</userinput></screen>
<para><replaceable>package</replaceable> のインストール時にエラーが出てはいけません。</para>
<para><replaceable>package</replaceable>
のインストール時にエラーが出てはいけません。</para>
</sect2>
<sect2>
@ -998,13 +1034,14 @@ exit 0</programlisting>
<para><application>&oracle;</application> をインストールする前に、
適切な環境を設定する必要があります。
このドキュメントでは、
<application>&oracle;</application> のインストールガイドに書いてあるようなことではなく
このドキュメントでは、<application>&oracle;</application>
のインストールガイドに書いてあるようなことではなく
FreeBSD で Linux 用 <application>&oracle;</application>
を動かすために<emphasis>特別に</emphasis>必要なことのみを解説します。</para>
<sect3 xml:id="linuxemu-kernel-tuning">
<title>カーネルのチューニング</title>
<indexterm><primary>カーネルのチューニング</primary></indexterm>
<para><application>&oracle;</application> インストールガイドにあるように、
@ -1029,7 +1066,7 @@ options SEMMSL=61</programlisting>
<para>また、
次のオプションがカーネルのコンフィギュレーションファイルにあることも確認します。</para>
<programlisting>options SYSVSHM #SysV shared memory
<programlisting>options SYSVSHM #SysV shared memory
options SYSVSEM #SysV semaphores
options SYSVMSG #SysV interprocess communication</programlisting>
</sect3>
@ -1038,12 +1075,15 @@ options SYSVMSG #SysV interprocess communication</programlisting>
<title>&oracle; 用アカウント</title>
<para>他のアカウントを作るのと同じように <systemitem class="username">oracle</systemitem>
<para>他のアカウントを作るのと同じように
<systemitem class="username">oracle</systemitem>
用のアカウントを作ります。
<systemitem class="username">oracle</systemitem> 用のアカウントに特別なのは
<systemitem class="username">oracle</systemitem>
用のアカウントに特別なのは
Linux のシェルを割り当てるところだけです。
<filename>/etc/shells</filename><literal>/compat/linux/bin/bash</literal>
を加え、<systemitem class="username">oracle</systemitem> 用のアカウントに設定します。</para>
<filename>/etc/shells</filename>
<literal>/compat/linux/bin/bash</literal> を加え、<systemitem
class="username">oracle</systemitem> 用のアカウントに設定します。</para>
</sect3>
<sect3 xml:id="linuxemu-environment">
@ -1055,8 +1095,8 @@ options SYSVMSG #SysV interprocess communication</programlisting>
<informaltable frame="none" pgwide="1">
<tgroup cols="2">
<colspec colwidth="1*"/>
<colspec colwidth="2*"/>
<colspec colwidth="1*"/>
<colspec colwidth="2*"/>
<thead>
<row>
<entry>変数</entry>
@ -1081,15 +1121,15 @@ options SYSVMSG #SysV interprocess communication</programlisting>
<entry><envar>PATH</envar></entry>
<entry><literal>/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</literal></entry>
/compat/linux/sbin
/compat/linux/usr/bin
/compat/linux/usr/sbin
/bin
/sbin
/usr/bin
/usr/sbin
/usr/local/bin
$ORACLE_HOME/bin</literal></entry>
</row>
</tbody>
</tgroup>
@ -1099,7 +1139,7 @@ $ORACLE_HOME/bin</literal></entry>
で設定することをお勧めします。
完璧なサンプルは以下の通りです。</para>
<programlisting>ORACLE_BASE=/oracle; export ORACLE_BASE
<programlisting>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</programlisting>
これは Linux エミュレーターにおけるちょっとした不整合のためです。
このディレクトリは <systemitem class="username">oracle</systemitem>
ユーザーのものにしておきます。
これで特に問題なく <application>&oracle;</application> がインストールできるでしょう。
これで特に問題なく <application>&oracle;</application>
がインストールできるでしょう。
もし問題が起こったら、まずは <application>&oracle;</application>
の配布物や設定をチェックしてください。
<application>&oracle;</application>
のインストールが終わったら次の二つのサブセクションで解説するパッチを当てます。</para>
<para>よくあるトラブルは、TCP プロトコルアダプターが正しくインストールされていないことです。
<para>よくあるトラブルは、TCP
プロトコルアダプターが正しくインストールされていないことです。
そのため、一切 TCP リスナーを起動することができないのです。
次の操作はこの問題を解決するのに役立ちます。</para>
@ -1145,16 +1187,16 @@ export PATH</programlisting>
<sect3 xml:id="linuxemu-patch-root">
<title>root.sh へのパッチ</title>
<para><application>&oracle;</application> をインストールする時、
<systemitem class="username">root</systemitem>
で行なう必要のあるいくつかの操作は <filename>root.sh</filename>
と呼ばれるシェルスクリプトに記録されます。
このスクリプトは、<filename>orainst</filename>
ディレクトリにあります。次のパッチを <filename>root.sh</filename> に当てて
正しい場所にある <command>chown</command> コマンドを使うようにするか、
代わりに Linux ネイティブなシェルのもとでスクリプトを走らせましょう。</para>
<para><application>&oracle;</application> をインストールする時、
<systemitem class="username">root</systemitem>
で行なう必要のあるいくつかの操作は <filename>root.sh</filename>
と呼ばれるシェルスクリプトに記録されます。
このスクリプトは、<filename>orainst</filename>
ディレクトリにあります。次のパッチを <filename>root.sh</filename> に当てて
正しい場所にある <command>chown</command> コマンドを使うようにするか、
代わりに Linux ネイティブなシェルのもとでスクリプトを走らせましょう。</para>
<programlisting>*** orainst/root.sh.orig Tue Oct 6 21:57:33 1998
<programlisting>*** 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</programlisting>
<sect1 xml:id="linuxemu-advanced">
<title>高度なトピックス</title>
<para>Linux バイナリ互換機能がどのような仕組みなのか興味がある人はこのセクションを読んでください。
<para>Linux
バイナリ互換機能がどのような仕組みなのか興味がある人はこのセクションを読んでください。
以下の文章で説明されていることのほとんどは &a.chat; に投稿された
Terry Lambert (<email>tlambert@primenet.com</email>) 氏のメール
(Message ID: <literal>&lt;199906020108.SAA07001@usr09.primenet.com&gt;</literal>)
@ -1226,49 +1269,48 @@ export PATH</programlisting>
<sect2>
<title>どのように動くのでしょう?</title>
<indexterm><primary>execution class loader</primary></indexterm>
<para>FreeBSD は、&ldquo;実行クラスローダ (execution class loader) &rdquo;
と呼ばれる抽象的な機構を持っています。これは &man.execve.2;
システムコールへの楔という形で実装されています。
</para>
<para>FreeBSD は、&ldquo;実行クラスローダ (execution class loader) &rdquo;
と呼ばれる抽象的な機構を持っています。これは &man.execve.2;
システムコールへの楔という形で実装されています。</para>
<para>FreeBSD は、シェルインタプリタやシェルスクリプトを実行するための
<literal>#!</literal> ローダを持った単一のプログラムローダではなく、
ローダのリストを持っているのです。
</para>
<para>FreeBSD は、シェルインタプリタやシェルスクリプトを実行するための
<literal>#!</literal> ローダを持った単一のプログラムローダではなく、
ローダのリストを持っているのです。</para>
<para>歴史的には、&unix; プラットフォーム上の唯一のローダーがマジックナンバー
(一般的にはファイルの先頭の 4 ないし 8 バイトの部分)
の検査を行ないシステムで実行できるバイナリかどうかを検査し、
もしそうならバイナリローダーを呼び出すというようになっていました。</para>
<para>歴史的には、&unix; プラットフォーム上の唯一のローダーがマジックナンバー
(一般的にはファイルの先頭の 4 ないし 8 バイトの部分)
の検査を行ないシステムで実行できるバイナリかどうかを検査し、
もしそうならバイナリローダーを呼び出すというようになっていました。</para>
<para>もし、そのシステム用のバイナリでない場合には、
&man.execve.2; システムコールの呼び出しは失敗の戻り値を返し、
シェルがシェルコマンドとして実行しようと試みていたわけです。
</para>
<para>もし、そのシステム用のバイナリでない場合には、
&man.execve.2; システムコールの呼び出しは失敗の戻り値を返し、
シェルがシェルコマンドとして実行しようと試みていたわけです。</para>
<para>この仮定は<quote>現在利用しているシェルがどのようなものであっても</quote>変わりません。</para>
<para>この仮定は<quote>現在利用しているシェルがどのようなものであっても</quote>変わりません。</para>
<para>後に &man.sh.1; に変更が加えられ、先頭の 2 バイトを検査した結果
<literal>:\n</literal> であれば代わりに &man.csh.1; を呼び出す、
というようになりました (この変更は SCO が最初に行なったと思われます)。</para>
<para>後に &man.sh.1; に変更が加えられ、先頭の 2 バイトを検査した結果
<literal>:\n</literal> であれば代わりに &man.csh.1; を呼び出す、
というようになりました (この変更は SCO が最初に行なったと思われます)。</para>
<para>現在の FreeBSD は、プログラムローダリストを走査します。
その際、空白文字までの文字列をインタプリタとして認識する、
通常の <literal>#!</literal> ローダを用いるため、
該当するものが存在しなければ最終的に /bin/sh がロードされます。</para>
<para>現在の FreeBSD は、プログラムローダリストを走査します。
その際、空白文字までの文字列をインタプリタとして認識する、
通常の <literal>#!</literal> ローダを用いるため、
該当するものが存在しなければ最終的に /bin/sh がロードされます。</para>
<indexterm><primary>ELF</primary></indexterm>
<para>Linux ABI をサポートするため、FreeBSD は
ELF バイナリを示すマジックナンバを確認します。
(ただし、この段階では FreeBSD、&solaris;, Linux、そしてその他の
ELF イメージ形式を使っている OS を区別することはできません)。</para>
<para>Linux ABI をサポートするため、FreeBSD は
ELF バイナリを示すマジックナンバを確認します。
(ただし、この段階では FreeBSD、&solaris;, Linux、そしてその他の
ELF イメージ形式を使っている OS を区別することはできません)。</para>
<indexterm><primary>Solaris</primary></indexterm>
<para>ELF ローダは、特殊な<emphasis>マーク (brand)</emphasis> があるかどうか探します。
このマークとは、ELF イメージのコメントセクションのことです。
SVR4/&solaris; の ELF バイナリには、このセクションは存在しません。</para>
<para>ELF ローダは、特殊な<emphasis>マーク (brand)</emphasis>
があるかどうか探します。
このマークとは、ELF イメージのコメントセクションのことです。
SVR4/&solaris; の ELF バイナリには、このセクションは存在しません。</para>
<para>Linux バイナリを実行するためには、
ELF バイナリに &man.brandelf.1; で説明されている
@ -1280,91 +1322,100 @@ export PATH</programlisting>
<literal>Linux</literal> のマークが付けられ、
ELF ローダが認識できるようになります。</para>
<indexterm>
<primary>ELF</primary>
<primary>ELF</primary>
<secondary>branding</secondary>
</indexterm>
<para>ELF ローダが <literal>Linux</literal> マークを確認すると、
ローダは <literal>proc</literal> 構造体内の
ある一つのポインタを置き換えます。システムコールは全て、
このポインタ (伝統的な &unix; システムではこれは構造体の配列 <literal>sysent[]</literal>
で、システムコールが含まれています) を通してインデックスされます。
さらに、そのプロセスには Linux カーネルモジュールに必要な
シグナルトランポリンコード (訳注:
シグナルの伝播を実現するコード) 用の特殊なトラップベクタの設定や、
他の (細かな) 調整のための設定が行なわれます。</para>
<para>ELF ローダが <literal>Linux</literal> マークを確認すると、
ローダは <literal>proc</literal> 構造体内の
ある一つのポインタを置き換えます。システムコールは全て、
このポインタ (伝統的な &unix; システムではこれは構造体の配列
<literal>sysent[]</literal> で、システムコールが含まれています)
を通してインデックスされます。
さらに、そのプロセスには Linux
カーネルモジュールに必要なシグナルトランポリンコード (訳注:
シグナルの伝播を実現するコード) 用の特殊なトラップベクタの設定や、
他の (細かな) 調整のための設定が行なわれます。</para>
<para>Linux システムコールベクタは、
さまざまなデータに加えて <literal>sysent[]</literal>
エントリーのリストを含んでおり、それらのアドレスはカーネルモジュール内にあります。</para>
<para>Linux システムコールベクタは、
さまざまなデータに加えて <literal>sysent[]</literal>
エントリーのリストを含んでおり、
それらのアドレスはカーネルモジュール内にあります。</para>
<para>Linux バイナリがシステムコールを発行する際、トラップコードは
<literal>proc</literal> 構造体を用いてシステムコール関数ポインタを
解釈します。そして FreeBSD ではなく
Linux 用のシステムコールエントリポイントを得るわけです。</para>
<para>Linux バイナリがシステムコールを発行する際、トラップコードは
<literal>proc</literal> 構造体を用いてシステムコール関数ポインタを
解釈します。そして FreeBSD ではなく
Linux 用のシステムコールエントリポイントを得るわけです。</para>
<para>さらに、Linux モードは状況に応じて<emphasis>ファイルシステム本来のルートマウントポイントを置き換えて</emphasis>ファイルの参照を行ないます。
これは、<option>union</option> オプションを指定してマウントされたファイルシステム
(<literal>unionfs</literal> ファイルシステムでは<emphasis>ありません!</emphasis>)
が行なっていることと同じです。
ファイルを検索する際にはまず
<filename>/compat/linux/original-path</filename>
ディレクトリを、<emphasis>それから</emphasis>見つけられなかったときにのみ、
<filename>/original-path</filename>
を調べます。
こうすることで、他のバイナリを要求するバイナリの実行を可能にしています
(したがって、Linux 用プログラムツールは Linux ABI サポート環境下で完全に動作するわけです)。
またこれは、もし対応する Linux バイナリが存在しない場合に
Linux バイナリが FreeBSD バイナリをロードしたり、実行したりすることが可能であること、
その Linux バイナリに自分自身が Linux 上で実行されていないことを
気付かせないようにする目的で、&man.uname.1; コマンドを
<filename>/compat/linux</filename> ディレクトリに置くことができる、
ということを意味します。
</para>
<para>さらに、Linux
モードは状況に応じて<emphasis>ファイルシステム本来のルートマウントポイントを置き換えて</emphasis>ファイルの参照を行ないます。
これは、<option>union</option>
オプションを指定してマウントされたファイルシステム
(<literal>unionfs</literal>
ファイルシステムでは<emphasis>ありません!</emphasis>)
が行なっていることと同じです。
ファイルを検索する際にはまず
<filename>/compat/linux/original-path</filename>
ディレクトリを、<emphasis>それから</emphasis>見つけられなかったときにのみ、
<filename>/original-path</filename>
を調べます。
こうすることで、他のバイナリを要求するバイナリの実行を可能にしています
(したがって、Linux 用プログラムツールは
Linux ABI サポート環境下で完全に動作するわけです)。
またこれは、もし対応する Linux バイナリが存在しない場合に
Linux バイナリが FreeBSD バイナリをロードしたり、
実行したりすることが可能であること、
その Linux バイナリに自分自身が Linux 上で実行されていないことを
気付かせないようにする目的で、&man.uname.1; コマンドを
<filename>/compat/linux</filename> ディレクトリに置くことができる、
ということを意味します。</para>
<para>要するに、Linux カーネルが FreeBSD カーネルの内部に存在しているわけです。
カーネルによって提供されるサービス全ての実装の基礎となるさまざまな関数は
FreeBSD システムコールテーブルエントリと
Linux システムコールテーブルエントリの両方で共通に利用されています。
これらにはファイルシステム処理、仮想メモリ処理、シグナル伝送、System V IPC
などが含まれますが、
FreeBSD バイナリは FreeBSD <emphasis>グルー</emphasis> (訳注: glue;
二者の間を仲介するという意味) 関数群、
そして Linux バイナリは Linux <emphasis>グルー</emphasis>関数群を用いる、
という点だけが異なります (過去に存在したほとんどの OS は、
自分自身のための<emphasis>グルー</emphasis>関数群しか備えていません。
前述したように、システムコールを発行する際、
各々のプロセスの <literal>proc</literal> 構造体内にある、
ローダによって動的に初期化されるポインタを参照してアドレスを得る代わりに、
静的でグローバルな <literal>sysent[]</literal> 構造体の配列に
システムコール関数のアドレスが直接格納されているのです)。</para>
<para>要するに、Linux カーネルが FreeBSD カーネルの内部に存在しているわけです。
カーネルによって提供されるサービス全ての実装の基礎となるさまざまな関数は
FreeBSD システムコールテーブルエントリと
Linux システムコールテーブルエントリの両方で共通に利用されています。
これらにはファイルシステム処理、仮想メモリ処理、シグナル伝送、
System V IPC などが含まれますが、
FreeBSD バイナリは FreeBSD <emphasis>グルー</emphasis> (訳注: glue;
二者の間を仲介するという意味) 関数群、
そして Linux バイナリは Linux <emphasis>グルー</emphasis>関数群を用いる、
という点だけが異なります (過去に存在したほとんどの OS は、
自分自身のための<emphasis>グルー</emphasis>関数群しか備えていません。
前述したように、システムコールを発行する際、
各々のプロセスの <literal>proc</literal> 構造体内にある、
ローダによって動的に初期化されるポインタを参照してアドレスを得る代わりに、
静的でグローバルな <literal>sysent[]</literal> 構造体の配列に
システムコール関数のアドレスが直接格納されているのです)。</para>
<para>さて、どちらを本来の FreeBSD ABI (訳注: Applications Binary Interface;
同じ CPU を利用したコンピュータ間でバイナリを共有するための規約のこと)
と呼ぶべきなのでしょうか?
実は、どちらが本来のものであるかということを論ずることに意味はありません。
基本的に、FreeBSD <emphasis>グルー</emphasis>関数群はカーネルの中に静的にリンクされていて、
Linux <emphasis>グルー</emphasis>関数群は静的にリンクすることも、
カーネルモジュールを介して利用することもできるようになっている、
という違いがあるだけ (ただしこれは現時点においての話であり、
将来のリリースで変更される可能性がありますし、
おそらく実際に変更されるでしょう) です。</para>
<para>さて、どちらを本来の FreeBSD ABI (訳注: Applications Binary Interface;
同じ CPU を利用したコンピュータ間でバイナリを共有するための規約のこと)
と呼ぶべきなのでしょうか?
実は、どちらが本来のものであるかということを論ずることに意味はありません。
基本的に、FreeBSD
<emphasis>グルー</emphasis>関数群はカーネルの中に静的にリンクされていて、
Linux <emphasis>グルー</emphasis>関数群は静的にリンクすることも、
カーネルモジュールを介して利用することもできるようになっている、
という違いがあるだけ (ただしこれは現時点においての話であり、
将来のリリースで変更される可能性がありますし、
おそらく実際に変更されるでしょう) です。</para>
<para>あ、「でもこれは本当にエミュレーションと呼べるのか」って?
答えは「いいえ」です。これは ABI の実装であり、
エミュレーションとは異なります。エミュレータが呼び出されているわけではありません
(シミュレータでもないことをあらかじめ断っておきましょう)。</para>
<para>あ、「でもこれは本当にエミュレーションと呼べるのか」って?
答えは「いいえ」です。これは ABI の実装であり、
エミュレーションとは異なります。
エミュレータが呼び出されているわけではありません
(シミュレータでもないことをあらかじめ断っておきましょう)。</para>
<para>では、これがよく <quote>Linux エミュレーション</quote>と呼ばれるのは何故でしょうか?
それはもちろん FreeBSD の売りにするためでもあるのですが、
実際には、次のような理由によります。
この機能が初めて実装された頃、
動作原理を説明する以外にこの機能を表現する言葉はありませんでした。
しかし、コードをコンパイルしたりモジュールをロードしない場合、
「FreeBSD 上で Linux バイナリを実行する」という表現は、
厳密に考えると適切ではありません。
そこで、その際にロードされているもの自身を表現する言葉 &mdash; すなわち
<quote>Linux エミュレータ</quote>が必要だったのです。</para>
<para>では、これがよく <quote>Linux
エミュレーション</quote>と呼ばれるのは何故でしょうか?
それはもちろん FreeBSD の売りにするためでもあるのですが、
実際には、次のような理由によります。
この機能が初めて実装された頃、
動作原理を説明する以外にこの機能を表現する言葉はありませんでした。
しかし、コードをコンパイルしたりモジュールをロードしない場合、
「FreeBSD 上で Linux バイナリを実行する」という表現は、
厳密に考えると適切ではありません。
そこで、その際にロードされているもの自身を表現する言葉 &mdash; すなわち
<quote>Linux エミュレータ</quote>が必要だったのです。</para>
</sect2>
</sect1>
</chapter>