Compare commits

...

89 Commits

Author SHA1 Message Date
github-actions[bot] 2d9f6c9458 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/4c1018d' (2026-04-09)
  → 'github:nixos/nixpkgs/0726a0e' (2026-04-22)
2026-04-30 11:22:08 +01:00
github-actions[bot] 52da5f9bf7 flake.lock: Update
Flake lock file updates:

• Updated input 'flake-schemas':
    'https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.3.0/019c9f61-e746-760e-a1fe-53f05b10d026/source.tar.gz' (2026-02-27)
  → 'https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.4.2/019d5cf2-ee3c-7313-964e-f3f83c35d509/source.tar.gz' (2026-04-03)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/2fc6539' (2026-02-23)
  → 'github:nixos/nixpkgs/4c1018d' (2026-04-09)
2026-04-19 11:25:33 +01:00
dependabot[bot] 2e2d8478dd build(deps): bump DeterminateSystems/nix-installer-action from 21 to 22
Bumps [DeterminateSystems/nix-installer-action](https://github.com/determinatesystems/nix-installer-action) from 21 to 22.
- [Release notes](https://github.com/determinatesystems/nix-installer-action/releases)
- [Commits](https://github.com/determinatesystems/nix-installer-action/compare/v21...v22)

---
updated-dependencies:
- dependency-name: DeterminateSystems/nix-installer-action
  dependency-version: '22'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-19 08:34:21 +01:00
Arusekk b541fe1c58 docs(quickemu): update ArchWiki link
No functional changes; comments only.

Signed-off-by: Arusekk <floss@arusekk.pl>
2026-03-04 09:55:39 +00:00
dependabot[bot] 30509e17b6 build(deps): bump actions/download-artifact from 7 to 8
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 7 to 8.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v7...v8)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-04 09:54:55 +00:00
dependabot[bot] 5344b2edfb build(deps): bump crazy-max/ghaction-import-gpg from 6 to 7
Bumps [crazy-max/ghaction-import-gpg](https://github.com/crazy-max/ghaction-import-gpg) from 6 to 7.
- [Release notes](https://github.com/crazy-max/ghaction-import-gpg/releases)
- [Commits](https://github.com/crazy-max/ghaction-import-gpg/compare/v6...v7)

---
updated-dependencies:
- dependency-name: crazy-max/ghaction-import-gpg
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-04 09:54:39 +00:00
github-actions[bot] ab73f043d5 flake.lock: Update
Flake lock file updates:

• Updated input 'flake-schemas':
    'https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.2.0/019a4a84-544d-7c59-b26d-e334e320c932/source.tar.gz' (2025-10-27)
  → 'https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.3.0/019c9f61-e746-760e-a1fe-53f05b10d026/source.tar.gz' (2026-02-27)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/a82ccc3' (2026-02-13)
  → 'github:nixos/nixpkgs/2fc6539' (2026-02-23)
2026-03-04 09:53:49 +00:00
Alex Haydock 4d07beaf15 chore: Remove Tails from legacy boot list 2026-03-04 09:53:09 +00:00
dependabot[bot] a6771fb636 build(deps): bump actions/upload-artifact from 6 to 7
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-04 09:52:02 +00:00
Alex Haydock 2ddbe4cd4d fix: Use correct paths for Secure Boot OVMF_VARS on NixOS hosts 2026-02-27 14:35:27 +00:00
Ricardo N Feliciano 67a6d0dc6c fix(quickget): arm64 support for Fedora editions
Maybe it was accurate in this past but the current Quickget release
suggest that only Fedora Server has arm64 support. That's not the case.
In fact checking the `releases.json` file that `quickget` already uses
shows us that every edition other than Onyx supports arm64.

This PR makes that change.

The command ran to check this info was:

```bash
curl -sL https://getfedora.org/releases.json | jq -r
'group_by(.variant)[] | "\(.[0].variant): \(map(.arch) | unique |
join(", "))"'

COSMIC-Atomic: aarch64, x86_64
Cloud: aarch64, ppc64le, s390x, x86_64
Container: aarch64, ppc64le, s390x, x86_64
Everything: aarch64, ppc64le, s390x, x86_64
IoT: aarch64, ppc64le, s390x, x86_64
KDE: aarch64, ppc64le, x86_64
Kinoite: aarch64, ppc64le, x86_64
Labs: aarch64, x86_64
Onyx: x86_64
Sericea: aarch64, x86_64
Server: aarch64, ppc64le, s390x, x86_64
Silverblue: aarch64, ppc64le, x86_64
Spins: aarch64, x86_64
Workstation: aarch64, ppc64le, x86_64
2026-02-20 18:22:19 +00:00
github-actions[bot] b986819fe2 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/bfc1b8a' (2026-01-26)
  → 'github:nixos/nixpkgs/a82ccc3' (2026-02-13)
2026-02-17 02:54:47 -06:00
Phil Clifford 81d038cbae docs: align manual pages with release 4.9.8
chore: align doc submodule commit

docs(quickget): adapt whitespace in help_message()

needed in manual page regeneration to retain filtering of needed lines
currently omits the new flag for --disable-unattended

Signed-off-by: Phil Clifford <philip.clifford@gmail.com>
2026-02-10 12:41:59 +00:00
github-actions[bot] 879d0ba885 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/c5296fd' (2026-01-23)
  → 'github:nixos/nixpkgs/bfc1b8a' (2026-01-26)
2026-01-29 08:48:12 +00:00
Martin Wimpress c2d8c96074 feat(quickemu): prefer GTK display backend and add GTK->SDL fallback
- Set default --display to 'gtk' instead of 'sdl'
- Add runtime check to fall back to 'sdl' when QEMU lacks GTK support
  and print a note to the user
- Update usage text to show 'gtk' as the default display option

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-27 19:43:51 +00:00
Martin Wimpress 7cbc062a57 fix(quickemu): disable serial by default for macOS and Windows
- Remove noisy "Serial: (off)" echo and add explanatory comment
- Stop forcing serial="${serial:-socket}" early; leave unset and set
per-guest after config
- Set serial="none" for macOS and Windows guests, otherwise default to
"socket"
- Reduce terminal clutter for guests that do not emit useful serial
output
- Document how to override: use --serial or set serial=socket in the VM
.conf

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-27 18:23:58 +00:00
Martin Wimpress eb98ce1160 fix(quickemu): use vmware-svga display for macOS guests
- Replace previous VGA default with vmware-svga to align with macOS
  native VMware display driver and OSX-KVM expectations
- Improve resolution handling and mouse integration for macOS VMs

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-27 17:47:36 +00:00
Martin Wimpress 25d1f09452 fix(quickget): pin macOS OpenCore and OVMF downloads to last-good commit
- Pin OSX-KVM URLs to commit da4b23b5e92c5b939568700034367e8b7649fe90
- Use pinned URLs for OpenCore.qcow2, OVMF_CODE.fd and
OVMF_VARS-1920x1080.fd
- Prevent breakage after upstream removed OVMF_CODE.fd from master (26
Jan 2026)

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-27 16:42:49 +00:00
Martin Wimpress ac4b75f46d feat(quickemu): enable local SPICE over Unix sockets with VirGL
- Use Unix sockets for local --display spice to allow GL/VirGL
acceleration
- Use egl-headless backend to provide GL context for virtio-gpu-gl; do
not
  enable SPICE gl=on (avoids blocking QEMU main loop)
- Add -vga none for SPICE modes to prevent duplicate scanouts
- Update start_viewer() to support spice+unix:// and
spice://localhost:port
  connection modes for spicy and remote-viewer clients
- Clean up Unix socket (.sock) files alongside existing .spice file
cleanup

Provides local GL-accelerated guest 3D via VirGL while keeping remote
access
over TCP unchanged.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-27 15:20:36 +00:00
Martin Wimpress a89b6588ff fix(quickemu): simplify display device selection and remove -vga none
- Reorder and refine Windows mapping: map none|spice -> qxl-vga;
cocoa|gtk|sdl|spice-app -> virtio-vga
- Remove the VGA variable and the forced '-vga none' from VIDEO
composition
- Remove unused VGA initialization in vm_boot

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-27 08:16:31 +00:00
dependabot[bot] 23a4fb2609 build(deps): bump actions/upload-artifact from 4 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-27 08:16:17 +00:00
dependabot[bot] 63c9d44332 build(deps): bump actions/download-artifact from 4 to 7
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4...v7)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-27 08:16:02 +00:00
Martin Wimpress fbb2960ce5 feat(quickemu): enable SPICE display reconnection for running VMs
Fixes #1370

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-26 12:31:33 +00:00
Martin Wimpress 3c16de4de3 fix: update vendor lookup on darwin
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-01-26 11:21:57 +00:00
Martin Wimpress 4805fbd6f4 fix(quickemu): read "Vendor ID" for CPU vendor detection
- Change HOST_CPU_VENDOR lookup to use '^Vendor ID' when parsing
/proc/cpuinfo
- Ensures correct CPU vendor detection on systems that label the field
as 'Vendor ID' instead of 'Vendor'

Fixes #1845

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-26 11:21:57 +00:00
Martin Wimpress 7825f33527 fix(quickemu): remove integrated OpenCore support, require OpenCore.qcow2
- Remove integrated OpenCore creation/extraction code from quickget:
  require_mtools/sgdisk helpers, create_macos_disk_with_opencore,
  download_opencore and related logic
- Simplify quickemu macOS boot flow to expect a separate OpenCore.qcow2
  or ESP.qcow2; streamline device/drive argument construction
- Remove mtools and gptfdisk from devshell.nix and package.nix
- Always download OpenCore.qcow2 via legacy method and update status
  messages

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-26 02:31:33 +00:00
Martin Wimpress 36d1c7f3de fix(macos): prevent default sound card overriding the compatible selection
Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-26 01:40:55 +00:00
Martin Wimpress a98a416133
Revert "fix(quickemu): enable pflash secure property only when secureboot on"
This reverts commit 5dfe6c9cf7.
2026-01-26 01:13:18 +00:00
Martin Wimpress 38817e1e6b
fix(quickget): resolve shellcheck warnings in azurelinux and rockylinux 2026-01-25 23:18:33 +00:00
Martin Wimpress 1840c7b7c1 fix(quickemu): only add 'topoext' cpu flag for x86_64 AMD guests
Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 23:13:23 +00:00
Martin Wimpress 0a16748db6 feat(quickget): add architecture-aware output and filenames
- Display supported architectures when running ./quickget <os> (shows
"Archs: amd64 arm64")
- Add get_supported_archs() helper to enumerate available architectures
- Add arch_suffix() helper and append architecture suffix to VM
dir/config names
  for foreign architectures (e.g., alpine-v3.23-arm64/)
- Add NORMALISED_HOST_ARCH variable to detect foreign vs native
architecture
- Include arch="x86_64" or arch="aarch64" in config files for foreign
downloads
2026-01-25 18:36:03 +00:00
Martin Wimpress 3c785eb50c fix(quickemu): detect audio backends via sockets, not pidof
- Replace process checks (pidof pipewire / pidof pulseaudio) with socket
  existence checks to determine functional audio services.
- PipeWire detection checks $PIPEWIRE_REMOTE or
  $XDG_RUNTIME_DIR/pipewire-0.
- PulseAudio detection checks $PULSE_SERVER or
  $XDG_RUNTIME_DIR/pulse/native.
- Change default audio driver from pa to alsa as a safer fallback on
  headless hosts.
- Set detection priority: PipeWire (if QEMU >= 8.1) → PulseAudio → ALSA.
- Reason: a listening socket indicates a working service; pidof can be
  misleading on headless servers and caused QEMU "Failed to initialize
PW context" errors.

Fixes #1838

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 18:27:25 +00:00
Martin Wimpress e777817ca9 perf(quickemu): improve disk I/O defaults (cache,aio)
- add cache=writeback and aio=threads to DRIVE_OPTIMISATIONS
- retain existing optimisations: discard=unmap,detect-zeroes=unmap
- improve write performance (host writeback caching) and async I/O
  parallelism via thread-based AIO
- follows Proxmox/libvirt QEMU disk best practices; researched for macOS
  but applies to all guests

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 16:11:06 +00:00
Martin Wimpress 9b54b36492 fix: use local ISO variable for azurelinux
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-01-25 15:45:26 +00:00
Martin Wimpress 5504fdf4cc feat(quickget): add Azure Linux (3.0) support
- Add os_info() case entry with a description for Azure Linux
- Add Azure Linux to os_support() list
- Implement releases_azurelinux() returning "3.0"
- Implement arch_azurelinux() returning "amd64 arm64"
- Implement get_azurelinux() using stable aka.ms download URLs:
  - https://aka.ms/azurelinux-3.0-x86_64.iso
  - https://aka.ms/azurelinux-3.0-aarch64.iso
Fixes #1459

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 15:45:26 +00:00
Martin Wimpress e600d742ba fix(quickemu): disable GL when display backend is none
- Disable GL context creation when no display backend is selected by
setting gl="off"
- Keep spice behaviour unchanged (DISPLAY_RENDER remains "none")
- Prevent GL-related errors and unnecessary GPU initialisation for
headless VMs

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 15:20:05 +00:00
Martin Wimpress dead42dc25 fix(nix): avoid CI stack overflow by using builtins.split
- Replace builtins.match with builtins.split for version extraction
- Previous regex with .* patterns caused catastrophic backtracking on large files (~2800 lines)
- builtins.split avoids full-string regex matching and is more efficient

Fixes: Nix build CI failure
2026-01-25 14:52:52 +00:00
Martin Wimpress dd39102ef9 build(flake): update nixpkgs to nixos-unstable
- Replace flake.nix nixpkgs URL with github:nixos/nixpkgs/nixos-unstable
- Update flake.lock to new locked rev, narHash and github type

No functional changes to scripts; resolves dependency refresh for Nix flakes.,
2026-01-25 14:52:52 +00:00
Phil Clifford 727c853461 fix: adjust rockylinux 10.0 dvd
Fix rockylinux 10.0 dvd iso naming

Signed-off-by: Phil Clifford <philip.clifford@gmail.com>
2026-01-25 14:52:12 +00:00
Phil Clifford 8a9cb55934 fix: restore rockylinux dynamic releases
The website was changed and the old parse was not cutting it
2026-01-25 13:43:47 +00:00
Martin Wimpress a56a43342d fix(quickget): exit on curl failure in web_get
Add exit 1 after curl failure handling in web_get

- Exit immediately when a download via curl fails
- Prevent continuing to build invalid VM configs after failed download

Fixes #1625
2026-01-25 13:41:46 +00:00
Martin Wimpress 57cd52b1dc fix(quickemu): enable xhci when braille devices used
- Set usb_controller="xhci" in display_param_check() when BRAILLE is enabled.
- Braille devices are USB 1.1 (full-speed); EHCI only handles USB 2.0/3.0,
  which causes speed mismatch warnings and prevents braille devices from working.

Fixes #730
2026-01-25 13:26:02 +00:00
Martin Wimpress 64eedfe7c5 build(quickemu): require QEMU 6.1.0 minimum
- Raise global minimum QEMU version from 6.0.0 to 6.1.0.
- The option -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off used for macOS guests
  is only available in QEMU 6.1.0 and later; prefer raising the global requirement rather
  than adding per-flag conditionals.
- Update version check and error message in quickemu.

BREAKING CHANGE: Require QEMU 6.1.0; older QEMU will fail the version check.
2026-01-25 12:43:43 +00:00
Martin Wimpress 2384b0d263 fix(quickemu): enable vmware TSC and disable ACPI PCI hotplug for macOS
- Pass vmware-cpuid-freq=on to -cpu on Intel hosts to enable VMware TSC
  frequency reporting and improve macOS timing
- Add ICH9-LPC flag to disable ACPI PCI hotplug bridge support to avoid
  macOS PCI hotplug issues (required for QEMU 6.1+)

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 12:43:43 +00:00
Martin Wimpress eb54549353 fix(quickemu): select correct sound card for macOS guests
- Split macOS sound card logic by OS version:
  - Use virtio-sound-pci for macOS 12+ (Monterey and newer)
  - Use ich9-intel-hda for Big Sur
  - Keep intel-hda for earlier macOS releases
- Add virtio-sound-pci case to configure_audio() to pair the device with
  existing audiodev backends (PulseAudio, PipeWire, ALSA, CoreAudio)
- Update help text to include virtio-sound-pci as an allowed sound card
option
- Add virtio-sound-pci to allowed sound cards in
sound_card_param_check()

VoodooHDA injected via OpenCore stopped working from macOS 11.3+
onwards and usb-audio proved unreliable for Big Sur+. virtio-sound-pci
works natively on macOS 12+ without kexts and fixes guest audio for
affected versions.

Fixes #1642

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 11:55:51 +00:00
Martin Wimpress 76b29c659c perf(quickemu): enable TRIM/discard and detect-zeroes for qcow2 drives
Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 10:43:01 +00:00
Martin Wimpress 81b99feccd perf(quickemu): tune TCG translation cache and enable multithreaded TCG
- Add TCG-specific runtime optimisations in vm_boot for
cross-architecture VMs
- Detect host RAM and set tb-size to 512 for hosts with >=16GB,
otherwise 256
- Append -accel tcg,tb-size=${TCG_TB_SIZE},thread=multi to QEMU args
- Improve TCG translation cache behaviour and SMP performance for TCG
guests

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 03:15:46 +00:00
Martin Wimpress d8b27e8480
docs: update documentation
Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 02:22:38 +00:00
Martin Wimpress 0742312aa5 build(packaging): sync Nix flakes, devshell and Debian packaging
- Update flake.nix and package.nix to refresh package definitions and
pins
- Refresh devshell.nix to include updated development dependencies
- Adjust debian/control metadata to match packaging and dependency
changes
- Align packaging metadata between Nix and Debian to improve
reproducibility

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 01:51:53 +00:00
Martin Wimpress e7b49430cf docs(quickemu): clarify CPU, display and VM comments
- Clarify highmem behaviour for aarch64 virt machine and why it is
needed for >3GB RAM
- Add detailed explanation of TCG (software emulation), how to force it,
and common use cases
- Replace TODOs about VM detection with manufacturer-based detection
guidance
- Improve ARM detection rationale (no standard vendor strings)
- Explain that TCG enables running x86_64 macOS on ARM via software
emulation
- Prefer OpenGL ES via ANGLE on macOS for stability/performance on
Metal-backed systems
- Document virtio-gpu naming and regex rationale for matching device
names
- Note virtio devices manage VRAM dynamically via QEMU default
max_hostmem
- Add SMM/vmport note clarifying x86-specific semantics and Secure Boot
differences

No functional changes; comments only.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 01:31:11 +00:00
Martin Wimpress 2324d96303 refactor: quote expansions and add ShellCheck directive
- Quote URL argument passed to web_pipe in quickget to prevent
word-splitting
- Quote echoed variables in quickget (echo "${...}") for safe output
when values contain whitespace
- Add shellcheck disable=SC2054 in quickemu vm_boot to silence a
spurious ShellCheck warning

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 01:11:25 +00:00
Martin Wimpress 1991306df3 fix(quickget): prefer macOS-friendly hash commands in check_hash
- Prefer GNU coreutils g* hash commands on macOS when available; fall
back to native shasum/md5 otherwise
- Handle MD5 on macOS using 'md5 -r' and parse its output for comparison
- Warn and skip b2sum verification when GNU b2sum is not installed on
macOS
- Use a selected hash command variable when printing status and
performing checks

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress 6c957f6529 feat(quickget): support Ubuntu desktop ARM64 from 25.10
- Add arch_ubuntu() to enumerate supported architectures and gate ARM64
by release
- Validate architecture once RELEASE is known and exit/skip if
unsupported
- Use UBUNTU_ARCH when selecting ISO lines and hashes instead of
hardcoded amd64
- Use cdimage.ubuntu.com releases path for Ubuntu ARM64 desktop ISOs
- Default non-numeric releases (daily, dvd, etc.) to amd64 only

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress f1c66b45b9 fix(quickget): skip unsupported architectures for test/show operations
- If architecture is unsupported and OPERATION is "test" or "show",
  call test_result with SKIP and exit 0
- Keep existing error and exit 1 for non-test/show operations

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress 61d0bec3ba fix(quickget): validate architecture support after edition selection
- Skip early architecture check for OSes with editions_<os> to avoid
  rejecting valid edition-specific combinations
- Perform architecture validation after EDITION is known and show a
  descriptive error when the chosen edition isn't available on ARCH
- Preserve test/show behaviour (report SKIP) and keep previous flow for
  OSes without editions_<os>

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress 78fc1c93e6 fix(quickget): skip unsupported architectures for all operations
- Remove the OPERATION == "test" guard so is_arch_supported() is
evaluated
  unconditionally
- Apply the unconditional arch check in test_all() for editions loop,
  ubuntu-server, ubuntu desktop (ubuntu*), and the default case
- Skip generating URLs / running further logic when an OS is not
available
  for the requested ARCH
IMPACT: quickget will no longer attempt to generate or test downloads
for
architectures that the distro does not support, preventing incorrect URL
generation and false-positive test attempts.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress 5bbfdd1b54 fix(quickget): validate architecture before attempting download
Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress 1f7ec7e52c feat(quickget): add --check-all-arch to test amd64 and arm64
- Add CLI flag --check-all-arch with help text and CHECK_ALL_ARCH var
- Implement loop to run checks for both amd64 and arm64, setting ARCH
per run
- Validate architecture and release/edition before generating URLs; skip
Windows
- Generate and check URLs per-arch, reporting PASS / FAIL / SKIP per
entry
- Update CI workflow to call ./quickget --check-all-arch for distro
matrix tests

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress 1e194c6941 feat(quickget): add per-distro architecture support and validation
- Add arch_*() functions declaring supported architectures for several
distros
- Add is_arch_supported() helper; default to amd64 when no arch_* exists
- Validate architecture before generating URLs or running tests
(web_get, zsync_get, test_all)
- Update test_result() to accept and display an optional reason when
skipping
- Prevent false failures by skipping tests for unsupported architectures
IMPACT: quickget now respects requested architectures and reports clear
SKIP reasons for distros that do not support the selected arch.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress fe4364c7e1 fix(quickget): use ARCH for Debian ISOs and validate arm64 editions
- Use ARCH as DEBIAN_ARCH when constructing ISO filename and cdimage URL
- Update DEBCURRENT handling to select arch-specific iso-hybrid path
- Add explicit error and exit if arm64 is requested with a non-netinst
edition
  (Debian provides netinst images only for ARM64)

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress b62c144480 fix(quickget): select correct arch for Fedora and Ubuntu server ISOs
- Add FEDORA_ARCH and set to aarch64 when ARCH == arm64
- Use FEDORA_ARCH in jq filter to pick the correct Fedora ISO/sha256
- Add UBUNTU_ARCH and switch Ubuntu daily/releases URL for arm64
- Use UBUNTU_ARCH when parsing SHA256SUMS/MD5SUMS instead of hardcoded
amd64
Fixes incorrect ISO selection on ARM64 hosts and enables arm64
downloads.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress 57f753a21d feat(quickget): detect host architecture and add --arch flag
- Add HOST_ARCH detection and set ARCH default (arm64 → arm64, others →
amd64)
- Add parse_arch_flag() and support --arch/-arch before or after
operation args
- Inject arch="aarch64" into generated VM configs when ARCH=arm64
- Use QEMU_ARCH in distro helpers (AlmaLinux, Alpine, etc.) to build
correct ISO names/URLs
- Update help text to document --arch and reorder flags display
- Tidy Alpine release parsing (use first match) and simplify Rocky URL
assignment
Note: quickget now defaults ARCH from the host; pass --arch to override
if you
need a different target architecture.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-25 00:54:57 +00:00
Martin Wimpress ea1fbf6932 build(devshell): remove macOS brew and SHARE_PATH sed substitutions
- Remove sed expressions that replaced local SHARE_PATH and removed
Homebrew check
- Rely on existing darwin-specific substitutions and Nix-provided qemu
paths
- Simplify shellHook and avoid accidental replacements on non-Darwin
systems

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 21:28:59 +00:00
Martin Wimpress 305b0cd90e fix(quickemu): derive qemu share path from binary location
- Add get_qemu_share_path() to resolve the QEMU binary realpath and
derive
  a matching share directory (handles symlinks, Nix store paths,
Homebrew,
  MacPorts and custom builds)
- Replace ad-hoc brew/system logic in configure_bios with resolved share
path
- Fallback to /usr/share when no qemu firmware directory is found
Improve firmware/OVMF lookup reliability for non-system QEMU
installations.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 21:28:59 +00:00
Martin Wimpress 2e147f658e
fix(quickemu): quote qemu-system-${ARCH_VM} lookup
Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 20:15:54 +00:00
Martin Wimpress 5276ebaafb fix(quickemu): set xres/yres only for devices that support them
- Replace vmware-svga exclusion with explicit device regex
- Apply xres/yres only to virtio-(vga|vga-gl|gpu|gpu-pci|gpu-gl-pci),
qxl, qxl-vga and bochs-display
- Prevent passing unsupported xres/yres params to other display devices,
avoiding incorrect resolution coercion and QEMU warnings

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 20:12:53 +00:00
Martin Wimpress 5dfe6c9cf7 fix(quickemu): enable pflash secure property only when secureboot on
Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 20:04:52 +00:00
Martin Wimpress aa4211b38a feat(quickemu): add CPU flag management with deduplication
- Add CPU_FLAG_MAP and helper functions reset_cpu_flags and add_cpu_flag
- Validate flag format, deduplicate entries and detect +/- and value
conflicts
- Replace direct CPU string concatenation in configure_cpu with
add_cpu_flag calls
- Centralise CPU flag logic to improve macOS and Windows CPU feature
selection
IMPACT: prevents duplicate or conflicting CPU flags being passed to QEMU
and
simplifies future CPU feature handling.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 19:36:09 +00:00
Martin Wimpress 6e0b4981ce feat(quickemu): add ARM64 (aarch64) guest support
- Allow arch override via config (arch="${arch:-x86_64}") and set
  ARCH_VM accordingly so aarch64 VMs can be selected from configs.
- Re-detect qemu-system-${ARCH_VM} after sourcing the VM config and
  fail fast with a clear error if the appropriate QEMU binary is
  missing (e.g. qemu-system-aarch64).
- Use virt machine for ARM64 and enable highmem when required
  (MACHINE_TYPE="virt,highmem=on,pflash0=rom,pflash1=efivars").
  pflash0/pflash1 reference named blockdev nodes instead of -drive if
  using OVMF-style pflash on x86.
- Set CPU selection for ARM64 to "max" when available; fall back to
  TCG accel when cross-arch emulation is required (ensures guests
  boot on non-ARM hosts).
- Omit x86-only machine options (smm, vmport) for aarch64 builds to
  avoid passing unsupported flags to QEMU.
- Add AAVMF/ARM64 firmware search paths and keep OVMF logic for
  x86_64 (preserve existing secureboot behaviour for x86 guests).
- Use virtio-gpu-pci for ARM64 (no VGA/virtio-vga on ARM) and add a
  ramfb device to provide an early UEFI framebuffer on ARM64 UEFI
  boot.
- Use virtio-scsi for CD-ROM on ARM64 (virt has no IDE controller) and
  set CD-ROM bootindex=1 so ISO boots before disk when provided.
  Set disk bootindex=2 when an ISO is present so disk remains second.
- Implement EFI boot configuration for ARM64 using -blockdev with
  named nodes (pflash handled via blockdev) rather than the x86
  -drive/secure global approach which is SMM/x86-specific.
- Use the ARM-compatible TPM device (tpm-tis-device) for aarch64
  instead of the x86 tpm-tis device where appropriate.
- Fix EFI_CODE condition bug by using -z instead of -n when checking
  for empty variables (pre-existing bug surfaced while testing ARM64).

IMPACT:
- Enables running aarch64 guests with proper firmware, machine type,
  devices and boot order on both native ARM hosts and non-ARM hosts
  (via TCG emulation).
- Maintainers should note the different pflash/blockdev handling and
  that -global secure pflash settings used for x86 must NOT be used
  for ARM64 virt machines.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 18:03:24 +00:00
Martin Wimpress b0e643d1c3 feat(quickemu): warn on unstable TSC for macOS Ventura+ on AMD
- Add check_macos_tsc_stability() to detect unstable TSC on Linux hosts
with
  AuthenticAMD CPUs when launching macOS Ventura+ guests
- Log a clear warning to the VM log and prompt interactively to continue
or
  abort to avoid guest freezes
- Abort by default in non-interactive mode to prevent unattended VM
hangs
- Add --ignore-tsc-warning to bypass the check and invoke the check
during
  vm_boot so it runs early in startup
Closes #1273

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 15:20:59 +00:00
Martin Wimpress 086128530f fix(quickget): support algorithm-prefixed hashes and b2sum
- Accept hashes in the form "algo:hash" and normalise prefix to
lowercase
- Map common prefixes (md5, sha1, sha256, sha512, b2sum|blake2|blake2b)
to tools
- Warn and skip verification for unknown prefixes
- Add macOS GNU coreutils mapping for gb2sum when using b2sum
- Use printf '%s  %s\n' to produce a stable "hash  filename" input for
--check

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 14:42:11 +00:00
Martin Wimpress e86d9980cd fix(quickemu): accept HygonGenuine CPUs and skip x86 checks on ARM hosts
- Treat HygonGenuine as AMD-compatible and check svm for AMD-style hosts
- On aarch64/arm64 hosts, skip x86-specific VT-x/SVM validation (HVF/KVM
handled by hypervisor)
- Add warning for unknown CPU vendors to aid troubleshooting

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 14:25:42 +00:00
Martin Wimpress e3fb8c3372 fix: use portable extended grep regex
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-01-24 14:02:38 +00:00
Martin Wimpress 18451fe6c1 feat(quickemu): enable GL on macOS (cocoa) and prefer virtio GL
- Add check_cocoa_gl_es_support(): detect QEMU cocoa gl=es support and
look for
  ANGLE/libEGL in QEMU prefix, Homebrew and DYLD paths
- Use the check in configure_display() to enable "gl=es" for cocoa when
available
  and fall back to disabling GL (preserving previous stability
behaviour)
- Improve virtio GL selection: prefer virtio-gpu(-gl) /
virtio-gpu-gl-pci /
  virtio-vga-gl variants when GL is enabled and QEMU exposes the device
- Remove the hard disable of GL for cocoa in display_param_check() (now
handled
  by the detection function)
- Ensure user-visible display/GL/VirGL status remains printed for
diagnostics
Enables safer GL usage on macOS (covers Nix/Homebrew QEMU and ANGLE
cases);
falls back cleanly when support is absent.

Signed-off-by: Martin Wimpress <martin@wimpress.org>
2026-01-24 14:02:38 +00:00
Martin Wimpress 7668519b8d fix: prevent FAT directory name munging
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-01-24 12:42:51 +00:00
Martin Wimpress c96a2484e6 fix: prevent FAT direectory name munging
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-01-24 12:42:51 +00:00
Martin Wimpress f9249d657f fix: verify all mtools are available
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-01-24 12:42:51 +00:00
Martin Wimpress 1783381e29 feat(quickget): integrate OpenCore into macOS disk image by default
Create macOS VMs with OpenCore embedded in the EFI partition of disk.qcow2
instead of using a separate OpenCore.qcow2 file. This simplifies VM management
by reducing from two disk images to one.

Implementation:
- Add create_macos_disk_with_opencore() using mtools/sgdisk for cross-platform
  EFI partition creation without mounting or root privileges
- Add download_opencore() to extract OpenCore files from OSX-KVM image
- Use LC_ALL='' with mcopy to prevent FAT directory name mangling
- Adjust disk size threshold for macOS integrated mode (1GB vs 1.5MB)

Backwards compatibility:
- If OpenCore.qcow2 exists, use legacy two-disk boot method
- If mtools/sgdisk unavailable, fall back to legacy method automatically

New dependencies: mtools, gptfdisk (added to devshell.nix and package.nix)

Closes #1720
2026-01-24 12:42:51 +00:00
Martin Wimpress 2fe51d5671 fix(quickemu): skip x86 CPU feature checks on Apple Silicon
When using TCG emulation for cross-architecture VMs (e.g., x86_64 guest
on arm64 host), skip the SSE/AVX CPU feature detection since QEMU
emulates these features in software. This fixes macOS guest startup on
Apple Silicon Macs.

Fixes #1457
2026-01-24 10:40:23 +00:00
Martin Wimpress 81143afaab fix(devshell): enable EFI boot on macOS by patching OVMF paths
Nix's qemu_full bundles EDK2 firmware with different filenames than
quickemu expects. Add darwin-specific sed patterns to:
- Set SHARE_PATH to qemu_full's share directory
- Prepend correct firmware paths (edk2-x86_64-code.fd, edk2-i386-vars.fd)
  to the ovmfs search array
2026-01-24 10:02:16 +00:00
Martin Wimpress 9cc54ff365 fix(quickemu): remove duplicate +invtsc flag for AMD macOS guests
The invtsc flag is already added by the configure_cpu_flag loop when
check_cpu_flag recognises constant_tsc as equivalent to invtsc on AMD.
Adding it again in the AMD-specific TSC block caused duplication.

Only +tsc and +tsc-deadline are needed as additional flags.
2026-01-24 02:42:52 +00:00
Martin Wimpress 3cfbfb1a30 fix(quickemu): improve TSC flag detection for macOS on AMD CPUs 2026-01-24 02:42:52 +00:00
Martin Wimpress a2539d3c56 fix(quickget): resize Batocera image for GPT expansion 2026-01-24 02:10:49 +00:00
Martin Wimpress c66827ccb1 fix(quickget): extract Archcraft version folder from redirect URL
The hash URL was incorrectly using 'v${RELEASE}' (e.g., 'vlatest')
instead of extracting the actual version folder from the redirect URL.
Since releases_archcraft returns 'latest', the download redirect goes
to a versioned folder like 'v25.10', but the hash file lookup used
'vlatest' which doesn't exist.

Extract the version folder from the redirect URL to construct the
correct hash file path.
2026-01-24 01:43:24 +00:00
Martin Wimpress 7a59041120 fix(quickget): add hash verification for Mabox Linux 2026-01-24 01:43:24 +00:00
Martin Wimpress 9d4171b0d6 fix(quickget): add hash verification for KolibriOS 2026-01-24 01:43:24 +00:00
Martin Wimpress 2e5b29ad43 fix(quickget): add hash verification for Archcraft 2026-01-24 01:43:24 +00:00
Martin Wimpress 5090385dbd fix(quickemu): conditionalise KVM-specific CPU flags for Windows
Fixes #1731
2026-01-24 01:02:49 +00:00
Martin Wimpress 5ef6d1ffeb
chore: bump version to 4.9.9 2026-01-24 00:33:33 +00:00
20 changed files with 1532 additions and 450 deletions

View File

@ -16,6 +16,6 @@ jobs:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: DeterminateSystems/nix-installer-action@v21
- uses: DeterminateSystems/nix-installer-action@v22
- uses: DeterminateSystems/magic-nix-cache-action@v9
- uses: DeterminateSystems/flake-checker-action@v12

View File

@ -13,7 +13,7 @@ jobs:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: DeterminateSystems/nix-installer-action@v21
- uses: DeterminateSystems/nix-installer-action@v22
- uses: DeterminateSystems/magic-nix-cache-action@v9
- uses: DeterminateSystems/update-flake-lock@v28
with:

View File

@ -106,7 +106,7 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: "Import gpg key 🔑"
uses: crazy-max/ghaction-import-gpg@v6
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.PPA_GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.PPA_GPG_PASSPHRASE }}

View File

@ -53,7 +53,7 @@ jobs:
- name: "Checkout 🥡"
uses: "actions/checkout@v6"
- name: "Install Nix ❄️"
uses: "DeterminateSystems/nix-installer-action@v21"
uses: "DeterminateSystems/nix-installer-action@v22"
- name: "Enable Magic Nix Cache 🪄"
uses: "DeterminateSystems/magic-nix-cache-action@v9"
- name: "Build & Test .nix ❄️"

View File

@ -50,7 +50,7 @@ jobs:
id: check
run: |
mkdir -p results
./quickget --check "${{ matrix.distro }}" | tee results/check.txt
./quickget --check-all-arch "${{ matrix.distro }}" | tee results/check.txt
# Count results (use wc -l to avoid grep exit code issues)
PASSED=$(grep '^PASS' results/check.txt | wc -l | tr -d ' ')
@ -83,7 +83,7 @@ jobs:
cat result/result.json
- name: "Upload result artifact 📤"
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: result-${{ matrix.distro }}
path: result/
@ -101,7 +101,7 @@ jobs:
if: always()
steps:
- name: "Download all result artifacts 📥"
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8
with:
pattern: result-*
path: results

View File

@ -27,6 +27,8 @@ The devshell patches `quickemu` to use Nix store paths for OVMF and Samba, writi
- Lint scripts: `shellcheck quickemu quickget quickreport chunkcheck`
- Test quickget URLs: `./quickget --check <os> [release] [edition]`
- Test ARM64 downloads: `./quickget --arch arm64 --check <os> [release] [edition]`
- Test all architectures: `./quickget --check-all-arch <os> [release] [edition]`
- List all supported OSes: `./quickget --list`
- Run VM: `./quickemu --vm <name>.conf`
@ -53,7 +55,8 @@ Follow the [guide in the wiki](https://github.com/quickemu-project/quickemu/wiki
1. Entry in `os_info()` case statement
2. `releases_<os>()` function returning available versions
3. `editions_<os>()` function if multiple editions exist
4. Download URL construction logic
4. `arch_<os>()` function if ARM64 is supported (defaults to amd64 only if omitted)
5. Download URL construction logic
## Commit message format
@ -96,10 +99,13 @@ fix(quickget): remove Athena OS (no longer getting updates)
## Platform support
- Host: Linux (x86_64, aarch64), macOS (x86_64, aarch64)
- Guest: x86_64 (default), aarch64 (set `arch="aarch64"` in VM config)
- ARM64 guests use AAVMF firmware and `virt` machine type
- Cross-arch emulation uses TCG (no KVM acceleration)
- OVMF/UEFI firmware: Linux only
- Bash 4.0+ required (explicit version check at runtime)
## Key dependencies
Runtime: qemu, cdrtools, curl, jq, spice-gtk, swtpm, samba, zsync
Linux-specific: OVMF, usbutils, mesa-demos
Linux-specific: OVMF (x86_64 guests), AAVMF (aarch64 guests), usbutils, mesa-demos

View File

@ -41,6 +41,7 @@ required to run the virtual machines.
- **macOS** Sequoia, Sonoma, Ventura, Monterey, Big Sur, Catalina & Mojave
- **Windows** 10 and 11 including TPM 2.0
- **Windows Server** 2022 2019 2016
- **ARM64 guest support** for running aarch64 VMs (native on ARM hosts, emulated on x86_64)
- [Ubuntu](https://ubuntu.com/desktop) and all the **[official Ubuntu
flavours](https://ubuntu.com/download/flavours)**
- **Nearly 1000 operating system editions are supported!**

@ -1 +1 @@
Subproject commit c5907eae9c0bd9364b4a91a3f449f1d1dbbc58c9
Subproject commit f9582c397c8ac9f1fc6ab2d6882d5ef51dc5efda

View File

@ -30,7 +30,7 @@ mkShell {
xorg.xrandr
zsync
]
++ lib.optionals stdenv.isLinux [
++ lib.optionals stdenv.hostPlatform.isLinux [
mesa-demos
usbutils
xdg-user-dirs
@ -52,10 +52,14 @@ mkShell {
sed \
${
lib.optionalString (OVMF != null && OVMFFull != null) ''
-e '/OVMF_CODE_4M.secboot.fd/s|ovmfs=(|ovmfs=("${OVMFFull.firmware}","${OVMFFull.variables}" |' \
-e '/OVMF_CODE_4M.secboot.fd/s|ovmfs=(|ovmfs=("${OVMFFull.firmware}","${OVMFFull.variablesMs}" |' \
-e '/OVMF_CODE_4M.fd/s|ovmfs=(|ovmfs=("${OVMF.firmware}","${OVMF.variables}" |' \
''
} \
}${lib.optionalString stdenv.hostPlatform.isDarwin ''
-e 's|ovmfs=("[$][{]SHARE_PATH}/OVMF/OVMF_CODE_4M.secboot.fd"|ovmfs=("${pkgs.qemu_full}/share/qemu/edk2-x86_64-secure-code.fd","${pkgs.qemu_full}/share/qemu/edk2-i386-vars.fd" "''${SHARE_PATH}/OVMF/OVMF_CODE_4M.secboot.fd"|' \
-e 's|ovmfs=("[$][{]SHARE_PATH}/OVMF/OVMF_CODE_4M.fd"|ovmfs=("${pkgs.qemu_full}/share/qemu/edk2-x86_64-code.fd","${pkgs.qemu_full}/share/qemu/edk2-i386-vars.fd" "''${SHARE_PATH}/OVMF/OVMF_CODE_4M.fd"|' \
-e 's|ovmfs=("/usr/share/AAVMF/AAVMF_CODE.fd"|ovmfs=("${pkgs.qemu_full}/share/qemu/edk2-aarch64-code.fd","${pkgs.qemu_full}/share/qemu/edk2-arm-vars.fd" "/usr/share/AAVMF/AAVMF_CODE.fd"|' \
''} \
-e '/cp "''${VARS_IN}" "''${VARS_OUT}"/a chmod +w "''${VARS_OUT}"' \
-e 's,\$(command -v smbd),${pkgs.samba}/bin/smbd,' \
quickemu > $PWD/.direnv/bin/quickemu

View File

@ -1,6 +1,6 @@
.\" Automatically generated by Pandoc 3.7.0.2
.\" Automatically generated by Pandoc 3.8.3
.\"
.TH "QUICKEMU" "1" "July 31, 2025" "quickemu" "Quickemu User Manual"
.TH "QUICKEMU" "1" "February 2, 2026" "quickemu" "Quickemu User Manual"
.SH NAME
quickemu \- A quick VM builder and manager
.SH SYNOPSIS
@ -31,8 +31,8 @@ Delete the entire VM and its configuration
.TP
\f[B]\-\-display\f[R]
Select display backend.
\(aqsdl\(aq (default), \(aqgtk\(aq, \(aqnone\(aq, \(aqspice\(aq or
\(aqspice\-app\(aq
\(aqgtk\(aq (default), \(aqsdl\(aq, \(aqcocoa\(aq, \(aqnone\(aq,
\(aqspice\(aq or \(aqspice\-app\(aq
.TP
\f[B]\-\-fullscreen\f[R]
Starts VM in full screen mode (Ctl+Alt+f to exit)
@ -191,6 +191,9 @@ Mojave
.IP \(bu 2
\f[B]Windows Server\f[R] 2022 2019 2016
.IP \(bu 2
\f[B]ARM64 guest support\f[R] for running aarch64 VMs (native on ARM
hosts, emulated on x86_64)
.IP \(bu 2
\c
.UR https://ubuntu.com/desktop
Ubuntu
@ -570,18 +573,23 @@ wiki
You can also use \f[CR]quickget\f[R] with advanced options :
.IP
.EX
\-\-download <os> <release> [edition] : Download image; no VM configuration
\-\-create\-config <os> [path/url] [flags] : Create VM config for an OS image
\-\-open\-homepage <os> : Open homepage for the OS
\-\-show [os] : Show OS information
\-\-version : Show version
\-\-help : Show this help message
\-\-disable\-unattended : Force quickget not to set up an unattended installation
\-\-url [os] [release] [edition] : Show image URL(s)
\-\-check [os] [release] [edition] : Check image URL(s)
\-\-list : List all supported systems
\-\-list\-csv : List everything in csv format
\-\-list\-json : List everything in json format
\-\-arch <arch> : Set architecture (arm64, aarch64, amd64, x86_64)
\-\-download <os> <release> [edition] : Download image; no VM configuration
\-\-create\-config <os> [path/url] [flags] : Create VM config for an OS image
\-\-open\-homepage <os> : Open homepage for the OS
\-\-show [os] : Show OS information
\-\-version : Show version
\-\-help : Show this help message
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Flags \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
\-\-create\-config:
\-\-disable\-unattended : Force quickget not to set up an unattended installation
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- For testing & development \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
\-\-url [os] [release] [edition] : Show image URL(s)
\-\-check [os] [release] [edition] : Check image URL(s)
\-\-check\-all\-arch [os] [release] [edition] : Check downloads for all architectures (amd64 and arm64)
\-\-list : List all supported systems
\-\-list\-csv : List everything in csv format
\-\-list\-json : List everything in json format
.EE
.PP
Here are some typical uses
@ -622,7 +630,7 @@ wiki
.IP \(bu 2
\f[CR]artixlinux\f[R] (Artix Linux)
.IP \(bu 2
\f[CR]athenaos\f[R] (Athena OS)
\f[CR]azurelinux\f[R] (Azure Linux)
.IP \(bu 2
\f[CR]batocera\f[R] (Batocera)
.IP \(bu 2
@ -678,8 +686,6 @@ wiki
.IP \(bu 2
\f[CR]haiku\f[R] (Haiku)
.IP \(bu 2
\f[CR]holoiso\f[R] (HoloISO)
.IP \(bu 2
\f[CR]kali\f[R] (Kali)
.IP \(bu 2
\f[CR]kdeneon\f[R] (KDE Neon)
@ -752,17 +758,15 @@ wiki
.IP \(bu 2
\f[CR]solus\f[R] (Solus)
.IP \(bu 2
\f[CR]sparkylinux\f[R] (SparkyLinux)
.IP \(bu 2
\f[CR]spirallinux\f[R] (SpiralLinux)
.IP \(bu 2
\f[CR]tails\f[R] (Tails)
.IP \(bu 2
\f[CR]tinycore\f[R] (Tiny Core Linux)
.IP \(bu 2
\f[CR]trisquel\f[R] (Trisquel\-)
.IP \(bu 2
\f[CR]truenas\-core\f[R] (TrueNAS Core)
.IP \(bu 2
\f[CR]truenas\-scale\f[R] (TrueNAS Scale)
\f[CR]trisquel\f[R] (Trisquel)
.IP \(bu 2
\f[CR]tuxedo\-os\f[R] (Tuxedo OS)
.IP \(bu 2
@ -770,8 +774,6 @@ wiki
.IP \(bu 2
\f[CR]void\f[R] (Void Linux)
.IP \(bu 2
\f[CR]vxlinux\f[R] (VX Linux)
.IP \(bu 2
\f[CR]zorin\f[R] (Zorin OS)
.SS \c
.UR https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines#manually-create-linux-guests
@ -827,6 +829,17 @@ check the Discussions
.PP
\f[CR]quickget\f[R] automatically downloads a macOS recovery image and
creates a virtual machine configuration.
.PP
Note: Some VPN users may need to \c
.UR https://github.com/quickemu-project/quickemu/issues/1391#issuecomment-3506845235
turn off their VPN
.UE \c
\ in order to download a recovery image.
Some other users may find \c
.UR https://github.com/quickemu-project/quickemu/issues/1391#issuecomment-2429146013
using a VPN
.UE \c
\ necessary in order to download a recovery image.
.IP
.EX
quickget macos big\-sur
@ -931,16 +944,16 @@ The default macOS configuration looks like this:
.IP
.EX
guest_os=\(dqmacos\(dq
img=\(dqmacos\- big\-sur/RecoveryImage.img\(dq
disk_img=\(dqmacos\- big\-sur/disk.qcow2\(dq
macos_release=\(dq big\-sur\(dq
img=\(dqmacos\-big\-sur/RecoveryImage.img\(dq
disk_img=\(dqmacos\-big\-sur/disk.qcow2\(dq
macos_release=\(dqbig\-sur\(dq
.EE
.IP \(bu 2
\f[CR]guest_os=\(dqmacos\(dq\f[R] instructs Quickemu to optimise for
macOS.
.IP \(bu 2
\f[CR]macos_release=\(dq big\-sur\(dq\f[R] instructs Quickemu to
optimise for a particular macOS release.
\f[CR]macos_release=\(dqbig\-sur\(dq\f[R] instructs Quickemu to optimise
for a particular macOS release.
.RS 2
.IP \(bu 2
For example VirtIO Network and Memory Ballooning are available in Big
@ -1144,11 +1157,13 @@ Usage
Arguments
\-\-access : Enable remote spice access support. \(aqlocal\(aq (default), \(aqremote\(aq, \(aqclientipaddress\(aq
\-\-braille : Enable braille support. Requires SDL.
\-\-cpu\-pinning : Choose which host cores correspond to which guest cores.
\-\-delete\-disk : Delete the disk image and EFI variables
\-\-delete\-vm : Delete the entire VM and its configuration
\-\-display : Select display backend. \(aqsdl\(aq (default), \(aqcocoa\(aq, \(aqgtk\(aq, \(aqnone\(aq, \(aqspice\(aq or \(aqspice\-app\(aq
\-\-display : Select display backend. \(aqgtk\(aq (default), \(aqsdl\(aq, \(aqcocoa\(aq, \(aqnone\(aq, \(aqspice\(aq or \(aqspice\-app\(aq
\-\-fullscreen : Starts VM in full screen mode (Ctl+Alt+f to exit)
\-\-ignore\-msrs\-always : Configure KVM to always ignore unhandled machine\-specific registers
\-\-ignore\-tsc\-warning : Skip TSC stability warning for macOS VMs on AMD
\-\-kill : Kill the VM process if it is running
\-\-offline : Override all network settings and start the VM offline
\-\-shortcut : Create a desktop shortcut
@ -1174,7 +1189,7 @@ Arguments
\-\-keyboard_layout <layout> : Set keyboard layout: \(aqen\-us\(aq (default)
\-\-mouse <type> : Set mouse. \(atOptions: \(aqtablet\(aq (default), \(aqps2\(aq, \(aqusb\(aq, \(aqvirtio\(aq
\-\-usb\-controller <type> : Set usb\-controller. \(atOptions: \(aqehci\(aq (default), \(aqxhci\(aq, \(aqnone\(aq
\-\-sound\-card <type> : Set sound card. \(atOptions: \(aqintel\-hda\(aq (default), \(aqac97\(aq, \(aqes1370\(aq, \(aqsb16\(aq, \(aqusb\-audio\(aq, \(aqnone\(aq
\-\-sound\-card <type> : Set sound card. \(atOptions: \(aqintel\-hda\(aq (default), \(aqac97\(aq, \(aqes1370\(aq, \(aqsb16\(aq, \(aqusb\-audio\(aq, \(aqvirtio\-sound\-pci\(aq, \(aqnone\(aq
\-\-sound\-duplex <type> : Set sound card duplex. \(atOptions: \(aqhda\-micro\(aq (default: speaker/mic), \(aqhda\-duplex\(aq (line\-in/line\-out), \(aqhda\-output\(aq (output\-only)
\-\-extra_args <arguments> : Pass additional arguments to qemu
\-\-version : Print version

View File

@ -1,6 +1,6 @@
---
author: Martin Wimpress
date: July 31, 2025
date: February 2, 2026
footer: quickemu
header: Quickemu User Manual
section: 1
@ -41,8 +41,8 @@ You can also pass optional parameters
: Delete the entire VM and its configuration
**--display**
: Select display backend. 'sdl' (default), 'gtk', 'none', 'spice' or
'spice-app'
: Select display backend. 'gtk' (default), 'sdl', 'cocoa', 'none',
'spice' or 'spice-app'
**--fullscreen**
: Starts VM in full screen mode (Ctl+Alt+f to exit)
@ -177,6 +177,8 @@ Haiku, KolibriOS, OpenIndiana, ReactOS, and more.
Mojave
- **Windows** 10 and 11 including TPM 2.0
- **Windows Server** 2022 2019 2016
- **ARM64 guest support** for running aarch64 VMs (native on ARM hosts,
emulated on x86_64)
- [Ubuntu](https://ubuntu.com/desktop) and all the **[official Ubuntu
flavours](https://ubuntu.com/download/flavours)**
- **Nearly 1000 operating system editions are supported!**
@ -397,18 +399,23 @@ may have further information.
You can also use `quickget` with advanced options :
``` text
--download <os> <release> [edition] : Download image; no VM configuration
--create-config <os> [path/url] [flags] : Create VM config for an OS image
--open-homepage <os> : Open homepage for the OS
--show [os] : Show OS information
--version : Show version
--help : Show this help message
--disable-unattended : Force quickget not to set up an unattended installation
--url [os] [release] [edition] : Show image URL(s)
--check [os] [release] [edition] : Check image URL(s)
--list : List all supported systems
--list-csv : List everything in csv format
--list-json : List everything in json format
--arch <arch> : Set architecture (arm64, aarch64, amd64, x86_64)
--download <os> <release> [edition] : Download image; no VM configuration
--create-config <os> [path/url] [flags] : Create VM config for an OS image
--open-homepage <os> : Open homepage for the OS
--show [os] : Show OS information
--version : Show version
--help : Show this help message
------------------------------------ Flags -------------------------------------
--create-config:
--disable-unattended : Force quickget not to set up an unattended installation
-------------------------- For testing & development ---------------------------
--url [os] [release] [edition] : Show image URL(s)
--check [os] [release] [edition] : Check image URL(s)
--check-all-arch [os] [release] [edition] : Check downloads for all architectures (amd64 and arm64)
--list : List all supported systems
--list-csv : List everything in csv format
--list-json : List everything in json format
```
Here are some typical uses
@ -441,7 +448,7 @@ Further information is available from the project
- `archcraft` (Archcraft)
- `archlinux` (Arch Linux)
- `artixlinux` (Artix Linux)
- `athenaos` (Athena OS)
- `azurelinux` (Azure Linux)
- `batocera` (Batocera)
- `bazzite` (Bazzite)
- `biglinux` (BigLinux)
@ -469,7 +476,6 @@ Further information is available from the project
- `gnomeos` (GNOME OS)
- `guix` (Guix)
- `haiku` (Haiku)
- `holoiso` (HoloISO)
- `kali` (Kali)
- `kdeneon` (KDE Neon)
- `kolibrios` (KolibriOS)
@ -506,16 +512,14 @@ Further information is available from the project
- `slint` (Slint)
- `slitaz` (SliTaz)
- `solus` (Solus)
- `sparkylinux` (SparkyLinux)
- `spirallinux` (SpiralLinux)
- `tails` (Tails)
- `tinycore` (Tiny Core Linux)
- `trisquel` (Trisquel-)
- `truenas-core` (TrueNAS Core)
- `truenas-scale` (TrueNAS Scale)
- `trisquel` (Trisquel)
- `tuxedo-os` (Tuxedo OS)
- `vanillaos` (Vanilla OS)
- `void` (Void Linux)
- `vxlinux` (VX Linux)
- `zorin` (Zorin OS)
### [Custom Linux guests](https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines#manually-create-linux-guests)
@ -561,6 +565,13 @@ for solutions or ask for help there** 🛟
`quickget` automatically downloads a macOS recovery image and creates a
virtual machine configuration.
Note: Some VPN users may need to [turn off their
VPN](https://github.com/quickemu-project/quickemu/issues/1391#issuecomment-3506845235)
in order to download a recovery image. Some other users may find [using
a
VPN](https://github.com/quickemu-project/quickemu/issues/1391#issuecomment-2429146013)
necessary in order to download a recovery image.
``` shell
quickget macos big-sur
quickemu --vm macos-big-sur.conf
@ -635,13 +646,13 @@ The default macOS configuration looks like this:
``` shell
guest_os="macos"
img="macos- big-sur/RecoveryImage.img"
disk_img="macos- big-sur/disk.qcow2"
macos_release=" big-sur"
img="macos-big-sur/RecoveryImage.img"
disk_img="macos-big-sur/disk.qcow2"
macos_release="big-sur"
```
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
- `macos_release=" big-sur"` instructs Quickemu to optimise for a
- `macos_release="big-sur"` instructs Quickemu to optimise for a
particular macOS release.
- For example VirtIO Network and Memory Ballooning are available in
Big Sur and newer, but not previous releases.
@ -758,11 +769,13 @@ Usage
Arguments
--access : Enable remote spice access support. 'local' (default), 'remote', 'clientipaddress'
--braille : Enable braille support. Requires SDL.
--cpu-pinning : Choose which host cores correspond to which guest cores.
--delete-disk : Delete the disk image and EFI variables
--delete-vm : Delete the entire VM and its configuration
--display : Select display backend. 'sdl' (default), 'cocoa', 'gtk', 'none', 'spice' or 'spice-app'
--display : Select display backend. 'gtk' (default), 'sdl', 'cocoa', 'none', 'spice' or 'spice-app'
--fullscreen : Starts VM in full screen mode (Ctl+Alt+f to exit)
--ignore-msrs-always : Configure KVM to always ignore unhandled machine-specific registers
--ignore-tsc-warning : Skip TSC stability warning for macOS VMs on AMD
--kill : Kill the VM process if it is running
--offline : Override all network settings and start the VM offline
--shortcut : Create a desktop shortcut
@ -788,7 +801,7 @@ Arguments
--keyboard_layout <layout> : Set keyboard layout: 'en-us' (default)
--mouse <type> : Set mouse. @Options: 'tablet' (default), 'ps2', 'usb', 'virtio'
--usb-controller <type> : Set usb-controller. @Options: 'ehci' (default), 'xhci', 'none'
--sound-card <type> : Set sound card. @Options: 'intel-hda' (default), 'ac97', 'es1370', 'sb16', 'usb-audio', 'none'
--sound-card <type> : Set sound card. @Options: 'intel-hda' (default), 'ac97', 'es1370', 'sb16', 'usb-audio', 'virtio-sound-pci', 'none'
--sound-duplex <type> : Set sound card duplex. @Options: 'hda-micro' (default: speaker/mic), 'hda-duplex' (line-in/line-out), 'hda-output' (output-only)
--extra_args <arguments> : Pass additional arguments to qemu
--version : Print version

View File

@ -1,6 +1,6 @@
.\" Automatically generated by Pandoc 3.7.0.2
.\" Automatically generated by Pandoc 3.8.3
.\"
.TH "QUICKEMU_CONF" "5" "July 31, 2025" "quickemu_conf" "Quickemu Configuration Manual"
.TH "QUICKEMU_CONF" "5" "February 2, 2026" "quickemu_conf" "Quickemu Configuration Manual"
.SH NAME
quickemu_conf \- Options and parameters in the quickemu <vm>.conf
.SH DESCRIPTION

View File

@ -1,6 +1,6 @@
---
author: Martin Wimpress
date: July 31, 2025
date: February 2, 2026
footer: quickemu_conf
header: Quickemu Configuration Manual
section: 5

View File

@ -1,6 +1,6 @@
.\" Automatically generated by Pandoc 3.7.0.2
.\" Automatically generated by Pandoc 3.8.3
.\"
.TH "QUICKGET" "1" "July 31, 2025" "quickget" "Quickget User Manual"
.TH "QUICKGET" "1" "February 2, 2026" "quickget" "Quickget User Manual"
.SH NAME
quickget \- download and prepare materials for building a quickemu VM
.SH SYNOPSIS
@ -128,18 +128,23 @@ wiki
You can also use \f[CR]quickget\f[R] with advanced options :
.IP
.EX
\-\-download <os> <release> [edition] : Download image; no VM configuration
\-\-create\-config <os> [path/url] [flags] : Create VM config for an OS image
\-\-open\-homepage <os> : Open homepage for the OS
\-\-show [os] : Show OS information
\-\-version : Show version
\-\-help : Show this help message
\-\-disable\-unattended : Force quickget not to set up an unattended installation
\-\-url [os] [release] [edition] : Show image URL(s)
\-\-check [os] [release] [edition] : Check image URL(s)
\-\-list : List all supported systems
\-\-list\-csv : List everything in csv format
\-\-list\-json : List everything in json format
\-\-arch <arch> : Set architecture (arm64, aarch64, amd64, x86_64)
\-\-download <os> <release> [edition] : Download image; no VM configuration
\-\-create\-config <os> [path/url] [flags] : Create VM config for an OS image
\-\-open\-homepage <os> : Open homepage for the OS
\-\-show [os] : Show OS information
\-\-version : Show version
\-\-help : Show this help message
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Flags \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
\-\-create\-config:
\-\-disable\-unattended : Force quickget not to set up an unattended installation
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- For testing & development \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
\-\-url [os] [release] [edition] : Show image URL(s)
\-\-check [os] [release] [edition] : Check image URL(s)
\-\-check\-all\-arch [os] [release] [edition] : Check downloads for all architectures (amd64 and arm64)
\-\-list : List all supported systems
\-\-list\-csv : List everything in csv format
\-\-list\-json : List everything in json format
.EE
.PP
Here are some typical uses
@ -180,7 +185,7 @@ wiki
.IP \(bu 2
\f[CR]artixlinux\f[R] (Artix Linux)
.IP \(bu 2
\f[CR]athenaos\f[R] (Athena OS)
\f[CR]azurelinux\f[R] (Azure Linux)
.IP \(bu 2
\f[CR]batocera\f[R] (Batocera)
.IP \(bu 2
@ -236,8 +241,6 @@ wiki
.IP \(bu 2
\f[CR]haiku\f[R] (Haiku)
.IP \(bu 2
\f[CR]holoiso\f[R] (HoloISO)
.IP \(bu 2
\f[CR]kali\f[R] (Kali)
.IP \(bu 2
\f[CR]kdeneon\f[R] (KDE Neon)
@ -310,17 +313,15 @@ wiki
.IP \(bu 2
\f[CR]solus\f[R] (Solus)
.IP \(bu 2
\f[CR]sparkylinux\f[R] (SparkyLinux)
.IP \(bu 2
\f[CR]spirallinux\f[R] (SpiralLinux)
.IP \(bu 2
\f[CR]tails\f[R] (Tails)
.IP \(bu 2
\f[CR]tinycore\f[R] (Tiny Core Linux)
.IP \(bu 2
\f[CR]trisquel\f[R] (Trisquel\-)
.IP \(bu 2
\f[CR]truenas\-core\f[R] (TrueNAS Core)
.IP \(bu 2
\f[CR]truenas\-scale\f[R] (TrueNAS Scale)
\f[CR]trisquel\f[R] (Trisquel)
.IP \(bu 2
\f[CR]tuxedo\-os\f[R] (Tuxedo OS)
.IP \(bu 2
@ -328,8 +329,6 @@ wiki
.IP \(bu 2
\f[CR]void\f[R] (Void Linux)
.IP \(bu 2
\f[CR]vxlinux\f[R] (VX Linux)
.IP \(bu 2
\f[CR]zorin\f[R] (Zorin OS)
.SS \c
.UR https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines#manually-create-linux-guests
@ -385,6 +384,17 @@ check the Discussions
.PP
\f[CR]quickget\f[R] automatically downloads a macOS recovery image and
creates a virtual machine configuration.
.PP
Note: Some VPN users may need to \c
.UR https://github.com/quickemu-project/quickemu/issues/1391#issuecomment-3506845235
turn off their VPN
.UE \c
\ in order to download a recovery image.
Some other users may find \c
.UR https://github.com/quickemu-project/quickemu/issues/1391#issuecomment-2429146013
using a VPN
.UE \c
\ necessary in order to download a recovery image.
.IP
.EX
quickget macos big\-sur
@ -497,8 +507,8 @@ macos_release=\(dqbig\-sur\(dq
\f[CR]guest_os=\(dqmacos\(dq\f[R] instructs Quickemu to optimise for
macOS.
.IP \(bu 2
\f[CR]macos_release=\(dq big\-sur\(dq\f[R] instructs Quickemu to
optimise for a particular macOS release.
\f[CR]macos_release=\(dqbig\-sur\(dq\f[R] instructs Quickemu to optimise
for a particular macOS release.
.RS 2
.IP \(bu 2
For example VirtIO Network and Memory Ballooning are available in Big

View File

@ -1,6 +1,6 @@
---
author: Martin Wimpress
date: July 31, 2025
date: February 2, 2026
footer: quickget
header: Quickget User Manual
section: 1
@ -123,18 +123,23 @@ may have further information.
You can also use `quickget` with advanced options :
``` text
--download <os> <release> [edition] : Download image; no VM configuration
--create-config <os> [path/url] [flags] : Create VM config for an OS image
--open-homepage <os> : Open homepage for the OS
--show [os] : Show OS information
--version : Show version
--help : Show this help message
--disable-unattended : Force quickget not to set up an unattended installation
--url [os] [release] [edition] : Show image URL(s)
--check [os] [release] [edition] : Check image URL(s)
--list : List all supported systems
--list-csv : List everything in csv format
--list-json : List everything in json format
--arch <arch> : Set architecture (arm64, aarch64, amd64, x86_64)
--download <os> <release> [edition] : Download image; no VM configuration
--create-config <os> [path/url] [flags] : Create VM config for an OS image
--open-homepage <os> : Open homepage for the OS
--show [os] : Show OS information
--version : Show version
--help : Show this help message
------------------------------------ Flags -------------------------------------
--create-config:
--disable-unattended : Force quickget not to set up an unattended installation
-------------------------- For testing & development ---------------------------
--url [os] [release] [edition] : Show image URL(s)
--check [os] [release] [edition] : Check image URL(s)
--check-all-arch [os] [release] [edition] : Check downloads for all architectures (amd64 and arm64)
--list : List all supported systems
--list-csv : List everything in csv format
--list-json : List everything in json format
```
Here are some typical uses
@ -167,7 +172,7 @@ Further information is available from the project
- `archcraft` (Archcraft)
- `archlinux` (Arch Linux)
- `artixlinux` (Artix Linux)
- `athenaos` (Athena OS)
- `azurelinux` (Azure Linux)
- `batocera` (Batocera)
- `bazzite` (Bazzite)
- `biglinux` (BigLinux)
@ -195,7 +200,6 @@ Further information is available from the project
- `gnomeos` (GNOME OS)
- `guix` (Guix)
- `haiku` (Haiku)
- `holoiso` (HoloISO)
- `kali` (Kali)
- `kdeneon` (KDE Neon)
- `kolibrios` (KolibriOS)
@ -232,16 +236,14 @@ Further information is available from the project
- `slint` (Slint)
- `slitaz` (SliTaz)
- `solus` (Solus)
- `sparkylinux` (SparkyLinux)
- `spirallinux` (SpiralLinux)
- `tails` (Tails)
- `tinycore` (Tiny Core Linux)
- `trisquel` (Trisquel-)
- `truenas-core` (TrueNAS Core)
- `truenas-scale` (TrueNAS Scale)
- `trisquel` (Trisquel)
- `tuxedo-os` (Tuxedo OS)
- `vanillaos` (Vanilla OS)
- `void` (Void Linux)
- `vxlinux` (VX Linux)
- `zorin` (Zorin OS)
### [Custom Linux guests](https://github.com/quickemu-project/quickemu/wiki/02-Create-Linux-virtual-machines#manually-create-linux-guests)
@ -287,6 +289,13 @@ for solutions or ask for help there** 🛟
`quickget` automatically downloads a macOS recovery image and creates a
virtual machine configuration.
Note: Some VPN users may need to [turn off their
VPN](https://github.com/quickemu-project/quickemu/issues/1391#issuecomment-3506845235)
in order to download a recovery image. Some other users may find [using
a
VPN](https://github.com/quickemu-project/quickemu/issues/1391#issuecomment-2429146013)
necessary in order to download a recovery image.
``` shell
quickget macos big-sur
quickemu --vm macos-big-sur.conf
@ -361,13 +370,13 @@ The default macOS configuration looks like this:
``` shell
guest_os="macos"
img="macos- big-sur/RecoveryImage.img"
disk_img="macos- big-sur/disk.qcow2"
macos_release=" big-sur"
img="macos-big-sur/RecoveryImage.img"
disk_img="macos-big-sur/disk.qcow2"
macos_release="big-sur"
```
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
- `macos_release=" big-sur"` instructs Quickemu to optimise for a
- `macos_release="big-sur"` instructs Quickemu to optimise for a
particular macOS release.
- For example VirtIO Network and Memory Ballooning are available in
Big Sur and newer, but not previous releases.

View File

@ -2,12 +2,12 @@
"nodes": {
"flake-schemas": {
"locked": {
"lastModified": 1761577921,
"narHash": "sha256-eK3/xbUOrxp9fFlei09XNjqcdiHXxndzrTXp7jFpOk8=",
"rev": "47849c7625e223d36766968cc6dc23ba0e135922",
"revCount": 107,
"lastModified": 1775244557,
"narHash": "sha256-iYXRXIX9eafJmwJFAhqT3YxvvpNRuPFSLRCSpvGh8Ic=",
"rev": "15edbeeaf77e42216dbcba8bfd907fdeabb75a2b",
"revCount": 132,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.2.0/019a4a84-544d-7c59-b26d-e334e320c932/source.tar.gz"
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.4.2/019d5cf2-ee3c-7313-964e-f3f83c35d509/source.tar.gz"
},
"original": {
"type": "tarball",
@ -16,16 +16,18 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1768940263,
"narHash": "sha256-sJERJIYTKPFXkoz/gBaBtRKke82h4DkX3BBSsKbfbvI=",
"rev": "3ceaaa8bc963ced4d830e06ea2d0863b6490ff03",
"revCount": 906247,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2511.906247%2Brev-3ceaaa8bc963ced4d830e06ea2d0863b6490ff03/019be1ae-9947-752c-81ca-8b8670ae9892/source.tar.gz"
"lastModified": 1776877367,
"narHash": "sha256-EHq1/OX139R1RvBzOJ0aMRT3xnWyqtHBRUBuO1gFzjI=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "0726a0ecb6d4e08f6adced58726b95db924cef57",
"type": "github"
},
"original": {
"type": "tarball",
"url": "https://flakehub.com/f/NixOS/nixpkgs/%2A.tar.gz"
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {

View File

@ -2,7 +2,7 @@
description = "Quickemu flake";
inputs = {
flake-schemas.url = "https://flakehub.com/f/DeterminateSystems/flake-schemas/*.tar.gz";
nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/*.tar.gz";
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
};
outputs =
@ -41,7 +41,7 @@
let
# OVMF is only available/needed on Linux
ovmfArgs =
if final.stdenv.isLinux then
if final.stdenv.hostPlatform.isLinux then
{ }
else
{
@ -60,7 +60,7 @@
let
# OVMF is only available/needed on Linux
ovmfArgs =
if pkgs.stdenv.isLinux then
if pkgs.stdenv.hostPlatform.isLinux then
{ }
else
{
@ -80,7 +80,7 @@
let
# OVMF is only available/needed on Linux
ovmfArgs =
if pkgs.stdenv.isLinux then
if pkgs.stdenv.hostPlatform.isLinux then
{ }
else
{

View File

@ -28,7 +28,6 @@
zsync,
OVMF ? null,
OVMFFull ? null,
quickemu,
}:
let
runtimePaths = [
@ -50,33 +49,35 @@ let
xrandr
zsync
]
++ lib.optionals stdenv.isLinux [
++ lib.optionals stdenv.hostPlatform.isLinux [
mesa-demos
OVMF
OVMFFull
usbutils
xdg-user-dirs
];
versionMatches = builtins.match ''
.*
readonly[[:blank:]]VERSION="([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)"
.*
'' (builtins.readFile ./quickemu);
# Extract version using builtins.split to avoid regex backtracking on large files.
# builtins.match with .* patterns on multi-kilobyte files can cause stack overflow.
versionParts = builtins.split "readonly VERSION=\"([0-9]+\\.[0-9]+\\.[0-9]+)\"" (
builtins.readFile ./quickemu
);
version = builtins.elemAt (builtins.elemAt versionParts 1) 0;
in
stdenv.mkDerivation rec {
stdenv.mkDerivation (finalAttrs: {
pname = "quickemu";
version = builtins.concatStringsSep "" versionMatches;
version = version;
src = lib.cleanSource ./.;
postPatch = ''
sed -i \
${
lib.optionalString (OVMF != null && OVMFFull != null) ''
-e '/OVMF_CODE_4M.secboot.fd/s|ovmfs=(|ovmfs=("${OVMFFull.firmware}","${OVMFFull.variables}" |' \
-e '/OVMF_CODE_4M.secboot.fd/s|ovmfs=(|ovmfs=("${OVMFFull.firmware}","${OVMFFull.variablesMs}" |' \
-e '/OVMF_CODE_4M.fd/s|ovmfs=(|ovmfs=("${OVMF.firmware}","${OVMF.variables}" |' \
''
} \
-e '/cp "''${VARS_IN}" "''${VARS_OUT}"/a chmod +w "''${VARS_OUT}"' \
-e 's/Icon=.*qemu.svg/Icon=qemu/' \
-e 's,\$(command -v smbd),${samba}/bin/smbd,' \
quickemu
'';
@ -103,11 +104,12 @@ stdenv.mkDerivation rec {
runHook postInstall
'';
passthru.tests = testers.testVersion { package = quickemu; };
passthru.tests = testers.testVersion { package = finalAttrs.finalPackage; };
meta = {
description = "Quickly create and run optimised Windows, macOS and Linux virtual machines";
homepage = "https://github.com/quickemu-project/quickemu";
changelog = "https://github.com/quickemu-project/quickemu/releases/tag/${finalAttrs.version}";
mainProgram = "quickemu";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [
@ -115,4 +117,4 @@ stdenv.mkDerivation rec {
flexiondotorg
];
};
}
})

1074
quickemu

File diff suppressed because it is too large Load Diff

538
quickget
View File

@ -8,6 +8,20 @@ export LC_ALL=C
# Detect host OS for checksum tool compatibility
HOST_OS=$(uname -s)
# Default architecture based on host
HOST_ARCH=$(uname -m)
case "${HOST_ARCH}" in
aarch64|arm64) ARCH="arm64";;
*) ARCH="amd64";;
esac
function arch_suffix() {
# Return architecture suffix for foreign architectures, empty for native
if [ "${ARCH}" != "${NORMALISED_HOST_ARCH}" ]; then
echo "-${ARCH}"
fi
}
function cleanup() {
if [ -n "$(jobs -p)" ]; then
kill "$(jobs -p)" 2>/dev/null
@ -27,6 +41,7 @@ function os_info() {
archcraft) INFO="Archcraft|-|https://archcraft.io/|Yet another minimal Linux distribution, based on Arch Linux.";;
archlinux) INFO="Arch Linux|-|https://archlinux.org/|Lightweight and flexible Linux® distribution that tries to Keep It Simple.";;
artixlinux) INFO="Artix Linux|-|https://artixlinux.org/|The Art of Linux. Simple. Fast. Systemd-free.";;
azurelinux) INFO="Azure Linux|-|https://github.com/microsoft/azurelinux|Microsoft's internal Linux distribution for cloud infrastructure and edge.";;
batocera) INFO="Batocera|-|https://batocera.org/|Retro-gaming distribution with the aim of turning any computer/nano computer into a gaming console during a game or permanently.";;
bazzite) INFO="Bazzite|-|https://github.com/ublue-os/bazzite/|Container native gaming and a ready-to-game SteamOS like.";;
biglinux) INFO="BigLinux|-|https://www.biglinux.com.br/|Is the right choice if you want to have an easy and enriching experience with Linux. It has been perfected over more than 19 years, following our motto: 'In search of the perfect system'.";;
@ -157,10 +172,14 @@ function error_specify_release() {
*ubuntu-server*)
echo -en " - Releases:\t"
releases_ubuntu-server
echo -en " - Archs:\t"
get_supported_archs "${OS}"
;;
*ubuntu*)
echo -en " - Releases:\t"
releases_ubuntu
echo -en " - Archs:\t"
get_supported_archs "${OS}"
;;
*windows*)
echo -en " - Releases:\t"
@ -168,6 +187,7 @@ function error_specify_release() {
echo -en " - Languages:\t"
"languages_${OS}"
echo "${I18NS[@]}"
# Windows uses multi-arch ISOs, skip architecture display
;;
*)
echo -en " - Releases:\t"
@ -176,6 +196,8 @@ function error_specify_release() {
echo -en " - Editions:\t"
"editions_${OS}" | fmt -w 80
fi
echo -en " - Archs:\t"
get_supported_archs "${OS}"
;;
esac
echo -e "\nERROR! You must specify a release."
@ -344,6 +366,7 @@ function test_result() {
local EDITION="${3:-}"
local URL="${4:-}"
local RESULT="${5:-}"
local REASON="${6:-}"
if [ -n "${EDITION}" ]; then
OS="${OS}-${RELEASE}-${EDITION}"
else
@ -353,7 +376,11 @@ function test_result() {
if [ -n "${RESULT}" ]; then
# Pad the OS string for consistent output
OS=$(printf "%-35s" "${OS}")
echo -e "${RESULT}: ${OS} ${URL}"
if [ -n "${REASON}" ]; then
echo -e "${RESULT}: ${OS} ${REASON}"
else
echo -e "${RESULT}: ${OS} ${URL}"
fi
else
OS=$(printf "%-36s" "${OS}:")
echo -e "${OS} ${URL}"
@ -374,6 +401,11 @@ function test_all() {
for RELEASE in $("releases_${FUNC}"); do
if [[ $(type -t "editions_${OS}") == function ]]; then
for EDITION in $(editions_"${OS}"); do
# Check architecture support before generating URL
if ! is_arch_supported "${OS}" "${ARCH}"; then
test_result "${OS}" "${RELEASE}" "${EDITION}" "" "SKIP" "(not available for ${ARCH})"
continue
fi
validate_release releases_"${OS}"
URL=$(get_"${OS}" | cut -d' ' -f1 | head -n 1)
if [ "${OPERATION}" == "show" ]; then
@ -397,12 +429,27 @@ function test_all() {
validate_release releases_macos
(get_macos)
elif [ "${OS}" == "ubuntu-server" ]; then
# Check architecture support before generating URL
if ! is_arch_supported "${OS}" "${ARCH}"; then
test_result "${OS}" "${RELEASE}" "" "" "SKIP" "(not available for ${ARCH})"
continue
fi
validate_release releases_ubuntu-server
(get_ubuntu-server)
elif [[ "${OS}" == *ubuntu* ]]; then
# Ubuntu desktop is amd64 only (no arch function = amd64 default)
if ! is_arch_supported "${OS}" "${ARCH}"; then
test_result "${OS}" "${RELEASE}" "" "" "SKIP" "(not available for ${ARCH})"
continue
fi
validate_release releases_ubuntu
(get_ubuntu)
else
# Check architecture support before generating URL
if ! is_arch_supported "${OS}" "${ARCH}"; then
test_result "${OS}" "${RELEASE}" "" "" "SKIP" "(not available for ${ARCH})"
continue
fi
validate_release releases_"${OS}"
URL=$(get_"${OS}" | cut -d' ' -f1 | head -n 1)
if [ "${OPERATION}" == "show" ]; then
@ -423,6 +470,7 @@ function os_support() {
archcraft \
archlinux \
artixlinux \
azurelinux \
batocera \
bazzite \
biglinux \
@ -566,6 +614,10 @@ function editions_artixlinux() {
echo $(web_pipe "https://mirror1.artixlinux.org/iso/" | grep "artix-" | cut -d'"' -f2 | grep -v sig | sed 's/artix-//' | sed 's/-[0-9]\{8\}-x86_64.iso//' | sort -u)
}
function releases_azurelinux() {
echo 3.0
}
function releases_batocera() {
#shellcheck disable=SC2046,SC2005
echo $(web_pipe "https://mirrors.o2switch.fr/batocera/x86_64/stable/" | grep ^\<a | cut -d'"' -f2 | cut -d '/' -f1 | grep -v '\.' | sort -ru | tail -n +2 | head -n 5)
@ -682,9 +734,9 @@ function releases_easyos() {
# get the latest 2 years of releases so that when we hit next year we still have the latest 2 years
TWO_YEARS=$(web_pipe https://distro.ibiblio.org/easyos/amd64/releases/kirkstone/ | grep -o -E '[[:digit:]]{4}/' | sort -nr | tr -d / | head -n 2 )
for YEAR in ${TWO_YEARS} ; do
ALL_RELEASES="${ALL_RELEASES} $(web_pipe https://distro.ibiblio.org/easyos/amd64/releases/kirkstone/${YEAR}/ | grep -o -E '[[:digit:]]+(\.[[:digit:]])+/' | tr -d / | sort -nr)"
ALL_RELEASES="${ALL_RELEASES} $(web_pipe "https://distro.ibiblio.org/easyos/amd64/releases/kirkstone/${YEAR}/" | grep -o -E '[[:digit:]]+(\.[[:digit:]])+/' | tr -d / | sort -nr)"
done
echo ${ALL_RELEASES}
echo "${ALL_RELEASES}"
}
@ -909,7 +961,7 @@ function releases_parrotsec() {
RELEASES="${RELEASES} ${REL}"
fi
done
echo ${RELEASES}
echo "${RELEASES}"
}
function editions_parrotsec() {
@ -981,7 +1033,7 @@ function releases_rebornos() {
function releases_rockylinux() {
#shellcheck disable=SC2046,SC2005
echo $(web_pipe "http://dl.rockylinux.org/vault/rocky/" | grep "^<a href" | grep -v full | grep -v RC | grep -v ISO | cut -d'"' -f2 | tr -d / | sort -ru)
echo $(web_pipe "http://dl.rockylinux.org/vault/rocky/" | grep "class=\"link" | grep -v -e 'full' -e 'RC' -e 'ISO' -e 'Parent' | cut -d'"' -f4 | tr -d / | sort -ru)
}
function editions_rockylinux() {
@ -1150,6 +1202,94 @@ function releases_zorin() {
echo 18 17 16
}
# Architecture support functions
# These declare which architectures each distro supports.
# Distros without an arch_*() function default to "amd64" only.
function arch_alma() {
echo "amd64 arm64"
}
function arch_alpine() {
echo "amd64 arm64"
}
function arch_azurelinux() {
echo "amd64 arm64"
}
function arch_debian() {
case "${EDITION}" in
netinst) echo "amd64 arm64";;
*) echo "amd64";;
esac
}
function arch_fedora() {
case "${EDITION}" in
Onyx) echo "amd64";;
*) echo "amd64 arm64";;
esac
}
function arch_ubuntu-server() {
echo "amd64 arm64"
}
function arch_ubuntu() {
# Ubuntu Desktop ARM64 only available from 25.10 onwards
local MAJOR MINOR
# When RELEASE is unset (initial arch check), return all supported architectures
# Actual validation happens in get_ubuntu() when release is known
if [ -z "${RELEASE}" ]; then
echo "amd64 arm64"
return
fi
# Non-numeric releases (daily-live, etc.) default to amd64 only
if [[ ! "${RELEASE}" =~ ^[0-9]+\.[0-9]+$ ]]; then
echo "amd64"
return
fi
MAJOR="${RELEASE%%.*}"
MINOR="${RELEASE##*.}"
# 25.10 and later support ARM64
if [ "${MAJOR}" -gt 25 ] || { [ "${MAJOR}" -eq 25 ] && [ "${MINOR}" -ge 10 ]; }; then
echo "amd64 arm64"
else
echo "amd64"
fi
}
# Check if a given architecture is supported for an OS
function is_arch_supported() {
local OS="${1}"
local CHECK_ARCH="${2}"
local SUPPORTED=""
# Check if arch function exists for this OS
if [[ $(type -t "arch_${OS}") == function ]]; then
SUPPORTED=$(arch_"${OS}")
else
# Default: amd64 only
SUPPORTED="amd64"
fi
# Check if requested arch is in supported list
[[ " ${SUPPORTED} " == *" ${CHECK_ARCH} "* ]]
}
# Get supported architectures for an OS
function get_supported_archs() {
local OS="${1}"
# Check if arch function exists for this OS
if [[ $(type -t "arch_${OS}") == function ]]; then
arch_"${OS}"
else
# Default: amd64 only
echo "amd64"
fi
}
function editions_zorin() {
# Lite edition not available for Zorin 18 (Pro-only starting from 18)
# When RELEASE is unset (e.g. csv_data context), return all editions
@ -1170,28 +1310,87 @@ function check_hash() {
iso="${VM_PATH}/${1}"
fi
hash="${2}"
# Guess the hash algorithm by the hash length
case ${#hash} in
32) hash_algo=md5sum;;
40) hash_algo=sha1sum;;
64) hash_algo=sha256sum;;
128) hash_algo=sha512sum;;
*) echo "WARNING! Can't guess hash algorithm, not checking ${iso} hash."
return;;
esac
# Use GNU coreutils on macOS/Darwin (prefixed with 'g')
if [ "${HOST_OS}" = "Darwin" ]; then
case ${hash_algo} in
md5sum) hash_algo=gmd5sum;;
sha1sum) hash_algo=gsha1sum;;
sha256sum) hash_algo=gsha256sum;;
sha512sum) hash_algo=gsha512sum;;
# Check for algorithm prefix (e.g., "sha256:abc123..." or "b2sum:abc123...")
if [[ "${hash}" == *":"* ]]; then
local hash_prefix="${hash%%:*}"
hash="${hash#*:}"
# Normalise algorithm prefix to lowercase
hash_prefix="$(echo "${hash_prefix}" | tr '[:upper:]' '[:lower:]')"
case "${hash_prefix}" in
md5) hash_algo=md5sum;;
sha1) hash_algo=sha1sum;;
sha256) hash_algo=sha256sum;;
sha512) hash_algo=sha512sum;;
b2sum|blake2|blake2b) hash_algo=b2sum;;
*) echo "WARNING! Unknown hash algorithm '${hash_prefix}', not checking ${iso} hash."
return;;
esac
else
# Guess the hash algorithm by the hash length
case ${#hash} in
32) hash_algo=md5sum;;
40) hash_algo=sha1sum;;
64) hash_algo=sha256sum;;
128) hash_algo=sha512sum;;
*) echo "WARNING! Can't guess hash algorithm, not checking ${iso} hash."
return;;
esac
fi
echo -n "Checking ${iso} with ${hash_algo}... "
if ! echo "${hash} ${iso}" | ${hash_algo} --check --status; then
# On macOS/Darwin, prefer GNU coreutils (prefixed with 'g') if available,
# otherwise fall back to native 'shasum' command
local hash_cmd="${hash_algo}"
if [ "${HOST_OS}" = "Darwin" ]; then
case ${hash_algo} in
md5sum)
if command -v gmd5sum &>/dev/null; then
hash_cmd=gmd5sum
else
# MD5 not directly supported by shasum; use native md5 command
hash_cmd="md5 -r"
fi;;
sha1sum)
if command -v gsha1sum &>/dev/null; then
hash_cmd=gsha1sum
else
hash_cmd="shasum -a 1"
fi;;
sha256sum)
if command -v gsha256sum &>/dev/null; then
hash_cmd=gsha256sum
else
hash_cmd="shasum -a 256"
fi;;
sha512sum)
if command -v gsha512sum &>/dev/null; then
hash_cmd=gsha512sum
else
hash_cmd="shasum -a 512"
fi;;
b2sum)
if command -v gb2sum &>/dev/null; then
hash_cmd=gb2sum
else
echo "WARNING! b2sum not available on macOS without GNU coreutils, not checking ${iso} hash."
return
fi;;
esac
fi
echo -n "Checking ${iso} with ${hash_cmd}... "
# Handle MD5 on macOS specially (md5 -r outputs "hash filename" format)
if [ "${hash_cmd}" = "md5 -r" ]; then
local computed_hash
computed_hash=$(md5 -r "${iso}" | cut -d' ' -f1)
if [ "${computed_hash}" != "${hash}" ]; then
echo "ERROR!"
echo "${iso} doesn't match ${hash}. Try running 'quickget' again."
exit 1
else
echo "Good!"
fi
elif ! printf '%s %s\n' "${hash}" "${iso}" | ${hash_cmd} --check --status; then
echo "ERROR!"
echo "${iso} doesn't match ${hash}. Try running 'quickget' again."
exit 1
@ -1243,6 +1442,11 @@ function web_get() {
test_result "${OS}" "${RELEASE}" "${EDITION}" "${URL}"
exit 0
elif [ "${OPERATION}" == "test" ]; then
# Check architecture support before testing URL
if ! is_arch_supported "${OS}" "${ARCH}"; then
test_result "${OS}" "${RELEASE}" "${EDITION}" "" "SKIP" "(not available for ${ARCH})"
exit 0
fi
CHECK=$(web_check "${URL}" && echo "PASS" || echo "FAIL")
test_result "${OS}" "${RELEASE}" "${EDITION}" "${URL}" "${CHECK}"
exit 0
@ -1258,12 +1462,12 @@ function web_get() {
if [[ ${OS} != windows && ${OS} != macos && ${OS} != windows-server ]]; then
echo "Downloading $(pretty_name "${OS}") ${RELEASE} ${EDITION}"
echo "- URL: ${URL}"
echo "- PATH: ${PWD}/${DIR}/${FILE}"
fi
if ! curl --disable --progress-bar --location --output "${DIR}/${FILE}" --continue-at - --user-agent "${USER_AGENT}" "${HEADERS[@]}" -- "${URL}"; then
echo "ERROR! Failed to download ${URL} with curl."
rm -f "${DIR}/${FILE}"
exit 1
fi
}
@ -1308,6 +1512,11 @@ function zsync_get() {
test_result "${OS}" "${RELEASE}" "${EDITION}" "${URL}"
exit 0
elif [ "${OPERATION}" == "test" ]; then
# Check architecture support before testing URL
if ! is_arch_supported "${OS}" "${ARCH}"; then
test_result "${OS}" "${RELEASE}" "${EDITION}" "" "SKIP" "(not available for ${ARCH})"
exit 0
fi
CHECK=$(web_check "${URL}" && echo "PASS" || echo "FAIL")
test_result "${OS}" "${RELEASE}" "${EDITION}" "${URL}" "${CHECK}"
exit 0
@ -1418,10 +1627,19 @@ function make_vm_config() {
if [ ! -e "${CONF_FILE}" ]; then
echo "Making ${CONF_FILE}"
local ARCH_LINE=""
if [ "${ARCH}" != "${NORMALISED_HOST_ARCH}" ]; then
if [ "${ARCH}" == "arm64" ]; then
ARCH_LINE="arch=\"aarch64\""
else
ARCH_LINE="arch=\"x86_64\""
fi
fi
cat << EOF > "${CONF_FILE}"
#!${QUICKEMU} --vm
guest_os="${GUEST}"
disk_img="${VM_PATH}/disk.qcow2"
${ARCH_LINE:+${ARCH_LINE}
}disk_img="${VM_PATH}/disk.qcow2"
${IMAGE_TYPE}="${VM_PATH}/${IMAGE_FILE}"
EOF
echo " - Setting ${CONF_FILE} executable"
@ -1441,7 +1659,7 @@ EOF
echo "disk_size=\"8G\"" >> "${CONF_FILE}";;
bazzite)
echo "disk_size=\"64G\"" >> "${CONF_FILE}";;
dragonflybsd|haiku|openbsd|netbsd|slackware|slax|tails|tinycore)
dragonflybsd|haiku|openbsd|netbsd|slackware|slax|tinycore)
echo "boot=\"legacy\"" >> "${CONF_FILE}";;
deepin)
echo "disk_size=\"64G\"" >> "${CONF_FILE}"
@ -1536,8 +1754,10 @@ EOF
function get_alma() {
local HASH=""
local ISO="AlmaLinux-${RELEASE}-latest-x86_64-${EDITION}.iso"
local URL="https://repo.almalinux.org/almalinux/${RELEASE}/isos/x86_64"
local QEMU_ARCH="x86_64"
[ "${ARCH}" == "arm64" ] && QEMU_ARCH="aarch64"
local ISO="AlmaLinux-${RELEASE}-latest-${QEMU_ARCH}-${EDITION}.iso"
local URL="https://repo.almalinux.org/almalinux/${RELEASE}/isos/${QEMU_ARCH}"
HASH="$(web_pipe "${URL}/CHECKSUM" | grep "(${ISO}" | cut -d' ' -f4)"
echo "${URL}/${ISO} ${HASH}"
}
@ -1545,11 +1765,13 @@ function get_alma() {
function get_alpine() {
local HASH=""
local ISO=""
local URL="https://dl-cdn.alpinelinux.org/alpine/${RELEASE}/releases/x86_64"
local QEMU_ARCH="x86_64"
[ "${ARCH}" == "arm64" ] && QEMU_ARCH="aarch64"
local URL="https://dl-cdn.alpinelinux.org/alpine/${RELEASE}/releases/${QEMU_ARCH}"
local VERSION=""
VERSION=$(web_pipe "${URL}/latest-releases.yaml" | awk '/"Xen"/{found=0} {if(found) print} /"Virtual"/{found=1}' | grep 'version:' | awk '{print $2}')
ISO="alpine-virt-${VERSION}-x86_64.iso"
HASH=$(web_pipe "${URL}/latest-releases.yaml" | awk '/"Xen"/{found=0} {if(found) print} /"Virtual"/{found=1}' | grep 'sha256:' | awk '{print $2}')
VERSION=$(web_pipe "${URL}/latest-releases.yaml" | awk '/"Xen"/{found=0} {if(found) print} /"Virtual"/{found=1}' | grep 'version:' | head -1 | awk '{print $2}')
ISO="alpine-virt-${VERSION}-${QEMU_ARCH}.iso"
HASH=$(web_pipe "${URL}/latest-releases.yaml" | awk '/"Xen"/{found=0} {if(found) print} /"Virtual"/{found=1}' | grep 'sha256:' | head -1 | awk '{print $2}')
echo "${URL}/${ISO} ${HASH}"
}
@ -1600,9 +1822,14 @@ function get_antix() {
function get_archcraft() {
local HASH=""
local ISO=""
local URL=""
local VERSION_FOLDER=""
URL="https://sourceforge.net/projects/archcraft/files/${RELEASE}/download"
URL="$(web_redirect "${URL}" | cut -d? -f1)"
ISO="$(basename "${URL}")"
VERSION_FOLDER="$(dirname "${URL}" | xargs basename)"
HASH=$(web_pipe "https://sourceforge.net/projects/archcraft/files/${VERSION_FOLDER}/${ISO}.sha256sum" | cut -d' ' -f1)
echo "${URL} ${HASH}"
}
@ -1624,6 +1851,15 @@ function get_artixlinux() {
echo "${URL}/${ISO} ${HASH}"
}
function get_azurelinux() {
local QEMU_ARCH="x86_64"
[ "${ARCH}" == "arm64" ] && QEMU_ARCH="aarch64"
local URL="https://aka.ms/azurelinux-${RELEASE}-${QEMU_ARCH}.iso"
local ISO
ISO="$(web_redirect "${URL}")"
echo "${ISO}"
}
function get_batocera() {
local HASH=""
local ISO=""
@ -1717,13 +1953,21 @@ function get_crunchbang++() {
}
function get_debian() {
local DEBIAN_ARCH="${ARCH}"
local DEBCURRENT=""
local HASH=""
local ISO="debian-live-${RELEASE}-amd64-${EDITION}.iso"
local URL="https://cdimage.debian.org/cdimage/archive/${RELEASE}-live/amd64/iso-hybrid"
local ISO="debian-live-${RELEASE}-${DEBIAN_ARCH}-${EDITION}.iso"
local URL="https://cdimage.debian.org/cdimage/archive/${RELEASE}-live/${DEBIAN_ARCH}/iso-hybrid"
# Debian only provides netinst images for ARM64
if [ "${DEBIAN_ARCH}" == "arm64" ] && [ "${EDITION}" != "netinst" ]; then
echo "ERROR! Debian ${EDITION} is not available for ARM64. Use 'netinst' edition."
exit 1
fi
DEBCURRENT=$(web_pipe "https://cdimage.debian.org/debian-cd/" | grep '\.[0-9]/' | cut -d'>' -f 9 | cut -d'/' -f 1)
case "${RELEASE}" in
"${DEBCURRENT}") URL="https://cdimage.debian.org/debian-cd/${RELEASE}-live/amd64/iso-hybrid";;
"${DEBCURRENT}") URL="https://cdimage.debian.org/debian-cd/${RELEASE}-live/${DEBIAN_ARCH}/iso-hybrid";;
esac
if [ "${EDITION}" == "netinst" ]; then
URL="${URL/-live/}"
@ -1842,11 +2086,15 @@ function get_endless() {
}
function get_fedora() {
local FEDORA_ARCH="x86_64"
local HASH=""
local ISO=""
local JSON=""
local URL=""
local VARIANT=""
[ "${ARCH}" == "arm64" ] && FEDORA_ARCH="aarch64"
case ${EDITION} in
Server|Kinoite|Onyx|Silverblue|Sericea|Workstation|KDE) VARIANT="${EDITION}";;
*) VARIANT="Spins";;
@ -1864,12 +2112,10 @@ function get_fedora() {
RELEASE="${RELEASE/_/ }"
fi
# shellcheck disable=SC2086
# Fedora may promote variants from Spins to Editions, in which case we want to accept either "Spins" or the specific edition name to preserve backwards compatibility
# For example, Fedora 42 KDE is now an edition, while previous releases are spins
JSON=$(web_pipe "https://getfedora.org/releases.json" | jq '.[] | select((.variant=="'"${VARIANT}"'" or .variant=="'"${EDITION}"'") and .subvariant=="'"${EDITION}"'" and .arch=="x86_64" and .version=="'"${RELEASE}"'" and (.link | endswith(".iso")))')
JSON=$(web_pipe "https://getfedora.org/releases.json" | jq '.[] | select((.variant=="'"${VARIANT}"'" or .variant=="'"${EDITION}"'") and .subvariant=="'"${EDITION}"'" and .arch=="'"${FEDORA_ARCH}"'" and .version=="'"${RELEASE}"'" and (.link | endswith(".iso")))')
URL=$(echo "${JSON}" | jq -r '.link' | head -n1)
HASH=$(echo "${JSON}" | jq -r '.sha256' | head -n1)
echo "${URL} ${HASH}"
@ -1987,6 +2233,7 @@ function get_kolibrios() {
local HASH=""
local ISO="latest-iso.7z"
local URL="http://builds.kolibrios.org/${EDITION}"
HASH=$(web_pipe "${URL}/sha256sums.txt" | grep "${ISO}" | cut -d' ' -f1)
echo "${URL}/${ISO} ${HASH}"
}
@ -2016,9 +2263,12 @@ function get_lmde() {
function get_maboxlinux() {
local HASH=""
local ISO=""
local URL=""
URL="https://sourceforge.net/projects/mabox-linux/files/${RELEASE}/download"
URL="$(web_redirect "${URL}" | cut -d? -f1)"
ISO="$(basename "${URL}")"
HASH=$(web_pipe "https://repo.maboxlinux.org/iso/${ISO}.md5" | cut -d' ' -f1)
echo "${URL} ${HASH}"
}
@ -2148,11 +2398,14 @@ function get_macos() {
rm "${VM_PATH}/RecoveryImage.dmg" "${VM_PATH}/RecoveryImage.chunklist"
echo " - RecoveryImage.img is ready."
fi
echo "Downloading OpenCore & UEFI firmware"
web_get "https://github.com/kholia/OSX-KVM/raw/master/OpenCore/OpenCore.qcow2" "${VM_PATH}"
web_get "https://github.com/kholia/OSX-KVM/raw/master/OVMF_CODE.fd" "${VM_PATH}"
# Pin to last known-good commit; OVMF_CODE.fd was removed from master on 26 Jan 2026
local OSX_KVM_COMMIT="da4b23b5e92c5b939568700034367e8b7649fe90"
web_get "https://github.com/kholia/OSX-KVM/raw/${OSX_KVM_COMMIT}/OpenCore/OpenCore.qcow2" "${VM_PATH}"
web_get "https://github.com/kholia/OSX-KVM/raw/${OSX_KVM_COMMIT}/OVMF_CODE.fd" "${VM_PATH}"
if [ ! -e "${VM_PATH}/OVMF_VARS-1920x1080.fd" ]; then
web_get "https://github.com/kholia/OSX-KVM/raw/master/OVMF_VARS-1920x1080.fd" "${VM_PATH}"
web_get "https://github.com/kholia/OSX-KVM/raw/${OSX_KVM_COMMIT}/OVMF_VARS-1920x1080.fd" "${VM_PATH}"
fi
fi
make_vm_config RecoveryImage.img
@ -2430,13 +2683,12 @@ function get_rebornos() {
}
function get_rockylinux() {
if [[ "${RELEASE}" =~ ^8. ]] && [[ "${EDITION}" == "dvd" ]]; then
if { [[ "${RELEASE}" =~ ^8. ]] || [[ "${RELEASE}" =~ ^10. ]]; } && [[ "${EDITION}" == "dvd" ]]; then
EDITION="dvd1"
fi
local HASH=""
local ISO="Rocky-${RELEASE}-x86_64-${EDITION}.iso"
local URL=""
URL="https://dl.rockylinux.org/vault/rocky/${RELEASE}/isos/x86_64"
local URL="https://dl.rockylinux.org/vault/rocky/${RELEASE}/isos/x86_64"
HASH=$(web_pipe "${URL}/CHECKSUM" | grep "SHA256" | grep "${ISO})" | cut -d' ' -f4)
echo "${URL}/${ISO} ${HASH}"
}
@ -2581,13 +2833,18 @@ function get_tuxedo-os() {
}
function get_ubuntu-server() {
local DATA=""
local HASH=""
local ISO=""
local NAME="live-server"
local UBUNTU_ARCH="${ARCH}"
local URL=""
if [[ "${RELEASE}" == "daily"* ]]; then
URL="https://cdimage.ubuntu.com/${OS}/${RELEASE}/current"
elif [ "${UBUNTU_ARCH}" == "arm64" ]; then
# ARM64 ISOs are hosted on cdimage.ubuntu.com
URL="https://cdimage.ubuntu.com/releases/${RELEASE}/release"
else
URL="https://releases.ubuntu.com/${RELEASE}"
fi
@ -2597,11 +2854,11 @@ function get_ubuntu-server() {
esac
if web_check "${URL}/SHA256SUMS"; then
DATA=$(web_pipe "${URL}/SHA256SUMS" | grep "${NAME}" | grep amd64 | grep iso | tail -n 1 )
DATA=$(web_pipe "${URL}/SHA256SUMS" | grep "${NAME}" | grep "${UBUNTU_ARCH}" | grep iso | tail -n 1 )
ISO=$(cut -d'*' -f2 <<<"${DATA}")
HASH=$(cut -d' ' -f1 <<<"${DATA}")
else
DATA=$(web_pipe "${URL}/MD5SUMS" | grep "${NAME}" | grep amd64 | grep iso | tail -n 1 )
DATA=$(web_pipe "${URL}/MD5SUMS" | grep "${NAME}" | grep "${UBUNTU_ARCH}" | grep iso | tail -n 1 )
ISO=$(cut -d' ' -f3 <<<"${DATA}")
HASH=$(cut -d' ' -f1 <<<"${DATA}")
fi
@ -2616,10 +2873,22 @@ function get_ubuntu-server() {
}
function get_ubuntu() {
local ISO=""
local HASH=""
local URL=""
local DATA=""
local HASH=""
local ISO=""
local UBUNTU_ARCH="${ARCH}"
local URL=""
# Validate architecture support now that RELEASE is known
if ! is_arch_supported "${OS}" "${UBUNTU_ARCH}"; then
if [ "${OPERATION}" == "test" ] || [ "${OPERATION}" == "show" ]; then
test_result "${OS}" "${RELEASE}" "" "" "SKIP" "(not available for ${UBUNTU_ARCH})"
exit 0
else
echo "ERROR! $(pretty_name "${OS}") ${RELEASE} is not available for ${UBUNTU_ARCH} architecture."
exit 1
fi
fi
if [[ "${RELEASE}" == "daily"* ]] && [ "${OS}" == "ubuntustudio" ]; then
# Ubuntu Studio daily-live images are in the dvd directory
@ -2631,21 +2900,24 @@ function get_ubuntu() {
else
URL="https://cdimage.ubuntu.com/${OS}/jammy/daily-live/current"
fi
VM_PATH="${OS}-jammy-live"
VM_PATH="${OS}-jammy-live$(arch_suffix)"
elif [[ "${RELEASE}" == "daily"* ]] || [ "${RELEASE}" == "dvd" ]; then
URL="https://cdimage.ubuntu.com/${OS}/${RELEASE}/current"
VM_PATH="${OS}-${RELEASE}"
VM_PATH="${OS}-${RELEASE}$(arch_suffix)"
elif [ "${OS}" == "ubuntu" ] && [ "${UBUNTU_ARCH}" == "arm64" ]; then
# ARM64 desktop ISOs are hosted on cdimage.ubuntu.com
URL="https://cdimage.ubuntu.com/releases/${RELEASE}/release"
elif [ "${OS}" == "ubuntu" ]; then
URL="https://releases.ubuntu.com/${RELEASE}"
else
URL="https://cdimage.ubuntu.com/${OS}/releases/${RELEASE}/release"
fi
if web_check "${URL}/SHA256SUMS"; then
DATA=$(web_pipe "${URL}/SHA256SUMS" | grep 'desktop\|dvd\|install' | grep amd64 | grep iso | grep -v "+mac" | tail -n 1 )
DATA=$(web_pipe "${URL}/SHA256SUMS" | grep 'desktop\|dvd\|install' | grep "${UBUNTU_ARCH}" | grep iso | grep -v "+mac" | tail -n 1 )
ISO=$(cut -d'*' -f2 <<<"${DATA}" | sed '1q;d')
HASH=$(cut -d' ' -f1 <<<"${DATA}" | sed '1q;d')
else
DATA=$(web_pipe "${URL}/MD5SUMS" | grep 'desktop\|dvd\|install' | grep amd64 | grep iso | grep -v "+mac" | tail -n 1 )
DATA=$(web_pipe "${URL}/MD5SUMS" | grep 'desktop\|dvd\|install' | grep "${UBUNTU_ARCH}" | grep iso | grep -v "+mac" | tail -n 1 )
ISO=$(cut -d'*' -f2 <<<"${DATA}")
HASH=$(cut -d' ' -f1 <<<"${DATA}")
fi
@ -3346,7 +3618,10 @@ function create_vm() {
if [[ ${ISO} = *".gz"* ]]; then
gzip -d "${VM_PATH}/${ISO}"
ISO="${ISO/.gz/}"
fi;;
fi
# Resize the raw image to provide space for Batocera's partition expansion
require_qemu_img
${QEMU_IMG} resize -f raw "${VM_PATH}/${ISO}" 128G;;
dragonflybsd)
# Could be other OS iso files compressed with bzip2 or gzip
# but for now we'll keep this to know cases
@ -3488,21 +3763,23 @@ Advanced usage:
quickget --download ubuntu 22.04
Arguments:
--download <os> <release> [edition] : Download image; no VM configuration
--create-config <os> [path/url] [flags] : Create VM config for an OS image
--open-homepage <os> : Open homepage for the OS
--show [os] : Show OS information
--version : Show version
--help : Show this help message
--arch <arch> : Set architecture (arm64, aarch64, amd64, x86_64)
--download <os> <release> [edition] : Download image; no VM configuration
--create-config <os> [path/url] [flags] : Create VM config for an OS image
--open-homepage <os> : Open homepage for the OS
--show [os] : Show OS information
--version : Show version
--help : Show this help message
------------------------------------ Flags -------------------------------------
--create-config:
--disable-unattended : Force quickget not to set up an unattended installation
--disable-unattended : Force quickget not to set up an unattended installation
-------------------------- For testing & development ---------------------------
--url [os] [release] [edition] : Show image URL(s)
--check [os] [release] [edition] : Check image URL(s)
--list : List all supported systems
--list-csv : List everything in csv format
--list-json : List everything in json format
--url [os] [release] [edition] : Show image URL(s)
--check [os] [release] [edition] : Check image URL(s)
--check-all-arch [os] [release] [edition] : Check downloads for all architectures (amd64 and arm64)
--list : List all supported systems
--list-csv : List everything in csv format
--list-json : List everything in json format
--------------------------------------------------------------------------------
Supported Operating Systems:\n\n' "$(${QUICKEMU} --version)" "${CURL_VERSION}"
@ -3519,6 +3796,9 @@ fi
QUICKEMU=$(resolve_quickemu)
I18NS=()
OPERATION=""
CHECK_ALL_ARCH="false"
# Normalised host architecture for foreign arch detection
NORMALISED_HOST_ARCH="${ARCH}"
CURL=$(command -v curl)
if [ ! -x "${CURL}" ]; then
echo "ERROR! curl not found. Please install curl"
@ -3527,10 +3807,33 @@ fi
CURL_VERSION=$("${CURL}" --version | head -n 1 | cut -d' ' -f2)
#TODO: Deprecate `list`, `list_csv`, and `list_json` in favor of `--list`, `--list-csv`, and `--list-json`
# Function to process --arch flag
function parse_arch_flag() {
if [ "${1}" == "--arch" ] || [ "${1}" == "-arch" ]; then
case "${2}" in
arm64|aarch64) ARCH="arm64";;
amd64|x86_64) ARCH="amd64";;
*) echo "ERROR! Unsupported architecture: ${2}"; exit 1;;
esac
return 0 # Flag was found
fi
return 1 # Flag was not found
}
# Process --arch flag first if present (can be combined with other flags)
if parse_arch_flag "${1}" "${2}"; then
shift 2
fi
case "${1}" in
--download|-download)
OPERATION="download"
shift
# Handle --arch after --download
if parse_arch_flag "${1}" "${2}"; then
shift 2
fi
;;
--create-config|-create-config)
OPERATION="config"
@ -3561,6 +3864,10 @@ case "${1}" in
--url|-url)
OPERATION="show"
shift
# Handle --arch after --url
if parse_arch_flag "${1}" "${2}"; then
shift 2
fi
if [ -z "${1}" ]; then
for OS in $(os_support); do
(test_all "${OS}")
@ -3573,6 +3880,10 @@ case "${1}" in
--check|-check)
OPERATION="test"
shift
# Handle --arch after --check
if parse_arch_flag "${1}" "${2}"; then
shift 2
fi
if [ -z "${1}" ]; then
for OS in $(os_support); do
(test_all "${OS}")
@ -3582,6 +3893,25 @@ case "${1}" in
test_all "${1}"
exit 0
fi;;
--check-all-arch|-check-all-arch)
OPERATION="test"
CHECK_ALL_ARCH="true"
shift
if [ -z "${1}" ]; then
for CHECK_ARCH in amd64 arm64; do
ARCH="${CHECK_ARCH}"
for OS in $(os_support); do
(test_all "${OS}")
done
done
exit 0
elif [ -z "${2}" ]; then
for CHECK_ARCH in amd64 arm64; do
ARCH="${CHECK_ARCH}"
test_all "${1}"
done
exit 0
fi;;
--list-csv|-list-csv|list|list_csv) list_csv;;
--list-json|-list-json|list_json) list_json;;
--list|-list) list_supported;;
@ -3596,9 +3926,69 @@ fi
os_supported
# Handle --check-all-arch for specific release/edition
if [ "${CHECK_ALL_ARCH}" == "true" ] && [ -n "${2}" ]; then
RELEASE="${2}"
EDITION="${3:-}"
for CHECK_ARCH in amd64 arm64; do
ARCH="${CHECK_ARCH}"
# Check architecture support before testing URL
if ! is_arch_supported "${OS}" "${ARCH}"; then
if [ -n "${EDITION}" ]; then
test_result "${OS}" "${RELEASE}" "${EDITION}" "" "SKIP" "(not available for ${ARCH})"
else
test_result "${OS}" "${RELEASE}" "" "" "SKIP" "(not available for ${ARCH})"
fi
continue
fi
# Validate release
case ${OS} in
*ubuntu-server*) validate_release releases_ubuntu-server;;
*ubuntu*) validate_release releases_ubuntu;;
*) validate_release "releases_${OS}";;
esac
# Generate and check URL
if [[ $(type -t "editions_${OS}") == function ]] && [ -n "${EDITION}" ]; then
URL=$(get_"${OS}" | cut -d' ' -f1 | head -n 1)
elif [ "${OS}" == "macos" ]; then
(get_macos)
continue
elif [[ "${OS}" == *"ubuntu-server"* ]]; then
(get_ubuntu-server)
continue
elif [[ "${OS}" == *"ubuntu"* ]]; then
(get_ubuntu)
continue
elif [[ "${OS}" == "windows"* ]]; then
test_result "${OS}" "${RELEASE}" "${EDITION}" "" "SKIP" "(Windows not supported in check mode)"
continue
else
URL=$(get_"${OS}" | cut -d' ' -f1 | head -n 1)
fi
CHECK=$(web_check "${URL}" && echo "PASS" || echo "FAIL")
test_result "${OS}" "${RELEASE}" "${EDITION}" "${URL}" "${CHECK}"
done
exit 0
fi
# Validate architecture support before attempting download
# Skip for OSes with editions_* functions - they have edition-dependent arch support
# and will be validated after EDITION is parsed
if [[ $(type -t "editions_${OS}") != function ]]; then
if ! is_arch_supported "${OS}" "${ARCH}"; then
if [ "${OPERATION}" == "test" ] || [ "${OPERATION}" == "show" ]; then
test_result "${OS}" "${2:-}" "${3:-}" "" "SKIP" "(not available for ${ARCH})"
exit 0
else
echo "ERROR! $(pretty_name "${OS}") is not available for ${ARCH} architecture."
exit 1
fi
fi
fi
if [ -n "${2}" ]; then
RELEASE="${2}"
VM_PATH="${OS}-${RELEASE}"
VM_PATH="${OS}-${RELEASE}$(arch_suffix)"
# If the OS has an editions_() function, use it.
if [[ $(type -t "editions_${OS}") == function ]]; then
validate_release "releases_${OS}"
@ -3620,8 +4010,18 @@ if [ -n "${2}" ]; then
echo -e "\nERROR! You must specify an edition."
exit 1
fi
# Now that EDITION is known, validate architecture support
if ! is_arch_supported "${OS}" "${ARCH}"; then
if [ "${OPERATION}" == "test" ] || [ "${OPERATION}" == "show" ]; then
test_result "${OS}" "${RELEASE}" "${EDITION}" "" "SKIP" "(not available for ${ARCH})"
exit 0
else
echo "ERROR! $(pretty_name "${OS}") ${EDITION} is not available for ${ARCH} architecture."
exit 1
fi
fi
handle_missing
VM_PATH="${OS}-${RELEASE}-${EDITION}"
VM_PATH="${OS}-${RELEASE}-${EDITION}$(arch_suffix)"
create_vm "$("get_${OS}" "${EDITION}")"
elif [ "${OS}" == "macos" ]; then
# macOS doesn't use create_vm()
@ -3644,7 +4044,7 @@ if [ -n "${2}" ]; then
if ! is_valid_language "${I18N}"; then
error_not_supported_lang
fi
VM_PATH="$(echo "${OS}-${RELEASE}-${I18N// /-}" | tr -d '()')"
VM_PATH="$(echo "${OS}-${RELEASE}-${I18N// /-}" | tr -d '()')$(arch_suffix)"
fi
validate_release "releases_${OS}"
get_windows