mozempk cd8248f2f5 feat: NVIDIA PRIME, audio fix, timezone, dmesg error cleanup
- Add nvidia/nvidia-dkms/nvidia-libs-32bit/nvidia-vaapi-driver to niri
  live and installed profiles; wireless-regdb and sof-firmware to all
  profiles (fixes regulatory.db and SOF firmware dmesg errors)

- iso/postsetup-nvidia.sh: new mklive -x hook that re-runs dracut inside
  the rootfs chroot after the overlay is applied; ensures the squashfs
  initramfs includes nvidia.ko and omits nouveau.ko at build time —
  no driver install needed at runtime (fixes /run tmpfs overflow that was
  killing wireplumber by corrupting D-Bus sockets)

- Both ISO inner build scripts gain -x postsetup-nvidia.sh and the nonfree
  repo flag so nvidia packages resolve correctly

- niri config: wireplumber started via supervisor loop (waits for PipeWire
  socket, auto-restarts on crash) replacing the one-shot exec — survives
  any D-Bus or pipewire disruption

- build-niri-live-iso.sh: NVIDIA modprobe blacklist-nouveau.conf,
  btusb-quirks.conf, modules-load.d/nvidia.conf, dracut/10-nvidia.conf,
  Xorg intel/nvidia configs, prime-run helper, elogind run script loop
  guard, timezone Europe/Zurich overlay, updated BOOT_CMDLINE

- build-live-iso.sh: same NVIDIA + timezone + sound udev rule overlays;
  live-setup.sh timezone and audio group fix

- installer/lib/grub.sh: GRUB_CMDLINE_LINUX_DEFAULT gains
  nvidia-drm.modeset=1 rd.driver.blacklist=nouveau btusb.enable_autosuspend=0

- installer/lib/postinstall.sh: configure_nvidia_prime() adds
  blacklist-nouveau.conf, btusb-quirks.conf, dracut omit_drivers nouveau,
  modules-load.d with all four nvidia modules
2026-04-25 18:27:06 +02:00
2026-04-25 13:23:49 +02:00
2026-04-25 13:23:49 +02:00
2026-04-25 13:23:49 +02:00

void-installer — XPS 17 (xps9700)

Auto-installing Void Linux ISO targeted at a Dell XPS 17 9700 dual-booting Windows. Final installed system ships with: Cinnamon, Docker, VS Code, your SSH config, NVIDIA PRIME render-offload, and Nix for Spotify/Discord/LocalSend.

⚠️ Destructive. This installer wipes one partition. Read the Safety section before running on real hardware.


Layout produced

What Where
Void root (btrfs @) /dev/nvme0n1p5 (replaces Mint)
/home, /.snapshots, etc. btrfs subvolumes on the same device
EFI System Partition /dev/nvme0n1p1 (shared, untouched)
GRUB target \EFI\Void\ (Windows entry preserved)
Windows /dev/nvme0n1p3 (left alone)

Repo layout

config/install.conf      # all knobs (hostname, locale, kbd, GPU, etc.)
config/packages.target.list  # xbps packages installed into target
config/packages.live.list    # extra packages added to the LIVE iso
secrets.env              # USER_PASSWORD / ROOT_PASSWORD (gitignored)
installer/
  install.sh             # main entrypoint, runs in the live env
  lib/                   # tui, partition, bootstrap, grub, postinstall
iso/
  build-iso.sh           # host-side: stages overlay, then runs mklive in docker
  _inner-build.sh        # invoked inside the docker container as root
  Dockerfile             # debian:stable-slim + mtools/xorriso/squashfs-tools
  patches/               # patches applied to upstream void-mklive
tests/
  make-test-disk.sh      # builds a qcow2 mimicking the XPS 17 partition table
  run-qemu-test.sh       # automated headless install + smoke tests
  interactive-qemu.sh    # GUI QEMU for manual exploration
  lib/make-test-overlay.sh
Makefile                 # build / test entrypoints

Quick start

Build dependencies (host)

Any Linux with bash, git, curl, docker (and qemu + ovmf if you want to run make test / make qemu). The mklive build runs inside a Debian container, so you don't need mtools, xorriso, squashfs-tools, etc. on the host.

  • Void: xbps-install -S git curl docker qemu ovmf
  • Debian/Ubuntu/Mint: apt install git curl docker.io qemu-system-x86 qemu-utils ovmf
  • Arch: pacman -S git curl docker qemu-full edk2-ovmf

Make sure your user is in the docker group (sudo usermod -aG docker $USER, then log out / back in) so the build runs without sudo.

1. Provide secrets

secrets.env is gitignored and pre-populated for you with the values from the chat. Edit if you want different passwords.

2. Build the ISO

make iso
# -> out/void-install-xps9700-YYYYMMDD.iso
make test           # full headless install + smoke tests (~15-30 min)
# or
make qemu           # interactive QEMU window with the ISO booted

4. Flash to USB and boot the XPS 17

sudo dd if=out/void-install-xps9700-*.iso of=/dev/sdX bs=4M status=progress conv=fsync

Boot the XPS from the USB (F12 boot menu). The TUI shows detected partitions with [WINDOWS] and [EFI] markers. Pick /dev/nvme0n1p5, type the device path verbatim to confirm, and let it run.


Safety

  • The installer refuses to wipe any NTFS partition.
  • A TUI confirmation step requires you to type the full device path before any destructive action.
  • The shared EFI partition is mounted read-write but never reformatted; Windows boot files under EFI/Microsoft/ are preserved.
  • All passwords come from /etc/installer-secrets.env baked into the ISO at build time (mode 0600). They are not on the network and not in argv.

If you want to be paranoid, run make test first — the smoke test asserts that EFI/Microsoft/Boot/bootmgfw.efi survives the install on a simulated disk with the same layout as the XPS.


Configuration

Everything tunable lives in config/install.conf:

  • locale en_US.UTF-8, keymap ch-fr_nodeadkeys, timezone Europe/Zurich
  • hostname xps9700, user moze in wheel,docker,video,audio,...
  • btrfs subvolumes @, @home, @snapshots, @var_log, @var_cache
  • GPU mode prime-offload (Intel UHD primary, NVIDIA GTX 1650 Ti via prime-run)
  • zram swap at 50% RAM (zramen)
  • nonfree + multilib + multilib-nonfree repos enabled

What's installed

xbps: base-system, linux, intel-ucode, NetworkManager, cinnamon, lightdm, docker, docker-compose, vscode (Microsoft), firefox, vlc, obs, flameshot, nvidia + nvidia-libs-32bit, pipewire, sudo, git, curl, vim, tlp, nix, … (full list in config/packages.target.list)

nix profile (first boot, as moze): spotify, discord, localsend. The first-boot service runs once after nix-daemon is up, then exits.


Post-install

After first reboot:

  1. Log in as moze (password: void).
  2. The Cinnamon greeter appears (LightDM).
  3. The first-boot Nix service installs Spotify/Discord/LocalSend in the background (~515 min depending on connection). Watch with journalctl -fu first-boot-nix is replaced by tail -f /var/log/socklog/everything/current on Void's runit; or just check nix profile list later.
  4. Run NVIDIA-accelerated apps with prime-run <app>.

Test harness

tests/run-qemu-test.sh runs end-to-end:

  1. Builds a TEST ISO variant (overlay forces UNATTENDED=1 TEST_MODE=1 and bakes a one-off ssh keypair for the harness).
  2. Builds a fresh out/test-disk.qcow2 with the same partition layout as the XPS (EFI + MSR + NTFS "Windows" placeholder + btrfs "Mint").
  3. Boots the ISO under QEMU/OVMF; installer runs unattended; VM powers off.
  4. Boots the installed disk; ssh's in as moze; runs ~20 smoke assertions.
make test                       # default
TIMEOUT_INSTALL=5400 make test  # slower hosts
ACCEL=tcg make test             # no KVM (e.g., nested virt without)

Files of interest while debugging

File on installed system Purpose
/var/log/void-installer.log full installer log
/etc/sv/first-boot-nix/run one-shot nix profile installer
/usr/local/bin/prime-run NVIDIA PRIME offload wrapper
/etc/X11/xorg.conf.d/20-nvidia.conf NVIDIA display config
/etc/runit/runsvdir/default/ enabled services
File on the live ISO Purpose
/usr/local/share/installer/ installer scripts + config + packages
/etc/installer-secrets.env passwords (mode 0600)
/etc/installer-ssh/ snapshot of build-host ~/.ssh/

Caveats

  • 150 MB shared EFI is tight (was 91 % full before install). Void puts only \EFI\Void\grubx64.efi (~150 KB) there; kernels live on btrfs /boot.
  • Secure Boot is off (per the input). NVIDIA proprietary modules won't load with SB on without manual MOK enrollment.
  • The installer assumes /dev/nvme0n1p5 is currently Linux Mint (btrfs). If that ever changes, the TUI default will be wrong but the listing is always live, and the confirmation step prevents accidents.
Description
No description provided
Readme 500 KiB
Languages
Shell 96%
Python 2.6%
Makefile 1.1%
Dockerfile 0.3%