--- name: schunix-ramdisk-root-sizing description: "Why `make iso` was failing with \"disk full\" — DOOM WADs in the ramdisk, not FSSIZE — and the three Makefile knobs that actually control that image." metadata: node_type: memory type: project originSessionId: 9d8a2aef-bcf0-47a0-96c6-f706efab4a95 modified: 2026-08-08T12:04:27.952Z --- Fixed 2026-08-08. `make iso` died with `mkfs: disk full -- used 6000 of 6000 blocks` and the advice "Increase FSSIZE in param.h". **`FSSIZE` was 150000 and entirely innocent.** The ramdisk root's size is `RAMDISK_BLOCKS` in the Makefile. The error message has been rewritten to name the right knob per image and print the metadata breakdown; don't trust the old advice if it resurfaces anywhere. **The actual cause: `make doom` stages 33 MB of WADs into `sysroot/`** (`freedoom1.wad` 28.8 MB, `doom1.wad` 4.2 MB) and the ramdisk was trying to swallow them into 6 MB. Real userland is only ~1.9 MB — the 244 `/bin` entries are *hardlinks* to one 822 KB toybox, which is why `du` says 35 MB while the file sizes sum to 229 MB. **This is a licensing rule, not just a size one, and that is the reason it is enforced in the build rather than by remembering to run `make doom-uninstall`.** The ramdisk is linked *into the kernel binary*; `doom1.wad` is non-redistributable shareware, so a kernel containing it could not be distributed. See [[schunix-doom-acceptance-test]] and [[schunix-licensing]]. Three Makefile knobs, none of them FSSIZE: - `RAMDISK_BLOCKS` (6000) — image size, BSIZE is 1024. - `RAMDISK_NINODES` (2000) — **the inode table is preallocated.** mkfs's default 12000 inodes cost 1501 of 6000 blocks, a quarter of the image, for ~260 files. Metadata went 1596 → 345 blocks. - `RAMDISK_EXCLUDE` (`usr/share/doom bin/doom`) — `mkfs --exclude `, repeatable, drops a whole subtree and prints what it skipped. `mkfs` gained `--ninodes` and `--exclude`. Its option parser used to handle exactly one flag then `break`, silently ignoring a second — now it compacts argv properly, but both modes still identify themselves *positionally* (argv[2] is `--sysroot` or the first file), so keep that contract if adding options. **Verified:** ramroot boots with no disk attached at all, and the ISO boots from optical media only (`ide: no drive on the primary channel`) to a full shell with 243 commands — 243 not 244 because `doom` is correctly excluded. **`make iso` needs `mkisofs`, not xorriso, on this host.** There is no xorriso package in scoop; cdrtools provides `mkisofs.exe` and was already installed. `tools/mkiso.sh` now takes either — the El Torito flags are argument-compatible. This also finally verified `-boot-load-size 49` (see [[schunix-boot-splash-logo]]), which was untestable while xorriso was missing. **Trap:** `make iso` builds the ramroot variant and does `rm -rf build/kernel` first, so a failed run leaves objects compiled with `-DRAMDISK_ROOT` and the next plain `make` dies on `_binary_ramdisk_size`. Recover with `rm -rf build/kernel build/lib build/cmd`.