349 lines
No EOL
11 KiB
Text
349 lines
No EOL
11 KiB
Text
<!--
|
|
The FreeBSD Documentation Project
|
|
|
|
$Id: article.sgml,v 1.1 1999-08-16 22:00:10 nik Exp $
|
|
-->
|
|
|
|
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V3.1-Based Extension//EN" [
|
|
|
|
<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
|
|
%man;
|
|
]>
|
|
|
|
<article>
|
|
<artheader>
|
|
<title>Diskless X Server: a how to guide</title>
|
|
|
|
<authorgroup>
|
|
<author>
|
|
<firstname> Jerry</firstname>
|
|
<surname>Kendall</surname>
|
|
<affiliation>
|
|
<address>
|
|
<email>jerry@kcis.com</email>
|
|
</address>
|
|
</affiliation>
|
|
</author></authorgroup>
|
|
|
|
<pubdate>28-December-1996</pubdate>
|
|
|
|
<copyright>
|
|
<year>1996</year>
|
|
<holder>Jerry Kendall</holder>
|
|
</copyright>
|
|
|
|
<abstract>
|
|
<para>With the help of some friends on the FreeBSD-hackers list, I have
|
|
been able to create a diskless X terminal. The creation of the X
|
|
terminal required first creating a diskless system with minimal
|
|
utilities mounted via NFS. These same steps were used to create 2
|
|
separate diskless systems. The first is <hostid
|
|
role="fqdn">altair.kcis.com</hostid>. A diskless X terminal that I
|
|
run on my old 386DX-40. It has a 340Meg hard disk but, I did not want
|
|
to change it. So, it boots from <hostid
|
|
role="fqdn">antares.kcis.com</hostid> across a Ethernet. The second
|
|
system is a 486DX2-66. I setup a diskless FreeBSD (complete) that
|
|
uses no local disk. The server in that case is a Sun 670MP running
|
|
SunOS 4.1.3. The same setup configuration was needed for both.</para>
|
|
|
|
<para>I am sure that there is stuff that needs to be added
|
|
to this. Please send me any comments.</para>
|
|
</abstract>
|
|
</artheader>
|
|
|
|
<sect1>
|
|
<title>Creating the boot floppy (On the diskless system)</title>
|
|
|
|
<para>Since the network boot loaders will not work with some of the TSR's
|
|
and such that MS-DOS uses, it is best to create a dedicated boot floppy
|
|
or, if you can, create an MS-DOS menu that will (via the
|
|
<filename>config.sys</filename>/<filename>autoexec.bat</filename> files)
|
|
ask what configuration to load when the system starts. The later is the
|
|
method that I use and it works great. My MS-DOS (6.x) menu is
|
|
below.</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>Getting the network boot programs (On the server)</title>
|
|
|
|
<para>Compile the 'net-boot' programs that are located in
|
|
<filename>/usr/src/sys/i386/boot/netboot</filename>. You should read
|
|
the comments at the top of the <filename>Makefile</filename>. Adjust as
|
|
required. Make a backup of the original in case it gets foobar'd. When
|
|
the build is done, there should be 2 MS-DOS executables,
|
|
<filename>nb8390.com</filename> and <filename>nb3c509.com</filename>.
|
|
One of these two programs will be what you need to run on the diskless
|
|
server. It will load the kernel from the boot server. At this point,
|
|
put both programs on the MS-DOS boot floppy created earlier.</para>
|
|
</sect1>
|
|
|
|
<sect1>
|
|
<title>Determine which program to run (On the diskless system)</title>
|
|
|
|
<para>If you know the chipset that your Ethernet adapter uses, this is
|
|
easy. If you have the NS8390 chipset, or a NS8390 based chipset, use
|
|
<filename>nb8390.com</filename>. If you have a 3Com 509 based chipset,
|
|
use the <filename>nb3C509.com</filename> boot program. If you are not
|
|
sure which you have, try using one, if it says <errorname>No adapter
|
|
found</errorname>, try the other. Beyond that, you are pretty much on
|
|
your own.</para>
|
|
</sect1>
|
|
|
|
<sect1>
|
|
<title>Booting across the network</title>
|
|
|
|
<para>Boot the diskless system with out any config.sys/autoexec.bat
|
|
files. try running the boot program for your Ethernet adapter.</para>
|
|
|
|
<para>My Ethernet adapter is running in WD8013 16bit mode so I run
|
|
<filename>nb8390.com</filename></para>
|
|
|
|
<screen><prompt>C:></prompt> <userinput>cd \netboot</userinput>
|
|
<prompt>C:></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>At this point, my diskless system is trying to find a machine to act
|
|
as a boot server. Make note of the <literal>addr</literal> line above,
|
|
you will need this number later. Reset the diskless system and modify
|
|
your <filename>config.sys</filename> and
|
|
<filename>autoexec.bat</filename> files to do these steps automatically
|
|
for you. Perhaps in a menu. If you had to run
|
|
<command>nb3c509.com</command> instead of <command>nb8390.com</command>
|
|
the output is the same as above. If you got <errorname>No adapter
|
|
found</errorname> at the <literal>Searching for adapter...</literal>
|
|
message, verify that you did indeed set the compile time defines in the
|
|
<filename>Makefile</filename> correctly.</para>
|
|
</sect1>
|
|
|
|
<sect1>
|
|
<title>Allowing systems to boot across the network (On the server)</title>
|
|
|
|
<para>Make sure the <filename>/etc/inetd.conf</filename> file has entries
|
|
for tftp and bootps. Mine are listed below:</para>
|
|
|
|
<programlisting>tftp dgram udp wait nobody /usr/libexec/tftpd tftpd
|
|
#
|
|
# Additions by who ever you are
|
|
bootps dgram udp wait root /usr/libexec/bootpd bootpd /etc/bootptab</programlisting>
|
|
|
|
<para>If you have to change the <filename>/etc/inetd.conf</filename> file,
|
|
send a <literal>HUP</literal> signal to inetd. To do this, get the
|
|
process ID of inetd with <command>ps -ax | grep inetd | grep -v
|
|
grep</command>. Once you have it, send it a HUP signal. Do this by
|
|
<command>kill -HUP <pid></command>. This will force inetd to
|
|
re-read its config file.</para>
|
|
|
|
<para>Did you remember to note the <literal>addr</literal> line from the
|
|
output of the boot loader on the diskless system? Guess what, here is
|
|
where you need it.</para>
|
|
|
|
<para>Add an entry to <literal>/etc/bootptab</literal> (maybe creating the
|
|
file). It should be laid out identical to this:</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>The lines are as follows:</para>
|
|
|
|
<informaltable frame="none">
|
|
<tgroup cols="2">
|
|
<tbody>
|
|
<row>
|
|
<entry><literal>altair</literal></entry>
|
|
<entry>the diskless systems name without the domain name.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>ht=ether</literal></entry>
|
|
<entry>the hardware type of 'ethernet'.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>ha=004001432666</literal></entry>
|
|
<entry>the hardware address (the number noted above).</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>sm=255.255.255.0</literal></entry>
|
|
<entry>the subnet mask.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>hn</literal></entry>
|
|
<entry>tells server to send client's hostname to the
|
|
client.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>ds=199.246.76.1</literal></entry>
|
|
<entry>tells the client who the domain server is.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>ip=199.246.76.2</literal></entry>
|
|
<entry>tells the client what it's IP address is.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>gw=199.246.76.1</literal></entry>
|
|
<entry>tells the client what the default gateway is.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>vm=...</literal></entry>
|
|
<entry>just leave it there.</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
|
|
<note>
|
|
<para>Be sure to setup the IP addresses correctly, the addresses above
|
|
are my own.</para>
|
|
</note>
|
|
|
|
<para>Create the directory '/tftpboot' on the server it will contain the
|
|
configuration files for the diskless systems that the server will serve.
|
|
These files will be named 'cfg.<ip>' where <ip> is the IP
|
|
address of the diskless system. The config file for 'altair' is
|
|
/tftpboot/cfg.199.246.76.2. The contents is:</para>
|
|
|
|
<programlisting>rootfs 199.246.76.1:/DiskLess/rootfs/altair
|
|
hostname altair.kcis.com</programlisting>
|
|
|
|
<para>The line <literal>hostname altair.kcis.com</literal> simply tells
|
|
the diskless system what its fully qualified domain name is.</para>
|
|
|
|
<para>The line <literal>rootfs
|
|
199.246.76.1:/DiskLess/rootfs/altair</literal> tells the diskless
|
|
system where its NFS mountable root filesystem is located.</para>
|
|
|
|
<note>
|
|
<para>The NFS mounted root filesystem will be mounted <emphasis>read
|
|
only</emphasis>.</para>
|
|
</note>
|
|
|
|
<para>The hierarchy for the diskless system can be re-mounted allowing
|
|
read-write operations if required.</para>
|
|
|
|
<para>I use my spare 386DX-40 as a dedicated X terminal.</para>
|
|
|
|
<para>The hierarchy for 'altair' is:</para>
|
|
|
|
<literallayout>/
|
|
/bin
|
|
/etc
|
|
/tmp
|
|
/sbin
|
|
/dev
|
|
/dev/fd
|
|
/usr
|
|
/var
|
|
/var/run</literallayout>
|
|
|
|
<para>The actual list of files is:</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>Don't forget to run <command>MAKEDEV all</command> in the
|
|
<filename>dev</filename> directory.</para>
|
|
|
|
<para>My <filename>/etc/rc</filename> for <hostid>altair</hostid>
|
|
is:</para>
|
|
|
|
<programlisting>#!/bin/sh
|
|
#
|
|
PATH=/bin:/
|
|
export PATH
|
|
#
|
|
# configure the localhost
|
|
/sbin/ifconfig lo0 127.0.0.1
|
|
#
|
|
# configure the ethernet card
|
|
/sbin/ifconfig ed0 199.246.76.2 netmask 0xffffff00
|
|
#
|
|
# mount the root filesystem via NFS
|
|
/sbin/mount antares:/DiskLess/rootfs/altair /
|
|
#
|
|
# mount the /usr filesystem via NFS
|
|
/sbin/mount antares:/DiskLess/usr /usr
|
|
#
|
|
/usr/X11R6/bin/XF86_SVGA -query antares -xf86config /etc/XF86Config.altair > /dev/null 2>&1
|
|
#
|
|
# Reboot after X exits
|
|
/sbin/reboot
|
|
#
|
|
# We blew up....
|
|
exit 1</programlisting>
|
|
|
|
<para>Any comments and all questions welcome.</para>
|
|
</sect1>
|
|
</article>
|
|
|
|
<!--
|
|
Local Variables:
|
|
mode: sgml
|
|
sgml-indent-data: t
|
|
sgml-omittag: nil
|
|
sgml-always-quote-attributes: t
|
|
End:
|
|
--> |