Repository navigation
feat(install): Holoport install script, runbook and a SeaBIOS VM check - #61
Conversation
scripts/holoport-install.sh partitions the named disk the ADR-017 way (GPT, 1 MiB bios_grub, vfat ESP 'boot', ext4 root 'nixos', swap 'swap'), mounts root at /mnt and the ESP at /mnt/efi-boot, runs nixos-install and then grub-install --target=i386-pc. It refuses to run without an explicit disk and asks for the disk name back. The flake exposes it as packages.x86_64-linux.holoport-install. checks.x86_64-linux.vmTestHoloportInstall runs that package on an installer VM against an empty AHCI disk, then boots the disk under SeaBIOS and asserts the conductor, the fleet's three hApps and Grafana on edgenode-01. CI runs it in its own job because the closure is about 10 GiB.
Boot an installer, get network, run holoport-install from the box or from a laptop that copies the closure straight into /mnt, write the Grafana password before the first boot, verify. The fleet README, the fleet template and the common.nix comment now point at the script instead of saying the sequence is unwritten.
…a-event-node Once #59 and #61 are both in, hosts/common.nix no longer reads fleetLine and fleetHapps: the fleet imports nixosModules.sensorica-event-node for them. holoportTarget still passed the old arguments, so the installed system had no hApps, no installer unit, and vmTestHoloportInstall failed ("holochain-happ-installer.service is inactive and there are no pending jobs"). It now imports the module the fleet imports, and the check passes: hrea, kando and requests-and-offers enabled 20 to 43 s after boot.
Merge note: this PR and #59 break #59 moves the fleet's line, hApps and seed into The fix is to replace the One other observation from these runs: one attempt failed at |
# Conflicts: # docs/deployment.md # flake.nix
…id disk A VM run once stopped at the root mount with 'wrong fs type' right after mkfs. The script now waits for udev after formatting and mounts the root as ext4 explicitly. A DISK given as a /dev/disk/by-id link is resolved to its kernel node first, so partition names and the label check compare /dev/sdX names.
Esc opens the base HoloPort's boot menu, the stick reads reliably only from a USB 2 port, and the graphical desktop freezes on the HD 610 (session log 2026-09-27). The root password prompt at the end of nixos-install appears only when its input is a terminal.
Brought up to date with main, plus two small fixesThe branch now merges cleanly on top of main after #25, #34 and #62 landed. Nothing was rebased or force-pushed. The review found nothing blocking, so the two extra commits only pick up non-blocking items from its list that sit in files this PR already owns. Commits pushed
Checks
Left open, deliberately
|
# Conflicts: # .github/workflows/ci.yml
…a-event-node Once #59 and #61 are both in, hosts/common.nix no longer reads fleetLine and fleetHapps: the fleet imports nixosModules.sensorica-event-node for them. holoportTarget still passed the old arguments, so the installed system had no hApps, no installer unit, and vmTestHoloportInstall failed ("holochain-happ-installer.service is inactive and there are no pending jobs"). It now imports the module the fleet imports, and the check passes: hrea, kando and requests-and-offers enabled 20 to 43 s after boot.
Refs #6, #8
Why
The next session at the Sensorica lab installs the event node on one real Holoport, and a Holoport boots legacy BIOS only (ADR-017).
hosts/common.nixalready configures GRUB for both halves and says the BIOS half comes from a runbook, and the fleet README said that runbook "is not yet written up (tracked in #6)". This PR writes it as one script, documents it, and proves it in a VM that boots the way the Holoport does.What
scripts/holoport-install.sh, exposed aspackages.x86_64-linux.holoport-installwith every tool it calls pinned.holoport-install DISK SOURCEdoes GPT with a 1 MiBbios_grubpartition, a vfat ESP labelledboot, an ext4 root labellednixosand 8 GiB of swap labelledswap; it mounts root at/mntand the ESP at/mnt/efi-boot, runsnixos-install, thengrub-install --target=i386-pc --boot-directory=/mnt/boot DISK. The sequence follows holochain/wind-tunnel-runner (installer.nix,base-install.nix).SOURCEis either a flake reference (...#edgenode-01), installed withnixos-install --flakeand the Holochain cache passed as--option, since the target has nonix.confyet; or a/nix/store/...system built elsewhere. If that system is not on the box yet, the script printsnix copy --to 'ssh://root@IP?remote-store=/mnt' PATHand waits for the copy. This is the laptop path: a HoloPort's disk is slow and its CPU is weak, and the installer's store lives in RAM.docs/deployment.md§ "Installing on a Holoport (legacy BIOS)": both machine variants (disks, BIOS keys), boot the workshop or stock ISO, check the network, install from the box (2a) or from a laptop (2b), write the Grafana password under/mntbefore the first boot, reboot, verify (conductor, hApp installer journal, Grafana). Every command is on one line.checks.x86_64-linux.vmTestHoloportInstall: an installer VM with a tmpfs root and one empty 40 GB SATA disk behind AHCI (so it is/dev/sda, reached byahcifrom the fleet's ownhardware-configuration.nix, not by virtio) runs the package. The disk then boots in a second VM under QEMU's default firmware, SeaBIOS, with no kernel handed in and no OVMF. The target is the real event node:hosts/edgenode-01/configuration.nixwithcommon.nix, the 0.6 line and all three fleet hApps (hREA, Kando, Requests & Offers), Plasma included. The test asserts the layout and labels, that the booted system is the installed store path with root on/dev/sda3and swap on/dev/sda4, that both GRUB halves are present, that the conductor is active, that each hApp is listed once and all three are enabled, and that Grafana serves the provisioned dashboard with the password written before boot.holoport-installjob. The event node's closure is about 10 GiB (most of it the desktop), and the job holds it twice (runner store and qcow2), so it frees the preinstalled toolchains first rather than sharing the disk with the other VM tests.common.nixcomment now point at the script.How to test
What I ran, on the Builder's machine (Nix 2.25.4, 16 cores, KVM).
nix buildof a VM check cannot open/dev/kvmin the sandbox there, so each run built the.driverattribute and rannixos-test-driverdirectly with KVM, under a lock shared with other agents' VM tests. CI runs the literalnix build.partedwas only inside the package, not on the installer's PATH (install itself done in 404 s); fixed in the testgrub-installline deletedSeaBIOS boots the disk through the BIOS GRUBfailed:action timed out after 600.16 secondswaiting for the kernel's first lineOn the first boot all three hApps went from install to enabled 76 s after the kernel started (
hc-sandbox: Enabled app: "requests-and-offers"at 75.8 s).Also:
alejandra --check(4.0.0, the devShell's) onflake.nixandexamples/sensorica-fleet/hosts/common.nix: exit 0.nix flake check --no-build --all-systems --accept-flake-config: exit 0. The example fleet'snix flake check --no-build --override-input nixos-holochain <checkout>: exit 0.shellcheck scripts/holoport-install.sh: exit 0.Deviations
nixos-install --systemwhere the doc's path 2a runsnixos-install --flake: the sandbox has no network, as in nixpkgs'nixos/tests/installer.nix. Everything before and after that one call is the documented command.x86_64-linuxonly (i386-pc GRUB, SeaBIOS). They use an attribute namednullelsewhere rather than//, so the existing attribute sets are not re-indented.Not covered
remote-storeon anssh://store URL (an unknown setting warns; this one does not), but the copy into/mntover SSH and the script's wait loop have not run end to end.nixos-install --flakewith the Holochain cache options has not run against the network either; the check covers--systemonly.nix run ...#holoport-installon the stock ISO, and whether the workshop ISO's sshd starts at boot (docs: rescue a failed install over SSH, learned on the homelab #25 notes the same open question).