<!--
    The FreeBSD Documentation Project
    The FreeBSD Japanese Documentation Project

    Original revision: 1.9
    $FreeBSD$
-->
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
%man;
]>

<!--
訳:
一宮 亮 ryo@azusa.shinshu-u.ac.jp
杉村 貴士 sugimura@jp.FreeBSD.org
-->

<article>
  <articleinfo>
    <title>ディスク無しの X サーバ: 一つのガイド</title>
    
    <authorgroup>
      <author>
	<firstname>Jerry</firstname>

	<surname>Kendall</surname>

	<affiliation>
	  <address>
	    <email>jerry@kcis.com</email>
	  </address>
	</affiliation>
      </author>
    </authorgroup>
    
    <pubdate>1996/12/28</pubdate>
    
    <copyright>
      <year>1996</year>
      <holder>Jerry Kendall</holder>
    </copyright>
    
    <abstract>
      <para>FreeBSD-hackers メーリングリストの友人たちの助けによって、
	わたしはディスクの無い X 端末を作ることができました。
	X 端末の作成には、NFS によってマウントされた最小のユーティリティを持つ
	ディスク無しのシステムを作らなくてはなりませんでした。
	同じ方法を使って 2 つの別々なディスク無しのシステムを作りました。
	一つ目は <hostid role="fqdn">altair.example.com</hostid> です。
	それは 340M のハードディスクが付いていますが、交換したくありませんでした。
	そのため、そのマシンは <hostid role="fqdn">antares.example.com</hostid>
	からイーサネットを通じてブートするようになっています。
	2 つ目のシステムは 486DX2-66 です。
	わたしは全くローカルディスクのないディスク無しの FreeBSD を (完璧に)
	セットアップしました。
	その場合のサーバは SunOS 4.1.3 が動いている Sun 670MP です。
	セットアップの設定は両方に同じものが必要でした。</para>

      <para>わたしはこの文書に加えなくてはならない内容がまだあると思っています。
	どんなことでもご意見がありましたら送ってください。</para>
    </abstract>
  </articleinfo>
  
  <sect1>
    <title>ブートフロッピーを作る (ディスク無しのシステム上で)</title>
    
    <para>ネットワークローダは TSR などの
      MS-DOS が使うものがあるとうまく働かないことがあるので、
      最も良い方法は専用のブートフロッピーを作るか、
      もしできれば、MS-DOS
      のメニューを作ってシステムが起動するときにどの設定を有効にするかを聞いてくるようにすることです。
      (<filename>config.sys</filename>/<filename>autoexec.bat</filename>
      ファイルによって)
      次に挙げるのはわたしが使っているもので、ちゃんと動作しているものです。
      わたしの MS-DOS (6.x) メニューを下に載せます。</para>
    
    <example>
      <title><filename>config.sys</filename></title>

      <programlisting>[menu]
menuitem=normal, normal
menuitem=unix, unix
[normal]
....
normal config.sys stuff
...
[unix]</programlisting>
    </example>

    <example>
      <title><filename>autoexec.bat</filename></title>

      <programlisting>@ECHO OFF
goto %config%

:normal
...
normal autoexec.bat stuff
...
goto end

:unix
cd \netboot
nb8390.com

:end</programlisting>
    </example>
  </sect1>
  
  <sect1>
    <title>ネットワークブートのプログラムを手に入れる (サーバ上で)</title>

    <para><filename>/usr/src/sys/i386/boot/netboot</filename> にある
      <quote>net-boot</quote> プログラムをコンパイルしてください。
      そのときには
      <filename>Makefile</filename>
      の先頭にあるコメントを読んでおきましょう。
      要求されるように調整してください。
      オリジナルのファイルはどこかにバックアップを取っておいてください。
      ビルドが終わったら、2 つの MS-DOS の実行ファイル
      <filename>nb8390.com</filename> と <filename>nb3c509.com</filename>
      ができているはずです。
      これらの 2 つのプログラムの 1 つはディスク無しのサーバ上で動かすのに必要になるものです。
      それはブートサーバからカーネルをロードするものです。
      ここでは両方のプログラムを先程作った
      MS-DOS のブートフロッピーに入れておきます。</para>
  </sect1>
  
  <sect1>
    <title>どのプログラムを実行するかを調べる (ディスク無しのシステム上で)</title>
    
    <para>もしあなたのイーサネットアダプタが使っているチップセットを知っているなら、
      これは簡単なことです。もしそれが NS8390 チップセットか、
      NS8390 をベースとするチップセットであれば、<filename>nb8390.com</filename>
      を使ってください。もし 3Com 509 をベースとするチップセットなら、
      <filename>nb3C509.com</filename> ブートプログラムを使ってください。
      もしあなたの持っているものがよくわからなければ、一つ試してみて、そこで
      <errorname>No adapter found</errorname>
      と言われたらまた他のを試してみてください。それでもだめだったら、
      あなたのものはとても珍しいということです。</para>
  </sect1>

  <sect1>
    <title>ネットワークと通じてブートする</title>
    
    <para>config.sys/autoexec.bat
      ファイルも使わずにディスク無しのシステムを立ち上げてみてください。
      あなたのイーサネットアダプタのためのブートプログラムを実行してみましょう。</para>

    <para>わたしのイーサネットアダプタは WD8013 16bit モードで動いているので
      <filename>nb8390.com</filename> を実行します。</para>
    
    <screen><prompt>C:&gt;</prompt> <userinput>cd \netboot</userinput>
<prompt>C:&gt</prompt> <userinput>nb8390</userinput>

<prompt>Boot from Network (Y/N) ?</prompt>  <userinput>Y</userinput>

BOOTP/TFTP/NFS bootstrap loader     ESC for menu

Searching for adapter..
WD8013EBT base 0x0300, memory 0x000D8000, addr 00:40:01:43:26:66

Searching for server...</screen>

    <para>ここでは、
      わたしのディスク無しのシステムはブートサーバとして振る舞うようなマシンを探しにいこうとします。
      上の <literal>addr</literal> 行を記録しておいてください。
      あとからその数が必要になります。ディスク無しのシステムを再起動して、
      あなたの <filename>config.sys</filename> や
      <filename>autoexec.bat</filename> ファイルを修正して
      これらの操作が自動で行われるようにしてください。
      おそらくメニューの部分になるでしょう。
      もし <command>nb3c509.com</command> を
      <command>nb8390.com</command>
      の代わりに使わなくてはいけなかったとしても、出力は上と同じです。
      もし <literal>Searching for adapter..</literal>
      というメッセージが出るときに
      <errorname>No adapter found</errorname> ということを言われたら、
      <filename>Makefile</filename>
      で定義されているコンパイル時間が正しくセットされているかどうかを確認してみてください。</para>
  </sect1>
  
  <sect1>
    <title>システムがネットワーク越しにブートすることを許可する (サーバ上で)</title>

    <para><filename>/etc/inetd.conf</filename> ファイルが tftp や
      bootps についてのエントリを持っているかどうかを確認してください。
      わたしのは次のようになっています。</para>
    
    <programlisting>tftp	dgram	udp	wait	nobody	/usr/libexec/tftpd	tftpd /tftpboot
#
# Additions by who ever you are
bootps  dgram  udp  wait  root  /usr/libexec/bootpd bootpd /etc/bootptab</programlisting>
    
    <para>もし <filename>/etc/inetd.conf</filename> ファイルを変更したときには、
      inetd に <literal>HUP</literal> シグナルを送ってください。
      これをするには、inetd のプロセス ID を
      <command>ps -ax | grep inetd | grep -v grep</command> して
      取得してください。プロセス ID がわかったら、
      それに向けて HUP シグナルを送ってください。
      これは <command>kill -HUP &lt;pid&gt;</command> として行います。
      これによって inetd はその設定ファイルを読み直します。</para>

    <para>ディスク無しシステム上でブートローダが出力した <literal>addr</literal>
      の出力を覚えているでしょうか? ここでそれが必要となるのです。</para>

    <para><literal>/etc/bootptab</literal> (おそらくファイルを作成して) に
      エントリを加えてください。それはこれと同様の書式で書きましょう。</para>

    <programlisting>altair:\
        :ht=ether:\
        :ha=004001432666:\
        :sm=255.255.255.0:\
        :hn:\
        :ds=199.246.76.1:\
        :ip=199.246.76.2:\
        :gw=199.246.76.1:\
        :vm=rfc1048:</programlisting>
    
    <para>これらの行は次のような意味です。</para>

    <informaltable frame="none">
      <tgroup cols="2">
	<tbody>
	  <row>
	    <entry><literal>altair</literal></entry>
	    <entry>ドメイン名を除いたディスク無しのシステムの名前</entry>
	  </row>

	  <row>
	    <entry><literal>ht=ether</literal></entry>
	    <entry><quote>イーサネット</quote>ハードウェアタイプ</entry>
	  </row>

	  <row>
	    <entry><literal>ha=004001432666</literal></entry>
	    <entry>(先に記録した) ハードウェアのアドレス</entry>
	  </row>

	  <row>
	    <entry><literal>sm=255.255.255.0</literal></entry>
	    <entry>サブネットマスク</entry>
	  </row>

	  <row>
	    <entry><literal>hn</literal></entry>
	    <entry>クライアントにクライアントのホスト名を送るよう、
	      サーバに伝えます</entry>
	  </row>

	  <row>
	    <entry><literal>ds=199.246.76.1</literal></entry>
	    <entry>ドメインサーバがどれなのかをクライアントに伝えます</entry>
	  </row>

	  <row>
	    <entry><literal>ip=199.246.76.2</literal></entry>
	    <entry>クライアントの IP アドレスが何なのかを
	      クライアントに伝えます</entry>
	  </row>

	  <row>
	    <entry><literal>gw=199.246.76.1</literal></entry>
	    <entry>デフォルトゲートウェイがどれなのかを
	      クライアントに伝えます</entry>
	  </row>

	  <row>
	    <entry><literal>vm=...</literal></entry>
	    <entry>これはそのままにしておいてください</entry>
	  </row>
	</tbody>
      </tgroup>
    </informaltable>

    <note>
      <para>IP アドレスは正しく設定してください。
	上のアドレスはわたしだけのものです。</para>
    </note>

    <para><filename>/tftpboot</filename> ディレクトリをサーバに作成して、
      サーバがサービスを行うディスク無しのシステムのための設定ファイルをこのディレクトリに入れておきます。
      これらのファイルは <filename>cfg.<replaceable>ip</replaceable></filename>
      という名前になっていて、<replaceable>ip</replaceable> 
      はディスク無しシステムの IP アドレスを表しています。
      <hostid>altair</hostid> の設定ファイルは <filename>/tftpboot/cfg.199.246.76.2</filename>
      となります。この中身は次のようになっています:</para>

    <programlisting>rootfs 199.246.76.1:/DiskLess/rootfs/altair
hostname altair.example.com</programlisting>

    <para><literal>hostname altair.example.com</literal>
      の行は単にディスク無しのシステムがどのような完全なドメイン名を持っているのかを表しています。</para>

    <para><literal>rootfs 199.246.76.1:/DiskLess/rootfs/altair</literal>
      の行はディスク無しのシステムが
      NFS でマウントできるルートファイルシステムの場所を表しています。</para>

    <note>
      <para>NFS でマウントされたルートファイルシステムは
	<emphasis>読み出し許可だけで</emphasis> マウントされます。</para>
    </note>
    
    <para>ディスク無しのシステムの階層は要求されれば読み書き可能にして、
      マウントし直すことができます。</para>

    <para>わたしは予備の 386DX-40 を専用の X 端末として使用しています。</para>

    <para><hostid>altair</hostid> の階層は次の通りです。</para>

    <literallayout>/
/bin
/etc
/tmp
/sbin
/dev
/dev/fd
/usr
/var
/var/run</literallayout>

    <para>実際のファイルのリストは次の通りです。</para>

    <screen>-r-xr-xr-x  1 root  wheel  779984 Dec 11 23:44 ./kernel
-r-xr-xr-x  1 root    bin  299008 Dec 12 00:22 ./bin/sh
-rw-r--r--  1 root  wheel     499 Dec 15 15:54 ./etc/rc
-rw-r--r--  1 root  wheel    1411 Dec 11 23:19 ./etc/ttys
-rw-r--r--  1 root  wheel     157 Dec 15 15:42 ./etc/hosts
-rw-r--r--  1 root    bin    1569 Dec 15 15:26 ./etc/XF86Config.altair
-r-x------  1 bin     bin  151552 Jun 10  1995 ./sbin/init
-r-xr-xr-x  1 bin     bin  176128 Jun 10  1995 ./sbin/ifconfig
-r-xr-xr-x  1 bin     bin  110592 Jun 10  1995 ./sbin/mount_nfs
-r-xr-xr-x  1 bin     bin  135168 Jun 10  1995 ./sbin/reboot
-r-xr-xr-x  1 root    bin   73728 Dec 13 22:38 ./sbin/mount
-r-xr-xr-x  1 root  wheel    1992 Jun 10  1995 ./dev/MAKEDEV.local
-r-xr-xr-x  1 root  wheel   24419 Jun 10  1995 ./dev/MAKEDEV</screen>
    
    <para><filename>dev</filename> ディレクトリで <command>MAKEDEV all</command>
      するのを忘れずに。</para>

    <para><hostid>altair</hostid> の <filename>/etc/rc</filename> は
      次の通りです。</para>

<programlisting>#!/bin/sh
#
PATH=/bin:/
export PATH
#
# localhost の設定
/sbin/ifconfig lo0 127.0.0.1
#
# イーサネットカードの設定
/sbin/ifconfig ed0 199.246.76.2 netmask 0xffffff00
#
# NFS で root ファイルシステムをマウントする
/sbin/mount antares:/DiskLess/rootfs/altair /
#
# NFS で /usr ファイルシステムをマウントする
/sbin/mount antares:/DiskLess/usr /usr
#
/usr/X11R6/bin/XF86_SVGA -query antares -xf86config /etc/XF86Config.altair > /dev/null 2>&1
#
# X を終了すると再起動
/sbin/reboot
#
# うまく行かないときには....
exit 1</programlisting>

    <para>コメントや質問はどんなものでも歓迎します。</para>
  </sect1>
</article>

<!-- 
     Local Variables:
     mode: sgml
     sgml-indent-data: t
     sgml-omittag: nil
     sgml-always-quote-attributes: t
     End:
-->