- Shell 100%
- Rescue / partitioning tools branch (GParted Live, Clonezilla Live, Rescuezilla, Hiren's BootCD PE, SystemRescue) as Lynx fallbacks. - netboot.xyz, Memtest86+, Super Grub2 Disk utility links. - SystemRescue autodownload resolver in vendor/netoy-iso.sh. - Rebased on upstream network-manager refactors (lynx_official labels). |
||
|---|---|---|
| media | ||
| netoy-tui@5d807f63e0 | ||
| overlay | ||
| scripts | ||
| vendor | ||
| .gitignore | ||
| .gitmodules | ||
| build.sh | ||
| genapkovl-netoy.sh | ||
| LICENSE | ||
| README.md | ||
netoy-os
The netoy-tui appliance. An Alpine Linux-based bootable ISO that
turns a plain Ventoy stick into a self-contained USB ISO manager — boot
it, and the TUI (built from the netoy-tui
submodule in for-bootable mode) is right there on the serial console
and the VGA console, with your Ventoy data partition already mounted
and writable at /mnt/netoy.
Screenshots
| Welcome | Network |
|---|---|
![]() |
![]() |
| Manage ISOs | Download ISOs |
|---|---|
![]() |
![]() |
What you get
- A minimal Alpine environment that boots straight into netoy-tui — on both the serial console and VGA.
- All the networking tools preinstalled:
NetworkManager(Wi-Fi backend:wpa_supplicantby default,iwdswitchable) +nmtuifor Wi-Fi and Ethernet, NetworkManager's internal DHCP client, dnsmasq as the DNS resolver,iproute2for manual/static config. - The whole netoy ISO copied into RAM and Ventoy's boot hook neutralized — so the USB stick (or CD) can be unplugged after boot.
- The real Ventoy data partition mounted read-write at
/mnt/netoy, so netoy-tui manages ISOs on it with zero runtime trickery.
Why this exists
Booted through Ventoy, an ISO lives as a file on the USB data
partition, and Ventoy injects a userspace hook that creates a
device-mapper node over that partition. That node pins the partition
read-only, breaks the Alpine boot for this image, and blocks netoy-tui
from mounting it later.
This image sidesteps the whole mess in two small, explicit steps:
-
An initramfs wrapper copies the netoy ISO from the Ventoy data partition into RAM, attaches it to a loop device, then neutralizes Ventoy — drops
/ventoy/ventoy_os_paramand Ventoy's udev rules — so no competingdevice-mappernode is ever created and Alpine's modloop-extraction hook never runs. Alpine'snlplug-findfsthen sees the RAM-backed loop as the only boot media. Because boot media is now a file in RAM, the physical stick can go. -
The OpenRC
netoy-ramservice copies the compressedmodloopsquashfs into RAM, switches/.modloopto the RAM copy, unmounts the boot media, removes any leftover Ventoydevice-mappernodes, and finally mounts the real Ventoy data partition at/mnt/netoy.
Result: /lib/modules, firmware, and boot media all live in RAM, with
the Ventoy data partition already mounted for netoy-tui — no runtime
"undo trick" needed in the TUI.
Why not archiso? Arch's
archisohas a singlecopytoram=yparameter that copies the whole live rootfs to RAM. Alpine has no equivalent one-liner, so this image uses a small custom initramfs wrapper + OpenRC service to do the same job while staying inside Alpine's officialmkimage.shtooling.
Build
./build.sh
Requirements on the host:
podman- The
netoy-tuigit submodule initialized:git submodule update --init
The script builds entirely inside an alpine:3.24 container: compiles
netoy-tui with --features for-bootable, then runs Alpine's official
mkimage.sh to produce the ISO in out/. Newer builds are dated
YYMMDD, e.g. netoy-260724-x86_64.iso.
Try it in QEMU
./scripts/qemu-serial.sh
The ISO runs both a serial console (console=ttyS0,115200) and VGA
(console=tty1) — headless in QEMU or on a real monitor. Both auto-login
root and launch netoy-tui. Note: two independent TUI processes
run at the same time; use only one console for USB operations.
The script boots the latest ISO with -nographic and attaches the
serial port to your terminal. Press Ctrl+A then C to switch to the
QEMU monitor, then type q to quit.
What to expect:
- The bootloader (ISOLINUX) and kernel messages on the serial line.
- The initramfs wrapper copying the netoy ISO out of the Ventoy data
partition into RAM (progress bar shown), neutralizing Ventoy's hook,
and attaching the RAM copy as a loop device;
nlplug-findfsthen discovers it as the boot media. - OpenRC's
netoy-ramservice copying the modloop into RAM, switching the loop to the RAM copy, unmounting boot media, removing Ventoydevice-mappernodes, and mounting the real data partition at/mnt/netoy. - Auto-login on
ttyS0andtty1(a tinygetty -n -lwrapper);/root/.profilestarts netoy-tui. Press Q to drop to a shell;inittabrespawns the login shell. - Root login without a password on the local console by default.
After boot
Auto-login root on every configured console via
agetty --autologin root --login-program /usr/local/bin/netoy-autologin
(/bin/login -f root); netoy-tui starts from /root/.profile on
tty1 (VGA) and ttyS0 (serial). tty2–tty6 are auto-login root
shells.
<N>on the Network screen launchesnmtui— NetworkManager's own full-screen TUI — for all Wi-Fi / Ethernet / manual IP+DNS config.<B>toggles the Wi-Fi backend (wpa_supplicant↔iwd) and restarts NetworkManager; the active backend is shown as an indicator.<T>runs a quick DNS/connectivity test (ping IP + hostname).- The network status is re-checked automatically every ~5 seconds until the machine is online.
<M>on the Manage ISOs screen remounts the Ventoy data partition at/mnt/netoyif needed (normallynetoy-ramalready did it at boot).
Files
| File | Purpose |
|---|---|
build.sh |
Host entry point that launches the container build. |
scripts/build-in-container.sh |
Runs inside the Alpine container; installs tools, builds Rust binaries, invokes mkimage.sh. |
scripts/qemu-serial.sh |
Boots the latest ISO under QEMU with a serial console for headless testing. |
vendor/mkimg.netoy.sh |
Alpine image profile for mkimage.sh. |
genapkovl-netoy.sh |
Generates the netoy.apkovl.tar.gz overlay: services, inittab, package world. |
overlay/usr/local/bin/netoy-autologin |
Tiny wrapper used by agetty --autologin for passwordless root. |
overlay/root/.profile |
Auto-starts netoy-tui on tty1 / ttyS0 root login. |
overlay/initramfs-files/netoy-copy-iso.sh |
Copies the ISO into RAM, neutralizes Ventoy, attaches the RAM copy as a loop device. |
overlay/ |
Static files that go into the apkovl. |
vendor/ |
Vendored Alpine mkimage.sh + mkimg.base.sh from aports 3.24-stable. |
Notes / limitations
- The image is intentionally minimal:
NetworkManager(Wi-Fi backend:wpa_supplicantby default, switchable toiwd) for Wi-Fi/Ethernet management,nmtuias the front-end, NetworkManager's internal DHCP client + dnsmasq for DNS,iproute2for manual/static config. - Want an even simpler (but more RAM-hungry) approach? Replace the
compressed modloop copy in
netoy-ramwith Alpine's officialcopy-modlooptool, which copies the uncompressed/lib/modulestree to RAM.



