docs: publish verified Gentoo preview build and acceptance records
This commit is contained in:
@@ -6,9 +6,12 @@ desktops may use the same independent VM manager and viewers.
|
||||
|
||||
## Status
|
||||
|
||||
Under active development, not yet an installation-ready distribution. The target
|
||||
is an installable UEFI ISO, first validated on ASUS TUF Dash F15 FX517ZC. Existing
|
||||
NixOS and VM disks are not installation or test targets.
|
||||
The first installable UEFI preview passed a complete disposable QEMU/KVM run:
|
||||
installation, boot without the ISO, password login, persistent data, networking,
|
||||
nested KVM and VM survival across user logout. See the
|
||||
[build and acceptance record](docs/releases/2026-10-13/acceptance.json).
|
||||
The first physical target is ASUS TUF Dash F15 FX517ZC; laptop hardware checks
|
||||
remain pending. Existing NixOS and VM disks were not installation or test targets.
|
||||
|
||||
1. Independent QEMU/KVM lifecycle with private QMP control.
|
||||
2. Minimal labwc session and fullscreen SPICE viewers.
|
||||
@@ -29,7 +32,7 @@ Build outputs, VM disks, runtime state and credentials stay outside Git.
|
||||
|
||||
Follow the [installation guide](docs/install.md) to install from the live ISO.
|
||||
The initial empty graphical session opens a recovery terminal. Enter `:shell`
|
||||
for an ordinary host shell; `nmtui` configures the host's network connections.
|
||||
for an ordinary host shell; `sudo nmtui` configures host network connections.
|
||||
Guest operating systems are supplied by you:
|
||||
|
||||
```sh
|
||||
@@ -66,6 +69,20 @@ Other host desktops can use `hydra start NAME` and `hydra view NAME --windowed`
|
||||
without entering the minimal labwc session. Ordinary Gentoo administration and
|
||||
Portage remain available through the recovery shell.
|
||||
|
||||
## Build the ISO
|
||||
|
||||
Follow the [isolated Gentoo build instructions](image/README.md). Outputs are
|
||||
`build/artifacts/hydra-os.iso` and `hydra-os.iso.sha256`; binary images stay out
|
||||
of Git. [Recorded source inputs and package versions](docs/releases/2026-10-13/rootfs-manifest.json)
|
||||
identify the tested image. The builder uses Gentoo systemd for login/device
|
||||
management, labwc for the minimal graphical session, and QEMU/KVM for guests.
|
||||
Portage and the tracked QEMU/viewer patches remain available for ordinary updates.
|
||||
|
||||
Resume a build from the same source checkout and work directory used to create
|
||||
its builder. Moving from a worktree to another checkout requires a fresh
|
||||
`--work` directory under the project, or using the original worktree; provenance
|
||||
checks deliberately reject an existing container mounted to a different source.
|
||||
|
||||
## Run the prototype
|
||||
|
||||
```sh
|
||||
|
||||
+12
-3
@@ -42,13 +42,17 @@ a nonsecret snapshot is also saved at `/var/log/hydra-install.log` on that disk.
|
||||
|
||||
## Disposable VM acceptance
|
||||
|
||||
Run the repository harness with QEMU/KVM, `qemu-img`, Python 3, and an OVMF
|
||||
CODE/VARS pair. Use trusted image and firmware files. For example:
|
||||
Run the repository harness with QEMU/KVM, `qemu-img`, Python 3, and a generic
|
||||
x86_64 QEMU OVMF CODE/VARS pair. A Xen-specific OVMF build is unsuitable: the
|
||||
first validation attempt with that variant produced no guest boot output.
|
||||
Use trusted image and matching firmware files. For example:
|
||||
|
||||
```sh
|
||||
install -d -m 700 "$HOME/.cache/hydra-tests"
|
||||
python3 dev/iso-smoke.py --iso /absolute/path/to/hydra-os.iso \
|
||||
--ovmf-code /absolute/path/to/OVMF_CODE.fd \
|
||||
--ovmf-vars /absolute/path/to/OVMF_VARS.fd
|
||||
--ovmf-vars /absolute/path/to/OVMF_VARS.fd \
|
||||
--scratch-parent "$HOME/.cache/hydra-tests"
|
||||
```
|
||||
|
||||
The harness creates a private directory under `/tmp`, a new 32 GiB sparse
|
||||
@@ -57,6 +61,8 @@ argument. QEMU attaches the ISO read-only; serial and QMP use private Unix
|
||||
sockets. Tool overrides `--qemu` and `--qemu-img` support temporary development
|
||||
environments. `--scratch-parent`, `--memory`, `--boot-timeout`, and
|
||||
`--install-timeout` control retained artifacts and bounded resource use.
|
||||
Prefer a disk-backed scratch directory: an installed disk stored on a tmpfs
|
||||
such as `/tmp` consumes host RAM. The example keeps test data in the user's cache.
|
||||
|
||||
The test boots the live image, runs the real installer through the guest's
|
||||
controlling terminal using a generated password, writes a persistence sentinel,
|
||||
@@ -67,6 +73,9 @@ synthetic VM endpoint. Network namespaces and veth interfaces exist only inside
|
||||
the disposable HydraOS guest. When guest KVM is available, it launches a further
|
||||
fresh-disk QEMU as the installed account to exercise KVM, the bridge helper,
|
||||
and private QMP; this checks VM launch, not a nested operating system boot.
|
||||
It also logs the installed account out and back in, checking that the same VM,
|
||||
private sockets and user audio services survive a measured interval without an
|
||||
open login session. This establishes process/socket continuity, not audio playback.
|
||||
|
||||
`report.json` records each observed check, ISO/firmware SHA256, failures, and
|
||||
skipped nested virtualization. Serial/QEMU logs and the qcow2 remain in the
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"format": 1,
|
||||
"status": "passed",
|
||||
"completed_utc": "2026-10-13T02:49:50Z",
|
||||
"artifact": {
|
||||
"file": "hydra-os.iso",
|
||||
"bytes": 2345109504,
|
||||
"sha256": "bdff621037ce9220767b7869499823c9b840b76c0b38268bc7f56a7b54390ce0",
|
||||
"source_commit": "903e7cf35339e50783a1bb3790b06e3204efab4d",
|
||||
"source_inputs_sha256": "cfe9ddf4549bdedcd91888adc8c4b00639e370b6296c361898d3898daf76d4de",
|
||||
"kernel": "6.18.54-gentoo-dist-bin",
|
||||
"package_count": 559,
|
||||
"rootfs_manifest_sha256": "c53ce549e98e0b5a56091d7960a2737534882e3f64a2497a12e3b2a27e522c48"
|
||||
},
|
||||
"validation": {
|
||||
"harness_commit": "4a636924df4e630788dcbbe8d0002261fa9a7df9",
|
||||
"harness_sha256": "64863d2f856cd3cee1e0c28af5aac2db2706b6403bf5deb32f64f57c33df1a53",
|
||||
"ovmf_code_sha256": "f3ff7e73448ed2845ee15356f394882f5618eb5dab92c9a30ec6ee0e1468553a",
|
||||
"ovmf_vars_input_sha256": "6ed987af3a3c155be71665f510eae3e007eda9b8b94afd59d45e91c4a11565cc",
|
||||
"tools": "Ubuntu QEMU8.2.2, Python3.12.3",
|
||||
"disk": "new 32 GiB sparse qcow2, only this disposable VM",
|
||||
"iso_unmodified": true,
|
||||
"manual_guest_changes": false,
|
||||
"full_private_report_sha256": "accfc85840681da69eeacabf82c9007dceb66952dac907e0e545b1061a9dee10",
|
||||
"checks": {
|
||||
"live_qmp_kvm": "passed",
|
||||
"live_boot": "passed",
|
||||
"real_installer": "passed",
|
||||
"live_poweroff": "passed",
|
||||
"installed_qmp_kvm": "passed",
|
||||
"installed_password_login": "passed",
|
||||
"disk_persistence": "passed",
|
||||
"installed_contract": "passed",
|
||||
"lan_to_vm_tcp": "passed",
|
||||
"nested_kvm": "passed",
|
||||
"installed_user_logout": "passed",
|
||||
"installed_poweroff": "passed"
|
||||
}
|
||||
},
|
||||
"scope": {
|
||||
"nested_virtualization": "Normal-user KVM VM launch, bridge helper and QMP; no nested guest OS boot",
|
||||
"audio": "Socket/service continuity only; signal/playback untested",
|
||||
"logout": "Actual getty logout, no open login for measured 15-second survival interval, relogin; unchanged VM process/start/UUID, runtime directories, private sockets and user audio service identities",
|
||||
"graphics": "Private graphical live recovery observed; actual two-guest labwc/viewer and profile-refresh probes recorded separately; no physical scanout assertion"
|
||||
},
|
||||
"pending_hardware": [
|
||||
"ASUS live boot",
|
||||
"Wi-Fi and Ethernet on laptop",
|
||||
"touchpad and physical input capture",
|
||||
"brightness",
|
||||
"physical audio playback",
|
||||
"suspend/resume",
|
||||
"USB device attachment and guest drivers",
|
||||
"physical display refresh and delivered FPS"
|
||||
],
|
||||
"publication": "Source, patches and these records are in Git. ISO, VM disks, raw logs and private runtime identities remain local."
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
bdff621037ce9220767b7869499823c9b840b76c0b38268bc7f56a7b54390ce0 hydra-os.iso
|
||||
File diff suppressed because it is too large
Load Diff
@@ -34,40 +34,40 @@
|
||||
**Files:** `image/sources.json`, `image/packages`, `image/portage/`, `scripts/hydra-build`, `hydra/build.py`, `tests/test_build.py`.
|
||||
**Interfaces:** `hydra-build fetch|prepare|packages|rootfs|iso|status`, `--work PATH`, `--cache PATH`, optional `--podman PATH`. Each step resumable and validates prerequisite manifests. Outputs WORK/rootfs payload or dedicated builder container, WORK/artifacts/, build manifest. No host root required.
|
||||
|
||||
- [ ] Test pinned download hash mismatch, required signaturefingerprint, safe workpath/refusal of root, resume state vs missingactualartifact, scoped Podman argv.
|
||||
- [ ] Observe RED; implement verifiedfetch and isolatedimport/container naming. Use stage3 20261011T170049Z SHA256 50634e8cb87384b94a6dbf78cd2707766c45a5a98f3823e7287d114ee998970b and Portage4696089e782c20b5f0c04952f6698d6a8cc1acb4 archiveSHA256 d24b2056f7ae26506193374b0d9f25c82d4bf547e0ee17279940169418bd3bca.
|
||||
- [ ] Configure officialbinhost signaturechecking, selective ~amd64 for labwc/wlroots, QEMU x86_64 only, required SPICE/GL/USB flags. Preserve licenses and installed packageDB.
|
||||
- [ ] Run actual dependency resolution and package install; record exact versions/USE and any selective sourcebuild decisions. No claim of bit-identical build.
|
||||
- [ ] Run tests and commit builder inputs/scripts.
|
||||
- [x] Test pinned download hash mismatch, required signaturefingerprint, safe workpath/refusal of root, resume state vs missingactualartifact, scoped Podman argv.
|
||||
- [x] Observe RED; implement verifiedfetch and isolatedimport/container naming. Use stage3 20261011T170049Z SHA256 50634e8cb87384b94a6dbf78cd2707766c45a5a98f3823e7287d114ee998970b and Portage4696089e782c20b5f0c04952f6698d6a8cc1acb4 archiveSHA256 d24b2056f7ae26506193374b0d9f25c82d4bf547e0ee17279940169418bd3bca.
|
||||
- [x] Configure officialbinhost signaturechecking, selective ~amd64 for labwc/wlroots, QEMU x86_64 only, required SPICE/GL/USB flags. Preserve licenses and installed packageDB.
|
||||
- [x] Run actual dependency resolution and package install; record exact versions/USE and any selective sourcebuild decisions. No claim of bit-identical build.
|
||||
- [x] Run tests and commit builder inputs/scripts.
|
||||
|
||||
### Task 2: Host rootfs and bootable image
|
||||
|
||||
**Files:** `image/rootfs/`, `image/grub.cfg`, `image/dracut.conf`, `image/configure-rootfs.sh`, `tests/test_image.py`.
|
||||
**Interfaces:** Consumes builder and tested CLI/session from graphics plan. Produces labelled HYDRA_OS ISO with boot/vmlinuz, boot/initramfs-live.img, LiveOS/squashfs.img and package/buildmanifest.
|
||||
|
||||
- [ ] Test service/config generation, live-only overrides separation, exact kernelversion used for dracut, image label/cmdline agreement, networksubnet conflict handling.
|
||||
- [ ] Implement rootfs overlay: greetd/minimalsession, recovery, localliveadministration, installedauth baseline, audio, NetworkManager, hydrabr0/DHCP/NAT and narrowlyscoped bridgehelper. Include laptopfirmware/bootdrivers and OVMF.
|
||||
- [ ] Build genericliveinitramfs with dmsquash-live and OverlayFS; squashfspayload retains kernel/packageDB. Assemble UEFIISO with GRUB; save SHA256 and manifest.
|
||||
- [ ] Run image checks and disposable OVMF/KVM liveboot; verify rootfilesystem ready and expected tools. Commit rootfs/imageconfig.
|
||||
- [x] Test service/config generation, live-only overrides separation, exact kernelversion used for dracut, image label/cmdline agreement, networksubnet conflict handling.
|
||||
- [x] Implement rootfs overlay: greetd/minimalsession, recovery, localliveadministration, installedauth baseline, audio, NetworkManager, hydrabr0/DHCP/NAT and narrowlyscoped bridgehelper. Include laptopfirmware/bootdrivers and OVMF.
|
||||
- [x] Build genericliveinitramfs with dmsquash-live and OverlayFS; squashfspayload retains kernel/packageDB. Assemble UEFIISO with GRUB; save SHA256 and manifest.
|
||||
- [x] Run image checks and disposable OVMF/KVM liveboot; verify rootfilesystem ready and expected tools. Commit rootfs/imageconfig.
|
||||
|
||||
### Task 3: Explicit guarded installer
|
||||
|
||||
**Files:** `bin/hydra-install`, `hydra/installer.py`, `tests/test_installer.py`.
|
||||
**Interfaces:** `hydra-install --disk DEVICE --user USER [--execute --confirm-erase DEVICE]`; without execute prints exactplan. Environment/default rootfs path points to live squashfs, never running root. Password via getpass/TTY, never CLI/log. Separate nonsecret dryrun from execution.
|
||||
|
||||
- [ ] Test missing/mismatched confirmation, disk mounted directly or through children/ancestors, root/live source backingdisk, invaliddevice, symlink resolution, invalidusername, failedcommands abort subsequentsteps.
|
||||
- [ ] Observe RED; implement sysfs/lsblk topology validation, GPT1GiBESP/ext4, payload extraction, fstabUUIDs, user/password setup and liveoverridesremoval. Explicit target, no automaticdiscoveryselection.
|
||||
- [ ] Install regularinitramfs and GRUBfallback --removable --no-nvram. Checked subprocessargv; handle failure diagnostics and mounts cleanup without deletingtargetdata.
|
||||
- [ ] Test fakecommandfailure paths then complete actualinstallation inside fresh VM using disposable qcow2. Rootprivilege exists only in testguest.
|
||||
- [ ] Commit installer and negative tests.
|
||||
- [x] Test missing/mismatched confirmation, disk mounted directly or through children/ancestors, root/live source backingdisk, invaliddevice, symlink resolution, invalidusername, failedcommands abort subsequentsteps.
|
||||
- [x] Observe RED; implement sysfs/lsblk topology validation, GPT1GiBESP/ext4, payload extraction, fstabUUIDs, user/password setup and liveoverridesremoval. Explicit target, no automaticdiscoveryselection.
|
||||
- [x] Install regularinitramfs and GRUBfallback --removable --no-nvram. Checked subprocessargv; handle failure diagnostics and mounts cleanup without deletingtargetdata.
|
||||
- [x] Test fakecommandfailure paths then complete actualinstallation inside fresh VM using disposable qcow2. Rootprivilege exists only in testguest.
|
||||
- [x] Commit installer and negative tests.
|
||||
|
||||
### Task 4: Installed-system validation and publication
|
||||
|
||||
**Files:** `dev/iso-smoke.py`, `docs/install.md`, `docs/verification.md`, `README.md`.
|
||||
**Interfaces:** Consumes ISO and installer. Produces evidence from boot/install/reboot and releaseartifact checksum, plus pendinghardwarechecklist.
|
||||
|
||||
- [ ] Boot ISO under OVMF/KVM with fresh disk; install only there; write persistence sentinel.
|
||||
- [ ] Remove ISO and boot installeddisk; verify sentinel, services, QEMUtools, network and shell/recovery. Check no liveoverlay/autologinadminoverride remains.
|
||||
- [ ] Test nested guest VM if KVM nesting available; distinguish virtualgraphics from real laptopresults.
|
||||
- [ ] Run full test suite and independent review. Correct material defects; document remaining physicalchecks without claiming them passed.
|
||||
- [ ] Save ISO locally with checksum, push source/patches/manifests to suppliedrepo. BinaryISO only uploaded when suitable repository release/storage path exists; never commit ISO to Git.
|
||||
- [x] Boot ISO under OVMF/KVM with fresh disk; install only there; write persistence sentinel.
|
||||
- [x] Remove ISO and boot installeddisk; verify sentinel, services, QEMUtools, network and shell/recovery. Check no liveoverlay/autologinadminoverride remains.
|
||||
- [x] Test nested guest VM if KVM nesting available; distinguish virtualgraphics from real laptopresults.
|
||||
- [x] Run full test suite and independent review. Correct material defects; document remaining physicalchecks without claiming them passed.
|
||||
- [x] Save ISO locally with checksum, push source/patches/manifests to suppliedrepo. BinaryISO only uploaded when suitable repository release/storage path exists; never commit ISO to Git.
|
||||
|
||||
@@ -50,12 +50,12 @@ unittest; `dev/` holds pinned tools and disposable integration probes.
|
||||
- `load_profile(path: Path) -> Profile`, `build_qemu_argv(profile: Profile, paths: VMPaths) -> list[str]`, `QMPClient.command(name: str, arguments: dict | None = None) -> dict`.
|
||||
- `VMPaths` provides disk, log, lock and private QMP/SPICE sockets. Session consumes stable name and socket paths only.
|
||||
|
||||
- [ ] Write validation/QMP fake-server tests: invalid names/resources, missing ISO, paths containing spaces, greeting/capabilities, asynchronous events, IDs, timeouts.
|
||||
- [ ] Run `python3 -m unittest discover -s tests -v`; observe failure before implementation.
|
||||
- [ ] Implement validation and bounded QMP; subprocess argv arrays, named environment tool overrides for tests.
|
||||
- [ ] Add lifecycle tests: simultaneous start, existing-disk preservation, stale socket, failed boot, shutdown vs force, QMP VM identity.
|
||||
- [ ] Implement locked safe disk creation, detached QEMU, virtio disk/network, SPICE no clipboard/file transfer, optional Intel GL. No display dependency in manager and no PID-only stop.
|
||||
- [ ] Run complete suite, help, scratch QEMU lifecycle probe. Commit `feat: add independent VM manager`.
|
||||
- [x] Write validation/QMP fake-server tests: invalid names/resources, missing ISO, paths containing spaces, greeting/capabilities, asynchronous events, IDs, timeouts.
|
||||
- [x] Run `python3 -m unittest discover -s tests -v`; observe failure before implementation.
|
||||
- [x] Implement validation and bounded QMP; subprocess argv arrays, named environment tool overrides for tests.
|
||||
- [x] Add lifecycle tests: simultaneous start, existing-disk preservation, stale socket, failed boot, shutdown vs force, QMP VM identity.
|
||||
- [x] Implement locked safe disk creation, detached QEMU, virtio disk/network, SPICE no clipboard/file transfer, optional Intel GL. No display dependency in manager and no PID-only stop.
|
||||
- [x] Run complete suite, help, scratch QEMU lifecycle probe. Commit `feat: add independent VM manager`.
|
||||
|
||||
### Task 2: Minimal fullscreen session
|
||||
|
||||
@@ -63,12 +63,12 @@ unittest; `dev/` holds pinned tools and disposable integration probes.
|
||||
|
||||
**Interfaces:** Consumes Task1 Profile/VMPaths. Produces `hydra view NAME [--windowed]`, `hydra session [--nested]`, labwc config only in selected runtime. Viewer title is deterministic from validated name; each VM maps to one workspace. Recovery opens host terminal; session never shuts down a VM.
|
||||
|
||||
- [ ] Probe actual labwc version/overrideInhibition and remote-viewer kiosk USB behavior on disposable state; record versions.
|
||||
- [ ] Resolve manual USB dialog with a small upstream viewer adaptation if necessary; never auto-redirect USB.
|
||||
- [ ] Write tests for valid escaped XML, exact window/workspace/fullscreen rules, no default keyboard/mouse bindings, overrideInhibition on host keys, missing viewer/display errors.
|
||||
- [ ] Run session tests and observe missing implementation failure.
|
||||
- [ ] Implement session/viewer commands and pinned temporary tool environment; no host installation.
|
||||
- [ ] Run full tests and labwc config parsing. Commit `feat: add fullscreen HydraOS session`.
|
||||
- [x] Probe actual labwc version/overrideInhibition and remote-viewer kiosk USB behavior on disposable state; record versions.
|
||||
- [x] Resolve manual USB dialog with a small upstream viewer adaptation if necessary; never auto-redirect USB.
|
||||
- [x] Write tests for valid escaped XML, exact window/workspace/fullscreen rules, no default keyboard/mouse bindings, overrideInhibition on host keys, missing viewer/display errors.
|
||||
- [x] Run session tests and observe missing implementation failure.
|
||||
- [x] Implement session/viewer commands and pinned temporary tool environment; no host installation.
|
||||
- [x] Run full tests and labwc config parsing. Commit `feat: add fullscreen HydraOS session`.
|
||||
|
||||
### Task 3: Integration and recovery
|
||||
|
||||
@@ -76,12 +76,12 @@ unittest; `dev/` holds pinned tools and disposable integration probes.
|
||||
|
||||
**Interfaces:** Consumes Tasks1/2, produces disposable-VM integration evidence.
|
||||
|
||||
- [ ] Run two disposable KVM instances/viewers, never existing lab disks; verify private QMP and independent lifecycle.
|
||||
- [ ] Verify viewer/session exit preserves QEMU and reattach works; switching neither restarts nor reconnects guests.
|
||||
- [ ] Check input only in disposable session, without injecting into current host or user's guests; add regression tests for discovered defects.
|
||||
- [ ] Record held-key, physical brightness and 144Hz checks needing dedicated TTY. Nested tests cannot prove them.
|
||||
- [ ] Run full suite and independent review; fix material findings with reproducing tests.
|
||||
- [ ] Commit evidence and push reviewed prototype branch to supplied repository.
|
||||
- [x] Run two disposable KVM instances/viewers, never existing lab disks; verify private QMP and independent lifecycle.
|
||||
- [x] Verify viewer/session exit preserves QEMU and reattach works; switching neither restarts nor reconnects guests.
|
||||
- [x] Check input only in disposable session, without injecting into current host or user's guests; add regression tests for discovered defects.
|
||||
- [x] Record held-key, physical brightness and 144Hz checks needing dedicated TTY. Nested tests cannot prove them.
|
||||
- [x] Run full suite and independent review; fix material findings with reproducing tests.
|
||||
- [x] Commit evidence and push reviewed prototype branch to supplied repository.
|
||||
|
||||
## Next plan
|
||||
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# Graphics and recovery verification
|
||||
|
||||
The [2026-10-13 preview record](releases/2026-10-13/acceptance.json) identifies
|
||||
the exact ISO, firmware and harness used for the passing twelve-check acceptance
|
||||
run. The unmodified ISO installed onto a fresh 32 GiB qcow2 disk and booted from
|
||||
that disk with no ISO attached. Password login, persistent data, removed live
|
||||
overrides, installed services, DNS lookup, routed LAN-to-VM TCP, normal-user
|
||||
nested KVM/bridge access and normal shutdown passed. An actual logout followed
|
||||
by 15 seconds without an open login and a new login preserved the same VM,
|
||||
QMP/SPICE sockets and user audio services. Audio playback was not measured.
|
||||
|
||||
Live graphical recovery was also observed through a private QEMU screenshot;
|
||||
the earlier two-guest compositor and profile-refresh probes cover fullscreen
|
||||
switching and hidden workload continuity. These virtual checks leave the physical
|
||||
ASUS checks listed below pending. No current host configuration or existing user
|
||||
VM disk was changed for this validation.
|
||||
|
||||
Run from the checkout. Tools are temporary Nix development dependencies; no
|
||||
persistent host installation is required. The two-guest smoke test needs access
|
||||
to `/dev/kvm` and creates its own headless Wayland display, VM disks and sockets
|
||||
|
||||
Reference in New Issue
Block a user