This FAQ is maintained by Alistair Riddoch, based on the origonal by Brian Candler; please send all updates to [email protected]. The latest version of this document is available at http://www.ecs.soton.ac.uk/elks. Note that ELKS is in the very early stages of development and this information is likely to become out of date rapidly.
Additional information can be found at the ELKS home page at http://www.uk.linux.org/ELKS-Home.
There is a mailing list. To subscribe, send a message to [email protected] containing the words subscribe linux-8086 in the body. Archives of the mailing list can be found at http://epocha.pd.mcs.net/Linux8086/. At the moment this archive doesn't seem to be working. There was an unofficial linux-8086 mailing list archive at http://www.cyberpass.net/~dummy/robert/archives/linux-8086/ which seems to be down at the moment.
Note that ELKS is not Linux, and the mailing list is not a suitable place for posting questions about Linux (despite its name). These would be better sent to one of the Linux-specific newsgroups such as comp.os.linux.misc
More information on the background, goals and current status of the project can be found at the ELKS home page.
ftp://ftp.ecs.soton.ac.uk/pub/elks/
ftp://cam053212.student.utwente.nl/pub/8086-nix/ELKS/
ftp://tsx-11.mit.edu/pub/linux/ALPHA/linux-16/
ftp://src.doc.ic.ac.uk/packages/linux/tsx-11-mirror/ALPHA/linux-16/
ftp://ftp.amscons.com/pubi/mirrors/ELKS
If you know of any others or wish to set one up, please contact the maintainer.
Recent releases contain a conmpiled binary kernel which most people whould be able to use for initial testing. You should only need to compile your own if you wish to modify the kernel, or change the configuration options. The file boot in images.zip can be written to floppy with dd or RAWRITE.EXE to make a kernel boot disk.
If you want to compile your own kernel, download dev86/Dev86-0.0.13.4.tar.gz and kernel/elks-0.0.67/elks-0.0.67.tar.gz (or the latest versions) from linux.mit.edu, or one of the other sites. Unpack Dev86 them into /usr/src (or any other convenient directory), and elks into /usr/src/linux-86tar -xvzf Dev86-0.0.13.tar.gz -C /usr/src tar -xvzf elks-0.0.67.tar.gz -C /usr/srcThe development environment will be created in /usr/src/linux-86, and the kernel source in /usr/src/elks. Next you have to build the development tools, which include the bcc compiler:
cd /usr/src/linux-86 make installNext, compile the kernel.
cd /usr/src/elks # Build kernel make config make dep makeMake config works in the same way as the main Linux kernel. The default configuration will work on almost all systems. Don't change any of the options unless you know what you are doing.
(If you're used to building Linux kernels with gcc, you'll be amazed at how quick this is! :-) The result is a floppy disk image called "Image", which you can copy to a formatted floppy and boot from.
dd if=Image of=/dev/fd0or
make diskYou should now be able to boot with this disk, but you won't get much further without a root floppy disk for it to mount. You can either use the image file root provided in images.zip, or make your own. You'll need to use bcc to compile an 'init' program and make a root minix filesystem. This is explained further down.
A real version of 'init' is being prepared for inclusion in the tiny-utils package, also on linux.mit.edu. A very basic init and login is included in the sysutils part of the elkscmd package which is distributed with each release. The kernel code has recently been changed so that it loads /bin/init instead of /bin/sh.
To install init and login compile them both with
bcc -0 -O -s init.c -o init bcc -0 -O -s login.c -o loginand copy them into the /bin directory of your root disk. login requires an /etc/passwd and a /etc/group file, and a /bin/sh (or other depending on the entry in /etc/passwd.
-0
selects 8086 code generation,
-O
enables optimisation,
-ansi
enables ansi-style function prototypes (only), and
-s
strips symbols out of the binary.
As of kernel 0.0.56 sash now works and is being used as /bin/sh by most people. It can be found in elkscmd.tar.gz. For best results copy /etc/passwd and /etc/group from a standard linux distribution onto your root disk so that ls -l works okay, and /usr/lib/liberror.txt so that sash error reporting works.
A version of ash is also included which does work under ELKS, but is much larger, and may not work at all on machines with <640K of memory.
dd if=root of=/dev/fd0 bs=8192or under DOS, RAWRITE.EXE can be used.
You need to create a minix floppy containing the appropriate bits and
pieces. This file should contain init, login, and sh in /bin/ and passwd and
group in /etc/, as well as three ttys for init in /dev/.
Note: /dev/tty is different to normal Linux which uses (5,0)
fdformat /dev/fd0H1440 # if floppy not yet formatted mkdir /usr/src/root86 # make a directory cd /usr/src/root86 mkdir dev # create directorys in it cd dev mknod tty c 4 0 # creatye the required devices mknod tty2 c 4 1 mknod tty3 c 4 2 mknod fd0 b 3 128 cd .. mkdir bin cd bin cp <path-to-elkscmd-init> init # copy in essential binaries cp <path-to-elkscmd-login> login cp <path-to-elkscmd-sash> sh cd .. mkdir etc cd etc cp <path-to-skeleton-passwd> passwd # add required files for login cp <path-to-skeleton-group> group cd .. fdformat /dev/fd0H1440 # if floppy not yet formatted mkfs -t minix -n14 /dev/fd0 1440 mount -t minix /dev/fd0 /a # need a mount point "/a" cp -pR /usr/src/root86/* /a umount /aSome distributions use /dev/fd0u1440 instead of /dev/fd0H1440.
You should removed passwords from the passwd file as they are not yet suported, and make sure the shell entry for each user is /bin/sh for future compatability.
Alternatively, if you have a 2.0.x kernel and mount-2.5k, you can use the loopback filesystem to create a disk image on your hard disk, and then dump it to floppy
dd if=/dev/zero of=root.image bs=18k count=80 losetup /dev/loop0 root.image mkfs -t minix /dev/loop0 1440 mount -t minix /dev/loop0 /a ... umount /a dd if=root.image of=/dev/fd0As of ELKS 0.0.53 floppy sizes other than 1.44M now work. Just follow the above intructions substituting the appropriate sizes in where required. However, because of the way 360K disks are written by 1.2Meg drives, the instructions below must be followed if you are trying to boot a machine with a 360K drive.
One solution is to fit a 360K drive as the second drive in your Linux PC - you can then format 360K disks with fdformat /dev/fd1d360 and create filesystems as usual.
Otherwise, you will need to create a floppy disk image file, transfer it to the PC which has the 360K drive (e.g. using a serial cable), then use "rawrite" under DOS to recreate the disk from the image file.
Root disks are now autodetected so you no longer have to re-compile for disk sizes other than 1.44Mb.
dd if=/dev/fd0 of=root.image bs=1k count=360This image can then be transferred to the target and written out using 'rawrite' as before. If you use the loopback filesystem this step is not necessary.
If you get an error about root disk mount failing on device 03c0, load the boot image into a hex editor and look for c003h somewhere near the start of the image and change it to 8003h. (c003h is 03c0 in Intel's backwards byte ordering). This should work for any version, but it is not clear whether the address of the byte to edit varies between version. [email protected] reports that in 0.0.62 boot image, the two bytes are at 0adf - oade.
First create a partition with fdisk. Any version of fdisk will be able to do this, but the current root disk only supports hd?1-4, which are primary partitions, and if you already have a DOS primary partition you will not be able to make a second primary partition with DOS fdisk. The version of fdisk included on the ELKS 0.0.67 root disk is still young code, but seems to work fine on my system.
Having created the partition, boot ELKS from boot and root floppies, and create a filesystem using mkfs. It is safe to use ELKS fdisk to check you know the correct device name for the partition you want to create the filesystem on. To create the filesystem type
mkfs /dev/hd?? <size>where hd?? is the correct partition, and size is the size of the partition in Kbyte blocks. <size> cannot be more than 32M. E.g. To make a filesystem on the first partition on the slave disk, which is a 20M partition type:
mkfs /dev/hdb1 20000
Now mount the partition on the /mnt mount point by typing
mount /dev/hd?? /mntwhere hd?? is the correct partition. The root directory of the new partition may look a bit corrupted and it may not be possibly to use ls from /mnt. I am not sure why mkfs is generating slightly corrupt filesystems, but I am working on it.
Create the essential directories on the new filesystem as follows:
mkdir /mnt/bin mkdir /mnt/dev mkdir /mnt/usr mkdir /mnt/usr/lib mkdir /mnt/mnt mkdir /mnt/etc mkdir /mnt/root mkdir /mnt/home mkdir /mnt/home/user?....
Now copy essential files. You will need many more than these for a decent system but here are the essentials and some of the more useful ones.
cp /bin/init /mnt/bin/init cp /bin/login /mnt/bin/login cp /bin/sh /mnt/bin/sh cp /bin/ls /mnt/bin/ls cp /bin/pwd /mnt/bin/pwd cp /bin/mount /mnt/bin/mount cp /bin/umount /mnt/bin/umount cp /bin/cp /mnt/bin/cp cp /etc/passwd /mnt/etc/passwd cp /etc/group /mnt/etc/group cp /usr/lib/liberror.txt /mnt/usr/lib/liberror.txt
Finally create the essentail devices:
mknod /mnt/dev/tty c 4 0 mknod /mnt/dev/tty2 c 4 1 mknod /mnt/dev/tty3 c 4 2 mknod /mnt/dev/fd0 b 3 128 mknod /mnt/dev/fd1 b 3 192 mknod /mnt/dev/hda b 3 0 mknod /mnt/dev/hda1 b 3 1 mknod /mnt/dev/hda2 b 3 2 mknod /mnt/dev/hda3 b 3 3 mknod /mnt/dev/hda4 b 3 4 mknod /mnt/dev/hdb b 3 64 mknod /mnt/dev/hdb1 b 3 65 mknod /mnt/dev/hdb2 b 3 66 mknod /mnt/dev/hdb3 b 3 67 mknod /mnt/dev/hdb4 b 3 68
Now unmount the new partition with
umount /dev/hd??
You will now need to re-compile a new kernel with the correct root device selected. To do this edit include/linuxmt/conmfig.h in the ELKS kernel sources, and changed the ROOT_DEV from 0x380 to the device number of the partition. The last two digits must be the minor number of the partition in hex. The minor number can be found from the list above in the far right column. E.g. The minor number for hdb3 is 67, which is 43 in hex, so the ROOT_DEV value is 0x343.
Type
make diskto build a new kernel floppy, and reboot the ELKS machine with this new boot disk. The new root should mount, but may give a warning, and the system come up as normal, but much faster than from floppy. As before the root directory may be corrupted, but it should be possible to change to other directories normally, and the system should work otherwise normally.
cd /usr/src/linux-86/elksemu make module insmod binfmt_elks.oNote that you will need to rerun the 'insmod' each time you reboot. There are some sample bcc programs you can try in /usr/src/linux-86/tests (such as a version of 'wc')
If when making the module you get an error saying "modversions.h: no such file or directory" then you need to edit the Makefile to remove the reference to this file, i.e.:
MODCFLAGS=-D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer \ -fno-strength-reduce -pipe -m486 -DCPU=486 -DMODULE -DMODVERSIONS
floppy { device /dev/fd0 threeinch }
> From: Bar-David YedidyaThere are reports this broke under the recent ELKS versions (>0.0.46?) Note - will this work on pre 386 machines?> > Today I managed to combine root/boot disks using LILO. It just worked! > > I created /boot on the floppy, copied Image and boot.b to it, > put in /etc (on the floppy) lilo.conf with this : > boot=/dev/fd0 > compact > image=/boot/Image > label=lin16 > did lilo -r /mnt > and Hopla! > I didn't look at the kernel sources yet to compare the boot code of linux > and linux-16, but I guess they act the same, and that's why lilo worked.
Chad Page is working on a single disk system which should be in the next version.