Earlier this year I brought an old laptop to my home my grandfather once gave. It is a relict from roughly 1999, with which I’ve already played around some nine years ago.
Prior to 38C3 I had the idea to bring it to the congress so people could mess around with it. In the end, I was the one messing around with it, fighting to get some operating systems installed on this poor thing.
Hardware
The laptop I’m talking about is a Fujitsu-Siemens Lifebook S4510 with BIOS version 1.36 released at 1999-11-30.
The hostnamectl status
output is expectedly really hilarious (the firmware age is originally printed in yellow):
Firmware Version: Version 1.36
Firmware Date: Tue 1999-11-30
Firmware Age: 25y 1month 5d
CPU
This device has a Intel(R) Pentium(R) III (Coppermine) processor with astonishing 0.4GHz single core. No multithreading. According to Wikipedia, this processor was produced with a 180 nm process node. It has 32 KiB of L1 cache and a 256KiB L2 cache, not bad for its time.
RAM
This thing boasts 256 MiB of SDRAM running at 100 MHz.
According to lshw
, it even has an empty second slot, but I don’t have any sticks to insert.
Battery
There is an internal Lithium-ion battery with originally 28 Wh of capacity. I believe some models even had the room for two batteries for easy switching. Unfortunately, the driver cannot give me details on the remaining capacity, but after this time it is expectedly bad. Some minutes and it’s completely empty, giving a last beep before turning forcefully off.
I/O
This thing has versatile I/O functionality, but not what one expects from current computers. It has internally:
- IDE for the hard drive (40 GB from Fujitsu)
- An IDE-like connector for CD drives. I have a CD-ROM drive (not DVD) and a SuperDisk drive with one 120 MB floppy for this slot.
- PCMCIA. I have adapters for a serial (RS-232) connection, SmartMedia memory cards and CompactFlash storage devices. I heavily use the one 512 MB CompactFlash card I have as swap storage for better random I/O performance. I also know about WLAN cards and cards offering more USB ports for PCMCIA.
The external connectors are:
- VGA
- USB 1.1 (max. 12 Mbit/s)
- Ethernet (100 Mbit/s)
- Dialup modem port
- Infrared transciever
- A mini RS-232 connector?
- 3.5 mm headphone, microphone and the third audio input jacks
A passive docking station with a probably proprietary connector extends the I/O with:
- PS/2 ports for keyboard and mouse
- parallel printer connector
- full-size RS-232 connector
- mini external floppy drive connector, for which I actually have the fitting external floppy drive
Software
I had played around with this computer some nine years ago. Back then I installed antiX on it, a Debian fork particularly suited for old devices, without systemd. I was pleasantly surprised that this old installation was working just fine.
For the congress, I thought it would be funny to install Windows 98 or XP on this system. Windows 98 was the preinstalled system back then, at least a license sticker is still glued at the bottom of this machine. Unfortunately, I forgot my CD collection at home, resorting to other means starting an operating system. Not easy on this old machine.
Booting from USB
The BIOS cannot boot from USB, the boot menu only offers the hard drive (on which we want to install a system on), the CD or SuperDisk, the external floppy as boot media, and finally network boot. The floppy and SuperDisk fall short on storage size, and CDs were not available to me at that time. And I had no intent to setup network boot. What I then tried to use was Plop, a custom boot manager I already found those nine years ago. It’s written in pure assembly and really tiny, fitting on a floppy or in the first MB of a hard drive (MBR plus some empty space). It can boot from almost anywhere and start almost anything, as it has its own CD and USB drivers. This finally allowed me to boot some installation media, namely Linux and Windows.
Windows
Despite extensive tries, we were not able to get Windows 98 SE or Windows XP to boot on this machine.
Using Ventoy on USB to boot the ISO got me into the Windows XP setup, but once the actual setup would start, a bluescreen with the feared STOP: 0x0[...]07B
error code appeared, which is commonly induced by using AHCI instead of IDE.
This can be ruled out in our case, at least the hard drive is for sure connected with IDE.
But to also rule out the USB stick with the Plop bootloader driver, we installed both Windows 98 and XP in a virtual machine, extracted the disk image (or rather the main partition) and dd
‘ed it on the laptop.
This led to a frame of the Windows XP boot animation, before the same bluescreen error message appeared here as well.
Somehow Windows XP doesn’t like my hard drive.
Back home, I tried to boot the installers from CD and was even less successful.
Nothing really booted from CD.
After some back and forth I used my existing Linux to just dd
the contents – directly leading to I/O errors.
I checked with multiple CD’s, but the issue remained.
Therefore I guess the drive or the connector to the motherboard has some issues.
Afterwards, I also tested the SuperDisk and also got I/O errors.
But then normal floppies in the SuperDisk worked fine, so maybe the CD drive and the one SuperDisk floppy I have are broken.
I then tried again to create a bootable Windows XP installer USB stick.
This topic is surprisingly hard, as Windows XP was not designed to be bootable from USB.
This led to the hilarious error message Setup cannot find the End User License Agreement
.
Rufus, my go-to bootable USB creator on Windows was insofar unavailable, as my local Windows installation on my desktop just wouldn’t boot after being back home.
It turned out that the issue here was a bad SATA cable, leading to I/O errors and somehow a corrupted Windows bootloader (something with BCD, which the Windows installer wasn’t able to fix, even with some shell fu).
So I first tried Ventoy (again), later on also woeusb.
After reinstalling Windows on my main desktop PC, I also tried Rufus (versions 2, 3 and 4, as version 2 was the latest version officially supporting Windows XP). I still had issues, so I also tried the alternatives linked at the old version of Rufus’s FAQ, UNetbootin and Universal USB installer. UNetbootin (at least the newest version) seemingly has no explicit support for Windows XP, it just tries to unpack the ISO with 7zip and do some other stuff, but the result was not bootable IIRC. I’m not sure how Universal USB Installer went, but then I also found a tool that used GRUB4DOS, which apparently made the Windows XP installer bootable.
In the end, I used that one to try installing Windows XP on another old desktop PC I have. That worked fine, confirming that the USB stick is actually bootable and installable. However, the old laptop failed to fully boot the setup most of the time, and always stopping before the actual installation could start. This feels like an issue dropping the power to the USB port to me. But for now no Windows for this old laptop.
During my endeavours with Windows XP, I also ruled out that my copy of the ISO was somehow broken. I tried two copies I had stored, an original ISO with Service Pack 3, and a bundled and modified version from 2015 with all updates and some other tweaks. An official version could also be downloaded from massgrave.dev, but a version on archive.org with all updates (up until 2020) and pre-activated, but otherwise untouched caught my eye. I installed that version on my desktop and it went great – although I skipped the installation of the required LAN driver, so I had no internet and didn’t do much with the installation.
Linux
The i686 support in mainstream Linux distributions is nowadays quite slim. NixOS removed official support at the start of 2024, removing the ISO image and stopping to build almost all packages. Arch Linux discontinued 32-bit x86 in 2017 already. Linux Mint has no i686 support since version 20, except for the Debian edition. But that didn’t boot, probably due to the small RAM. Fedora also doesn’t offer a i686 version anymore. Towards the end of year, even Debian announced partially discontinuing i686 support by removing installer images for the next release.
That is generally a healthy sign, as 64 bit variants provide a multitude of advantages in supported RAM, security mitigations and performance. For old devices it remains to be seen if such support can be uphold over time.
Debian
Booting the Debian 12 netinstaller ISO from USB worked as expected and Debian was helpful in noting the lack of memory I have. Contrary to this scary warning message, a further dialogue gave me a list of modules and functionality to load. By only loading support tools for required filesystems, the default network drivers and the likes, I never had issues with this installer. Good job, Debian, for handling such edge cases in 2025.
NixOS
Unsatisfied with the Windows progress, we had the crazy idea to build NixOS for i686-linux during congress.
At first we wanted to create a i686 ISO image as installer, to be able to boot it and from there and do nixos-generate-config
.
The first compilation errors could be avoided by just removing the respective packages from the ISO image.
We finally failed due to a syslinux compilation error.
Syslinux is the mandatory bootloader for BIOS (non-UEFI) systems, and replacing that is not easily possible.
After talking to the NixOS assembly at the 38C3, we wanted to create a raw disk/partition image to dd
onto the disk and to be able to later install grub as bootloader.
Some packages still had compilation errors, which led us to abandon the image building for now.
Building on the Debian installation, I could instead install nix with apt and run hello
after the laptop itself compiled it, before leaving the congress.
Some days later, I picked up this work by using my desktop pc to build nixos-install-tools
, transmit it with the Debian ssh daemon and be able to execute nixos-generate-config
on the laptop.
I then used this config to build a full base system for i686, which surprisingly went smoothly after the compilation of the kernel and ghc was done.
This was also transmitted with nix-copy-closure
and a manual call to switch-to-configuration boot
with the necessary lustrate setup prepared beforehand meant that on reboot I was running NixOS on this old laptop.
Unfortunately, I tried the install without enabling openssh, which made it very painful to get a running ssh server back.
Just changing the config on the laptop was quickly ruled out, especially because the swap was not (correctly) set up.
In the end, I opted to build a static i686 openssh package, which is fortunately relatively easy: nix-build -A pkgsStatic.openssh --system i686-linux
.
However, how do I get this over to the laptop without ssh?
I copied the path onto a USB stick and tried to execute sshd directly.
That failed, as openssh was expecting the path to be placed inside of the nix store.
That led me to my most deranged move yet: I remounted the nix store read-write and copied this folder manually at the right place.
Then I had to generate a ssh host key, place a configuration file at /etc/ssh/sshd_config
and add a sshd
user and group.
After that, sshd was finally running and I could nixos-rebuild
into the laptop again.
My next config iteration added the ssh server, but on reboot I unfortunately had to see that sshd was failing because its dependency, nsncd, was also failing.
I was noticing this failure previously, but didn’t realize that ssh depends on it, leading to a never-ending boot.
Booting with sshd masked (because I had no previous generation in the bootloader?) finally brought me back into the system, and with a second static sshd invocation, I was finally fully back.
Rust on i686
The nsncd issue was an illegal instruction error.
After some research I learned it is caused by Rust not supporting old i686 CPUs without SSE4.
My laptop barely has the mmx
and sse
extensions, Rust applications will not run on it until Rust would add support on their side.
For now, switching nsncd back to nscd avoids this Rust service (services.nscd.enableNsncd = false
).
The same is true for the switch-to-configuration program (system.switch.enableNg = false
) and for the shutdown ramfs functionality (systemd.shutdownRamfs.enable = false
).
Now NixOS always warns me that the old switch-to-configuration program will be removed in NixOS 25.05, probably preventing me to ever update to this version.
NixOS 24.11 seems to be the last runnable version on Pentium III CPUs.
PCMCIA on NixOS
Then I headed to the last error I faced.
I had inserted the PCMCIA card into the NixOS config as swap storage, but that wasn’t available.
After too much time, I found hardware.pcmcia.enable
, which promptly led to a compilation error.
In response, I fixed two small issues and created PRs (1, 2) to fix them also in nixpkgs.
After rebuilding and rebooting, the CompactFlash storage was just available, and now the swap is running as intended.
That concludes my journey on this laptop so far, I learned some things on the way and even was able to fix at least some of the NixOS issues I faced. Some i686 related issues remain, but it is also not an officially supported system.