Reorganize the brownfield repository, remove retired and generated artifacts, harden ignore rules, and record the GitOps/IaC redesign.
4.7 KiB
Installing Windows 9x (95 / 98 / ME) over the network
9x is DOS-based, not NT — none of the NT5/NT6 methods apply. There are two routes; the second is much better for netboot.
Route A — the "real DOS way" (not recommended)
PXE → memdisk boots a DOS floppy/ISO (FreeDOS or MS-DOS) → load a real-mode NIC packet
driver + network redirector → copy the WIN98 CABs from a share → run setup.exe. It works
(netboot.xyz already has a FreeDOS entry to bootstrap from), but real-mode DOS packet drivers
are a per-NIC nightmare and the CAB copy is slow. Only worth it for authenticity.
Route B — win98-quickinstall (recommended)
https://github.com/oerg866/win98-quickinstall
The important thing: its installer is Linux-based (a minimal Linux env + a writer called
lunmercy). It does not run DOS-era Setup — it streams a pre-made image ("MercyPak",
designed to be read once, sequentially) onto the disk, then you reboot into a working Win98.
It bundles driver libraries (NIC/sound/video/storage incl. USB/NVMe) that can be injected at
install time — so it also solves 9x's driver problem.
Because the installer is Linux, it netboots exactly like any Linux distro — which iPXE does natively — with no DOS, no packet drivers, and no mid-install media dependency (it's a single-pass writer, so unlike XP it survives the process fine).
iPXE → kernel vmlinuz + initrd (HTTP) → lunmercy writes the image → reboot into Win98
Building the image (on Linux)
QuickInstall images are derived from an already-set-up Win98 install, so you either:
- grab a prebuilt release ISO from the repo (fastest way to test the pipeline), or
git clone+./build.shagainst your Win98 SE ISO to produce a custom image + boot media (see the repo'sBUILDING.md).
Output includes bootable ISO / USB / floppy images and the underlying kernel + initrd.
Wiring it into netboot — two ways
Host the files under the appliance's assets dir so they're on :8080:
/home/panxiao81/services/apps/netboot/assets/win98qi/ → http://192.168.10.127:8080/win98qi/
B1. Quick path — sanboot the ISO (good first test). Works here because it's a
one-shot Linux writer (the reboot-mid-install problem that kills XP sanboot doesn't apply):
#!ipxe
sanboot http://192.168.10.127:8080/win98qi/win98-quickinstall.iso
B2. Proper path — kernel/initrd over HTTP. Extract vmlinuz + initrd from the ISO
and boot them directly:
#!ipxe
kernel http://192.168.10.127:8080/win98qi/vmlinuz
initrd http://192.168.10.127:8080/win98qi/initrd.gz
imgargs vmlinuz <any source/args lunmercy needs>
boot
Verify first: whether
lunmercycan read the MercyPak image from the network (HTTP/NFS) via a kernel-cmdline source. If yes → serve the image over HTTP (its sequential read design is ideal). If it only reads from the boot medium → either bake the image into theinitrd, or just use thesanboot-ISO path (B1), which keeps the image on the virtual CD.
Adding it to the netboot.xyz menu
netboot.xyz supports a custom menu: set custom_url in config/menus/local-vars.ipxe to a
dir that serves a custom.ipxe, and the menu gains a custom entry that chains it.
# in local-vars.ipxe
set custom_url http://192.168.10.127:8080
Then host assets/custom.ipxe (→ :8080/custom.ipxe) containing a menu that chains the B1 or
B2 snippet above. For a one-off test you can also just drop to the iPXE shell (menu →
"iPXE shell") and paste the sanboot/kernel lines directly.
Test in a VM
Use the drive-vm skill (BIOS, IDE disk — 9x is BIOS-only and wants IDE):
V=~/.claude/skills/drive-vm/scripts/vmctl.sh
# either boot the ISO directly to validate the installer itself:
$V start --name w98 --mem 512 --disk /path/blank.qcow2 --iso /path/win98qi.iso --boot d
# or netboot it (bridge) once the menu/custom entry is wired:
$V start --name w98 --mem 512 --disk /path/blank.qcow2 --bridge br0 --netboot
Then screenshot/keydrive through it. 9x is happy with 512 MB RAM (more can upset it), a BIOS machine, and an IDE disk.
Gotchas
- BIOS/CSM only — no UEFI. Legacy boot for both the installer and the target.
- 9x RAM ceiling — >512 MB–1 GB can cause "insufficient memory" errors; cap the VM/target.
- Disk geometry — FAT32; keep the system partition sane (<127 GB is safest for 9x).
- Drivers are handled by quickinstall's driver libs at install time — no F6/packet-driver pain.
- The MercyPak-over-network question (above) is the one thing to confirm before committing to
the pure
kernel/initrd+HTTP path;sanboot-ISO always works as a fallback.