Files
homelab-infra/apps/netboot/9x.md
T
panxiao81 88a02ababa
lint / yaml (push) Has been cancelled
lint / ansible (push) Has been cancelled
lint / terraform (push) Has been cancelled
Establish clean homelab infrastructure baseline
Reorganize the brownfield repository, remove retired and generated artifacts, harden ignore rules, and record the GitOps/IaC redesign.
2026-09-09 16:47:20 +00:00

4.7 KiB
Raw Blame History

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.

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.

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.sh against your Win98 SE ISO to produce a custom image + boot media (see the repo's BUILDING.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 lunmercy can 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 the initrd, or just use the sanboot-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.