Unix BSD/OS 4.3 Install on Qemu 386


A practical approach for the Qemu 386 install of the operating system from Berkeley Software Design BSD/OS 4.3 (2002). Installing and running a legacy Unix system is a great point of reference concerning the study and appreciation of older operating systems. BSD/OS 3.x to 5.x also install in a very similar way. The audience is experienced Unix and Linux administrators.

CLARIFICATION: This is the BSD/OS 4.3 version for i386 from 2002, and not the classic 4.3BSD Berkeley Unix for the VAX from 1986. For that install visit Install 4.3BSD Berkeley UNIX with VAX780 SimH Emulator and TCP/IP Networking


The copyright declaration as seen inside the mounted ISO download:


BSD/OS Release 4.3
Copyright 2001 Wind River Systems, Inc.
Copyright 1992,1993,1994,1995,1996,1997,1998,1999,2000,2001
	Berkeley Software Design, Inc.

Portions Copyright by other entities, see individual modules for details.

Use of this software is governed by the Wind River Systems, Inc.
Software License.

If you do not accept the terms of this license, immediately return the
distribution to the place of purchase for a full refund. Further
use of the software will be considered to be acceptance of the terms
of the license.


Download 4.3BSD [612MB]: https://archive.org/download/bsdos-4.3/bsdos-4.3-binary.iso

$ mkidr -p /u1/qemu/4.3bsd
$ cd /u1/qemu/4.3bsd
$ wget https://archive.org/download/bsdos-4.3/bsdos-4.3-binary.iso

Host Specs

Configurations used:

    PC: Dell Optiplex Intel i7, 32G Mem, 1T SSD.
    OS: Debian Linux 10.5 AMD64
    Emulator: Qemu 3.1.0
    Bridge Network: br0
    Tunnel: tap0

Network Configuration

Bridged and tap network configuration.

$ sudo cp /etc/networks/interfaces{,.$RANDOM.bak}

$ sudo cat > /etc/network/interfaces <<EOF
auto lo
iface lo inet loopback
iface eth0 inet manual
auto br0
iface br0 inet static
	bridge_ports eth0
	bridge_fd 9
	bridge_hello 2
	bridge_maxage 12
	bridge_stp off
	pre-up ip tuntap add dev tap0 mode tap user ramses
	pre-up ip link set tap0 up
	bridge_ports all tap0
	bridge_maxwait 0
	#bridge_fd      0
	post-down ip link set tap0 down
	post-down ip tuntap del dev tap0 mode tap

$ sudo systemctl restart networking

$ /sbin/ifconfig 
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet  netmask  broadcast

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 98:90:96:e4:60:b5  txqueuelen 1000  (Ethernet)

tap0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether fa:97:72:75:1b:3a  txqueuelen 1000  (Ethernet)

Prepare Disks

Extract the installation floppy image:

$ sudo mount -o loop bsdos-4.3-binary.iso /mnt
$ cp /mnt/FLOPPIES/INSTALL.img .
$ sudo umount /mnt

Create the hard drive image. It will not work with 4GB or bigger. I made mine 2GB. Also be sure to make it fully writable:

$ qemu-img create -f qcow2 bsd4.3.qcow2 2G
Formatting 'bsd4.3.qcow2', fmt=qcow2 size=2147483648 cluster_size=65536 lazy_refcounts=off refcount_bits=16

$ qemu-img info bsd4.3.qcow2 
image: bsd4.3.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

$ chmod 0666 bsd4.3.qcow2

Qemu Boot Script

cat > boot.sh << EOF
qemu-system-i386 -M pc -cpu 486 -m $MEM \
 -fda $FLP \
 -drive file=$CD,if=ide,index=1,media=cdrom \
 -hda $HD \
 -boot $BOOT -no-fd-bootchk \
 -net nic,model=ne2k_pci -net tap,ifname=tap0,script=no,downscript=no \
 -k en-us -rtc base=localtime 2>&1 &

$ chmod +x boot.sh

First Boot

Run the boot.sh script. To exit the Qemu screen press “Ctrl-Alt-G”.

$ ./boot.sh


After a while it pops up a blue welcome screen. Do not go through the wizard. It will get you nowhere. We have to format the drives and install the packages manual. Press “Ctrl-C” or type “!shell” to exit to the prompt.



Mount the CDROM,

# mount_cd9660 /dev/sr0a /cdrom


Verify Networking

Make sure that networking is up and running and that you are able to ping the gateway and another machine. Here we are simply making sure that the networking does work. These settings are temporary and work only during the install. Additionally, networking settings during the install can function as an alternate installation method using an NFS mount on /cdrom. More on that later.

# ifconfig ne1
# ifconfig ne1 netmask
# route add default
# ping

Partition Hard Disk

Before formatting the virtual hard disk verify the physical disk parameters as seen by the kernel. This is sometimes necessary because BSD tends to use the last sectors of the disk for recording bad blocks. IDE disk is usually created as /dev/wd0 and SCSI is sd0. Record the number of sectors-per-track after running the disk setup command.

# disksetup wd0

bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 4161
sectors/unit: 4194288

To calculate sectors units divide total bytes by the smallest block size of 512. Total size of 2GB = 2 to the power of 31. The bytes total should be a couple of bytes more than what is reported by the BIOS above:

$ echo "(2^31)/512" | bc

Default to the cdrom directory which has the bootstraps, run the interactive disk setup utility against the raw disk file /dev/rwd0, and answer the text wizard questions:

# cd /cdrom/usr/bootstraps/
# disksetup -i rwd0

Use an FDISK table? NO


Next verify the geometry of and press Enter to continue. At the next screen press “C” to choose [C]MOS geometry.


Continue with the default answers:

Would you like to view or change the geometry? NO
Would you like to use standard BSD partition table? YES
Would you like to view/alter the BSD partition table created? NO
Do you wish to install new BSD/OS boot blocks? YES
What type of boot blocks do you wish to install? bios
Okay to write new disk label and BSD/OS boot blocks? YES


At this point your hard disk is partitioned and your boot block is set and ready to boot the Unix kernel. Run the disk setup utility one more time with no parameters in order to view the partitions.

# disksetup rwd0


As seen above, BSD creates three partitions, “a”, “b” and “h” - root, swap and /usr/. Up to eight partitions per disk can be created, lettered from a to h. To calculate the default partition sizes in bytes multiply the number of blocks by the block size 512, then remove the last six numbers to return in megabytes.

$ a=`echo "57456*512" | bc` ; echo "${a::-6}"
$ a=`echo "393120*512" | bc` ; echo "${a::-6}"
$ a=`echo "3742704*512" | bc` ; echo "${a::-6}"
    / = 29MB
    swap = 201MB
    /usr = 1916MB

Format Partitions

Create the BSD file system:

# newfs -O /dev/rwd0a
# newfs -O /dev/rwd0h

Ignore the “wd0: format error in bad-sector file”. Old-style UFS is not exactly 100% compatible with virtual disks.

Check the file systems:

# fsck -y -f /dev/rwd0a
# fsck -y -f /dev/rwd0h

Install Software

Mount the root and /usr/ directories to the temporary /a/, and install the software:

# mount /dev/wd0a /a
# mkdir /a/usr
# mount /dev/wd0h /a/usr
# df
# installsw -d /a -m cdrom


Next, disable all the unnecessary software by pressing the corresponding letter. Here I decide to not omit X11 and development packages, which I will not use for studying this OS.



Press “N” when ready, then “y” to confirm. The packages should begin installing with a progress bar.


Take a 10 minute coffee break. At the end it should display “100% complete:” and “All packages were installed successfully.”


Copy Kernel, Mounts then Shutdown

Show the storage percentage consumed then copy the kernel.

# df
# cp /cdrom/bsd /a/
# cp /cdrom/boot* /a/

Create the file system tab. There is a sample file available for copy.

# cp /a/etc/fstab.sample.wd0 /a/etc/fstab
# cat /a/etc/fstab
/dev/wd0a /    ufs rw 0 1
/dev/wd0h /usr ufs rw 0 2

Dismount then gracefully shut down.

# sync
# cd /
# umount /a/usr
# umount /a
# umount -f /a

To shutdown simply close the Qemu window after the dismounts.

Boot to Disk

Boot to disk instead of the floppy by changing the BOOT parameter in the boot script.

# sed -i 's/BOOT=a/BOOT=c/g' boot.sh

# ./boot.sh

Final Boot

Type “manual” at the System Configuration screen, then press Enter.

Enter unlimited license, as seen below, shown in https://archive.org/details/bsdos-4.3: “K8ix @Vix @Dnw”, then press Enter.

Follow the prompts and select your region and time zone.

Enter your machine name FQDN, such as: bsd43.example.com

Next it should detect and display the NE2000 network car, to be selected.


Next type your static IP address, such as:, Netmask:, Gateway:


Last, it will ask you to confirm the changes, and after pressing Enter, the system will boot to a login prompt.


Login as root. It will not prompt you for the password the first time.



Useful links for classic Unix enthusiasts and Unix historians:


The End.