Downloading the latest Linux kernel from a floppy disk on a 486th computer
Back in August 2019, I held the Sing-Along Week synchronization contest A MIDI file with a speech synthesizer that sings a song. In my warehouse I found a MIDI card MQX-32M (clone Roland MPU-401), which I wanted to use to convert MIDI signals to Apple II + with an Echo II speech synthesizer, but ended up using a laptop with a USB MIDI interface. Another contest Pizza Week made me interested in finding a 486 computer that would fit into a pizza box, and here is a good opportunity.
Searching on eBay was not easy because it was not possible to find a really good search query. I did not bother to save the search, since this project is not a priority. Instead, from time to time, something inspired me to go to eBay and try new searches. A couple of weeks ago, I noticed this 486th computer and made an assumption about the size of the case, judging by the height of the 5.25-inch compartment. It is quite thin, and it has a special card to insert other cards sideways, and the case is shorter than the ISA card. Although it's thicker than a pizza box, it's close!
Motherboard TMC PAT48PG4 comes with 32 MB of RAM (technically 36 MB, it has four 30-pin SIMs) and four cards: VGA, SoundBlaster, modem and multi-function I/O. The seller checked the computer and sold it as a non-working one, because it did not pass POST, although all the cards worked. I basically needed a case, so I didn't really bother. Of course, when I got the computer, I had to check if the motherboard was really dead. He didn’t work for me either, but then I found that if you press the reset button, several error beeps are heard. I tried a different power source, and the systems came to life after pressing the Reset button! It still does not boot from a cold shutdown at the press of a power button, it’s not sure if there is a bad cover or a slight damage to the battery (the battery has changed before) that prevents the Reset line from turning off after turning on the power. However, he worked enough to explore his possibilities.
My ultimate goal is to install the latest Linux and Python 3 distribution on a "large" hard drive. Since we have a 486th computer, installing the current Linux distribution is not a trivial task. The only Linux distributions that still support installation from floppy disks are quite outdated. Usually I completely bypassed the installation from floppy disks and simply booted the old computer through PXE, and then installed the system over the network. I thought I could write iPXE to disk and insert it into ISA NIC, but iPXE just freezes without any error messages immediately after booting from a floppy disk.
The BIOS is ancient and tormented with support for the "large" hard drive that I connected. The disk size is 8.45 GB, but the BIOS only sees 8.0 GB. Enabling LBA in the BIOS causes the computer to freeze during POST after a disk is detected. Win98 fdisk insists that the drive is only 504 MB. FreeDOS does not see it at all. I tried inserting a network adapter with an XTIDE ROM into the slot, and XTIDE also insists that the disk is not connected.
Since I wanted to see how Linux would detect the drive, I needed to find a way to boot Linux. Googling a bit, I found the make tinyconfig option, which makes a very small (but useless) kernel, quite small, to fit on a floppy disk. I turned on a couple of other options, found a rather small initramfs and was able to load it on the 486th. As expected, Linux sees the disk and its full capacity without any problems.
The next step is to actually install Linux on your hard drive. I would prefer not to release my own distribution, but you may have to. Another option is to boot Linux from a floppy disk, and then boot the kernel and initrd from the current distribution and kexec to it. But it seems to me that it's like reinventing the iPXE.
Compiling the Linux kernel from source code
Summary of steps to create an image on floppy:
- git clone git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
- v5.8-rc2-1-g625d3449788f at time of writing of the article
- make ARCH=x86 tinyconfig
- make ARCH=x86 menuconfig
- Set processor to 486: CONFIG_M486=y
- Processor type and features > Processor family > 486
- Include tty: CONFIG_TTY=y
- Device Drivers > Character devices > Enable TTY
- Include printk: CONFIG_PRINTK=y
- General Setup > Configure standard kernel features (expert users) > Enable support for printk
- Enable initramfs: CONFIG_INITRAMFS_COMPRESSION_GZIP=y
- General Setup > Initial RAM filesystem and RAM disk (initramfs/initrd) support > Support initial ramdisk/ramfs compressed using gzip
- Enable ELF: CONFIG_BINFMT_ELF=y
- Executable file formats > Kernel support for ELF binaries
- Set processor to 486: CONFIG_M486=y
- make ARCH=x86 bzImage
You will need rootfs, get the image system-image-486 from Aboriginal Linux , extract rootfs.cpio. gz.
Test boot with qemu:
qemu-system-i386 -kernel arch/x86/boot/bzImage -initrd../system-image-486/rootfs.cpio.gz
Creating an Empty Floppy Image:
dd if=/dev/zero of=linux-boot.img bs=1k count=1440 mkdosfs linux-boot.img syslinux --install linux-boot.img mount -o loop linux-boot.img/mnt cp arch/x86/boot/bzImage/mnt cp rootfs.cpio.gz/mnt
DEFAULT linux LABEL linux SAY Now booting the kernel from SYSLINUX... KERNEL bzImage APPEND initrd=rootfs.cpio.gz
Burning an image to a floppy disk:
umount/mnt fdformat/dev/fd0 ddrescue -f -D linux-boot.img/dev/fd0