Installing 386BSD on BOCHS
This is the procedure that was used to install 386_BSD onto a patched version of the Bochs IA-32 emulator. This is based on ancient FAQs and trial & error. It is assumed you use a modern Linux with a kernel that features the ip_tables packet filter and TUN/TAP as host OS. If you want to use a different platform you can still follow the tutorial as a guideline but you are on your own figuring out how to get the emulator networked. A good starting point is http://bochs.sourceforge.net/doc/docbook/user/bochsrc.html#AEN1831
Special attention has been given to the ability to run the emulator in a terminal and in the background.
Watch out for leading spaces if you copy/paste anything from the boxes below, they tend to break here-documents.
Contents
Requirements
You will need the following to get a 386BSD system patched and installed:
- A modern linux system with iptables
- A working copy of gunzip
- An http/ftp client like wget
- An acceptable C compiler like gcc to compile Bochs
- The curses/ncurses library for Bochs to simulate a monitor in a terminal
- An ftp server for the distribution files
On a stock Basic Fedora Core 8 box you have these in no time with
yum -y install wget yum -y install gcc yum -y install gcc-c++ yum -y install ncurses-devel yum -y install vsftpd
We will get to this later in the tutorial, but for those attempting to install on a different platform or those using this tutorial as a guide, you also need:
- The bochs 2.4.2 sources
- A patched pic.cc
- The 386BSD distribution and patchkits
You can download the Bochs sources from sourceforge
A patched pic.cc can be found at
The 386BSD 0.1 distribution and patchkits can be found at
Preparing for installation
Get, patch, configure and compile Bochs
The Tiny 386BSD boot floppy does something odd. It writes 0x02 to port 20h of the emulated PIC. This causes Bochs to panic. The patch enables Bochs to continue in CLI mode. The available windows binary for Bochs comes up with a msgbox.
cd /usr/local/src wget http://downloads.sourceforge.net/project/bochs/bochs/2.4.2/bochs-2.4.2.tar.gz gunzip -c bochs-2.4.2.tar.gz |tar -xvf - wget http://www.xs4all.nl/~dugo/pic.cc mv -f pic.cc ./bochs-2.4.2/iodev/pic.cc cd bochs-2.4.2 ./configure --enable-cpu-level=3 \ --enable-ne2000 \ --with-term \ --with-nogui \ --enable-all-optimizations \ --enable-docbook=no make && make install
Get and serve the 386BSD distribution and patches
During installation the 386BSD distribution files and patches can be fetched with ftp. To facilitate this set up an anon ftpd that serves up the files. It should be possible to obtain these directly from minnie during install, but there are two problems. From the looks of it Warren Toomey never intended minnie to be a 386BSD install server. There is also a catch 22 in using the famous patchkits. Stock 386BSD 0.1 comes without gzip, the patches are gzipped, so here your chance to get around that.
echo listen=YES >> /etc/vsftpd/vsftpd.conf vsftpd cd /var/ftp wget -r -np ftp://minnie.tuhs.org/BSD/386bsd-0.1/ wget -r -np ftp://minnie.tuhs.org/BSD/386bsd-patchkits/ mv minnie.tuhs.org/BSD ./ rmdir ./minnie.tuhs.org cd /var/ftp/BSD/386bsd-patchkits gunzip *gz
Prepare the host for networking Bochs
To make Bochs' ne2k work without a spare NIC in your host you need to set up tunneling.
echo alias char-major-10-200 tun >>/etc/modprobe.d/modprobe.conf.dist depmod -a ln -s /dev/net/tun /dev/net/tun0
Make a tunconfig script for bochs to fire off when the ne2k comes up. In this example 192.168.1.1 becomes the gw and you can pick an ip in 192.168.1.0/24 for the guest later.
# set up the bsd dir w/ tunconfig cd; mkdir bsd; cd bsd printf '#!/bin/bash\n/sbin/ifconfig ${1##/*/} 192.168.1.1\n' >tunconfig cat >>tunconfig <<__EOF # carnival, put your masks on and go /sbin/iptables -D POSTROUTING -t nat -s 192.168.1.0/24 -d ! 192.168.1.0/24 -j MASQUERADE >& /dev/null /sbin/iptables -t nat -s 192.168.1.0/24 -d ! 192.168.1.0/24 -A POSTROUTING -j MASQUERADE echo 1 > /proc/sys/net/ipv4/ip_forward __EOF chmod +x tunconfig
Configure Bochs
The 386BSD installation fails on a box with a lot of mem, hence the `megs: 8' stanza in the bochs configuration.
cat >bochsrc <<__EOF config_interface: textconfig display_library: term romimage: file=/usr/local/share/bochs/BIOS-bochs-legacy cpu: count=1, ips=80000000, reset_on_triple_fault=0 megs: 8 vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest vga: extension=none floppya: 1_44=boot.img, status=inserted ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 ata0-master: type=disk, path="disk.img", mode=flat, cylinders=1024, heads=16, spt=63, translation=none, model=generic boot: disk, floppy floppy_bootsig_check: disabled=0 log: bochsout.txt panic: action=ask error: action=report info: action=report debug: action=ignore vga_update_interval: 400000 keyboard_serial_delay: 250 keyboard_paste_delay: 1000000 mouse: enabled=0 private_colormap: enabled=0 keyboard_mapping: enabled=0, map= i440fxsupport: enabled=0 ne2k: ioaddr=0x300, irq=9, mac=fe:fd:00:00:00:01, ethmod=tuntap, ethdev=/dev/net/tun0, script=/root/bsd/tunconfig com1: enabled=0 __EOF
Create Tiny 386BSD floppy
Prepare the 386BSD boot floppy to work on our emulated box that has a fancy 1.44MB floppy drive. The original floppy was intended for 1.2MB floppys, but who wants to be caught dead using these nowadays?
(cat /var/ftp/BSD/386bsd-0.1/bootable/dist.fs;dd if=/dev/zero bs=1 count=245760)>boot.img
Create a disk image
Make a disk that has the same geometry as in the configuration file, in this case 1024 cylinders, 16 heads and 63 sectors per track. This gets you a about 500 megabytes, go larger and you get yourself in heaps of trouble.
printf "hd\nflat\n504\ndisk.img\n" |bximage
First boot, Tiny 386BSD
Start up Bochs
You should now be ready to fire up bochs in your terminal and start your journey back in time.
bochs -q -f bochsrc
You should get the following output:
Plex86/Bochs VGABios 0.6c 08 Apr 2009 NO Bochs VBE Support available! Bochs BIOS - build: 09/28/09 $Revision: 1.235 $ $Date: 2009/09/28 16:36:02 $ Options: apmbios pcibios eltorito ata0 master: generic ATA-6 Hard-Disk ( 504 MBytes) Press F12 for boot menu. Booting from Hard Disk... Boot failed: not a bootable disk Booting from Floppy... 386BSD Release 0.1 by William and Lynne Jolitz. [0.1.24 07/14/92 19:07] Copyright (c) 1989,1990,1991,1992 William F. Jolitz. All rights reserved. Based in part on work by the 386BSD User Community and the BSD Networking Software, Release 2 by UCB EECS Department. pc0<color> at 0x60 irq 1 on isa wd0 <generic> at 0x1f0 irq 14 on isa fd0 drives 0: 1.44M at 0x3f0 irq 6 drq 2 on isa ne0 ethernet address fe:fd:00:00:00:01 at 0x300 irq 9 on isa npx0 at 0xf0 irq 13 on isa changing root device to fd0a warning: no swap space present (yet) 386BSD Distribution Installation Floppy (Tiny 386BSD) Release 0.1 Please read the installation notes (type 'zmore INSTALL.NOTES') and registration information (type 'more REGISTRATION') before use. To install on hard disk drive, type 'install'. erase ^?, werase ^H, kill ^U, intr ^C # || style="background:#000000;"| |
Format drive and install the distribution utilities
At he promt give:
(echo y; echo y)|install
This will cause the installer to format the entire drive as it sees fit and install the distribution utilities on it. When the installer is finished Tiny 386BSD and Bochs will go down gracelessly.
Second boot, Base System
=== Finnish the installation.
Restart Bochs
Give another:
bochs -q -f bochsrc
..to boot the base system. After it finds the devices it will greet you with the following:
386BSD Base System Release 0.1 |
Write an installer
The installed 386BSD kernel keeps kprinting `startartstartart' to your screen once network is up and running. This can get on your nerves, to work around this you can write an instsaller in a .netrc macro.
Change the ips below, 10.0.0.1 to where your ftpd lives, 192.168.1.1 to your gw and 192.168.1.2 to the ip you want to give the guest. Change odin into the name you want to give the guest.
echo "machine 10.0.0.1" >.netrc echo "login ftp" >>.netrc echo "password news@EU.net" >>.netrc echo "macdef init" >>.netrc echo "#" >>.netrc echo "pasv" >>.netrc echo "prompt" >>.netrc echo "bin" >>.netrc echo "lcd /tmp" >>.netrc echo "cd BSD/386bsd-0.1/bindist/" >>.netrc echo "mget *" >>.netrc echo "cd ../etcdist/" >>.netrc echo "mget *" >>.netrc echo "cd ../srcdist/" >>.netrc echo "mget *" >>.netrc echo "cd ../../386bsd-patchkits" >>.netrc echo "mget *tar" >>.netrc echo "!echo odin |extract bin01" >>.netrc echo "!csh -c \"limit openfiles 512; extract src01 ; extract etc01 ; tar -cf /dist.tar /tmp/ ; cp pk023.tar /pk023.tar ; cp pk023024.tar /pk023024.tar ; sync ; sync ; sync ; /sbin/shutdown -r now\"" >>.netrc echo "quit" >>.netrc echo "#newl" >>.netrc echo "" >>.netrc chmod 400 .netrc
Configure the network
Watch out for the startarts.
ifconfig ne0 192.168.1.2 netmask 255.255.255.0 up route add default 192.168.1.1
Start the installation
Extract will complain with:
/tmp/install.src01: Can't open /tmp/install.src01 extract: Cannot execute installation script of distribution, failed
according to an ancient FAQ this is a joke from Jolitz. I don't get it.
Extract (or cat) also opens more files than the base sh can handle in case you were wondering about the use of csh.
ftp 10.0.0.1
When the macro is finnished Bochs will go down gracelessly.
Third boot, fsck
When you restart Bochs again with:
bochs -q -f bochsrc
386BSD will boot, fsck the disk and shut down again. Don't panic.
Fourth boot, multiuser mode
Restart Bochs
After another
bochs -q -f bochsrc
you boot into multisuser mode.
386BSD Release 0.1 by William and Lynne Jolitz. [0.1.24 07/14/92 19:07] Based in part on work by the 386BSD User Community and the BSD Networking Software, Release 2 by UCB EECS Department. pc0<color> at 0x60 irq 1 on isa wd0 <generic> at 0x1f0 irq 14 on isa fd0 drives 0: 1.44M at 0x3f0 irq 6 drq 2 on isa ne0 ethernet address fe:fd:00:00:00:01 at 0x300 irq 9 on isa npx0 at 0xf0 irq 13 on isa Automatic reboot in progress... /dev/rwd0a: 13409 files, 240517 used, 253130 free (674 frags, 31557 blocks, 0.1% fragmentation) starting network starting system logger. checking for core dump... preserving editor files clearing /tmp standard daemons: update crond. starting network daemons: routed printer sendmail inetd. starting local daemons:. Wed Apr 8 13:16:44 PST 1970 386BSD (odin) (console) login: || style="background:#000000;"| |
386BSD 0.1 is installed now. You are at the point where Bill and Lynne Jolitz said "Cut the Tape" on 14th of July 1992. 386BSD 0.2 never happened. Now that you have 386BSD installed you can take the opportunity to travel forward in time to the birth of modern BSD. In 1992 and 1993 people released patchkits for 386BSD. In early 1993 David Greenman proposed a new operating system based on the patchkits with a new name: "FreeBSD." These steps will bring 386BSD up to the point where maintaining the patchkits became too cumbersome.
For more on this part of history read:
- http://www.freebsdworld.gr/freebsd/bsd-family-tree.html
- http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/history.html
Apply the first patchkit
Login as root, no password, and install the first of the two patchkits.
exec sh cd / tar -xvf pk023.tar mv patch dist cd dist/bin ./mkpatchdirs (echo y; echo; echo; echo IALL; echo y ; echo ; echo q)|./patches ./afterinstall.sh
Recompile the kernel
As instructed by mkpatchdirs, recompile the kernel. For Bochs the GENERICISA will do for now. There is something to be said for adjusting the kernel configuration, but this is left as an exercise better done later on.
rm -r /sys/compile/* cd /sys/i386/conf config GENERICISA cd /sys/compile/GENERICISA make depend make mv /386bsd /386bsd.old cp 386bsd /386bsd sync; sync; sync shutdown -rf now
Fifth boot, GENERICISA
Upgrade the virtual machine and restart
Now that you have a proper kernel you can upgrade your machine to use some more than the 8 megs we gave it before.
sed -e's/megs: 8/megs: 256/' bochsrc >bochsrc256 bochs -q -f bochrc256
Buildworld
The system is in a bit of an odd state, the sources are patched but most of the binaries are still the same. So put your new memory to good use, log in as root and execute a buildworld. Note that this can take a while.
exec sh cd /patch/bin ./buildworld.sh sync; sync; sync shutdown -rf now
and fire up Bochs again
bochs -q -f bochrc256
Sixth boot, patched and recompiled system
Apply the second patchkit
Login as root, don't use su.
exec sh cd / tar -xvf pk023024.tar (echo y ; echo ; echo ; echo IALL ; echo y ; echo ; echo q )|./patches ./afterinstall.sh
Recompile GENERICISA
rm -r /sys/compile/* cd /sys/i386/conf config GENERICISA cd /sys/compile/GENERICISA make depend make mv /386bsd /386bsd.old cp 386bsd /386bsd sync; sync; sync shutdown -rf now
and fire up Bochs again
bochs -q -f bochrc256
Seventh boot, almost there
Buildworld
Login as root and perform another buildworld. Like before, this takes a while.
exec sh cd /patch/bin ./buildworld.sh sync; sync; sync shutdown -rf now
TO BE CONTINUED