# 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) 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 #!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 #!ipxe kernel http://192.168.10.127:8080/win98qi/vmlinuz initrd http://192.168.10.127:8080/win98qi/initrd.gz imgargs vmlinuz 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. ```ipxe # 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): ```bash 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.