Reorganize the brownfield repository, remove retired and generated artifacts, harden ignore rules, and record the GitOps/IaC redesign.
106 lines
4.7 KiB
Markdown
106 lines
4.7 KiB
Markdown
# 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.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 <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.
|
||
|
||
```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.
|