Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Mar 97 15:25:51 CST
From:      Joe Greco <jgreco@solaria.sol.net>
To:        hackers@freebsd.org
Cc:        fyeung@fyeung8.netific.com, spaz@u.washington.edu, chris@bb.cc.wa.us
Subject:   Okay, okay already!  Diskless Xterminal stuff.
Message-ID:  <199703272125.PAA18688@solaria.sol.net>

next in thread | raw e-mail | index | archive | help
I stopped counting a little while ago.  Please stop asking for it!
:-)

I have posted the bits at ftp.freebsd.sol.net:/pub/alpha/xkernel.tar.gz

The README is attached.  There are enough materials enclosed that you
should be able to set up a diskless Xterminal.  It's the same stuff I
use here; I'm using one of my Xterminals right now.

This is not a beginner level project, but on the other hand, it's not
rocket science.  Anyone who could set up a diskless box and understands
poorly documented C code could get this up and running without too much
trouble, I think.

Please drop me a line if you do{,n't} have success with this.

... Joe

-------------------------------------------------------------------------------
Joe Greco - Systems Administrator			      jgreco@ns.sol.net
Solaria Public Access UNIX - Milwaukee, WI			   414/342-4847


README:
This is hardly a comprehensive document, it's more like a few notes
about how it all works.

I'm a cheap SOB, and I don't like putting hard drives in everything,
not just because it's expensive (you can actually MOVE a box with no
hard drive, while it's running, and you don't have to worry about
backups).  So, sometimes I feel that a diskless workstation is a
practical solution, and I've been using FreeBSD based ones for
several years now, with the ed-based cards.

I finally got exasperated that I couldn't do the same thing with the
de-based cards.  They are nicer, faster, and PCI.  But they don't have
netboot support...  and there are a few applications where a standalone
system might be very useful.  Since I have floppy drives in all my
machines, I developed what I felt to be a reasonable compromise.

I figured out (with a little guidance from the sysinstall build tools)
how to make a standalone 1.44MB floppy, complete with kernel and a few
basics.

The basic premise is that I can get a standalone machine running off of
a floppy.  Then I NFS mount a server, and pull other goodies (like X11)
off of it.

To do this, I hacked up a custom init(8) called "myinit" that did the
bare essentials: run an ifconfig and then run mount_nfs.  If that all
works, then it executes /usr/init (for maximum configurability on the 
server end).

The arguments to ifconfig and mount_nfs are hard wired into myinit's
source code (ewwwwwwww).

The floppy's contents look like this:

---------------------------------------
# df -k .
Filesystem  1K-blocks     Used    Avail Capacity  Mounted on
/dev/vn0c         763      580      183    76%    /mnt
# ls -lR
total 3
drwxr-xr-x  2 root  wheel  512 Dec 28 20:26 boot
drwxr-xr-x  3 root  wheel  512 Dec 28 20:26 dev 
drwxr-xr-x  2 root  wheel  512 Dec 28 20:26 etc 
drwxr-xr-x  2 root  wheel  512 Dec 28 20:26 stand
drwxr-xr-x  2 root  wheel  512 Dec 28 20:26 usr

./boot:
total 508
-r-xr-xr-x  1 root  wheel  172032 Dec 28 20:26 ifconfig
-r-xr-xr-x  1 root  wheel  159744 Dec 28 20:26 mount_nfs
-r-xr-xr-x  1 root  wheel  176128 Dec 28 20:26 route

./dev:  
total 1 
crw-------  1 root  wheel     0,   0 Dec 28 20:26 console
crw-rw----  1 uucp  dialer   28, 128 Dec 28 20:26 cuaa0
crw-rw----  1 uucp  dialer   28, 129 Dec 28 20:26 cuaa1
crw-rw----  1 uucp  dialer   28, 160 Dec 28 20:26 cuaia0
crw-rw----  1 uucp  dialer   28, 161 Dec 28 20:26 cuaia1
crw-rw----  1 uucp  dialer   28, 192 Dec 28 20:26 cuala0
crw-rw----  1 uucp  dialer   28, 193 Dec 28 20:26 cuala1
crw-r-----  1 root  kmem      4,   0 Dec 28 20:26 drum
dr-xr-xr-x  2 bin   bin         1024 Dec 28 20:26 fd
crw-------  1 root  wheel     2,  14 Dec 28 20:26 io
crw-------  1 root  wheel     7,   0 Dec 28 20:26 klog
crw-r-----  1 root  kmem      2,   1 Dec 28 20:26 kmem
crw-r--r--  1 root  wheel    32,   0 Dec 28 20:26 lkm
crw-r-----  1 root  kmem      2,   0 Dec 28 20:26 mem
crw-rw-rw-  1 root  wheel     2,   2 Dec 28 20:26 null
crw-r--r--  1 root  wheel     2,   3 Dec 28 20:26 random
crw-rw-rw-  1 root  wheel    22,   2 Dec 28 20:26 stderr
crw-rw-rw-  1 root  wheel    22,   0 Dec 28 20:26 stdin
crw-rw-rw-  1 root  wheel    22,   1 Dec 28 20:26 stdout
crw-rw-rw-  1 root  wheel     1,   0 Dec 28 20:26 tty
crw-------  1 root  wheel    12,   0 Dec 28 20:26 ttyv0
crw-------  1 root  wheel    12,   1 Dec 28 20:26 ttyv1
crw-------  1 root  wheel    12,   2 Dec 28 20:26 ttyv2
crw-------  1 root  wheel    12,   3 Dec 28 20:26 ttyv3
crw-r--r--  1 root  wheel     2,   4 Dec 28 20:26 urandom
lrwxr-xr-x  1 root  wheel          5 Dec 28 20:26 vga -> ttyv0
crw-rw-rw-  1 root  wheel     2,  12 Dec 28 20:26 zero

./dev/fd:
total 0
crw-rw-rw-  1 bin  bin   22,   0 Dec 28 20:26 0
crw-rw-rw-  1 bin  bin   22,   1 Dec 28 20:26 1
crw-rw-rw-  1 bin  bin   22,  10 Dec 28 20:26 10
crw-rw-rw-  1 bin  bin   22,  11 Dec 28 20:26 11
crw-rw-rw-  1 bin  bin   22,  12 Dec 28 20:26 12
crw-rw-rw-  1 bin  bin   22,  13 Dec 28 20:26 13
crw-rw-rw-  1 bin  bin   22,  14 Dec 28 20:26 14
crw-rw-rw-  1 bin  bin   22,  15 Dec 28 20:26 15
crw-rw-rw-  1 bin  bin   22,  16 Dec 28 20:26 16
crw-rw-rw-  1 bin  bin   22,  17 Dec 28 20:26 17
crw-rw-rw-  1 bin  bin   22,  18 Dec 28 20:26 18
crw-rw-rw-  1 bin  bin   22,  19 Dec 28 20:26 19
crw-rw-rw-  1 bin  bin   22,   2 Dec 28 20:26 2
crw-rw-rw-  1 bin  bin   22,  20 Dec 28 20:26 20
crw-rw-rw-  1 bin  bin   22,  21 Dec 28 20:26 21
....etc....
crw-rw-rw-  1 bin  bin   22,  61 Dec 28 20:26 61
crw-rw-rw-  1 bin  bin   22,  62 Dec 28 20:26 62
crw-rw-rw-  1 bin  bin   22,  63 Dec 28 20:26 63
crw-rw-rw-  1 bin  bin   22,   7 Dec 28 20:26 7
crw-rw-rw-  1 bin  bin   22,   8 Dec 28 20:26 8
crw-rw-rw-  1 bin  bin   22,   9 Dec 28 20:26 9

./etc:
total 1
-rw-r--r--  1 root  wheel  32 Dec 28 20:26 hosts

./stand:
total 68
-rwxr-xr-x  1 root  wheel  62174 Dec 28 20:26 sysinstall

./usr:
#
---------------------------------------

You will note that I didn't bother messing around with crunch to
save space in the binaries.  You will also note that ifconfig and
route both exist, meaning there are enough tools for a simple Ethernet
router right now.  :-)

To set this thing up for yourself, you're on your own.  Read that line
again a few times...  I will do what I can to help, but there is no
promise of support or assistance with this.  I am a one man shop and
may not have the time to help everyone!

But, here's a few hints.

1) You need a custom kernel, and therefore the FreeBSD kernel sources.
   There is a 2.2-derived kernel config file called XKERNEL included.
   The "build" script expects you to use it.

2) Edit the file "hosts" to contain both your client and the NFS server.
   The client reference is used by "myinit" to ifconfig the interface.
   The server is obvious.  This is not strictly necessary, I guess,
   but was the first step towards making the code more portable and
   less hardwired.

3) Edit myinit.c to have a reasonable set of args for ifconfig and
   mount_nfs.

4) Running "build" after building the kernel will do most of the dirty
   work.

5) dd if=boot.flp of=/dev/rfd0c bs=512    on a formatted floppy to finish
   making your boot floppy.

Now comes more fun.  You get to configure both the NFS server and X11.

6) I highly recommend that you already have a preconfigured XF86Config
   file for the card you want.  Life will suck if you don't.

7) Read the comments in install_server_usr_fs!!!!!!!!!!!!!!!!!!!!!!!!!
   If you do NOT understand what it is doing, do NOT use it, or you
   might seriously hose up your system.  It is simply a tool to do most
   of the dreary stuff automatically.  It does not do everything for
   you.  I advise you to understand it fully.

8) You need to figure out which X11R6/XF86 bits need to get installed.

9) If you want to be able to use "top" to monitor the Xserver (it's a
   good idea), you need a hacked up copy of top with one single change:
   the kvm_open needs to open "/usr/kernel" instead of the value it
   obtains from the system.  This means that your kernel needs to be
   available as /usr/kernel, fortunately "build" leaves it around for
   you.  ("top" doesn't seem to get the keyboard in the correct mode,
   anyone who figures this out gets a hearty thank-you from me.)

   If not - compile usrinit.c with -DNOTOP or it'll whine all day at
   you.

10) Configure your system to NFS export the appropriate data, read-only,
    with as minimal a set of permissions as possible.

11) Set up an XDM server on your network to answer the Xterminal's
    automatic xdm broadcast queries.

12) Boot it.

Comments and improved directions are not unwelcome.

Where possible and practical, the init's will try to emit semi-useful
error messages.  Make sure you page through vty0/vty1 watching for
problems.

---------------------------------------
Some random thoughts about all of this:
---------------------------------------

There are places where a floppy drive might be undesirable, such as a
school:  in such circumstances, it could either be hidden inside the 
machine in a hard drive bay (such that the machine would need to be 
disassembled to access it), or a very low capacity hard drive could
be substituted (use your creativity to build such a beast and install
the stuff on it).

For some applications, it might actually be possible AND acceptable 
to netboot, in which case these tools would still be useful to build 
a minimal skeleton system that was optimized for a task.

There is nothing preventing this from being used for other dedicated
applications.  I've been approached about it for tasks such as a mini-
router, terminal server, etc.  It's all very possible.

For such an application, it might be possible to set up some space on
the floppy as a miniature configuration partition, or provide some
other mechanism to provide for a self-configurable floppy.  The current
system obviously builds the information in at floppy creation time.

It would be neat/cool/challenging to try to eliminate the dependence
on a read-only NFS server, and have an Xserver-on-the-disk.  With an
external font server, such a thing might just be possible!



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199703272125.PAA18688>