Change punctuation style and fix some typos.

Submitted by:	Hideyuki KURASHINA <rushani@jp.FreeBSD.org>
References:	[doc-jp-work 471]
This commit is contained in:
Hiroki Sato 2002-08-09 16:14:09 +00:00
parent b88d2f1133
commit 599e9f17b8
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=13818
4 changed files with 1116 additions and 1116 deletions

File diff suppressed because it is too large Load diff

View file

@ -3,7 +3,7 @@
The FreeBSD Japanese Documentation Project The FreeBSD Japanese Documentation Project
Original revision: 1.33 Original revision: 1.33
$FreeBSD: doc/ja_JP.eucJP/books/handbook/kerneldebug/chapter.sgml,v 1.13 2001/04/29 17:51:27 hrs Exp $ $FreeBSD$
--> -->
<chapter id="kerneldebug"> <chapter id="kerneldebug">
@ -20,99 +20,99 @@
<para>ここではクラッシュダンプ (crash dump : 訳注 この文脈では <para>ここではクラッシュダンプ (crash dump : 訳注 この文脈では
kernel 自身 kernel 自身
の異常によって停止した場合に出力されるイメージを指します) の異常によって停止した場合に出力されるイメージを指します)
によるカー ネルデバッグの方法を示します.</para> によるカーネルデバッグの方法を示します。</para>
<para>ここではダンプするための十分なスワップ <para>ここではダンプするための十分なスワップ
(swap) の容量があるものとします. (swap) の容量があるものとします
もし複数のスワップパーティションを持ち, もし複数のスワップパーティションを持ち
最初のパーティションがダンプ 最初のパーティションがダンプ
を保持するのに十分な大きさを持たない場合は を保持するのに十分な大きさを持たない場合は
別のダンプデバイスを使うよ 別のダンプデバイスを使うよ
うに (<literal>config kernel</literal> 行で) うに (<literal>config kernel</literal> 行で)
カーネルのコンフィグをおこなうか, &man.dumpon.8; カーネルのコンフィグをおこなうか&man.dumpon.8;
コマンドを使って別のデバイスを示すことができます. &man.dumpon.8; コマンドを使って別のデバイスを示すことができます&man.dumpon.8;
を使うもっともよい方法は変数 <literal>dumpdev</literal> を を使うもっともよい方法は変数 <literal>dumpdev</literal> を
<filename>/etc/rc.conf</filename> で設定することです. 一般的には <filename>/etc/rc.conf</filename> で設定することです一般的には
<filename>/etc/fstab</filename> で設定されているスワップデバイスが <filename>/etc/fstab</filename> で設定されているスワップデバイスが
使われるでしょう. 使われるでしょう
スワップに使えないデバイスへのダンプ, スワップに使えないデバイスへのダンプ
例えばテープへのダンプは現在サポートさ 例えばテープへのダンプは現在サポートさ
れていません. カーネルのコンフィグは れていませんカーネルのコンフィグは
<command>config <option>-g</option></command> によって行ってください. <command>config <option>-g</option></command> によって行ってください
<link linkend="kernelconfig"> FreeBSD <link linkend="kernelconfig"> FreeBSD
カーネルのコンフィグレーション </link> カーネルのコンフィグレーション </link>
には FreeBSD のカーネルの設定の詳細がありますので には FreeBSD のカーネルの設定の詳細がありますので
参照してください.</para> 参照してください</para>
<para>&man.dumpon.8; コマンドを使ってどこへダンプするか <para>&man.dumpon.8; コマンドを使ってどこへダンプするか
カーネルに伝えてください カーネルに伝えてください
(&man.swapon.8; によってそのパーティションが (&man.swapon.8; によってそのパーティションが
スワップとして設定された スワップとして設定された
後でなければならないことに注意してください). これは普通は 後でなければならないことに注意してください)これは普通は
<filename>/etc/rc.conf</filename> や <filename>/etc/rc</filename> <filename>/etc/rc.conf</filename> や <filename>/etc/rc</filename>
で設定されます. あるいは で設定されますあるいは
別の方法としてカーネルコンフィグレーションファイルの 別の方法としてカーネルコンフィグレーションファイルの
<literal>config</literal> 行の <literal>dump</literal> 節 <literal>config</literal> 行の <literal>dump</literal> 節で
ダンプデバイスをハードコードすることができます. ダンプデバイスをハードコードすることができます
この方法はあまりよくは この方法はあまりよくは
ありません. カーネルがブート時に crash ありませんカーネルがブート時に crash
する場合のクラッシュダンプを取り する場合のクラッシュダンプを取り
たい時だけ使うべきです.</para> たい時だけ使うべきです</para>
<note> <note>
<para>以下では <command>gdb</command>という用語は <para>以下では <command>gdb</command>という用語は
<command>gdb</command> <command>gdb</command>
を<quote>カーネルデバッグモード</quote>で動かしていることを意味します. を<quote>カーネルデバッグモード</quote>で動かしていることを意味します
<command>gdb</command> を <command>gdb</command> を
<option>-k</option>オプションをつけて起動することで, <option>-k</option>オプションをつけて起動することで
このモードになります. このモードになります
カーネルデバッグモードでは, プロンプトが カーネルデバッグモードではプロンプトが
<prompt>(kgdb)</prompt> に変わります.</para> <prompt>(kgdb)</prompt> に変わります</para>
</note> </note>
<tip> <tip>
<para>FreeBSD 3 およびそれ以前のシステムを使っているなら, <para>FreeBSD 3 およびそれ以前のシステムを使っているなら
巨大なデバッグカーネルをそのままインストールするのではなく 巨大なデバッグカーネルをそのままインストールするのではなく
strip されたデバッグ用カーネルをつくるべきでしょう.</para> strip されたデバッグ用カーネルをつくるべきでしょう</para>
<screen>&prompt.root; <userinput>cp kernel kernel.debug</userinput> <screen>&prompt.root; <userinput>cp kernel kernel.debug</userinput>
&prompt.root; <userinput>strip -g kernel</userinput></screen> &prompt.root; <userinput>strip -g kernel</userinput></screen>
<para>この手順は必須ではありませんが, ぜひ行なうことをおすすめします <para>この手順は必須ではありませんがぜひ行なうことをおすすめします
(FreeBSD 4 およびそれ以降では, カーネルの <command>make</command> (FreeBSD 4 およびそれ以降ではカーネルの <command>make</command>
の段階で自動的にこれが行なわれます). の段階で自動的にこれが行なわれます)
自動的に, あるいは上のコマンドを手動で実行してカーネルが strip 自動的にあるいは上のコマンドを手動で実行してカーネルが strip
されたら, 普通に <command>make install</command> されたら普通に <command>make install</command>
と実行し, カーネルをインストールして構いません.</para> と実行し、カーネルをインストールして構いません。</para>
<para>FreeBSD の古いリリース (3.1 を含まない以前のもの) は, <para>FreeBSD の古いリリース (3.1 を含まない以前のもの) は
標準で a.out カーネルを使っていることに注意してください. 標準で a.out カーネルを使っていることに注意してください
これはシンボルテーブルが常に物理メモリ上に存在することを要求するため, これはシンボルテーブルが常に物理メモリ上に存在することを要求するため
strip されていないデバッグカーネルに含まれる大きなシンボルテーブルは非常に無駄になります. strip されていないデバッグカーネルに含まれる大きなシンボルテーブルは非常に無駄になります
ELF カーネルを使った FreeBSD の最近のリリースでは, ELF カーネルを使った FreeBSD の最近のリリースでは
そのような問題がなくなりました.</para> そのような問題がなくなりました</para>
</tip> </tip>
<para>カーネルを作った時にそのコピーを <para>カーネルを作った時にそのコピーを
<filename>kernel.debug</filename> という名前で作りましょう. <filename>kernel.debug</filename> という名前で作りましょう
また, オリジナルに対して <command>strip またオリジナルに対して <command>strip
-g</command>を実行します. -g</command>を実行します
オリジナルを普通にインストールします. また strip オリジナルを普通にインストールしますまた strip
していないカーネル も同様にインストールすることができますが, していないカーネルも同様にインストールすることができますが
シンボルテーブルの参照時間 シンボルテーブルの参照時間
がいくつかのプログラムでは劇的に増加するでしょう. また, がいくつかのプログラムでは劇的に増加するでしょう。また、
カーネル全体 はブート時に読み込まれ カーネル全体はブート時に読み込まれ
スワップアウトされないため数メガバイトの物理メ スワップアウトされないため数メガバイトの物理メ
モリが無駄になります.</para> モリが無駄になります</para>
<para>例えばブートプロンプトで <para>例えばブートプロンプトで
新しいカーネルの名前をタイプすることによって, 新しいカーネルの名前をタイプすることによって
新しいカーネルをテストした場合で, 新しいカーネルをテストした場合で
再びシステムを動かすのに別のカーネ 再びシステムを動かすのに別のカーネ
ルで立ち上げることが必要な場合はブートプロンプトで ルで立ち上げることが必要な場合はブートプロンプトで
<option>-s</option>フラグ <option>-s</option>フラグ
を使いシングルユーザの状態にしてください. を使いシングルユーザの状態にしてください
そして以下のような操作をおこな います.</para> そして以下のような操作をおこないます。</para>
<screen>&prompt.root; <userinput>fsck -p</userinput> <screen>&prompt.root; <userinput>fsck -p</userinput>
&prompt.root; <userinput>mount -a -t ufs</userinput> # /var/crash 用のファイルシステムを書き込み可能にする &prompt.root; <userinput>mount -a -t ufs</userinput> # /var/crash 用のファイルシステムを書き込み可能にする
@ -120,33 +120,33 @@
&prompt.root; <userinput>exit</userinput> # ...マルチユーザモードへ移行</screen> &prompt.root; <userinput>exit</userinput> # ...マルチユーザモードへ移行</screen>
<para>ここに示した &man.savecore.8; は (現在動いているものとは別の) <para>ここに示した &man.savecore.8; は (現在動いているものとは別の)
カーネルのシンボル名の抽出をおこなうために使っています. カーネルのシンボル名の抽出をおこなうために使っています
抽出はデフォルトで 抽出はデフォルトで
は現在動いているカーネルに対しておこなわれ, は現在動いているカーネルに対しておこなわれ
クラッシュダンプとカーネルシンボ クラッシュダンプとカーネルシンボ
ルのくい違いのためにまったく何もしません ルのくい違いのためにまったく何もしません
(訳注:そのためにオプション (訳注: そのためにオプション
で実際にダンプをおこしたカーネルを指定します).</para> で実際にダンプをおこしたカーネルを指定します)</para>
<para>クラッシュダンプの起きた後に <para>クラッシュダンプの起きた後に
<filename>/sys/compile/WHATEVER</filename>へ行き <filename>/sys/compile/WHATEVER</filename>へ行き
<command>gdb</command>を動かします. <command>gdb</command> <command>gdb</command>を動かします<command>gdb</command>
より次のようにします.</para> より次のようにします</para>
<screen><userinput>symbol-file kernel.debug</userinput> <screen><userinput>symbol-file kernel.debug</userinput>
<userinput>exec-file /var/crash/kernel.0</userinput> <userinput>exec-file /var/crash/kernel.0</userinput>
<userinput>core-file /var/crash/vmcore.0</userinput></screen> <userinput>core-file /var/crash/vmcore.0</userinput></screen>
<para>こうすると, <para>こうすると
クラッシュダンプを使ってカーネルソースを他のプログラムと同様に クラッシュダンプを使ってカーネルソースを他のプログラムと同様に
デバッグすることができます.</para> デバッグすることができます</para>
<para>次に <command>gdb</command> <para>次に <command>gdb</command>
での手順のセッションのログを示します. 長い行は読 での手順のセッションのログを示します長い行は読
みやすくするために改行しました. また, みやすくするために改行しました。また、
参照のために行番号を入れてあり ます. ただし, これは実際の 参照のために行番号を入れてあります。ただし、これは実際の
pcvtコンソールドライバの開発中の実際のエ pcvt コンソールドライバの開発中の実際のエ
ラーのトレースです.</para> ラーのトレースです</para>
<screen> 1:Script started on Fri Dec 30 23:15:22 1994 <screen> 1:Script started on Fri Dec 30 23:15:22 1994
2:&prompt.root; <userinput>cd /sys/compile/URIAH</userinput> 2:&prompt.root; <userinput>cd /sys/compile/URIAH</userinput>
@ -230,52 +230,52 @@
79: 79:
80:Script done on Fri Dec 30 23:18:04 1994</screen> 80:Script done on Fri Dec 30 23:18:04 1994</screen>
<para>上の出力についてのコメントをします.</para> <para>上の出力についてのコメントをします</para>
<variablelist> <variablelist>
<varlistentry><term>line 6:</term> <varlistentry><term>line 6:</term>
<listitem> <listitem>
<para>これは DDB (後述) からのダンプです. このため <para>これは DDB (後述) からのダンプですこのため
<quote>because you said to!</quote> という <quote>because you said to!</quote> という
panicコメントがつき, ページフォルトのト ラップによって panicコメントがつき、ページフォルトのトラップによって
DDBに入ったことが原因の, やや長いスタックトレー DDBに入ったことが原因のやや長いスタックトレー
スがあります.</para> スがあります</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry><term>line 20:</term> <varlistentry><term>line 20:</term>
<listitem> <listitem>
<para>スタックトレースでのこれは <para>スタックトレースでのこれは
<function>trap()</function>関数の位置で す.</para> <function>trap()</function>関数の位置です。</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry><term>line 36:</term> <varlistentry><term>line 36:</term>
<listitem> <listitem>
<para>新しいスタックフレームを使用するように指定しています. <para>新しいスタックフレームを使用するように指定しています
ただし, ここでこれを指定する必要ありません. ただし、ここでこれを指定する必要ありません。
trap の場合, スタックフレームは正しい場所を指していると考えられるからです. trap の場合、スタックフレームは正しい場所を指していると考えられるからです。
ソースコードの 403 行を見ると, <quote>tp</quote> ソースコードの 403 行を見ると<quote>tp</quote>
ポインタのアクセスが失敗しているか, ポインタのアクセスが失敗しているか
配列のアクセスが範囲外である可能性が高いことがわかります.</para> 配列のアクセスが範囲外である可能性が高いことがわかります</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry><term>line 52:</term> <varlistentry><term>line 52:</term>
<listitem> <listitem>
<para>怪しいポインタですが, <para>怪しいポインタですが
アクセスは正常におこなえました.</para> アクセスは正常におこなえました</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry><term>line 56:</term> <varlistentry><term>line 56:</term>
<listitem> <listitem>
<para>ところが, 明らかにポインタはゴミを指しています. これで <para>ところが、明らかにポインタはゴミを指しています。これで
エラーを見つけました! (ここのコードの部分からはよくわかり エラーを見つけました! (ここのコードの部分からはよくわかり
ませんが, ませんが
<literal>tp-&gt;t_line</literal>はコンソールデバイスの規定 <literal>tp-&gt;t_line</literal>はコンソールデバイスの規定
する行を参照しているので, する行を参照しているので
もっと小さな整数でなければなりませ ん. )</para> もっと小さな整数でなければなりません。)</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
</variablelist> </variablelist>
@ -285,15 +285,15 @@
<title>DDD によるクラッシュダンプのデバッグ</title> <title>DDD によるクラッシュダンプのデバッグ</title>
<para>カーネルのクラッシュダンプは <command>ddd</command> <para>カーネルのクラッシュダンプは <command>ddd</command>
のようなグラフィカルなデバッガで調べることもできます. のようなグラフィカルなデバッガで調べることもできます
通常はコマンドラインで <option>-k</option> オプションをつけて 通常はコマンドラインで <option>-k</option> オプションをつけて
<command>ddd</command> を起動します. たとえば:</para> <command>ddd</command> を起動しますたとえば:</para>
<screen>&prompt.root; <userinput>ddd -k /var/crash/kernel.0 /var/crash/vmcore.0</userinput></screen> <screen>&prompt.root; <userinput>ddd -k /var/crash/kernel.0 /var/crash/vmcore.0</userinput></screen>
<para>クラッシュダンプを <command>ddd</command> <para>クラッシュダンプを <command>ddd</command>
のグラフィカルなインターフェースを使って のグラフィカルなインターフェースを使って
見ることができます.</para> 見ることができます</para>
</sect1> </sect1>
<sect1> <sect1>
@ -302,43 +302,43 @@
<para>カーネルが予想もしない時にコアダンプして <command>config <para>カーネルが予想もしない時にコアダンプして <command>config
-g</command> -g</command>
を行ってコンパイルされていなかった場合にはどうしたら を行ってコンパイルされていなかった場合にはどうしたら
よいでしょう. すべてが失われるわけではありません. よいでしょう。すべてが失われるわけではありません。
パニックを起こさないでください.</para> パニックを起こさないでください</para>
<para>もちろん, クラッシュダンプを使えるようにする必要があります. <para>もちろん、クラッシュダンプを使えるようにする必要があります。
使い方は前述の部分を見てください.</para> 使い方は前述の部分を見てください</para>
<para>カーネルのコンパイルディレクトリ <para>カーネルのコンパイルディレクトリ
(<filename>/usr/src/sys/<replaceable>arch</replaceable>/conf</filename>) (<filename>/usr/src/sys/<replaceable>arch</replaceable>/conf</filename>)
, 設定ファイルを編集します. 以下の行のコメントを外します 、設定ファイルを編集します。以下の行のコメントを外します
(行が存在しなければ追加します):</para> (行が存在しなければ追加します):</para>
<programlisting>makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols</programlisting> <programlisting>makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols</programlisting>
<para>カーネルを再構築しましょう. <para>カーネルを再構築しましょう
Makefileのタイムスタンプの変更により, 例えば <!-- kuriyama - Makefileのタイムスタンプの変更により例えば <!-- kuriyama -
should be filename --> <emphasis remap=tt> trap.o should be filename --> <emphasis remap=tt> trap.o
</emphasis>などのいくつかの他のオブジェクトファイルも作り直さ </emphasis>などのいくつかの他のオブジェクトファイルも作り直さ
れます. 少しの幸運があれば, れます。少しの幸運があれば、
<option>-g</option>オプションが追加されても作ら <option>-g</option>オプションが追加されても作ら
れるコードは変更されず, いくらかのデバッグシンボル以外には れるコードは変更されずいくらかのデバッグシンボル以外には
問題を 問題を
起こしたコードとそっくりな新しいカーネルを手に入れることが 起こしたコードとそっくりな新しいカーネルを手に入れることが
できます. 少なくとも &man.size.1; できます少なくとも &man.size.1;
コマンドで古い方と新しい方のサイズを比較すべ きです. コマンドで古い方と新しい方のサイズを比較すべきです。
これが食い違っていれば, これが食い違っていれば
多分あきらめなければならないでしょう.</para> 多分あきらめなければならないでしょう</para>
<para>ダンプを使って前述のように動かして調べます. <para>ダンプを使って前述のように動かして調べます
デバッグシンボルは 必ずしも十分ではありません. デバッグシンボルは 必ずしも十分ではありません
上の例ではスタックトレースでいくつかの関 上の例ではスタックトレースでいくつかの関
数の行番号や引数リストが表示されないかもしれません. 数の行番号や引数リストが表示されないかもしれません
もしより多くのデ バッグシンボルが必要であれば,十分になるまで もしより多くのデバッグシンボルが必要であれば、十分になるまで
適切なオブジェクトファイ ルを消して (makeして) 適切なオブジェクトファイ ルを消して (makeして)
<command>gdb <option>-k</option></command>セッションを繰り返してください.</para> <command>gdb <option>-k</option></command> セッションを繰り返してください。</para>
<para>これは必ずしもうまく動くと保証はできません. <para>これは必ずしもうまく動くと保証はできません
しかしほとんどの場合でう まくいくでしょう.</para> しかしほとんどの場合でうまくいくでしょう。</para>
</sect1> </sect1>
<sect1> <sect1>
@ -346,110 +346,110 @@
<para><command>gdb <option>-k</option></command> <para><command>gdb <option>-k</option></command>
は非常に高レベルのユーザインタフェースを提 は非常に高レベルのユーザインタフェースを提
供するオフラインデバッガですが, いくつかのことはできません. 供するオフラインデバッガですが、いくつかのことはできません。
(できないことの中で) (できないことの中で)
極めて重要なことはカーネルコードへのブレークポイ 極めて重要なことはカーネルコードへのブレークポイ
ントの設定とシングルステップ実行です.</para> ントの設定とシングルステップ実行です</para>
<para>カーネルの低レベルデバッグが必要であれば, DDBと呼ばれる <para>カーネルの低レベルデバッグが必要であればDDBと呼ばれる
on-lineデバッ ガが使えます. ブレークポイントの設定, on-lineデバッガが使えます。ブレークポイントの設定、
シングルステップのカーネルの実 行, シングルステップのカーネルの実行、
変数の検査と変更などができます. 変数の検査と変更などができます
ただし,これはカーネルのソースファ ただしこれはカーネルのソースファ
イルにアクセスすることはできません. イルにアクセスすることはできません
<command>gdb</command>のようにすべてのデ <command>gdb</command>のようにすべてのデ
バッグ情報にはアクセスできず, global バッグ情報にはアクセスできず、global
staticのシンボルにアクセス することができるだけです.</para> static のシンボルにアクセスすることができるだけです。</para>
<para>カーネルに DDB <para>カーネルに DDB
を含めるためにはコンフィグファイルに次のようなオプショ を含めるためにはコンフィグファイルに次のようなオプショ
ンを加えて,</para> ンを加えて</para>
<programlisting>options DDB</programlisting> <programlisting>options DDB</programlisting>
<para>再構築をおこないます. ( <para>再構築をおこないます(
FreeBSDのカーネルの設定の詳細については<link FreeBSD のカーネルの設定の詳細については <link
linkend="kernelconfig"> FreeBSD linkend="kernelconfig">FreeBSD
カーネルのコンフィグレーション</link>を参照してくださ カーネルのコンフィグレーション</link>を参照してくださ
.</para> </para>
<note> <note>
<para>古いバージョンの起動ブロックを使っている場合,ですと, <para>古いバージョンの起動ブロックを使っている場合、ですと、
デバッガのシンボルが完全にはロードされないかもしれません. デバッガのシンボルが完全にはロードされないかもしれません
その時は起動ブロックを最新のものに更新してください. その時は起動ブロックを最新のものに更新してください
新しい起動ブロックは, DDB シンボルを自動的にロードします.</para> 新しい起動ブロックは、DDB シンボルを自動的にロードします。</para>
</note> </note>
<para>DDB カーネルの実行において, <para>DDB カーネルの実行において
DDBに入るいくつかの方法があります. 最初 の, DDB に入るいくつかの方法があります。最初の、
最も早い方法はブートプロンプトが出ている時に 最も早い方法はブートプロンプトが出ている時に
<option>-d</option>のブート フラグをタイプすることです. <option>-d</option>のブートフラグをタイプすることです。
カーネルはデバッグモードで起動し, デバ イスのプローブ以前に カーネルはデバッグモードで起動し、デバイスのプローブ以前に
DDBに入ります. したがって, デバイスのプローブ/初期 DDB に入ります。したがって、デバイスのプローブ/初期
設定ファンクションのデバッグができます.</para> 設定ファンクションのデバッグができます</para>
<para>2つ目のシナリオはキーボードのホットキーで, 通常は <para>2 つ目のシナリオはキーボードのホットキーで通常は
Ctrl-Alt-ESCです. syscons ではホットキーは再設定することができ, Ctrl-Alt-ESC です。syscons ではホットキーは再設定することができ、
配付されているいくつかの キーマッピングでは別のキーに 配付されているいくつかのキーマッピングでは別のキーに
再設定されていますので確認しておいてください. シリアルラインの 再設定されていますので確認しておいてくださいシリアルラインの
BREAKを使って シリアルコンソールから DDBへ入ることを可 BREAK を使ってシリアルコンソールから DDB へ入ることを可
能にするオプションもあります 能にするオプションもあります
(カーネルコンフィグレーションファイルの <literal>options (カーネルコンフィグレーションファイルの <literal>options
BREAK_TO_DEBUGGER</literal>). これは 多くのつまらないシリ BREAK_TO_DEBUGGER</literal>)。これは多くのつまらないシリ
アルアダプタが, 例えばケーブルを引き抜いた時に アルアダプタが例えばケーブルを引き抜いた時に
BREAK状態を意味もなく BREAK 状態を意味もなく
作り出してしまうのでデフォルトでは無効になっています.</para> 作り出してしまうのでデフォルトでは無効になっています</para>
<para>3つ目は, DDB <para>3つ目はDDB
を使うようになっているカーネルがパニック状態になると DDB を使うようになっているカーネルがパニック状態になると DDB
へ入るというものです. このため, へ入るというものです。このため、
無人運転するマシンのカーネルにDDBを 無人運転するマシンのカーネルに DDB
入れるのは賢明ではありません.</para> 入れるのは賢明ではありません</para>
<para>DDB のコマンドはおおまかには <command>gdb</command> <para>DDB のコマンドはおおまかには <command>gdb</command>
のいくつかのコマンドと似て のいくつかのコマンドと似て
います. おそらく最初にブレークポイントを いますおそらく最初にブレークポイントを
設定する必要があるでしょう.</para> 設定する必要があるでしょう</para>
<screen><userinput>b function-name</userinput> <screen><userinput>b function-name</userinput>
<userinput>b address</userinput></screen> <userinput>b address</userinput></screen>
<para>数値はデフォルトでは16進数で, <para>数値はデフォルトでは 16 進数で、
シンボル名とはまったく異なります. 16進数で <literal>a-f</literal> シンボル名とはまったく異なります。16 進数で <literal>a-f</literal>
の文字で始まる場合は, 先頭に <literal>0x</literal> の文字で始まる場合は先頭に <literal>0x</literal>
をつける必要があります(それ以外の数字の場合はどちらでもか をつける必要があります(それ以外の数字の場合はどちらでもか
まいません). <literal>function-name + まいません)<literal>function-name +
0x103</literal>のような単純な式を使うこ とができます.</para> 0x103</literal>のような単純な式を使うことができます。</para>
<para>割り込みされたカーネルから処理を続行するためには, </para> <para>割り込みされたカーネルから処理を続行するためには</para>
<screen><userinput>c</userinput></screen> <screen><userinput>c</userinput></screen>
<para>とタイプするだけです. <para>とタイプするだけです
スタックのトレースには</para> スタックのトレースには</para>
<screen><userinput>trace</userinput></screen> <screen><userinput>trace</userinput></screen>
<para>とします.</para> <para>とします</para>
<note> <note>
<para>DDB にホットキーで入った場合は, カーネルはその <para>DDB にホットキーで入った場合はカーネルはその
(ホットキーの) 割り込み (ホットキーの) 割り込み
の処理を行っていますのでスタックトレースは の処理を行っていますのでスタックトレースは
あまり役にたたないことに注 意してください.</para> あまり役にたたないことに注意してください。</para>
</note> </note>
<para>ブレークポイントを削除したい場合は,</para> <para>ブレークポイントを削除したい場合は</para>
<screen><userinput>del</userinput> <screen><userinput>del</userinput>
<userinput>del address-expression</userinput></screen> <userinput>del address-expression</userinput></screen>
<para>とします. <para>とします
最初の形式はブレークポイントにヒットしたすぐ後で使うことが でき, 最初の形式はブレークポイントにヒットしたすぐ後で使うことができ、
現在のブレークポイントを削除します. 2番目の形式では任意のブレー 現在のブレークポイントを削除します。2 番目の形式では任意のブレー
クポイントを削除することができますが, クポイントを削除することができますが
次の形式で得られるような正確な 次の形式で得られるような正確な
アドレスを与えることが必要です.</para> アドレスを与えることが必要です</para>
<screen><userinput>show b</userinput></screen> <screen><userinput>show b</userinput></screen>
@ -457,150 +457,150 @@
<screen><userinput>s</userinput></screen> <screen><userinput>s</userinput></screen>
<para>としてみてください. これは関数呼出し先までステップ実行 (step <para>としてみてくださいこれは関数呼出し先までステップ実行 (step
into function) するでしょう. into function) するでしょう
次のステートメントが終了するまでのDDBトレースは</para> 次のステートメントが終了するまでの DDBトレースは</para>
<screen><userinput>n</userinput></screen> <screen><userinput>n</userinput></screen>
<para>によっておこなうことができます.</para> <para>によっておこなうことができます</para>
<note> <note>
<para>これは <command>gdb</command> の <command>next</command> <para>これは <command>gdb</command> の <command>next</command>
命令とは異ります. <command>gdb</command>の 命令とは異ります<command>gdb</command>の
<command>finish</command>命令と似ています.</para> <command>finish</command> 命令と似ています。</para>
</note> </note>
<para>メモリ上のデータを調べるには (例として) 次のようにします. <para>メモリ上のデータを調べるには (例として) 次のようにします
<screen><userinput>x/wx 0xf0133fe0,40</userinput> <screen><userinput>x/wx 0xf0133fe0,40</userinput>
<userinput>x/hd db_symtab_space</userinput> <userinput>x/hd db_symtab_space</userinput>
<userinput>x/bc termbuf,10</userinput> <userinput>x/bc termbuf,10</userinput>
<userinput>x/s stringbuf</userinput></screen> <userinput>x/s stringbuf</userinput></screen>
word/halfword/byte 単位でアクセスをおこない, hex (16進) word/halfword/byte 単位でアクセスをおこないhex (16進)
/dec (10進) / /dec (10進) /
char (文字) /string (文字列) で表示します. char (文字) /string (文字列) で表示します
カンマの後ろの数字はオブジェク カンマの後ろの数字はオブジェク
トカウントです. 次の 0x10個の要素を表示するには, 単純に</para> トカウントです。次の 0x10 個の要素を表示するには、単純に</para>
<screen><userinput>x ,10</userinput></screen> <screen><userinput>x ,10</userinput></screen>
<para>とします. 同様に次のように使うことができます. <para>とします。同様に次のように使うことができます。
<screen><userinput>x/ia foofunc,10</userinput></screen> <screen><userinput>x/ia foofunc,10</userinput></screen>
<function>foofunc</function> <function>foofunc</function>
の最初の 0x10個の命令語をディスアセンブルし, の最初の 0x10 個の命令語をディスアセンブルし、
<function>foofunc</function> <function>foofunc</function>
の先頭からのオフセットとともに表示します.</para> の先頭からのオフセットとともに表示します</para>
<para>メモリの内容を変更するには writeコマンドを使います.</para> <para>メモリの内容を変更するには write コマンドを使います。</para>
<screen><userinput>w/b termbuf 0xa 0xb 0</userinput> <screen><userinput>w/b termbuf 0xa 0xb 0</userinput>
<userinput>w/w 0xf0010030 0 0</userinput></screen> <userinput>w/w 0xf0010030 0 0</userinput></screen>
<para>コマンドモディファイアの <para>コマンドモディファイアの
(<literal>b</literal>/<literal>h</literal>/<literal>w</literal>) (<literal>b</literal>/<literal>h</literal>/<literal>w</literal>)
はデータを 書くサイズを定義し, はデータを 書くサイズを定義し
これに続く最初の式は書き込むアドレス, 残りがこれ これに続く最初の式は書き込むアドレス残りがこれ
に続く連続するメモリアドレスに書き込まれるデータになります. に続く連続するメモリアドレスに書き込まれるデータになります
</para> </para>
<para>現在のレジスタ群の内容を知りたい場合は</para> <para>現在のレジスタ群の内容を知りたい場合は</para>
<screen><userinput>show reg</userinput></screen> <screen><userinput>show reg</userinput></screen>
<para>とします. また, 単一のレジスタの値を表示するには, 例えば <para>とします。また、単一のレジスタの値を表示するには、例えば
<screen><userinput>p $eax</userinput></screen> <screen><userinput>p $eax</userinput></screen>
とします. また値の変更は</para> としますまた値の変更は</para>
<screen><userinput>set $eax new-value</userinput></screen> <screen><userinput>set $eax new-value</userinput></screen>
<para>とします.</para> <para>とします</para>
<para>DDBからカーネルの関数を呼び出す必要がある場合は, 単に</para> <para>DDBからカーネルの関数を呼び出す必要がある場合は単に</para>
<screen><userinput>call func(arg1, arg2, ...)</userinput></screen> <screen><userinput>call func(arg1, arg2, ...)</userinput></screen>
<para>とします. return 値が出力されます.</para> <para>とします。return 値が出力されます。</para>
<para>動いているプロセスの &man.ps.1; スタイルの概要は</para> <para>動いているプロセスの &man.ps.1; スタイルの概要は</para>
<screen><userinput>ps</userinput></screen> <screen><userinput>ps</userinput></screen>
<para>です.</para> <para>です</para>
<para>カーネルの失敗の原因の調査が終わったら, ここで再起動すべきです. <para>カーネルの失敗の原因の調査が終わったら、ここで再起動すべきです。
それまでの不具合により, カーネルのすべての部分が期待するような それまでの不具合によりカーネルのすべての部分が期待するような
動作をしているわけではないということを忘れないでください. 動作をしているわけではないということを忘れないでください
以下のうちいずれかの方法でシステムのシャットダウンおよび再起動を行ってください.</para> 以下のうちいずれかの方法でシステムのシャットダウンおよび再起動を行ってください</para>
<screen><userinput>panic</userinput></screen> <screen><userinput>panic</userinput></screen>
<para>カーネルをコアダンプしてリブートしますので, 後で <para>カーネルをコアダンプしてリブートしますので後で
<command>gdb</command>によってコアの高 レベル解析をすることができます. <command>gdb</command>によってコアの高レベル解析をすることができます。
このコマンドは通常, 一度 このコマンドは通常一度
<command>continue</command>命令を使った後に <command>continue</command>命令を使った後に
使うことになるでしょう.</para> 使うことになるでしょう</para>
<screen><userinput>call boot(0)</userinput></screen> <screen><userinput>call boot(0)</userinput></screen>
<para> は動いているシステムを `clean' に shut <para> は動いているシステムを `clean' に shut
downするよい方法です. すべて のディスクを down するよい方法です。すべてのディスクを
<function>sync()</function>して最後にリブートします. <function>sync()</function> して最後にリブートします。
ディスクとカー ディスクとカー
ネルのファイルシステムインタフェースが破損していない限り, ネルのファイルシステムインタフェースが破損していない限り
ほぼ完全 に `clean'にシャットダウンするよい方法でしょう.</para> ほぼ完全に `clean' にシャットダウンするよい方法でしょう</para>
<!-- kuriyama - ldquo? --> <!-- kuriyama - ldquo? -->
<screen><userinput>call cpu_reset()</userinput></screen> <screen><userinput>call cpu_reset()</userinput></screen>
<para>は大惨事を防ぐための最後の手段で 「赤い大きなボタン」 <para>は大惨事を防ぐための最後の手段で 「赤い大きなボタン」
を押すのとほとんど 同じです.(訳注: を押すのとほとんど同じです (訳注:
リセットボタンを押すのとほぼ同じであるという意味です)</para> リセットボタンを押すのとほぼ同じであるという意味です)</para>
<para>短いコマンドの要約は</para> <para>短いコマンドの要約は</para>
<screen><userinput>help</userinput></screen> <screen><userinput>help</userinput></screen>
<para>をタイプします. ただし, デバッグセッションのために <para>をタイプします。ただし、デバッグセッションのために
&man.ddb.4; の &man.ddb.4; の
マニュアルページのプリントアウトを用意しておくことを マニュアルページのプリントアウトを用意しておくことを
強くお奨めします. 強くお奨めします
カーネルのシングルステップ中にオンラインマニュアルを カーネルのシングルステップ中にオンラインマニュアルを
読むことは難しい ということを覚えておいてください.</para> 読むことは難しいということを覚えておいてください。</para>
</sect1> </sect1>
<sect1> <sect1>
<title>リモート GDB を使ったオンラインカーネルデバッグ</title> <title>リモート GDB を使ったオンラインカーネルデバッグ</title>
<para>この機能は FreeBSD 2.2 からサポートされました. <para>この機能は FreeBSD 2.2 からサポートされました
これは本当にすばらし い機能です.</para> これは本当にすばらし い機能です</para>
<para>GDB はすでにかなり以前より <para>GDB はすでにかなり以前より
<emphasis>リモートデバッグ</emphasis> をサポートしてい ます. <emphasis>リモートデバッグ</emphasis> をサポートしてい ます
これはシリアル回線を使い非常に単純なプロトコルで行ないます. これはシリアル回線を使い非常に単純なプロトコルで行ないます
もちろん, この方法では今までに示した方法とは違い, もちろん、この方法では今までに示した方法とは違い、
2台のマシンが必 要になります. 1台はデバッグ環境のためのホストで, 2 台のマシンが必要になります。1 台はデバッグ環境のためのホストで、
すべてのソースとす すべてのソースとす
べてのシンボルを含んだバイナリのコピーを持っています. もう 1台は べてのシンボルを含んだバイナリのコピーを持っています。もう 1 台は
ターゲットマシンで, 同一のカーネルのコピー (ただしデバッグ情報は ターゲットマシンで同一のカーネルのコピー (ただしデバッグ情報は
取り除いてあるもの) を単に実行するためのものです.</para> 取り除いてあるもの) を単に実行するためのものです</para>
<para>この場合, カーネルのコンフィグレーションは <command>config <para>この場合カーネルのコンフィグレーションは <command>config
-g</command> で行な い, <option>DDB</option> -g</command> で行な い<option>DDB</option>
を含めなくてはなりません. そうして通常通りコンパイルし ます. を含めなくてはなりません。そうして通常通りコンパイルし ます。
こうして作ったバイナリファイルはデバッグ情報のために非常に大き こうして作ったバイナリファイルはデバッグ情報のために非常に大き
くなります. このカーネルをターゲットマシンにコピーして くなりますこのカーネルをターゲットマシンにコピーして
<command>strip -x</command> でデバッグシンボルを取り除きます. <command>strip -x</command> でデバッグシンボルを取り除きます
そして <option>-d</option> ブートオプションを使いブートします. そして <option>-d</option> ブートオプションを使いブートします
sio デバイスにフラグ 0x80 が設定されているターゲットマシンの sio デバイスにフラグ 0x80 が設定されているターゲットマシンの
シリアル回線を, デバッグホストのいずれかのシリアル回線に シリアル回線をデバッグホストのいずれかのシリアル回線に
つないでください. つないでください
それからデバッグ(訳注:ホスト)マシン上で, ターゲットとなって それからデバッグ (訳注:ホスト) マシン上で、ターゲットとなって
いるカーネルのコンパイルディレクトリで <command>gdb</command> を起動します:</para> いるカーネルのコンパイルディレクトリで <command>gdb</command> を起動します:</para>
<screen>&prompt.user; <userinput>gdb -k kernel</userinput> <screen>&prompt.user; <userinput>gdb -k kernel</userinput>
@ -612,8 +612,8 @@ Copyright 1996 Free Software Foundation, Inc...
<prompt>(kgdb)</prompt> </screen> <prompt>(kgdb)</prompt> </screen>
<para>リモートデバッグセッションの初期化 <para>リモートデバッグセッションの初期化
(1番目のシリアルポートを使用する ことの設定) (1 番目のシリアルポートを使用することの設定)
を以下のように行ないます.</para> を以下のように行ないます</para>
<screen><prompt>(kgdb)</prompt> <userinput>target remote /dev/cuaa0</userinput></screen> <screen><prompt>(kgdb)</prompt> <userinput>target remote /dev/cuaa0</userinput></screen>
@ -624,15 +624,15 @@ Copyright 1996 Free Software Foundation, Inc...
Stopped at Debugger+0x35: movb $0, edata+0x51bc Stopped at Debugger+0x35: movb $0, edata+0x51bc
<prompt>db&gt;</prompt> <userinput>gdb</userinput></screen> <prompt>db&gt;</prompt> <userinput>gdb</userinput></screen>
<para>DDB は次のような出力を返すでしょう. </para> <para>DDB は次のような出力を返すでしょう</para>
<screen>Next trap will enter GDB remote protocol mode</screen> <screen>Next trap will enter GDB remote protocol mode</screen>
<para><command>gdb</command>と入力するたびに リモート GDB <para><command>gdb</command>と入力するたびにリモート GDB
とローカル DDB が交互に切り替わ ります. とローカル DDB が交互に切り替わります。
トラップをすぐに起こすために単に ``s'' (step) と入力して下 さい. トラップをすぐに起こすために単に ``s'' (step) と入力して下さい。
そうするとホストの GDB はターゲットのカーネルの制御を行なうよ そうするとホストの GDB はターゲットのカーネルの制御を行なうよ
うになります.</para> うになります</para>
<screen>Remote debugging using /dev/cuaa0 <screen>Remote debugging using /dev/cuaa0
Debugger (msg=0xf01b0383 "Boot flags requested debugger") Debugger (msg=0xf01b0383 "Boot flags requested debugger")
@ -641,27 +641,27 @@ Debugger (msg=0xf01b0383 "Boot flags requested debugger")
<para>このセッションではソースコードへのフルアクセスや Emacs の <para>このセッションではソースコードへのフルアクセスや Emacs の
window 上 の gud-mode (これは別の Emacs window window 上 の gud-mode (これは別の Emacs window
に自動的にソースコードを表示し ます) で動かすなど, 通常の GDB に自動的にソースコードを表示します) で動かすなど、通常の GDB
セッションでできることのほとんどのこ とができます.</para> セッションでできることのほとんどのことができます。</para>
</sect1> </sect1>
<sect1> <sect1>
<title>GDB を使ったローダブルモジュールのデバッグ</title> <title>GDB を使ったローダブルモジュールのデバッグ</title>
<para>モジュール内部で発生する panic のデバッグや, <para>モジュール内部で発生する panic のデバッグや
動的モジュールを使っているマシンを GDB 動的モジュールを使っているマシンを GDB
でリモートデバッグしている場合, でリモートデバッグしている場合
モジュールのシンボル情報を得る方法を モジュールのシンボル情報を得る方法を
GDB に伝える必要があります.</para> GDB に伝える必要があります</para>
<para>まず, モジュールをデバッグ情報を含めて構築する必要があります.</para> <para>まず、モジュールをデバッグ情報を含めて構築する必要があります。</para>
<screen>&prompt.root; <userinput>cd /sys/modules/linux</userinput> <screen>&prompt.root; <userinput>cd /sys/modules/linux</userinput>
&prompt.root; <userinput>make clean; make COPTS=-g</userinput></screen> &prompt.root; <userinput>make clean; make COPTS=-g</userinput></screen>
<para>リモート GDB を使っている場合は, <para>リモート GDB を使っている場合は
ターゲットマシンで <command>kldstat</command> を実行することで ターゲットマシンで <command>kldstat</command> を実行することで
モジュールがどこにロードされたか調べることが可能です.</para> モジュールがどこにロードされたか調べることが可能です</para>
<screen>&prompt.root; <userinput>kldstat</userinput> <screen>&prompt.root; <userinput>kldstat</userinput>
Id Refs Address Size Name Id Refs Address Size Name
@ -670,29 +670,29 @@ Id Refs Address Size Name
3 1 0xc0ad7000 2000 warp_saver.ko 3 1 0xc0ad7000 2000 warp_saver.ko
4 1 0xc0adc000 11000 linux.ko</screen> 4 1 0xc0adc000 11000 linux.ko</screen>
<para>クラッシュダンプをデバッグしている場合, <para>クラッシュダンプをデバッグしている場合
<literal>linker_files->tqh_first</literal> から始まる <literal>linker_files->tqh_first</literal> から始まる
<literal>linker_files</literal> リストを調べ, <literal>linker_files</literal> リストを調べ
探している <literal>filename</literal> が見つかるまで 探している <literal>filename</literal> が見つかるまで
<literal>link.tqe_next</literal> ポインタをたどる必要があります. <literal>link.tqe_next</literal> ポインタをたどる必要があります
エントリ中の <literal>address</literal> メンバが, エントリ中の <literal>address</literal> メンバが
モジュールのロードアドレスです.</para> モジュールのロードアドレスです</para>
<para>次に, モジュール内の text セクションのオフセットを調べます.</para> <para>次に、モジュール内の text セクションのオフセットを調べます。</para>
<screen>&prompt.root; <userinput>objdump --section-headers /sys/modules/linux/linux.ko | grep text</userinput> <screen>&prompt.root; <userinput>objdump --section-headers /sys/modules/linux/linux.ko | grep text</userinput>
3 .rel.text 000016e0 000038e0 000038e0 000038e0 2**2 3 .rel.text 000016e0 000038e0 000038e0 000038e0 2**2
10 .text 00007f34 000062d0 000062d0 000062d0 2**2</screen> 10 .text 00007f34 000062d0 000062d0 000062d0 2**2</screen>
<para>必要なのは <literal>.text</literal> セクションで, <para>必要なのは <literal>.text</literal> セクションで
上の例では 10 にあたります. その 4 番目の 16 進数フィールド 上の例では 10 にあたりますその 4 番目の 16 進数フィールド
(全部で 6 フィールドあります) が, ファイル中の text (全部で 6 フィールドあります) がファイル中の text
セクションのオフセットになります. セクションのオフセットになります
そして, このオフセットをモジュールのロードアドレスに加算すると そしてこのオフセットをモジュールのロードアドレスに加算すると
モジュールのコードの再配置アドレスを求めることができます. モジュールのコードの再配置アドレスを求めることができます
この例では 0xc0adc000 + 0x62d0 = 0xc0ae22d0 です. この例では 0xc0adc000 + 0x62d0 = 0xc0ae22d0 です
GDB コマンド <command>add-symbol-file</command> を使い, GDB コマンド <command>add-symbol-file</command> を使い
得られたモジュールの情報をデバッガに伝えるには, 次のようにします.</para> 得られたモジュールの情報をデバッガに伝えるには、次のようにします。</para>
<screen><prompt>(kgdb)</prompt> <userinput>add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0</userinput> <screen><prompt>(kgdb)</prompt> <userinput>add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0</userinput>
add symbol table from file "/sys/modules/linux/linux.ko" at text_addr = 0xc0ae22d0? add symbol table from file "/sys/modules/linux/linux.ko" at text_addr = 0xc0ae22d0?
@ -700,20 +700,20 @@ add symbol table from file "/sys/modules/linux/linux.ko" at text_addr = 0xc0ae22
Reading symbols from /sys/modules/linux/linux.ko...done. Reading symbols from /sys/modules/linux/linux.ko...done.
<prompt>(kgdb)</prompt></screen> <prompt>(kgdb)</prompt></screen>
<para>これで, モジュール内のすべてのシンボルにアクセスできるようになります.</para> <para>これで、モジュール内のすべてのシンボルにアクセスできるようになります。</para>
</sect1> </sect1>
<sect1> <sect1>
<title>コンソールドライバのデバッグ</title> <title>コンソールドライバのデバッグ</title>
<para>DDBを動かすためにはコンソールドライバが必要ですから, <para>DDBを動かすためにはコンソールドライバが必要ですから
コンソールドラ イバ自身に不具合のある場合は複雑になります. コンソールドラ イバ自身に不具合のある場合は複雑になります
シリアルコンソールを利 用する方法 (ブートブロックを変更するか シリアルコンソールを利 用する方法 (ブートブロックを変更するか
<prompt>Boot:</prompt>プロンプトで <prompt>Boot:</prompt>プロンプトで
<option>-h</option>と入力する) を思い出してください. <option>-h</option>と入力する) を思い出してください
そして標準ター ミナルを最初のシリアルポートに設定します. DDBは, そして標準ター ミナルを最初のシリアルポートに設定します。DDBは、
もちろんシリアルコ ンソールを含むいずれの もちろんシリアルコンソールを含むいずれの
コンソールドライバの設定でも動作します.</para> コンソールドライバの設定でも動作します</para>
</sect1> </sect1>
</chapter> </chapter>

View file

@ -9,41 +9,41 @@
<chapter id="linuxemu"> <chapter id="linuxemu">
<title>Linux バイナリ互換機能</title> <title>Linux バイナリ互換機能</title>
<para><emphasis>オリジナルは Brian N. Handy <email>handy@sxt4.physics.montana.edu</email> と &a.rich; によるものですが, <para><emphasis>オリジナルは Brian N. Handy <email>handy@sxt4.physics.montana.edu</email> と &a.rich; によるものですが
&a.jim; が 2000 年 3 月 22 日に再構成と一部の更新を行ないました.</emphasis></para> &a.jim; が 2000 年 3 月 22 日に再構成と一部の更新を行ないました</emphasis></para>
<para><emphasis>訳: &a.jp.kiroh;, 1996 年 9 月 24 日.</emphasis></para> <para><emphasis>訳: &a.jp.kiroh;、1996 年 9 月 24 日</emphasis></para>
<sect1> <sect1>
<title>この章では</title> <title>この章では</title>
<para>この章では FreeBSD における Linux バイナリとの互換機能について, <para>この章では FreeBSD における Linux バイナリとの互換機能について
インストール方法やその仕組みを解説します.</para> インストール方法やその仕組みを解説します</para>
<para>現時点では, 一体なぜ FreeBSD が Linux <para>現時点では一体なぜ FreeBSD が Linux
バイナリを実行できるようにならなければならないのか自問しているのではないでしょうか? バイナリを実行できるようにならなければならないのか自問しているのではないでしょうか?
答えはきわめて簡単です. 答えはきわめて簡単です
Linux は現在コンピュータの世界では最も<quote>ホットなモノ</quote>なのでたくさんの会社や開発者たちが Linux は現在コンピュータの世界では最も<quote>ホットなモノ</quote>なのでたくさんの会社や開発者たちが
Linux のためだけに開発を行なっています. そのため, 残された私たち Linux のためだけに開発を行なっています。そのため、残された私たち
FreeBSD ユーザは彼らに対して FreeBSD ネイティブなアプリケーションも出すように言うしかないのです. FreeBSD ユーザは彼らに対して FreeBSD ネイティブなアプリケーションも出すように言うしかないのです
問題は, FreeBSD バージョンも出した場合にどれくらいの数のユーザーが使うのかわからない, 問題はFreeBSD バージョンも出した場合にどれくらいの数のユーザーが使うのかわからない
ということであり, そのため Linux 版のみを開発しているということなのです. ということであり、そのため Linux 版のみを開発しているということなのです。
そこで FreeBSD では Linux バイナリ互換機能が役に立つのです.</para> そこで FreeBSD では Linux バイナリ互換機能が役に立つのです</para>
<para>簡単に言ってしまえば, この機能により全ての Linux アプリケーションの <para>簡単に言ってしまえばこの機能により全ての Linux アプリケーションの
90 % が修正なしに FreeBSD 上で起動できます. 90% が修正なしに FreeBSD 上で起動できます
この中には Star Office や Linux 版の Netscape, Adobe Acrobat, RealPlayer 5 と 7, この中には Star Office や Linux 版の Netscape、Adobe Acrobat、RealPlayer 5 と 7、
VMWare, Oracle, WordPerfect, Doom, Quake などがあります. VMWare、Oracle、WordPerfect、Doom、Quake などがあります。
また, ある状況においては Linux バイナリを Linux で動かすよりも またある状況においては Linux バイナリを Linux で動かすよりも
FreeBSD で動かすほうが良いパフォーマンスが出るという報告もあります.</para> FreeBSD で動かすほうが良いパフォーマンスが出るという報告もあります</para>
<para>しかしながら, いくつかの Linux に特有な OS の機能は FreeBSD ではサポートされていません. <para>しかしながら、いくつかの Linux に特有な OS の機能は FreeBSD ではサポートされていません。
例えば, Linux の <filename>/proc</filename> ファイルシステムを過度に使うような 例えばLinux の <filename>/proc</filename> ファイルシステムを過度に使うような
Linux バイナリは FreeBSD では動きません (FreeBSD の <filename>/proc</filename> Linux バイナリは FreeBSD では動きません (FreeBSD の <filename>/proc</filename>
ファイルシステムとは異なるのです) し, ファイルシステムとは異なるのです) し
仮想 8086 モードを有効にするような i386 特有の呼び出しも動きません.</para> 仮想 8086 モードを有効にするような i386 特有の呼び出しも動きません</para>
<para>Linux バイナリ互換モードのインストールに関しては<link linkend="linuxemu-lbc-install">次のセクション</link>をご覧ください.</para> <para>Linux バイナリ互換モードのインストールに関しては<link linkend="linuxemu-lbc-install">次のセクション</link>をご覧ください</para>
</sect1> </sect1>
<sect1 id="linuxemu-lbc-install"> <sect1 id="linuxemu-lbc-install">
@ -51,17 +51,17 @@
<para>3.0-RELEASE以降であればカーネルのコンフィギュレーションファイルに <para>3.0-RELEASE以降であればカーネルのコンフィギュレーションファイルに
<literal>options LINUX</literal> や <literal>options COMPAT_LINUX</literal> <literal>options LINUX</literal> や <literal>options COMPAT_LINUX</literal>
といった行を加える必要はありません.</para> といった行を加える必要はありません</para>
<para>Linux バイナリ互換機能は今は KLD オブジェクト (<quote>Kernel LoaDable object</quote>) <para>Linux バイナリ互換機能は今は KLD オブジェクト (<quote>Kernel LoaDable object</quote>)
として実現されており, リブートしなくても として実現されておりリブートしなくても
<quote>on-the-fly</quote> で組み込むことができるのですが, <quote>on-the-fly</quote> で組み込むことができるのですが
<filename>/etc/rc.conf</filename>に次の行を加える必要があります.</para> <filename>/etc/rc.conf</filename> に次の行を加える必要があります。</para>
<programlisting>linux_enable=<quote>YES</quote></programlisting> <programlisting>linux_enable=<quote>YES</quote></programlisting>
<para>この設定により, <filename>/etc/rc.i386</filename> <para>この設定により<filename>/etc/rc.i386</filename>
では次のような操作が行なわれます.</para> では次のような操作が行なわれます</para>
<programlisting># Start the Linux binary compatibility if requested. <programlisting># Start the Linux binary compatibility if requested.
# #
@ -73,7 +73,7 @@ esac
</programlisting> </programlisting>
<para>望みの KLD モジュールがロードされているか確認したい時には <para>望みの KLD モジュールがロードされているか確認したい時には
<command>kldstat</command> を利用します.</para> <command>kldstat</command> を利用します</para>
<screen>&prompt.user; <userinput>kldstat</userinput> <screen>&prompt.user; <userinput>kldstat</userinput>
Id Refs Address Size Name Id Refs Address Size Name
@ -81,92 +81,92 @@ Id Refs Address Size Name
7 1 0xc24db000 d000 linux.ko</screen> 7 1 0xc24db000 d000 linux.ko</screen>
<para> <para>
何らかの理由で Linux KLD をロードしたくない, 何らかの理由で Linux KLD をロードしたくない
あるいはロードできないような場合には, あるいはロードできないような場合には
<literal>options LINUX</literal> <literal>options LINUX</literal>
をカーネルの設定ファイルに指定して, をカーネルの設定ファイルに指定して
Linux バイナリ互換機能をカーネルにスタティックリンクしてください. Linux バイナリ互換機能をカーネルにスタティックリンクしてください
そして, <link linkend="kernelconfig">FreeBSD カーネルのコンフィギュレーション</link> そして<link linkend="kernelconfig">FreeBSD カーネルのコンフィギュレーション</link>
の記述にしたがって新しいカーネルをインストールしてください.</para> の記述にしたがって新しいカーネルをインストールしてください</para>
<sect2> <sect2>
<title>Linux ランタイムライブラリのインストール</title> <title>Linux ランタイムライブラリのインストール</title>
<para>これは, <link linkend="linuxemu-libs-port">linux_base</link> <para>これは<link linkend="linuxemu-libs-port">linux_base</link>
の port を用いるか, もしくは <link linkend="linuxemu-libs-manually">手動で</link>インストールします.</para> の port を用いるか、もしくは<link linkend="linuxemu-libs-manually">手動で</link>インストールします</para>
<sect3 id="linuxemu-libs-port"> <sect3 id="linuxemu-libs-port">
<title>linux_base の port を用いたインストール</title> <title>linux_base の port を用いたインストール</title>
<para>ランタイムライブラリをインストールするには最も簡単な方法です. <para>ランタイムライブラリをインストールするには最も簡単な方法です
<ulink url="../ports/">ports コレクション</ulink>から他の port <ulink url="../ports/">ports コレクション</ulink>から他の port
をインストールするのと全く同じようにできます.</para> をインストールするのと全く同じようにできます</para>
<screen>&prompt.root; <userinput>cd /usr/ports/emulators/linux_base</userinput> <screen>&prompt.root; <userinput>cd /usr/ports/emulators/linux_base</userinput>
&prompt.root; <userinput>make install distclean</userinput></screen> &prompt.root; <userinput>make install distclean</userinput></screen>
<para>これで Linux バイナリ互換機能が使えるはずです. <para>これで Linux バイナリ互換機能が使えるはずです
いつかのプログラムはシステムライブラリのマイナーバージョンが違うと文句を言うかもしれませんが一般的には大した問題ではありません.</para> いつかのプログラムはシステムライブラリのマイナーバージョンが違うと文句を言うかもしれませんが一般的には大した問題ではありません</para>
</sect3> </sect3>
<sect3 id="linuxemu-libs-manually"> <sect3 id="linuxemu-libs-manually">
<title>手動でのライブラリのインストール</title> <title>手動でのライブラリのインストール</title>
<para><quote>ports</quote>コレクションをインストールしていない場合, <para><quote>ports</quote> コレクションをインストールしていない場合
代わりに手動でライブラリをインストールすることができます. 代わりに手動でライブラリをインストールすることができます
プログラムが必要とする Linux のシェアードライブラリとランタイムリンカが必要です. プログラムが必要とする Linux のシェアードライブラリとランタイムリンカが必要です
また Linux ライブラリ用の <quote>shadow root</quote> ディレクトリ, また Linux ライブラリ用の <quote>shadow root</quote> ディレクトリ
<filename>/compat/linux</filename>, を作成する必要があります. <filename>/compat/linux</filename> を作成する必要があります。
FreeBSD で動作する Linux プログラムが使用するシェアードライブラリは, FreeBSD で動作する Linux プログラムが使用するシェアードライブラリは
まずこのファイルツリーから検索されます. 例えば, まずこのファイルツリーから検索されます。例えば、
Linux のプログラムが <filename>/lib/libc.so</filename> Linux のプログラムが <filename>/lib/libc.so</filename>
をロードしようとした場合には, FreeBSD はまず をロードしようとした場合にはFreeBSD はまず
<filename>/compat/linux/lib/libc.so</filename> <filename>/compat/linux/lib/libc.so</filename>
を開こうとします. これが存在しなかった場合には, 次に を開こうとします。これが存在しなかった場合には、次に
<filename>/lib/libc.so</filename> を試します. <filename>/lib/libc.so</filename> を試します
シェアードライブラリは, Linux の <command>ld.so</command> シェアードライブラリはLinux の <command>ld.so</command>
が報告するパスではなく, が報告するパスではなく
<filename>/compat/linux/lib</filename> <filename>/compat/linux/lib</filename>
以下にインストールする 必要があります.</para> 以下にインストールする必要があります。</para>
<para>Linux のプログラムが必要とする <para>Linux のプログラムが必要とする
シェアードライブラリを探す必要があるのは, FreeBSD シェアードライブラリを探す必要があるのはFreeBSD
のシステムに Linux のシステムに Linux
のプログラムをインストールする最初の数回だけでしょう. のプログラムをインストールする最初の数回だけでしょう
それが過ぎれば, 十分な Linux のシェアードライブラリがシステムにインストールされ, それが過ぎれば、十分な Linux のシェアードライブラリがシステムにインストールされ、
新しくインストールした Linux のバイナリも余計な作業をせずに動作させることができるようになります.</para> 新しくインストールした Linux のバイナリも余計な作業をせずに動作させることができるようになります</para>
</sect3> </sect3>
<sect3> <sect3>
<title>シェアードライブラリの追加</title> <title>シェアードライブラリの追加</title>
<para><filename>linux_base</filename> port をインストールした後に, <para><filename>linux_base</filename> port をインストールした後に
アプリケーションが必要なライブラリが存在しないというエラーを出したらどうしたらよいでしょうか? アプリケーションが必要なライブラリが存在しないというエラーを出したらどうしたらよいでしょうか?
Linux のバイナリがどのシェアードライブラリを必要とし, Linux のバイナリがどのシェアードライブラリを必要とし
そしてどこで入手できるか, どのように探したらよいでしょうか? そしてどこで入手できるかどのように探したらよいでしょうか?
基本的には, 以下の 2 種類の方法があります (以下の手順に従う場合には, 基本的には、以下の 2 種類の方法があります (以下の手順に従う場合には、
必要なインストール作業をおこなう FreeBSD システム上で root 必要なインストール作業をおこなう FreeBSD システム上で root
として作業をおこなう必要があります).</para> として作業をおこなう必要があります)</para>
<para>Linux システムにアクセス可能ならば, <para>Linux システムにアクセス可能ならば
そのアプリケーションがどういうシェアードライブラリを必要としているのか調べ, そのアプリケーションがどういうシェアードライブラリを必要としているのか調べ
単に FreeBSD にそのライブラリをコピーするだけです. 単に FreeBSD にそのライブラリをコピーするだけです
次の例を見てみましょう.</para> 次の例を見てみましょう</para>
<informalexample> <informalexample>
<para>FTP を使って Doom の Linux バイナリを取ってきて, <para>FTP を使って Doom の Linux バイナリを取ってきて
アクセスできる Linux システムに置いたとしましょう. アクセスできる Linux システムに置いたとしましょう
次のように <command>ldd linuxdoom</command> とするだけでどのシェアードライブラリが必要かチェックできます.</para> 次のように <command>ldd linuxdoom</command> とするだけでどのシェアードライブラリが必要かチェックできます</para>
<screen>&prompt.user; <userinput>ldd linuxxdoom</userinput> <screen>&prompt.user; <userinput>ldd linuxxdoom</userinput>
libXt.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libXt.so.3.1.0 libXt.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libX11.so.3.1.0 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> libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>
<para>最後のカラムに表示されているすべてのファイルを持って来て, <para>最後のカラムに表示されているすべてのファイルを持って来て
<filename>/compat/linux</filename> の下に置き, <filename>/compat/linux</filename> の下に置き
最初のカラムに示されるファイル名にシンボリックリンクを張ります. 最初のカラムに示されるファイル名にシンボリックリンクを張ります
すなわち, FreeBSD システムでは以下のようなファイルが必要となります.</para> すなわち、FreeBSD システムでは以下のようなファイルが必要となります。</para>
<screen>/compat/linux/usr/X11/lib/libXt.so.3.1.0 <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 /compat/linux/usr/X11/lib/libXt.so.3 -&gt; libXt.so.3.1.0
@ -177,26 +177,26 @@ libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>
<blockquote> <blockquote>
<note> <note>
<para>最初のカラムに表示されているファイルとメジャーバージョンが同じ <para>最初のカラムに表示されているファイルとメジャーバージョンが同じ
Linux シェアードライブラリを既にインストールしている場合は, Linux シェアードライブラリを既にインストールしている場合は
新たにコピーする 必要はありません. 新たにコピーする 必要はありません
既にあるライブラリで動作するはずです. 既にあるライブラリで動作するはずです
ただ, 新しいバージョンのものをコピーすることをお奨めします. ただ、新しいバージョンのものをコピーすることをお奨めします。
新しいライブラリにシンボリックリンクを変更したら, 新しいライブラリにシンボリックリンクを変更したら
古いライブラリは削除してかまいません. </para> 古いライブラリは削除してかまいません</para>
<screen>/compat/linux/lib/libc.so.4.6.27 <screen>/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.27</screen> /compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.27</screen>
<para>従って, 以上のようなライブラリがインストールされており, <para>従って、以上のようなライブラリがインストールされており、
新しいバイナリに対する <command>ldd</command> 新しいバイナリに対する <command>ldd</command>
の出力が以下のようになる場合を考えます.</para> の出力が以下のようになる場合を考えます</para>
<screen>libc.so.4 (DLL Jump 4.5pl26) -&gt; libc.so.4.6.29</screen> <screen>libc.so.4 (DLL Jump 4.5pl26) -&gt; libc.so.4.6.29</screen>
<para>このように最後の番号が1つか2つ古いだけならば, 普通は <para>このように最後の番号が 1 つか 2 つ古いだけならば、普通は
<filename>/lib/libc.so.4.6.29</filename> <filename>/lib/libc.so.4.6.29</filename>
をコピーする必要はありません. わずかに古いライブラリでもプログラムは動作するはずだからです. をコピーする必要はありません。わずかに古いライブラリでもプログラムは動作するはずだからです。
もちろん, 以下のように新しいライブラリと置き換えても構いません.</para> もちろん、以下のように新しいライブラリと置き換えても構いません。</para>
<screen>/compat/linux/lib/libc.so.4.6.29 <screen>/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.29</screen> /compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.29</screen>
@ -206,9 +206,9 @@ libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>
<blockquote> <blockquote>
<note> <note>
<para>シンボリックリンクのメカニズムは Linux <para>シンボリックリンクのメカニズムは Linux
バイナリに<emphasis>のみ</emphasis>必要なことに注意してください. バイナリに<emphasis>のみ</emphasis>必要なことに注意してください
FreeBSD のランタイムリンカはメジャーリビジョン番号の一致したライブラリを検索するので, FreeBSD のランタイムリンカはメジャーリビジョン番号の一致したライブラリを検索するので
ユーザが気にする必要はありません.</para> ユーザが気にする必要はありません</para>
</note> </note>
</blockquote> </blockquote>
</informalexample> </informalexample>
@ -218,50 +218,50 @@ libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>
<sect2> <sect2>
<title>Linux の ELF バイナリのインストール</title> <title>Linux の ELF バイナリのインストール</title>
<para>ELF のバイナリを使うためには, <para>ELF のバイナリを使うためには
<quote>マークをつける (branding)</quote> 作業が必要になります. <quote>マークをつける (branding)</quote> 作業が必要になります
マークのない ELF バイナリを実行しようとすると以下のようなエラーメッセージを受けとってしまうことでしょう.</para> マークのない ELF バイナリを実行しようとすると以下のようなエラーメッセージを受けとってしまうことでしょう</para>
<screen>&prompt.user; <userinput>./my-linux-elf-binary</userinput> <screen>&prompt.user; <userinput>./my-linux-elf-binary</userinput>
ELF binary type not known ELF binary type not known
Abort</screen> Abort</screen>
<para>カーネルが FreeBSD の ELF バイナリと Linux のバイナリとを <para>カーネルが FreeBSD の ELF バイナリと Linux のバイナリとを
見分けられるようにするためには, &man.brandelf.1; 見分けられるようにするためには&man.brandelf.1;
ユーティリティを以下のようにして使ってください.</para> ユーティリティを以下のようにして使ってください</para>
<screen>&prompt.user; <userinput>brandelf -t Linux my-linux-elf-binary</userinput></screen> <screen>&prompt.user; <userinput>brandelf -t Linux my-linux-elf-binary</userinput></screen>
<para>今ではGNU のツールたちが <para>今では GNU のツールたちが
ELF バイナリに自動的に適切なマークを付加するようになったので, ELF バイナリに自動的に適切なマークを付加するようになったので
今後はこの作業もだんだんと必要なくなってゆくでしょう.</para> 今後はこの作業もだんだんと必要なくなってゆくでしょう</para>
</sect2> </sect2>
<sect2> <sect2>
<title>ホストネームリゾルバの設定</title> <title>ホストネームリゾルバの設定</title>
<para>DNS がうまく動作しなかったり, <para>DNS がうまく動作しなかったり
以下のようなエラーメッセージが表示され 以下のようなエラーメッセージが表示され
る場合は, <filename>/compat/linux/etc/host.conf</filename> る場合は<filename>/compat/linux/etc/host.conf</filename>
ファイルを設定する必要があります.</para> ファイルを設定する必要があります</para>
<screen>resolv+: "bind" is an invalid keyword resolv+: <screen>resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword</screen> "hosts" is an invalid keyword</screen>
<para>ファイルの内容を以下のように設定してください.</para> <para>ファイルの内容を以下のように設定してください</para>
<programlisting>order hosts, bind <programlisting>order hosts, bind
multi on</programlisting> multi on</programlisting>
<para>ここで, order は <filename>/etc/hosts</filename> を最初に検索し, <para>ここで、order は <filename>/etc/hosts</filename> を最初に検索し、
次にDNSを検索するように指定します. 次に DNS を検索するように指定します。
<filename>/compat/linux/etc/host.conf</filename> <filename>/compat/linux/etc/host.conf</filename>
がインストールされていない場合, がインストールされていない場合
Linux アプリケーションは FreeBSD の Linux アプリケーションは FreeBSD の
<filename>/etc/host.conf</filename> を使用しようとして, <filename>/etc/host.conf</filename> を使用しようとして
文法の違いによる警告を出力します. 文法の違いによる警告を出力します
<filename>/etc/resolv.conf</filename> を利用してネームサーバの設定をしていない場合には, <filename>/etc/resolv.conf</filename> を利用してネームサーバの設定をしていない場合には
<literal>bind</literal> を削除してください.</para> <literal>bind</literal> を削除してください</para>
</sect2> </sect2>
</sect1> </sect1>
@ -269,28 +269,28 @@ multi on</programlisting>
<title>Mathematica のインストール</title> <title>Mathematica のインストール</title>
<para><emphasis>Mathematica 4.x 用に &a.murray; <para><emphasis>Mathematica 4.x 用に &a.murray;
がアップデートし, Bojan Bistrovic <email>bojanb@physics.odu.edu</email> がアップデートしBojan Bistrovic <email>bojanb@physics.odu.edu</email>
がマージしました.</emphasis></para> がマージしました</emphasis></para>
<para>この章では, Mathematica 4.X Linux 版の FreeBSD <para>この章ではMathematica 4.X Linux 版の FreeBSD
へのインストールについて説明します.</para> へのインストールについて説明します</para>
<para>Linux 版の Mathematica は FreeBSD においても完璧に動きます. <para>Linux 版の Mathematica は FreeBSD においても完璧に動きます
ただ, 実行する際に Linux ABI を用いる必要があることを ただ実行する際に Linux ABI を用いる必要があることを
FreeBSD に教えるために, Wolfram によって出荷されているバイナリにマーク付け FreeBSD に教えるためにWolfram によって出荷されているバイナリにマーク付け
(branded) をする必要があります.</para> (branded) をする必要があります</para>
<para>Mathematica や Mathematica for Students の Linux 版は Wolfram <para>Mathematica や Mathematica for Students の Linux 版は Wolfram
(<ulink url="http://www.wolfram.com/">http://www.wolfram.com/</ulink>) (<ulink url="http://www.wolfram.com/">http://www.wolfram.com/</ulink>)
から直接注文することができます.</para> から直接注文することができます</para>
<sect2> <sect2>
<title>Linux バイナリへのマーク付け (branding)</title> <title>Linux バイナリへのマーク付け (branding)</title>
<para>Linux 用バイナリは Wolfram の Mathematica CD-ROM の <para>Linux 用バイナリは Wolfram の Mathematica CD-ROM の
<filename>Unix</filename> ディレクトリにあります. <filename>Unix</filename> ディレクトリにあります
インストーラーを起動する前にこのディレクトリをローカルディスクにコピーし, インストーラーを起動する前にこのディレクトリをローカルディスクにコピーし
&man.brandelf.1; により Linux バイナリにマークを付けます.</para> &man.brandelf.1; により Linux バイナリにマークを付けます</para>
<screen>&prompt.root; <userinput>mount /cdrom</userinput> <screen>&prompt.root; <userinput>mount /cdrom</userinput>
&prompt.root; <userinput>cp -rp /cdrom/Unix/ /localdir/</userinput> &prompt.root; <userinput>cp -rp /cdrom/Unix/ /localdir/</userinput>
@ -303,70 +303,70 @@ multi on</programlisting>
&prompt.root; <userinput>cd /localdir/Installers/Linux/</userinput> &prompt.root; <userinput>cd /localdir/Installers/Linux/</userinput>
&prompt.root; <userinput>./MathInstaller</userinput></screen> &prompt.root; <userinput>./MathInstaller</userinput></screen>
<para>また以下のようにすると, マーク付けされていない <para>また以下のようにするとマーク付けされていない
ELF バイナリすべての扱いを, デフォルトで Linux ELF バイナリすべての扱いをデフォルトで Linux
バイナリとすることが可能です.</para> バイナリとすることが可能です</para>
<screen>&prompt.root; <userinput>sysctl -w kern.fallback_elf_brand=3</userinput> <screen>&prompt.root; <userinput>sysctl -w kern.fallback_elf_brand=3</userinput>
</screen> </screen>
<para>これは FreeBSD システムに対して, <para>これは FreeBSD システムに対して
マーク付けされていない ELF バイナリが マーク付けされていない ELF バイナリが
Linux ABI を利用するように設定します. こうすることで, Linux ABI を利用するように設定します。こうすることで、
CDROM から直接インストーラを実行することが可能になります.</para> CDROM から直接インストーラを実行することが可能になります</para>
</sect2> </sect2>
<sect2> <sect2>
<title>Mathematica パスワードの取得</title> <title>Mathematica パスワードの取得</title>
<para>Mathematica を起動する前に Wolfram から自分の <para>Mathematica を起動する前に Wolfram から自分の
<quote>マシン ID</quote> に対応したパスワードを取得しなければいけません.</para> <quote>マシン ID</quote> に対応したパスワードを取得しなければいけません</para>
<para>一旦 Linux 互換ランタイムライブラリをインストールし, <para>一旦 Linux 互換ランタイムライブラリをインストールし
Mathematica を展開すれば Install ディレクトリにある Mathematica を展開すれば Install ディレクトリにある
<command>mathinfo</command> プログラムを起動して <command>mathinfo</command> プログラムを起動して
<quote>マシン ID</quote> を得ることができます. <quote>マシン ID</quote> を得ることができます
このマシン ID は, 最初に見つかったイーサネットカードの MAC アドレスをベースに生成されます.</para> このマシン ID は最初に見つかったイーサネットカードの MAC アドレスをベースに生成されます</para>
<screen>&prompt.root; <userinput>cd /localdir/Files/SystemFiles/Installation/Binaries/Linux</userinput> <screen>&prompt.root; <userinput>cd /localdir/Files/SystemFiles/Installation/Binaries/Linux</userinput>
&prompt.root; <userinput>mathinfo</userinput> &prompt.root; <userinput>mathinfo</userinput>
disco.example.com 7115-70839-20412</screen> disco.example.com 7115-70839-20412</screen>
<para>電子メールや電話, FAXなどでWolfram に登録する時にはこの <para>電子メールや電話、FAX などで Wolfram に登録する時にはこの
<quote>マシン ID</quote> を渡します. <quote>マシン ID</quote> を渡します
するといくつかの数字から構成されるパスワードが返されるので, するといくつかの数字から構成されるパスワードが返されるので
他の Mathematica プラットホームでするのと全く同じように最初に 他の Mathematica プラットホームでするのと全く同じように最初に
Mathematica を立ち上げる時にその情報を入力します.</para> Mathematica を立ち上げる時にその情報を入力します</para>
</sect2> </sect2>
<sect2> <sect2>
<title>ネットワーク経由での Mathematica フロントエンドの起動</title> <title>ネットワーク経由での Mathematica フロントエンドの起動</title>
<para> <para>
Mathematica は標準フォントセットにない特別な記号 (積分記号, 総和記号, Mathematica は標準フォントセットにない特別な記号 (積分記号、総和記号、
ギリシャ文字など) を表示するために特殊なフォントを使用します. ギリシャ文字など) を表示するために特殊なフォントを使用します
X プロトコルは, X プロトコルは
これらのフォントが<emphasis>ローカルマシンに</emphasis>インストールされていることを要求します. これらのフォントが<emphasis>ローカルマシンに</emphasis>インストールされていることを要求します
これはつまり, ローカルマシンに (CD-ROM や Mathematica これはつまりローカルマシンに (CD-ROM や Mathematica
がインストールされているホストマシンから) そのフォントをコピーしなければならないということです. がインストールされているホストマシンから) そのフォントをコピーしなければならないということです
これらのフォントは通常, CD-ROM の これらのフォントは通常CD-ROM の
<filename>/cdrom/Unix/Files/SystemFiles/Fonts</filename> か, もしくはハードディスクの <filename>/cdrom/Unix/Files/SystemFiles/Fonts</filename> かもしくはハードディスクの
<filename>/usr/local/mathematica/SystemFiles/Fonts</filename> <filename>/usr/local/mathematica/SystemFiles/Fonts</filename>
に置かれており, 実際に使用されるフォントは <filename>Type1</filename> と に置かれており実際に使用されるフォントは <filename>Type1</filename> と
<filename>X</filename> のサブディレクトリに格納されています. <filename>X</filename> のサブディレクトリに格納されています
これらを利用するには次のような二つ方法があります.</para> これらを利用するには次のような二つ方法があります</para>
<para>一つは, フォントファイルをすべて <para>一つはフォントファイルをすべて
<filename>/usr/X11R6/lib/X11/fonts/</filename> <filename>/usr/X11R6/lib/X11/fonts/</filename>
以下にある既存のフォントディレクトリにコピーする方法です. 以下にある既存のフォントディレクトリにコピーする方法です
この場合, <filename>fonts.dir</filename> にフォント名を追加し, この場合、<filename>fonts.dir</filename> にフォント名を追加し、
先頭行のフォント総数を変更することも必要になります. 先頭行のフォント総数を変更することも必要になります
あるいは, フォントをコピーしたディレクトリで あるいはフォントをコピーしたディレクトリで
<command>mkfontdir</command> を実行するだけでもかまいません.</para> <command>mkfontdir</command> を実行するだけでもかまいません</para>
<para>もう一つの方法は, <para>もう一つの方法は
<filename>/usr/X11R6/lib/X11/fonts/</filename> <filename>/usr/X11R6/lib/X11/fonts/</filename>
にフォントディレクトリごとコピーする方法です.</para> にフォントディレクトリごとコピーする方法です</para>
<screen>&prompt.root; <userinput>cd /usr/X11R6/lib/X11/fonts</userinput> <screen>&prompt.root; <userinput>cd /usr/X11R6/lib/X11/fonts</userinput>
&prompt.root; <userinput>mkdir X</userinput> &prompt.root; <userinput>mkdir X</userinput>
@ -379,21 +379,21 @@ disco.example.com 7115-70839-20412</screen>
&prompt.root; <userinput>cd ../MathType1</userinput> &prompt.root; <userinput>cd ../MathType1</userinput>
&prompt.root; <userinput>mkfontdir</userinput</screen> &prompt.root; <userinput>mkfontdir</userinput</screen>
<para>そして, フォントパスに新しいフォントディレクトリを追加します.</para> <para>そして、フォントパスに新しいフォントディレクトリを追加します。</para>
<screen>&prompt.root; <userinput>xset fp+ /usr/X11R6/lib/X11/fonts/X</userinput> <screen>&prompt.root; <userinput>xset fp+ /usr/X11R6/lib/X11/fonts/X</userinput>
&prompt.root; <userinput>xset fp+ /usr/X11R6/lib/X11/fonts/MathType1</userinput> &prompt.root; <userinput>xset fp+ /usr/X11R6/lib/X11/fonts/MathType1</userinput>
&prompt.root; <userinput>xset fp rehash</userinput></screen> &prompt.root; <userinput>xset fp rehash</userinput></screen>
<para>XFree86 サーバを使用しているなら, <para>XFree86 サーバを使用しているなら
<filename>/etc/XF86Config</filename> に加えることでこれらのフォントを自動的に読み込むことができます.</para> <filename>/etc/XF86Config</filename> に加えることでこれらのフォントを自動的に読み込むことができます</para>
<para> <para>
<filename>/usr/X11R6/lib/X11/fonts/Type1</filename> という <filename>/usr/X11R6/lib/X11/fonts/Type1</filename> という
ディレクトリが<emphasis>存在していない</emphasis>場合には, ディレクトリが<emphasis>存在していない</emphasis>場合には
上記例の <filename>MathType1</filename> を 上記例の <filename>MathType1</filename> を
<filename>Type1</filename> <filename>Type1</filename>
とすることができます.</para> とすることができます</para>
</sect2> </sect2>
</sect1> </sect1>
@ -406,51 +406,51 @@ disco.example.com 7115-70839-20412</screen>
<sect2> <sect2>
<title>はじめに</title> <title>はじめに</title>
<para>このドキュメントでは Oracle 8.0.5 と Oracle 8.0.5.1 Enterprise Edition <para>このドキュメントでは Oracle 8.0.5 と Oracle 8.0.5.1 Enterprise Edition
の Linux 版を FreeBSD にインストールするための手順を解説します.</para> の Linux 版を FreeBSD にインストールするための手順を解説します</para>
</sect2> </sect2>
<sect2> <sect2>
<title>Linux 環境のインストール</title> <title>Linux 環境のインストール</title>
<para>まずは Ports Collection から <filename>linux_base</filename> と <para>まずは Ports Collection から <filename>linux_base</filename> と
<filename>linux_devtools</filename> をインストールしてください. <filename>linux_devtools</filename> をインストールしてください
これらの ports は FreeBSD 3.2 のリリース後にコレクションに加えられました. これらの ports は FreeBSD 3.2 のリリース後にコレクションに加えられました
もし FreeBSD 3.2 もしくはそれよりも古いものを使っている場合は もし FreeBSD 3.2 もしくはそれよりも古いものを使っている場合は
ports コレクションをアップデートしましょう. ついでに FreeBSD ports コレクションをアップデートしましょうついでに FreeBSD
をアップデートするのもいいでしょう. もし <filename>linux_base-6.1</filename> をアップデートするのもいいでしょうもし <filename>linux_base-6.1</filename>
や <filename>linux_devtools-6.1</filename> でうまくいかなければ や <filename>linux_devtools-6.1</filename> でうまくいかなければ
5.2 を試してみてください.</para> 5.2 を試してみてください</para>
<para>もし賢いエージェント (intelligent agent) を起動したいなら <para>もし賢いエージェント (intelligent agent) を起動したいなら
Red Hat TCL パッケージ <filename>tcl-8.0.3-20.i386.rpm</filename> Red Hat TCL パッケージ <filename>tcl-8.0.3-20.i386.rpm</filename>
もインストールする必要があるでしょう. もインストールする必要があるでしょう
公式の RPM パッケージをインストールするには一般的に次のようにします.</para> 公式の RPM パッケージをインストールするには一般的に次のようにします</para>
<screen>&prompt.root; <userinput>rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm <replaceable>package</replaceable></userinput></screen> <screen>&prompt.root; <userinput>rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm <replaceable>package</replaceable></userinput></screen>
<para>パッケージのインストール時にエラーが出てはいけません.</para> <para>パッケージのインストール時にエラーが出てはいけません</para>
</sect2> </sect2>
<sect2> <sect2>
<title>Oracle 環境の構築</title> <title>Oracle 環境の構築</title>
<para>Oracleをインストールする前に, 適切な環境を設定する必要があります. <para>Oracleをインストールする前に、適切な環境を設定する必要があります。
このドキュメントでは, このドキュメントでは
Oracle のインストールガイドに書いてあるようなことではなく Oracle のインストールガイドに書いてあるようなことではなく
FreeBSD で Linux 用 Oracle FreeBSD で Linux 用 Oracle
を動かすために<emphasis>特別に</emphasis>必要なことのみを解説します.</para> を動かすために<emphasis>特別に</emphasis>必要なことのみを解説します</para>
<sect3 id="linuxemu-kernel-tuning"> <sect3 id="linuxemu-kernel-tuning">
<title>カーネルのチューニング</title> <title>カーネルのチューニング</title>
<para>Oracle インストールガイドにあるように, <para>Oracle インストールガイドにあるように
シェアードメモリーの最大サイズを設定しなければいけません. シェアードメモリーの最大サイズを設定しなければいけません
FreeBSD では <literal>SHMMAX</literal> を使わないようにしてください. FreeBSD では <literal>SHMMAX</literal> を使わないようにしてください
<literal>SHMMAX</literal> は単に <literal>SHMMAXPGS</literal> <literal>SHMMAX</literal> は単に <literal>SHMMAXPGS</literal>
と <literal>PGSIZE</literal> から計算されるだけなのです. と <literal>PGSIZE</literal> から計算されるだけなのです
従って, <literal>SHMMAXPGS</literal> を使うようにしましょう. 従って、<literal>SHMMAXPGS</literal> を使うようにしましょう。
インストールガイドに記述されている他のオプションは使えます. インストールガイドに記述されている他のオプションは使えます
例えば以下のようにします.</para> 例えば以下のようにします</para>
<programlisting>options SHMMAXPGS=10000 <programlisting>options SHMMAXPGS=10000
options SHMMNI=100 options SHMMNI=100
@ -459,10 +459,10 @@ options SEMMNS=200
options SEMMNI=70 options SEMMNI=70
options SEMMSL=61</programlisting> options SEMMSL=61</programlisting>
<para>これらのオプションを意図した Oracle の使い方に合わせて設定してください.</para> <para>これらのオプションを意図した Oracle の使い方に合わせて設定してください</para>
<para>また, <para>また
次のオプションがカーネルのコンフィギュレーションファイルにあることも確認します.</para> 次のオプションがカーネルのコンフィギュレーションファイルにあることも確認します</para>
<programlisting>options SYSVSHM #SysV shared memory <programlisting>options SYSVSHM #SysV shared memory
options SYSVSEM #SysV semaphores options SYSVSEM #SysV semaphores
@ -473,17 +473,17 @@ options SYSVMSG #SysV interprocess communication</programlisting>
<title>Oracle 用アカウント</title> <title>Oracle 用アカウント</title>
<para>他のアカウントを作るのと同じように Oracle 用のアカウントを作ります. <para>他のアカウントを作るのと同じように Oracle 用のアカウントを作ります
Oracle 用のアカウントに特別なのは Linux のシェルを割り当てるところだけです. Oracle 用のアカウントに特別なのは Linux のシェルを割り当てるところだけです
<filename>/etc/shells</filename> に <literal>/compat/linux/bin/bash</literal> <filename>/etc/shells</filename> に <literal>/compat/linux/bin/bash</literal>
を加え, Oracle 用のアカウントに設定します.</para> を加え、Oracle 用のアカウントに設定します。</para>
</sect3> </sect3>
<sect3 id="linuxemu-environment"> <sect3 id="linuxemu-environment">
<title>環境設定</title> <title>環境設定</title>
<para><envar>ORACLE_HOME</envar> や <envar>ORACLE_SID</envar> <para><envar>ORACLE_HOME</envar> や <envar>ORACLE_SID</envar>
といった通常の Oracle 用の変数の他に次の変数も設定しなければなりません.</para> といった通常の Oracle 用の変数の他に次の変数も設定しなければなりません</para>
<informaltable frame="none"> <informaltable frame="none">
<tgroup cols="2"> <tgroup cols="2">
@ -525,8 +525,8 @@ $ORACLE_HOME/bin</literal></entry>
</tgroup> </tgroup>
</informaltable> </informaltable>
<para>全ての環境変数は <filename>.profile</filename> で設定することをお勧めします. <para>全ての環境変数は <filename>.profile</filename> で設定することをお勧めします
完璧なサンプルは以下の通りです.</para> 完璧なサンプルは以下の通りです</para>
<programlisting>ORACLE_BASE=/oracle; export ORACLE_BASE <programlisting>ORACLE_BASE=/oracle; export ORACLE_BASE
ORACLE_HOME=/oracle; export ORACLE_HOME ORACLE_HOME=/oracle; export ORACLE_HOME
@ -544,17 +544,17 @@ export PATH</programlisting>
<sect2> <sect2>
<title>Oracle のインストール</title> <title>Oracle のインストール</title>
<para>インストーラーを起動する前に, <filename>/var/tmp</filename> <para>インストーラーを起動する前に<filename>/var/tmp</filename>
に <filename>.oracle</filename> という名前のディレクトリを作る必要がありますが, に <filename>.oracle</filename> という名前のディレクトリを作る必要がありますが
これは Linux エミュレーターにおけるちょっとした不整合のためです. これは Linux エミュレーターにおけるちょっとした不整合のためです
このディレクトリは誰でもが書けるか, もしくは oracle ユーザーのものにしておきます. このディレクトリは誰でもが書けるか、もしくは oracle ユーザーのものにしておきます。
これで特に問題なく Oracle がインストールできるでしょう. これで特に問題なく Oracle がインストールできるでしょう
もし問題が起こったら, まずは Oracle の配布物や設定をチェックしてください. もし問題が起こったら、まずは Oracle の配布物や設定をチェックしてください。
Oracle のインストールが終わったら次の二つのサブセクションで解説するパッチを当てます.</para> Oracle のインストールが終わったら次の二つのサブセクションで解説するパッチを当てます</para>
<para>よくあるトラブルは, TCP プロトコルアダプターが正しくインストールされていないことです. <para>よくあるトラブルは、TCP プロトコルアダプターが正しくインストールされていないことです。
そのため, 一切 TCP リスナーを起動することができないのです. そのため、一切 TCP リスナーを起動することができないのです。
次の操作はこの問題を解決するのに役立ちます.</para> 次の操作はこの問題を解決するのに役立ちます</para>
<screen>&prompt.root; <userinput>cd $ORACLE_HOME/network/lib</userinput> <screen>&prompt.root; <userinput>cd $ORACLE_HOME/network/lib</userinput>
&prompt.root; <userinput>make -f ins_network.mk ntcontab.o</userinput> &prompt.root; <userinput>make -f ins_network.mk ntcontab.o</userinput>
@ -568,13 +568,13 @@ export PATH</programlisting>
<sect3 id="linuxemu-patch-root"> <sect3 id="linuxemu-patch-root">
<title>root.sh へのパッチ</title> <title>root.sh へのパッチ</title>
<para>Oracle をインストールする時, <username>root</username> <para>Oracle をインストールする時<username>root</username>
で行なう必要のあるいくつかの操作は <filename>root.sh</filename> で行なう必要のあるいくつかの操作は <filename>root.sh</filename>
と呼ばれるシェルスクリプトに記録されます. と呼ばれるシェルスクリプトに記録されます
<filename>root.sh</filename> は <filename>orainst</filename> <filename>root.sh</filename> は <filename>orainst</filename>
ディレクトリにあります. 次のパッチを root.sh に当てて ディレクトリにあります次のパッチを root.sh に当てて
正しい場所にある chown コマンドを使うようにするか, 正しい場所にある chown コマンドを使うようにするか
代わりに Linux ネイティブなシェルのもとでスクリプトを走らせましょう.</para> 代わりに 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 --- orainst/root.sh Mon Dec 28 15:58:53 1998
@ -595,17 +595,17 @@ export PATH</programlisting>
# Define variables to be used in this script</programlisting> # Define variables to be used in this script</programlisting>
<para>CD-ROM からのインストールでない場合は <filename>root.sh</filename> <para>CD-ROM からのインストールでない場合は <filename>root.sh</filename>
のソースにパッチを当ててもいいでしょう. のソースにパッチを当ててもいいでしょう
<filename>rthd.sh</filename> という名前でソースツリーの <filename>rthd.sh</filename> という名前でソースツリーの
<filename>orainst</filename> というディレクトリにあります.</para> <filename>orainst</filename> というディレクトリにあります</para>
</sect3> </sect3>
<sect3 id="linuxemu-patch-tcl"> <sect3 id="linuxemu-patch-tcl">
<title>genclntsh へのパッチ</title> <title>genclntsh へのパッチ</title>
<para>genclntsh スクリプトは一つの共有クライアントライブラリを生成するのに用いられます. <para>genclntsh スクリプトは一つの共有クライアントライブラリを生成するのに用いられます
これはデモを作る時に使われます. これはデモを作る時に使われます
PATH の定義をコメントアウトするために次のパッチを当ててください.</para> PATH の定義をコメントアウトするために次のパッチを当ててください</para>
<programlisting>*** bin/genclntsh.orig Wed Sep 30 07:37:19 1998 <programlisting>*** bin/genclntsh.orig Wed Sep 30 07:37:19 1998
--- bin/genclntsh Tue Dec 22 15:36:49 1998 --- bin/genclntsh Tue Dec 22 15:36:49 1998
@ -630,153 +630,153 @@ export PATH</programlisting>
<sect2> <sect2>
<title>Oracle の起動</title> <title>Oracle の起動</title>
<para>インストラクションに従えば, Linux でと同じように <para>インストラクションに従えばLinux でと同じように
Oracle を起動できるでしょう.</para> Oracle を起動できるでしょう</para>
</sect2> </sect2>
</sect1> </sect1>
<sect1> <sect1>
<title>高度なトピックス</title> <title>高度なトピックス</title>
<para>Linux バイナリ互換機能がどのような仕組みなのか興味がある人はこのセクションを読んでください. <para>Linux バイナリ互換機能がどのような仕組みなのか興味がある人はこのセクションを読んでください
以下の文章で説明されていることのほとんどは &a.chat; に投稿された 以下の文章で説明されていることのほとんどは &a.chat; に投稿された
Terry Lambert (<email>tlambert@primenet.com</email>) 氏のメール Terry Lambert (<email>tlambert@primenet.com</email>) 氏のメール
(Message ID: <literal>&lt;199906020108.SAA07001@usr09.primenet.com&gt;</literal>). (Message ID: <literal>&lt;199906020108.SAA07001@usr09.primenet.com&gt;</literal>)
をもとにしています.</para> をもとにしています</para>
<sect2> <sect2>
<title>どのように動くのでしょう?</title> <title>どのように動くのでしょう?</title>
<para>FreeBSD は, &ldquo;実行クラスローダ(execution class loader)&rdquo; <para>FreeBSD は、&ldquo;実行クラスローダ (execution class loader) &rdquo;
と呼ばれる抽象的な機構を持っています. これは &man.execve.2 と呼ばれる抽象的な機構を持っていますこれは &man.execve.2
システムコールへの楔という形で実装されています. システムコールへの楔という形で実装されています
</para> </para>
<para>FreeBSD は, シェルインタプリタやシェルスクリプトを実行するための <para>FreeBSD はシェルインタプリタやシェルスクリプトを実行するための
<literal>#!</literal> ローダを持った単一のプログラムローダではなく, <literal>#!</literal> ローダを持った単一のプログラムローダではなく
ローダのリストを持っているのです. ローダのリストを持っているのです
</para> </para>
<para>歴史的には, UNIX プラットフォーム上の唯一のローダーがマジックナンバー <para>歴史的にはUNIX プラットフォーム上の唯一のローダーがマジックナンバー
(一般的にはファイルの先頭の 4 ないし 8 バイトの部分) (一般的にはファイルの先頭の 4 ないし 8 バイトの部分)
の検査を行ないシステムで実行できるバイナリかどうかを検査し, の検査を行ないシステムで実行できるバイナリかどうかを検査し
もしそうならバイナリローダーを呼び出すというようになっていました.</para> もしそうならバイナリローダーを呼び出すというようになっていました</para>
<para>もし, そのシステム用のバイナリでない場合には, <para>もし、そのシステム用のバイナリでない場合には、
&man.execve.2; システムコールの呼び出しは失敗の戻り値を返し, &man.execve.2; システムコールの呼び出しは失敗の戻り値を返し
シェルがシェルコマンドとして実行しようと試みていたわけです. シェルがシェルコマンドとして実行しようと試みていたわけです
</para> </para>
<para>この仮定は<quote>現在利用しているシェルがどのようなものであっても</quote>変わりません.</para> <para>この仮定は<quote>現在利用しているシェルがどのようなものであっても</quote>変わりません</para>
<para>後に &man.sh.1; に変更が加えられ, 先頭の 2 バイトを検査した結果 <para>後に &man.sh.1; に変更が加えられ先頭の 2 バイトを検査した結果
<literal>:\n</literal> であれば代わりに &man.csh.1; を呼び出す, <literal>:\n</literal> であれば代わりに &man.csh.1; を呼び出す
というようになりました(この変更は SCO が最初に行なったと思われます).</para> というようになりました (この変更は SCO が最初に行なったと思われます)</para>
<para>現在の FreeBSD は, プログラムローダリストを走査します. <para>現在の FreeBSD は、プログラムローダリストを走査します。
その際, 空白文字までの文字列をインタプリタとして認識する, その際、空白文字までの文字列をインタプリタとして認識する、
通常の <literal>#!</literal> ローダを用いるため, 通常の <literal>#!</literal> ローダを用いるため
該当するものが存在しなければ最終的に /bin/sh がロードされます.</para> 該当するものが存在しなければ最終的に /bin/sh がロードされます</para>
<para>Linux ABI をサポートするため, FreeBSD は <para>Linux ABI をサポートするためFreeBSD は
ELF バイナリを示すマジックナンバを確認します. ELF バイナリを示すマジックナンバを確認します
(ただし, この段階では FreeBSD, Solaris, Linux, そしてその他の (ただし、この段階では FreeBSD、Solaris、Linux、そしてその他の
ELF イメージ形式を使っている OS を区別することはできません).</para> ELF イメージ形式を使っている OS を区別することはできません)</para>
<para>ELF ローダは, 特殊な<emphasis>マーク (brand)</emphasis> があるかどうか探します. <para>ELF ローダは、特殊な<emphasis>マーク (brand)</emphasis> があるかどうか探します。
このマークとは, ELF イメージのコメントセクションのことです. このマークとは、ELF イメージのコメントセクションのことです。
SVR4/Solaris の ELF バイナリには, このセクションは存在しません.</para> SVR4/Solaris の ELF バイナリには、このセクションは存在しません。</para>
<para>Linux バイナリを実行するためには, <para>Linux バイナリを実行するためには
ELF バイナリに &man.brandelf.1; で説明されている ELF バイナリに &man.brandelf.1; で説明されている
<literal>Linux</literal> のマークが<emphasis>付けられて</emphasis>いなければなりません.</para> <literal>Linux</literal> のマークが<emphasis>付けられて</emphasis>いなければなりません</para>
<screen>&prompt.root; <userinput>brandelf -t Linux file</userinput></screen> <screen>&prompt.root; <userinput>brandelf -t Linux file</userinput></screen>
<para>上のようにすることで, 指定されたファイルは <para>上のようにすることで指定されたファイルは
<literal>Linux</literal> のマークが付けられ, <literal>Linux</literal> のマークが付けられ
ELF ローダが認識できるようになります.</para> ELF ローダが認識できるようになります</para>
<para>ELF ローダが <literal>Linux</literal> マークを確認すると, <para>ELF ローダが <literal>Linux</literal> マークを確認すると
ローダは <literal>proc</literal> 構造体内の ローダは <literal>proc</literal> 構造体内の
ある一つのポインタを置き換えます. システムコールは全て, ある一つのポインタを置き換えます。システムコールは全て、
このポインタ (伝統的な UNIX システムではこれは構造体の配列 <literal>sysent[]</literal> このポインタ (伝統的な UNIX システムではこれは構造体の配列 <literal>sysent[]</literal>
, システムコールが含まれています) を通してインデックスされます. 、システムコールが含まれています) を通してインデックスされます。
さらに, そのプロセスには Linux カーネルモジュールに必要な さらにそのプロセスには Linux カーネルモジュールに必要な
シグナルトランポリンコード(訳注: シグナルトランポリンコード (訳注:
シグナルの伝播を実現するコード) 用の特殊なトラップベクタの設定や, シグナルの伝播を実現するコード) 用の特殊なトラップベクタの設定や
他の(細かな)調整のための設定が行なわれます.</para> 他の (細かな) 調整のための設定が行なわれます。</para>
<para>Linux システムコールベクタは, <para>Linux システムコールベクタは
さまざまなデータに加えて <literal>sysent[]</literal> さまざまなデータに加えて <literal>sysent[]</literal>
エントリーのリストを含んでおり, それらのアドレスはカーネルモジュール内にあります.</para> エントリーのリストを含んでおり、それらのアドレスはカーネルモジュール内にあります。</para>
<para>Linux バイナリがシステムコールを発行する際, トラップコードは <para>Linux バイナリがシステムコールを発行する際トラップコードは
<literal>proc</literal> 構造体を用いてシステムコール関数ポインタを <literal>proc</literal> 構造体を用いてシステムコール関数ポインタを
解釈します. そして FreeBSD ではなく 解釈しますそして FreeBSD ではなく
Linux 用のシステムコールエントリポイントを得るわけです.</para> Linux 用のシステムコールエントリポイントを得るわけです</para>
<para>さらに, Linux モードは状況に応じて<emphasis>ファイルシステム本来のルートマウントポイントを置き換えて</emphasis>ファイルの参照を行ないます. <para>さらにLinux モードは状況に応じて<emphasis>ファイルシステム本来のルートマウントポイントを置き換えて</emphasis>ファイルの参照を行ないます
これは, <literal>union</literal> オプションを指定してマウントされたファイルシステム これは<literal>union</literal> オプションを指定してマウントされたファイルシステム
(unionfs では<emphasis>ありません!</emphasis>)が行なっていることと同じです. (unionfs では<emphasis>ありません!</emphasis>)が行なっていることと同じです
ファイルを検索する際にはまず ファイルを検索する際にはまず
<filename>/compat/linux/<replaceable>original-path</replaceable></filename> <filename>/compat/linux/<replaceable>original-path</replaceable></filename>
ディレクトリを, <emphasis>それから</emphasis>見つけられなかったときにのみ, ディレクトリを、<emphasis>それから</emphasis>見つけられなかったときにのみ、
<filename>/<replaceable>original-path</replaceable></filename> <filename>/<replaceable>original-path</replaceable></filename>
を調べます. を調べます
こうすることで, 他のバイナリを要求するバイナリの実行を可能にしています こうすることで他のバイナリを要求するバイナリの実行を可能にしています
(したがって, Linux 用プログラムツールは Linux ABI サポート環境下で完全に動作するわけです). (したがってLinux 用プログラムツールは Linux ABI サポート環境下で完全に動作するわけです)
またこれは, もし対応する Linux バイナリが存在しない場合に またこれはもし対応する Linux バイナリが存在しない場合に
Linux バイナリが FreeBSD バイナリをロードしたり, 実行したりすることが可能であること, Linux バイナリが FreeBSD バイナリをロードしたり、実行したりすることが可能であること、
その Linux バイナリに自分自身が Linux 上で実行されていないことを その Linux バイナリに自分自身が Linux 上で実行されていないことを
気付かせないようにする目的で, &man.uname.1; コマンドを 気付かせないようにする目的で&man.uname.1; コマンドを
<filename>/compat/linux</filename> ディレクトリに置くことができる, <filename>/compat/linux</filename> ディレクトリに置くことができる
ということを意味します. ということを意味します
</para> </para>
<para>要するに, Linux カーネルが FreeBSD カーネルの内部に存在しているわけです. <para>要するに、Linux カーネルが FreeBSD カーネルの内部に存在しているわけです。
カーネルによって提供されるサービス全ての実装の基礎となるさまざまな関数は カーネルによって提供されるサービス全ての実装の基礎となるさまざまな関数は
FreeBSD システムコールテーブルエントリと FreeBSD システムコールテーブルエントリと
Linux システムコールテーブルエントリの両方で共通に利用されています. Linux システムコールテーブルエントリの両方で共通に利用されています
これらにはファイルシステム処理, 仮想メモリ処理, シグナル伝送, System V IPC これらにはファイルシステム処理、仮想メモリ処理、シグナル伝送、System V IPC
などが含まれますが, などが含まれますが
FreeBSD バイナリは FreeBSD <emphasis>グルー</emphasis> (訳注: glue; FreeBSD バイナリは FreeBSD <emphasis>グルー</emphasis> (訳注: glue;
二者の間を仲介するという意味) 関数群, 二者の間を仲介するという意味) 関数群
そして Linux バイナリは Linux <emphasis>グルー</emphasis>関数群を用いる, そして Linux バイナリは Linux <emphasis>グルー</emphasis>関数群を用いる
という点だけが異なります(過去に存在したほとんどの OS は, という点だけが異なります (過去に存在したほとんどの OS は、
自分自身のための<emphasis>グルー</emphasis>関数群しか備えていません. 自分自身のための<emphasis>グルー</emphasis>関数群しか備えていません
前述したように, システムコールを発行する際, 前述したように、システムコールを発行する際、
各々のプロセスの <literal>proc</literal> 構造体内にある, 各々のプロセスの <literal>proc</literal> 構造体内にある
ローダによって動的に初期化されるポインタを参照してアドレスを得る代わりに, ローダによって動的に初期化されるポインタを参照してアドレスを得る代わりに
静的でグローバルな <literal>sysent[]</literal> 構造体の配列に 静的でグローバルな <literal>sysent[]</literal> 構造体の配列に
システムコール関数のアドレスが直接格納されているのです).</para> システムコール関数のアドレスが直接格納されているのです)</para>
<para>さて, どちらを本来の FreeBSD ABI (訳注: Applications Binary Interface; <para>さてどちらを本来の FreeBSD ABI (訳注: Applications Binary Interface;
同じ CPU を利用したコンピュータ間でバイナリを共有するための規約のこと) 同じ CPU を利用したコンピュータ間でバイナリを共有するための規約のこと)
と呼ぶべきなのでしょうか? と呼ぶべきなのでしょうか?
実は, どちらが本来のものであるかということを論ずることに意味はありません. 実は、どちらが本来のものであるかということを論ずることに意味はありません。
基本的に, FreeBSD <emphasis>グルー</emphasis>関数群はカーネルの中に静的にリンクされていて, 基本的にFreeBSD <emphasis>グルー</emphasis>関数群はカーネルの中に静的にリンクされていて
Linux <emphasis>グルー</emphasis>関数群は静的にリンクすることも, Linux <emphasis>グルー</emphasis>関数群は静的にリンクすることも
カーネルモジュールを介して利用することもできるようになっている, カーネルモジュールを介して利用することもできるようになっている
という違いがあるだけ (ただしこれは現時点においての話であり, という違いがあるだけ (ただしこれは現時点においての話であり
将来のリリースで変更される可能性がありますし, 将来のリリースで変更される可能性がありますし
おそらく実際に変更されるでしょう) です.</para> おそらく実際に変更されるでしょう) です</para>
<para>あ, 「でもこれは本当にエミュレーションと呼べるのか」って? <para>あ「でもこれは本当にエミュレーションと呼べるのか」って?
答えは「いいえ」です. これは ABI の実装であり, 答えは「いいえ」です。これは ABI の実装であり、
エミュレーションとは異なります. エミュレータが呼び出されているわけではありません エミュレーションとは異なりますエミュレータが呼び出されているわけではありません
(シミュレータでもないことをあらかじめ断っておきましょう).</para> (シミュレータでもないことをあらかじめ断っておきましょう)</para>
<para>では, これがよく <quote>Linux エミュレーション</quote>と呼ばれるのは何故でしょうか? <para>ではこれがよく <quote>Linux エミュレーション</quote>と呼ばれるのは何故でしょうか?
それはもちろん FreeBSD の売りにするため <!-- smiley -->8-) でもあるのですが, それはもちろん FreeBSD の売りにするため <!-- smiley -->8-) でもあるのですが
実際には, 次のような理由によります. 実際には、次のような理由によります。
この機能が初めて実装された頃, この機能が初めて実装された頃
動作原理を説明する以外にこの機能を表現する言葉はありませんでした. 動作原理を説明する以外にこの機能を表現する言葉はありませんでした
しかし, コードをコンパイルしたりモジュールをロードしない場合, しかし、コードをコンパイルしたりモジュールをロードしない場合、
「FreeBSD 上で Linux バイナリを実行する」という表現は, 「FreeBSD 上で Linux バイナリを実行する」という表現は
厳密に考えると適切ではありません. 厳密に考えると適切ではありません
そこで, その際にロードされているもの自身を表現する言葉&mdash;すなわち そこでその際にロードされているもの自身を表現する言葉 &mdash; すなわち
<quote>Linux エミュレータ</quote>が必要だったのです.</para> <quote>Linux エミュレータ</quote>が必要だったのです</para>
</sect2> </sect2>
</sect1> </sect1>
</chapter> </chapter>

View file

@ -34,21 +34,21 @@
<indexterm><primary>email</primary></indexterm> <indexterm><primary>email</primary></indexterm>
<indexterm><primary>電子メール</primary></indexterm> <indexterm><primary>電子メール</primary></indexterm>
<para>電子メール, emailとしてのほうが知られているでしょう, <para>電子メール、email としてのほうが知られているでしょう、
は現代で最も広く利用されているコミュニケーション手段の一つです. は現代で最も広く利用されているコミュニケーション手段の一つです
何百万人という人が毎日 email を使っており, 何百万人という人が毎日 email を使っており
この文章を偶然にもオンラインで読んでいるという人はこのカテゴリーに入るでしょうし, この文章を偶然にもオンラインで読んでいるという人はこのカテゴリーに入るでしょうし
複数の email アドレスを持っていたりもするかもしれません.</para> 複数の email アドレスを持っていたりもするかもしれません</para>
<para>電子メールの設定は多くの<link linkend="bibliography">システム管理</link>書籍のテーマになっています. <para>電子メールの設定は多くの<link linkend="bibliography">システム管理</link>書籍のテーマになっています
もし自分のネットワーク用に一つメールホストを設定することよりもさらに高度なことをしようとするなら, もし自分のネットワーク用に一つメールホストを設定することよりもさらに高度なことをしようとするなら
しっかりとしたヘルプが必要でしょう.</para> しっかりとしたヘルプが必要でしょう</para>
<indexterm><primary>DNS</primary></indexterm> <indexterm><primary>DNS</primary></indexterm>
<para>email の設定におけるいくつかの部分は Domain Name System (DNS) <para>email の設定におけるいくつかの部分は Domain Name System (DNS)
の管理下にあります. 自分の DNS サーバーを立ち上げようと思っているなら, の管理下にあります。自分の DNS サーバーを立ち上げようと思っているなら、
必ず <filename>/etc/namedb</filename> と 必ず <filename>/etc/namedb</filename> と
<command>man -k named</command> を一通り読むようにしてください.</para> <command>man -k named</command> を一通り読むようにしてください</para>
</sect1> </sect1>
<sect1 id="mail-using"> <sect1 id="mail-using">
@ -56,28 +56,28 @@
<indexterm><primary>POP</primary></indexterm> <indexterm><primary>POP</primary></indexterm>
<indexterm><primary>IMAP</primary></indexterm> <indexterm><primary>IMAP</primary></indexterm>
<para>email の交換には 5 つの主要な部分があります. <para>email の交換には 5 つの主要な部分があります
それらは <link linkend="mail-mua">ユーザープログラム</link>, それらは <link linkend="mail-mua">ユーザープログラム</link>
<link linkend="mail-mta">サーバーデーモン</link>, <link linkend="mail-mta">サーバーデーモン</link>
<link linkend="mail-dns">DNS</link>, <link linkend="mail-dns">DNS</link>
<link linkend="mail-receive">POP もしくは IMAP のデーモン</link>, <link linkend="mail-receive">POP もしくは IMAP のデーモン</link>
そしてもちろん <link linkend="mail-host">メールホスト</link>です.</para> そしてもちろん <link linkend="mail-host">メールホスト</link>です</para>
<sect2 id="mail-mua"> <sect2 id="mail-mua">
<title>ユーザープログラム</title> <title>ユーザープログラム</title>
<para>いくつか名前を挙げれば, <para>いくつか名前を挙げれば
<application>mutt</application>, <application>pine</application>, <application>mutt</application>、<application>pine</application>、
<application>elm</application>, そして <application>elm</application>そして
<application>mail</application>, <application>mail</application>
といったコマンドラインプログラムや といったコマンドラインプログラムや
<application>balsa</application>, <application>balsa</application>
<application>xfmail</application> のような <application>xfmail</application> のような
GUI プログラム, WWW ブラウザーのようにさらに<quote>洗練された</quote>ものまであります. GUI プログラムWWW ブラウザーのようにさらに<quote>洗練された</quote>ものまであります
これらのプログラムは, email の処理を これらのプログラムはemail の処理を
<link linkend="mail-mta">server daemons</link> を呼び出したり <link linkend="mail-mta">server daemons</link> を呼び出したり
TCP 経由で渡したり, といった手段でローカルの TCP 経由で渡したりといった手段でローカルの
<link linkend="mail-host"><quote>メールホスト</quote></link>に任せるだけです.</para> <link linkend="mail-host"><quote>メールホスト</quote></link>に任せるだけです</para>
</sect2> </sect2>
<sect2 id="mail-mta"> <sect2 id="mail-mta">
@ -99,41 +99,41 @@
<secondary><application>exim</application></secondary> <secondary><application>exim</application></secondary>
</indexterm> </indexterm>
<para>通常, これは <application>sendmail</application> <para>通常これは <application>sendmail</application>
(FreeBSD のデフォルト) や <application>qmail</application>, (FreeBSD のデフォルト) や <application>qmail</application>
<application>postfix</application>, もしくは <application>postfix</application>もしくは
<application>exim</application> <application>exim</application>
といった他のメールサーバーデーモンの一つです. といった他のメールサーバーデーモンの一つです
他にもあるのですが、以上のものが広く使われています.</para> 他にもあるのですが、以上のものが広く使われています</para>
<para>サーバーデーモンは通常 2 つの機能 &mdash; <para>サーバーデーモンは通常 2 つの機能 &mdash;
やってくるメールを受け取るのと出ていくメールを配送する, やってくるメールを受け取るのと出ていくメールを配送する
を持っています. メールを読むために POP や IMAP で接続する, を持っています。メールを読むために POP や IMAP で接続する、
ということはできません. ということはできません
そのためにはもう一つ<link linkend="mail-receive">デーモン</link>が必要なのです.</para> そのためにはもう一つ<link linkend="mail-receive">デーモン</link>が必要なのです</para>
<para>いくつかの古いバージョンの <application>sendmail</application> <para>いくつかの古いバージョンの <application>sendmail</application>
には深刻なセキュリティー問題がありますが, には深刻なセキュリティー問題がありますが
現在のバージョンを使っているおれば特に問題ないことに注意してください. 現在のバージョンを使っているおれば特に問題ないことに注意してください
例のごとく, 例のごとく
どんなソフトウェアを利用する時にも最新の状態にしておくのが大事なのです.</para> どんなソフトウェアを利用する時にも最新の状態にしておくのが大事なのです</para>
</sect2> </sect2>
<sect2 id="mail-dns"> <sect2 id="mail-dns">
<title>Email and DNS</title> <title>Email and DNS</title>
<para>Domain Name System (DNS) とそのデーモンである <para>Domain Name System (DNS) とそのデーモンである
<command>named</command> は email の配送において大変重要な役割を担ってます. <command>named</command> は email の配送において大変重要な役割を担ってます
あなたのサイトからもう一つのサイトへメールを配送するためには, あなたのサイトからもう一つのサイトへメールを配送するためには
サーバーデーモンは DNS からそのサイトを探し, サーバーデーモンは DNS からそのサイトを探し
メールの受け取り先のホストを決定します.</para> メールの受け取り先のホストを決定します</para>
<para>メールがあなたに送られた場合にも同じような仕組みになっています. <para>メールがあなたに送られた場合にも同じような仕組みになっています
DNS にはホスト名と IP アドレス, ホスト名とメールホストをマッピングするデータベースがあります. DNS にはホスト名と IP アドレス、ホスト名とメールホストをマッピングするデータベースがあります。
IP アドレスは A レコードで指定されます. IP アドレスは A レコードで指定されます
MX (Mail eXchanger) レコードはあなた宛のメールを受け取るホストを指定します. MX (Mail eXchanger) レコードはあなた宛のメールを受け取るホストを指定します
あなたのホスト名に対する MX レコードがない場合には, あなたのホスト名に対する MX レコードがない場合には
メールは直接あなたのホストに配送されます.</para> メールは直接あなたのホストに配送されます</para>
</sect2> </sect2>
<sect2 id="mail-receive"> <sect2 id="mail-receive">
@ -143,26 +143,26 @@
<secondary>受け取り</secondary> <secondary>受け取り</secondary>
</indexterm> </indexterm>
<para>メールはメールホストが受け取ります. <para>メールはメールホストが受け取ります
このホストは送られてきたメールを集め, このホストは送られてきたメールを集め
(ユーザーが) 読んだりピックアップしたりするために保存します. (ユーザーが) 読んだりピックアップしたりするために保存します
保存されているメールをピックアップするにはメールホストに接続する必要があります. 保存されているメールをピックアップするにはメールホストに接続する必要があります
これは POP や IMAP を用いて行なわれます. これは POP や IMAP を用いて行なわれます
メールホスト上で直接メールを読みたい時は POP や IMAP のサーバーは必要ありません.</para> メールホスト上で直接メールを読みたい時は POP や IMAP のサーバーは必要ありません</para>
<indexterm><primary>POP</primary></indexterm> <indexterm><primary>POP</primary></indexterm>
<indexterm><primary>IMAP</primary></indexterm> <indexterm><primary>IMAP</primary></indexterm>
<para>POP や IMAP のサーバーを走らせるためには 2 つのことをやらなければいけません.</para> <para>POP や IMAP のサーバーを走らせるためには 2 つのことをやらなければいけません</para>
<procedure> <procedure>
<step> <step>
<!-- XXX: kuriyama: English version points as /ports/mail.html. --> <!-- XXX: kuriyama: English version points as /ports/mail.html. -->
<!-- XXX: kuriyama: This should be related path. --> <!-- XXX: kuriyama: This should be related path. -->
<para>POP や IMAP のデーモンを<ulink url="../ports/mail.html">ports コレクション</ulink>からインストールします.</para> <para>POP や IMAP のデーモンを<ulink url="../ports/mail.html">ports コレクション</ulink>からインストールします</para>
</step> </step>
<step> <step>
<para><filename>/etc/inetd.conf</filename> を修正して POP や IMAP のサーバーが起動されるように設定します.</para> <para><filename>/etc/inetd.conf</filename> を修正して POP や IMAP のサーバーが起動されるように設定します</para>
</step> </step>
</procedure> </procedure>
</sect2> </sect2>
@ -171,8 +171,8 @@
<title>メールホスト</title> <title>メールホスト</title>
<indexterm><primary>メールホスト</primary></indexterm> <indexterm><primary>メールホスト</primary></indexterm>
<para>メールホストとは責任をもってメールを配送したり, <para>メールホストとは責任をもってメールを配送したり
あなたのホストや, もしかするネットワークも, に宛てたメールを受け取ったりするホストに与えられる名前です.</para> あなたのホストや、もしかするネットワークも、に宛てたメールを受け取ったりするホストに与えられる名前です。</para>
</sect2> </sect2>
</sect1> </sect1>
@ -183,8 +183,8 @@
<secondary>トラブルシューティング</secondary> <secondary>トラブルシューティング</secondary>
</indexterm> </indexterm>
<para>ここには、いくつかのよく聞かれる質問とその答があります. <para>ここには、いくつかのよく聞かれる質問とその答があります
それらは <ulink url="../FAQ/">FAQ</ulink> からこちらに移りました.</para> それらは <ulink url="../FAQ/">FAQ</ulink> からこちらに移りました</para>
<qandaset> <qandaset>
<qandaentry> <qandaentry>
@ -193,27 +193,27 @@
</question> </question>
<answer> <answer>
<para>恐らく, そのホストは実際には別のドメインにあるのでしょう. <para>恐らく、そのホストは実際には別のドメインにあるのでしょう。
例えば <hostid role="fqdn">foo.bar.edu</hostid> ドメインにいて, 例えば <hostid role="fqdn">foo.bar.edu</hostid> ドメインにいて
<hostid role="domainname">bar.edu</hostid> というドメイン内の <hostid role="domainname">bar.edu</hostid> というドメイン内の
<hostid>mumble</hostid> というホストにアクセスしたいとします. <hostid>mumble</hostid> というホストにアクセスしたいとします
この時は単に <hostid>mumble</hostid> ではなく この時は単に <hostid>mumble</hostid> ではなく
<hostid role="fqdn">mumble.bar.edu</hostid> と FQDN で参照しなければなりません.</para> <hostid role="fqdn">mumble.bar.edu</hostid> と FQDN で参照しなければなりません</para>
<indexterm><primary>BIND</primary></indexterm> <indexterm><primary>BIND</primary></indexterm>
<para>そもそも, BSD BIND のリゾルバー (resolver) ではこのようなことが可能でしたが, <para>そもそも、BSD BIND のリゾルバー (resolver) ではこのようなことが可能でしたが、
FreeBSD に入っている最新版の <application>BIND</application> FreeBSD に入っている最新版の <application>BIND</application>
では自分のドメイン以外に対する FQDN でない省略形は許されません. では自分のドメイン以外に対する FQDN でない省略形は許されません
従ってホストを <hostid>mumble</hostid> と曖昧に指定した場合は 従ってホストを <hostid>mumble</hostid> と曖昧に指定した場合は
<hostid role="fqdn">mumble.foo.bar.edu</hostid> という名前があればそれになり, <hostid role="fqdn">mumble.foo.bar.edu</hostid> という名前があればそれになり
そうでなければ root ドメインから検索されます.</para> そうでなければ root ドメインから検索されます</para>
<para>これは, <para>これは
<hostid>mumble.bar.edu</hostid> と <hostid>mumble.bar.edu</hostid> と
<hostid>mumble.edu</hostid> <hostid>mumble.edu</hostid>
ということなったドメイン名に対してホスト名のサーチがおこなわれていた以前の振る舞いとは異なったものです. ということなったドメイン名に対してホスト名のサーチがおこなわれていた以前の振る舞いとは異なったものです
このような事が悪い例もしくはセキュリティホールとみなされる理由については このような事が悪い例もしくはセキュリティホールとみなされる理由については
RFC 1535 を見てください.</para> RFC 1535 を見てください</para>
<para><filename>/etc/resolv.conf</filename> で <para><filename>/etc/resolv.conf</filename> で
@ -223,42 +223,42 @@
<programlisting>search foo.bar.edu bar.edu</programlisting> <programlisting>search foo.bar.edu bar.edu</programlisting>
と書き換えることで上のようなことができます. と書き換えることで上のようなことができます
しかし, RFC 1535 にあるように検索順序が<quote>内部 (local) しかしRFC 1535 にあるように検索順序が<quote>内部 (local)
と外部 (public) の管理の境界</quote>をまたがないようにしてください.</para> と外部 (public) の管理の境界</quote>をまたがないようにしてください</para>
</answer> </answer>
</qandaentry> </qandaentry>
<qandaentry> <qandaentry>
<question> <question>
<para>sendmail が <errorname>mail loops back to <para>sendmail が <errorname>mail loops back to
myself</errorname> というメッセージを出すのですが.</para> myself</errorname> というメッセージを出すのですが</para>
</question> </question>
<answer> <answer>
<para>sendmail FAQ に次のように書いてあります.</para> <para>sendmail FAQ に次のように書いてあります</para>
<programlisting>* <quote>Local configuration error</quote> というメッセージが出ます. 例えば, <programlisting>* <quote>Local configuration error</quote> というメッセージが出ます。例えば、
553 relay.domain.net config error: mail loops back to myself 553 relay.domain.net config error: mail loops back to myself
554 &lt;user@domain.net&gt;... Local configuration error 554 &lt;user@domain.net&gt;... Local configuration error
のような感じですが, どうしたら解決できますか? のような感じですがどうしたら解決できますか?
これは, 例えば domain.net のようなドメイン宛てのメールを これは例えば domain.net のようなドメイン宛てのメールを
<literal>MX</literal> レコードで特定のホスト(ここでは <literal>MX</literal> レコードで特定のホスト(ここでは
relay.domain.net) に送ろうとしたのに, relay.domain.net) に送ろうとしたのに
そのホストでは domain.net そのホストでは domain.net
宛てのメールを受け取れるような設定になっていない場合です. 宛てのメールを受け取れるような設定になっていない場合です
設定の際に 設定の際に
FEATURE(use_cw_file) を指定してある場合には FEATURE(use_cw_file) を指定してある場合には
/etc/sendmail.cw の中に domain.net を追加してください. /etc/sendmail.cw の中に domain.net を追加してください
もしくは, /etc/sendmail.cf の中に <quote>Cw domain.net</quote> もしくは/etc/sendmail.cf の中に <quote>Cw domain.net</quote>
を追加してください.</programlisting> を追加してください</programlisting>
<para>sendmail FAQ は <para>sendmail FAQ は
<filename>/usr/src/usr.sbin/sendmail</filename> にありますので, <filename>/usr/src/usr.sbin/sendmail</filename> にありますので
メールの設定に<quote>おかしなこと</quote>があれば常に読んでください.</para> メールの設定に<quote>おかしなこと</quote>があれば常に読んでください</para>
</answer> </answer>
</qandaentry> </qandaentry>
@ -269,90 +269,90 @@ FEATURE(use_cw_file)
</question> </question>
<answer> <answer>
<para>LAN 上にある FreeBSD マシンを, <para>LAN 上にある FreeBSD マシンを
インターネットに接続したいとします. FreeBSD マシンは, その インターネットに接続したいとします。FreeBSD マシンは、その
LAN でのメールゲートウェイになります. FreeBSD LAN でのメールゲートウェイになりますFreeBSD
マシンは専用線接続ではありません マシンは専用線接続ではありません
(訳注:ダイアルアップ接続など).</para> (訳注: ダイアルアップ接続など)。</para>
<para>これには, 少なくとも二つの方法があります.</para> <para>これには、少なくとも二つの方法があります。</para>
<indexterm><primary>UUCP</primary></indexterm> <indexterm><primary>UUCP</primary></indexterm>
<para>一つは UUCP を使うことです.</para> <para>一つは UUCP を使うことです</para>
<para>このとき鍵になるのは, あなたのドメインに対するセカンダリ <para>このとき鍵になるのはあなたのドメインに対するセカンダリ
MX サービスを提供してくれるインターネットサイトをみつけることです. MX サービスを提供してくれるインターネットサイトをみつけることです
例えば以下のように.</para> 例えば以下のように</para>
<programlisting>bigco.com. MX 10 bigco.com. <programlisting>bigco.com. MX 10 bigco.com.
MX 20 smalliap.com.</programlisting> MX 20 smalliap.com.</programlisting>
<para>最終的なメール受信先としては, <para>最終的なメール受信先としては
一つのホストだけが定義されるべきです (bigco.com 上の 一つのホストだけが定義されるべきです (bigco.com 上の
<filename>/etc/sendmail.cf</filename> ファイルに, <literal>Cw <filename>/etc/sendmail.cf</filename> ファイルに<literal>Cw
bigco.com</literal> を追加します).</para> bigco.com</literal> を追加します)</para>
<para>送信側の <command>sendmail</command> が, <para>送信側の <command>sendmail</command> が
メールを配送しようとしている時, モデムの接続を メールを配送しようとしている時モデムの接続を
介してあなたのところに接続しようとします. 大抵の場合, 介してあなたのところに接続しようとします。大抵の場合、
あなたのマシンがオンラインでないために, 接続はタイムアウト あなたのマシンがオンラインでないために接続はタイムアウト
してしまうでしょう. <command>sendmail</command> は自動的に, してしまうでしょう。<command>sendmail</command> は自動的に、
メールをセカンダリの MX サイト に メールをセカンダリの MX サイト に
(あなたのインターネットプロバイダ) に配送します. セカンダリ MX (あなたのインターネットプロバイダ) に配送しますセカンダリ MX
サイトは, (<filename>/etc/rc.conf</filename> ファイル に サイトは(<filename>/etc/rc.conf</filename> ファイル に
<literal>sendmail_flag = "-bd <literal>sendmail_flag = "-bd
-q15m"</literal>と書かれている場合) 15 分ごとに, -q15m"</literal>と書かれている場合) 15 分ごとに
プライマリ MX サイトにメールを配送しようと, プライマリ MX サイトにメールを配送しようと
あなたのホストに接続しに いきます.</para> あなたのホストに接続しに いきます</para>
<para>ログインスクリプトとして, <para>ログインスクリプトとして
このようなものを使うとよいでしょう. </para> このようなものを使うとよいでしょう</para>
<programlisting>#!/bin/sh <programlisting>#!/bin/sh
# Put me in /usr/local/bin/pppbigco # Put me in /usr/local/bin/pppbigco
( sleep 60 ; /usr/sbin/sendmail -q ) &amp; ( sleep 60 ; /usr/sbin/sendmail -q ) &amp;
/usr/sbin/ppp -direct pppbigco</programlisting> /usr/sbin/ppp -direct pppbigco</programlisting>
<para>ユーザごとにログインスクリプトを作りたい場合には, 上記 <para>ユーザごとにログインスクリプトを作りたい場合には上記
のスクリプトの代わりに, <command>sendmail のスクリプトの代わりに<command>sendmail
-qRbigco.com</command> を使用する こともできます. -qRbigco.com</command> を使用する こともできます
このようにすると, キューの中の bigco.com に対する このようにするとキューの中の bigco.com に対する
すべてのメールは, すぐに強制的に処理されます.</para> すべてのメールは、すぐに強制的に処理されます。</para>
<para>さらに, 次のような改良もできます.</para> <para>さらに、次のような改良もできます。</para>
<para>以下は, &a.isp; <para>以下は&a.isp;
メイリングリストから抜粋してきたメッセージです. </para> メイリングリストから抜粋してきたメッセージです</para>
<programlisting>&gt; 私たちはお客様に対して, セカンダリ MX を提供しています. <programlisting>&gt; 私たちはお客様に対して、セカンダリ MX を提供しています。
&gt; お客様は一日に何回か私たちのサービスに接続し, メールを彼らのプライマリ MX &gt; お客様は一日に何回か私たちのサービスに接続しメールを彼らのプライマリ MX
&gt; に受け取ります (彼らのドメインに対するメールが到着した時には, &gt; に受け取ります (彼らのドメインに対するメールが到着した時には
&gt; 私たちは彼らのサイトを呼び出しません). &gt; 私たちは彼らのサイトを呼び出しません)
&gt; 私たちの sendmail は, 30 分ごとにメールキューに溜っているメールを配送します. &gt; 私たちの sendmail は、30 分ごとにメールキューに溜っているメールを配送します。
&gt; ちょうどその時に, すべてのメールがプライマリ MX に送られたかどうかを確かめるためには, &gt; ちょうどその時に、すべてのメールがプライマリ MX に送られたかどうかを確かめるためには、
&gt; 彼らは 30 分は オンラインでいなければなりません. &gt; 彼らは 30 分は オンラインでいなければなりません
&gt; &gt;
&gt; すべてのメールを今すぐ送るために sendmail を初期化するコマンドはあるでしょうか? &gt; すべてのメールを今すぐ送るために sendmail を初期化するコマンドはあるでしょうか?
&gt; もちろん私たちのマシン上には, ユーザはルート (root) 権限を持っていません. &gt; もちろん私たちのマシン上には、ユーザはルート (root) 権限を持っていません。
sendmail.cf の <quote>privacy flags</quote> セクションに, sendmail.cf の <quote>privacy flags</quote> セクションに
Opgoaway,restrictqrun の定義があります. Opgoaway,restrictqrun の定義があります
root 以外のユーザがキューを処理できるようにするには, root 以外のユーザがキューを処理できるようにするには
restrictqrun を削除してください. また, MX の再調整が必要かもしれません. restrictqrun を削除してください。また、MX の再調整が必要かもしれません。
あなたがたは, 顧客のサイトに対する一番優先度の高い MX なので, あなたがたは、顧客のサイトに対する一番優先度の高い MX なので、
次のように定義します: 次のように定義します:
# If we are the best MX for a host, try directly instead of generating # If we are the best MX for a host, try directly instead of generating
# local config error. # local config error.
OwTrue OwTrue
このようにすると, リモートサイトからのメールが, このようにすると、リモートサイトからのメールが、
顧客のマシンと接続しようとせず, 直接あなたがたのホストマシンに配送されるようになります. 顧客のマシンと接続しようとせず、直接あなたがたのホストマシンに配送されるようになります。
ホストマシンに配送されたメールは, 続いて顧客のマシンに送られます. ホストマシンに配送されたメールは、続いて顧客のマシンに送られます。
これはホスト名にのみ有効なので, 顧客のメールマシンに, これはホスト名にのみ有効なので、顧客のメールマシンに、
<quote>host.customer.com</quote> とは別に, <quote>customer.com</quote>も定義する必要があります. <quote>host.customer.com</quote> とは別に、<quote>customer.com</quote>も定義する必要があります。
DNS 上で, <quote>customer.com</quote>に対する A レコードを定義してください.</programlisting> DNS 上で、<quote>customer.com</quote>に対する A レコードを定義してください。</programlisting>
</answer> </answer>
</qandaentry> </qandaentry>
</qandaset> </qandaset>
@ -361,8 +361,8 @@ DNS
<sect1 id="mail-advanced"> <sect1 id="mail-advanced">
<title>先進的なトピックス</title> <title>先進的なトピックス</title>
<para>これからのセクションでは, <para>これからのセクションでは
メールの設定やドメイン全体のためのメールの設定といったさらに突込んだ話題について触れます.</para> メールの設定やドメイン全体のためのメールの設定といったさらに突込んだ話題について触れます</para>
<sect2 id="mail-config"> <sect2 id="mail-config">
<title>基本事項</title> <title>基本事項</title>
@ -371,51 +371,51 @@ DNS
<secondary>設定</secondary> <secondary>設定</secondary>
</indexterm> </indexterm>
<para>あなたのマシンに FreeBSD を普通にインストールして, <para>あなたのマシンに FreeBSD を普通にインストールして
<filename>/etc/resolv.conf</filename> ファイルを設定するか, <filename>/etc/resolv.conf</filename> ファイルを設定するか
またはネームサーバを走らせれば, またはネームサーバを走らせれば
他のホストへ電子メールを送ることができるようになります. 他のホストへ電子メールを送ることができるようになります
あなたのホスト宛のメールを特定のホストに配送するようにしたい場合には, あなたのホスト宛のメールを特定のホストに配送するようにしたい場合には
次の二つの方法があります.</para> 次の二つの方法があります</para>
<itemizedlist> <itemizedlist>
<listitem> <listitem>
<para>自身でネームサーバーを実行し, <para>自身でネームサーバーを実行し
自分のドメインを持つ. 例えば 自分のドメインを持つ例えば
<hostid role="domainname">FreeBSD.org</hostid>.</para> <hostid role="domainname">FreeBSD.org</hostid></para>
</listitem> </listitem>
<listitem> <listitem>
<para>あなたのホストへ直接メールが配送されるようにする. <para>あなたのホストへ直接メールが配送されるようにする
これはメールがあなたのマシンの現在の これはメールがあなたのマシンの現在の
DNS 名に直接配送されるようにすることにより実現できます. DNS 名に直接配送されるようにすることにより実現できます
たとえば <hostid role="fqdn">example.FreeBSD.org</hostid>.</para> たとえば <hostid role="fqdn">example.FreeBSD.org</hostid></para>
</listitem> </listitem>
</itemizedlist> </itemizedlist>
<indexterm><primary>SMTP</primary></indexterm> <indexterm><primary>SMTP</primary></indexterm>
<para>上のどちらを選ぶ場合でも, 自分のホストに直接メールが配送されるようにするには恒久的 <para>上のどちらを選ぶ場合でも自分のホストに直接メールが配送されるようにするには恒久的
(静的) な IP アドレス (動的な PPP ダイアルアップではない) を持っていなければなりません. (静的) な IP アドレス (動的な PPP ダイアルアップではない) を持っていなければなりません
もしファイアーウォールの中にいるならば, SMTP トラフィックが通過してくれないといけません. もしファイアーウォールの中にいるならば、SMTP トラフィックが通過してくれないといけません。
もし自分のホストでメールを受け取りたいならば, もし自分のホストでメールを受け取りたいならば
次の二つのうちの一つができていることを確認してください.</para> 次の二つのうちの一つができていることを確認してください</para>
<itemizedlist> <itemizedlist>
<indexterm><primary>MX レコード</primary></indexterm> <indexterm><primary>MX レコード</primary></indexterm>
<listitem> <listitem>
<para>自分のドメインでの MX レコードが自分のホストの <para>自分のドメインでの MX レコードが自分のホストの
IP アドレスを差していることを確認する.</para> IP アドレスを差していることを確認する</para>
</listitem> </listitem>
<listitem> <listitem>
<para>自分のドメインの中に自分のホスト用の MX がないことを確認する.</para> <para>自分のドメインの中に自分のホスト用の MX がないことを確認する</para>
</listitem> </listitem>
</itemizedlist> </itemizedlist>
<para>上のどちらかが設定されていれば, <para>上のどちらかが設定されていれば
自分のホストでメールを受け取ることができるでしょう.</para> 自分のホストでメールを受け取ることができるでしょう</para>
<para>次のコマンドを実行してみてください.</para> <para>次のコマンドを実行してみてください</para>
<screen>&prompt.root; <userinput>hostname</userinput> <screen>&prompt.root; <userinput>hostname</userinput>
example.FreeBSD.org example.FreeBSD.org
@ -423,29 +423,29 @@ example.FreeBSD.org
example.FreeBSD.org has address 204.216.27.XX</screen> example.FreeBSD.org has address 204.216.27.XX</screen>
<para>もしあなたのマシンが上記のメッセージだけを出力したならば, <para>もしあなたのマシンが上記のメッセージだけを出力したならば
<email>yourlogin@example.FreeBSD.org</email> <email>yourlogin@example.FreeBSD.org</email>
へのメールは問題なく配送されるでしょう.</para> へのメールは問題なく配送されるでしょう</para>
<para>上記のメッセージの代わりに, </para> <para>上記のメッセージの代わりに</para>
<screen>&prompt.root; <userinput>host example.FreeBSD.org</userinput> <screen>&prompt.root; <userinput>host example.FreeBSD.org</userinput>
example.FreeBSD.org has address 204.216.27.XX example.FreeBSD.org has address 204.216.27.XX
example.FreeBSD.org mail is handled (pri=10) by hub.FreeBSD.org</screen> example.FreeBSD.org mail is handled (pri=10) by hub.FreeBSD.org</screen>
<para>というメッセージが出力された場合は, <para>というメッセージが出力された場合は
あなたのホスト (<hostid role="fqdn">example.FreeBSD.org</hostid>) あなたのホスト (<hostid role="fqdn">example.FreeBSD.org</hostid>)
に宛てたメールは全て直接配送されずに <hostid>hub</hostid> に宛てたメールは全て直接配送されずに <hostid>hub</hostid>
上の同じユーザー名に配送されます.</para> 上の同じユーザー名に配送されます</para>
<para>上の情報は DNS サーバーが扱います. <para>上の情報は DNS サーバーが扱います
メールルーティング情報をもつ DNS レコードは, メールルーティング情報をもつ DNS レコードは
<emphasis>M</emphasis>ail e<emphasis>X</emphasis>change エントリーです. <emphasis>M</emphasis>ail e<emphasis>X</emphasis>change エントリーです
MX エントリが存在しない場合には, IP アドレスにしたがって, MX エントリが存在しない場合には、IP アドレスにしたがって、
直接宛先ホストに配送されます.</para> 直接宛先ホストに配送されます</para>
<para><hostid role="fqdn">freefall.FreeBSD.org</hostid> <para><hostid role="fqdn">freefall.FreeBSD.org</hostid>
の現時点での MX エントリは, 次のようになっています.</para> の現時点での MX エントリは、次のようになっています。</para>
<programlisting>freefall MX 30 mail.crl.net <programlisting>freefall MX 30 mail.crl.net
freefall MX 40 agora.rdrop.com freefall MX 40 agora.rdrop.com
@ -453,90 +453,90 @@ freefall MX 10 freefall.FreeBSD.org
freefall MX 20 who.cdrom.com</programlisting> freefall MX 20 who.cdrom.com</programlisting>
<para><hostid>freefall</hostid> は多くの MX <para><hostid>freefall</hostid> は多くの MX
エントリを持っています. もっとも MX の値が小さいホストが最終的にメールを受け取ります. エントリを持っています。もっとも MX の値が小さいホストが最終的にメールを受け取ります。
もし <hostid>freefall</hostid> もし <hostid>freefall</hostid>
が他の処理で忙しかったり, ダウンしているような場合には, が他の処理で忙しかったり、ダウンしているような場合には、
他のホストが一時的にメールをキューにいれます.</para> 他のホストが一時的にメールをキューにいれます</para>
<para>使い勝手をよくするためには, 代替の MX サイトは, それぞれ <para>使い勝手をよくするためには、代替の MX サイトは、それぞれ
別の経路でインターネットへ接続しているとよいでしょう. 別の経路でインターネットへ接続しているとよいでしょう
インターネットプロバイダまたは他の関連サイトが, このサービスを インターネットプロバイダまたは他の関連サイトがこのサービスを
提供することができます.</para> 提供することができます</para>
</sect2> </sect2>
<sect2 id="mail-domain"> <sect2 id="mail-domain">
<title>あなたのドメインに対するメール設定</title> <title>あなたのドメインに対するメール設定</title>
<para><quote>メールホスト</quote> (メールサーバーとしても知られています) <para><quote>メールホスト</quote> (メールサーバーとしても知られています)
をセットアップするためには, をセットアップするためには
いろいろなワークステーションに宛てた全てのメールを受ける必要があります. いろいろなワークステーションに宛てた全てのメールを受ける必要があります
基本的には, あなたのドメイン (この場合だと 基本的にはあなたのドメイン (この場合だと
<hostid role="fqdn">*.FreeBSD.org</hostid>) <hostid role="fqdn">*.FreeBSD.org</hostid>)
宛ての全てのメールを<quote>ハイジャック</quote>し, 宛ての全てのメールを<quote>ハイジャック</quote>し
そのメールをあなたのメールサーバーに配送し, そのメールをあなたのメールサーバーに配送し
ユーザーが POP を通じてあるいはサーバー上で直接, メールをチェックできるようにします.</para> ユーザーが POP を通じてあるいはサーバー上で直接、メールをチェックできるようにします。</para>
<indexterm><primary>DNS</primary></indexterm> <indexterm><primary>DNS</primary></indexterm>
<para>話を簡単にするために, あるユーザーのアカウントはどのマシンでも同じ<emphasis>ユーザー名</emphasis>にすべきです. <para>話を簡単にするためにあるユーザーのアカウントはどのマシンでも同じ<emphasis>ユーザー名</emphasis>にすべきです
そのためには <command>adduser</command> を使ってください.</para> そのためには <command>adduser</command> を使ってください</para>
<para>使用する予定のメールホストは, <para>使用する予定のメールホストは
各ワークステーションごとにメール交換が 各ワークステーションごとにメール交換が
できるように設定されていなければなりません. これは, DNS できるように設定されていなければなりません。これは、DNS
(すなわち BIND や named) の設定で次のように行なうことができます.</para> (すなわち BIND や named) の設定で次のように行なうことができます</para>
<programlisting>example.FreeBSD.org A 204.216.27.XX ; ワークステーション <programlisting>example.FreeBSD.org A 204.216.27.XX ; ワークステーション
MX 10 hub.FreeBSD.org ; メールホスト</programlisting> MX 10 hub.FreeBSD.org ; メールホスト</programlisting>
<para>これは, ワークステーションの A レコードがどこを指していようとも <para>これはワークステーションの A レコードがどこを指していようとも
そのワークステーション宛てのメールをメールホストに転送する, というものです.</para> そのワークステーション宛てのメールをメールホストに転送する、というものです。</para>
<para>自前で DNS サーバを運用しているのでなければ, <para>自前で DNS サーバを運用しているのでなければ
この作業は自分では行なえおこなえません. 自分で DNS この作業は自分では行なえおこなえません自分で DNS
サーバを運用しないとかできないという場合は, サーバを運用しないとかできないという場合は
インターネットプロバイダ等に依頼して作業をおこなってもらってください.</para> インターネットプロバイダ等に依頼して作業をおこなってもらってください</para>
<para>この作業により, このワークステーション宛のメールは, MX <para>この作業により、このワークステーション宛のメールは、MX
(メールエクスチェンジャ) ホストに送られるようになります. A (メールエクスチェンジャ) ホストに送られるようになりますA
レコードがどのマシンを指しているかどいうことには関係なく, レコードがどのマシンを指しているかどいうことには関係なく
メールは MX ホストに送られます.</para> メールは MX ホストに送られます</para>
<para>もしバーチャル電子メールホストを運用するなら次の情報が役に立つでしょう. <para>もしバーチャル電子メールホストを運用するなら次の情報が役に立つでしょう
例として,あなたには自分のドメイン, ここでは 例として、あなたには自分のドメイン、ここでは
<hostid role="domainname">customer1.org</hostid>, <hostid role="domainname">customer1.org</hostid>
を持っている顧客がいるとしましょう. を持っている顧客がいるとしましょう
あなたは <hostid role="domainname">customer1.org</hostid> 宛ての全てのメールを あなたは <hostid role="domainname">customer1.org</hostid> 宛ての全てのメールを
<hostid role="fqdn">mail.myhost.com</hostid> という名前のメールホストに集めたいとします. <hostid role="fqdn">mail.myhost.com</hostid> という名前のメールホストに集めたいとします
DNS エントリーは次のようになるでしょう.</para> DNS エントリーは次のようになるでしょう</para>
<programlisting>customer1.org MX 10 mail.myhost.com</programlisting> <programlisting>customer1.org MX 10 mail.myhost.com</programlisting>
<para>そのドメインに対して電子メールを送りたいだけなら, A <para>そのドメインに対して電子メールを送りたいだけならA
レコードは必要ありません.</para> レコードは必要ありません</para>
<note> <note>
<para>これは, <hostid role="domainname">customer1.org</hostid> <para>これは<hostid role="domainname">customer1.org</hostid>
に対して ping を実行しても, に対して ping を実行しても
A レコードが存在しない限りうまくいかないことに留意しておいてください.</para> A レコードが存在しない限りうまくいかないことに留意しておいてください</para>
</note> </note>
<para>やらなければいけない最後のことは, <para>やらなければいけない最後のことは
メールホスト上の <application>sendmail</application> メールホスト上の <application>sendmail</application>
に対してどんあドメインやホスト宛のメールを受け取るのか, に対してどんあドメインやホスト宛のメールを受け取るのか
を教えることです. いくつかの方法がありますが次のどちらかでいいでしょう.</para> を教えることです。いくつかの方法がありますが次のどちらかでいいでしょう。</para>
<itemizedlist> <itemizedlist>
<listitem> <listitem>
<para><literal>FEATURE(use_cw_file)</literal> を使っているなら, <para><literal>FEATURE(use_cw_file)</literal> を使っているなら
<filename>/etc/sendmail.cw</filename> ファイルにホストを加えます. <filename>/etc/sendmail.cw</filename> ファイルにホストを加えます
もし sendmail 8.10 かそれ以降のものであれば該当ファイルは もし sendmail 8.10 かそれ以降のものであれば該当ファイルは
<filename>/etc/mail/local-host-names</filename> です.</para> <filename>/etc/mail/local-host-names</filename> です</para>
</listitem> </listitem>
<listitem> <listitem>
<para><filename>/etc/sendmail.cf</filename> もしくは <para><filename>/etc/sendmail.cf</filename> もしくは
sendmail 8.10 以降なら <filename>/etc/mail/sendmail.cf</filename> sendmail 8.10 以降なら <filename>/etc/mail/sendmail.cf</filename>
といったファイルに <literal>Cwyour.host.com</literal> という行を加えます.</para> といったファイルに <literal>Cwyour.host.com</literal> という行を加えます</para>
</listitem> </listitem>
</itemizedlist> </itemizedlist>
</sect2> </sect2>