diff --git a/README.md b/README.md
index 83488df..981e5dd 100644
--- a/README.md
+++ b/README.md
@@ -8,17 +8,16 @@
Made with 💝 for 
-Introduction
-------------
+## Introduction
Quickly create and run highly optimised desktop virtual machines for
Linux, macOS and Windows; with just two commands. You decide what
operating system you want to run and Quickemu will figure out the best
way to do it for you. For example:
-``` {.bash}
-quickget ubuntu-mate 21.10
-quickemu --vm ubuntu-mate-21.10-.conf
+``` bash
+quickget ubuntu-mate 22.04
+quickemu --vm ubuntu-mate-22.04.conf
```
The original objective of the project was to enable quick testing of
@@ -28,8 +27,7 @@ and no elevated permissions are required to run the virtual machines.
**Quickemu now also includes comprehensive support for macOS and
Windows**.
-Features
---------
+## Features
- **macOS** Monterey, Big Sur, Catalina, Mojave & High Sierra
- **Windows** 8.1, 10 and 11 including TPM 2.0
@@ -67,8 +65,7 @@ Quickemu.
[](https://www.youtube.com/watch?v=AOTYWEgw0hI)
-Requirements
-------------
+## Requirements
- [QEMU](https://www.qemu.org/) (*6.0.0 or newer*) **with GTK, SDL,
SPICE & VirtFS support**
@@ -93,11 +90,37 @@ Requirements
- [zsync](http://zsync.moria.org.uk/)
- [unzip](http://www.info-zip.org/UnZip.html)
-Usage
-=====
+### Installing Requirements
-Graphical User Interfaces
--------------------------
+For Ubuntu, Arch and nixos systems the
+[ppa](https://launchpad.net/~flexiondotorg/+archive/ubuntu/quickemu),
+[AUR](https://aur.archlinux.org/packages/quickemu) or
+[nix](https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/quickemu)
+packaging will take care of the dependencies. For other host
+distributions or operating systems it will be necessary to install the
+above requirements or their equivalents.
+
+These examples may save a little typing
+
+Debian:
+
+ sudo apt install qemu bash coreutils ovmf grep jq lsb procps python3 genisoimage usbutils util-linux sed spice-client-gtk swtpm wget xdg-user-dirs zsync unzip
+
+Fedora:
+
+ sudo dnf install qemu bash coreutils edk2-tools grep jq lsb procps python3 genisoimage usbutils util-linux sed spice-gtk-tools swtpm wget xdg-user-dirs xrandr unzip
+
+MacOS:
+
+This is a work in progress (see [issue
+248](https://github.com/quickemu-project/quickemu/issues/248) for other
+steps and changes that may enable running on MacOS)
+
+ brew install qemu bash coreutils grep jq python@3.10 cdrtools gnu-sed spice-gtk wget zsync
+
+# Usage
+
+## Graphical User Interfaces
While `quickemu` and `quickget` are designed for the terminal, a
graphical user interface is also available:
@@ -112,33 +135,30 @@ Many thanks to [Luke Wesley-Holley](https://github.com/Lukewh) and
### Quickgui for Ubuntu
-``` {.bash}
+``` bash
sudo add-apt-repository ppa:yannick-mauray/quickgui
sudo apt update
sudo apt install quickgui
```
-Install Quickemu
-================
+# Install Quickemu
-Ubuntu
-------
+## Ubuntu
Quickemu is available from a PPA for Ubuntu users. The Quickemu PPA also
includes a back port of QEMU 6.0.0 for 20.04 (Focal) and 21.04
(Hirsute). To install Quickemu and all the dependencies run the
following in a terminal:
-``` {.bash}
+``` bash
sudo apt-add-repository ppa:flexiondotorg/quickemu
sudo apt update
sudo apt install quickemu
```
-Other Linux
------------
+## Other Linux
-``` {.bash}
+``` bash
git clone --depth=1 https://github.com/wimpysworld/quickemu
cd quickemu
```
@@ -160,15 +180,14 @@ status](https://repology.org/badge/vertical-allrepos/quickemu.svg)](https://repo
[](https://repology.org/project/quickgui/versions)
-Ubuntu Guest
-------------
+## Ubuntu Guest
`quickget` will automatically download an Ubuntu release and create the
virtual machine configuration.
-``` {.bash}
-quickget ubuntu 20.04
-quickemu --vm ubuntu-20.04.conf
+``` bash
+quickget ubuntu 22.04
+quickemu --vm ubuntu-22.04.conf
```
- Complete the installation as normal.
@@ -185,7 +204,7 @@ quickemu --vm ubuntu-20.04.conf
`quickget` can also download/refresh devel images via `zsync` for Ubuntu
developers and testers.
-``` {.bash}
+``` bash
quickget ubuntu devel
quickemu --vm ubuntu-devel.conf
```
@@ -208,8 +227,7 @@ with your preferred flavour.
- `ubuntu` (Ubuntu)
- `xubuntu` (Xubuntu)
-Other Operating Systems
------------------------
+## Other Operating Systems
`quickget` also supports:
@@ -218,11 +236,15 @@ Other Operating Systems
- `android` (Android x86)
- `archlinux` (Arch Linux)
- `arcolinux` (Arco Linux)
+- `batocera` (Batocera)
- `cachyos` (CachyOS)
+- `centos-stream` (CentOS Stream)
- `debian` (Debian)
+- `deepin` (Deepin)
- `devuan` (Devuan)
- `dragonflybsd` (DragonFlyBSD)
- `elementary` (elementary OS)
+- `endeavouros` (EndeavourOS)
- `fedora` (Fedora)
- `freebsd` (FreeBSD)
- `freedos` (FreeDOS)
@@ -234,6 +256,7 @@ Other Operating Systems
- `kdeneon` (KDE Neon)
- `kolibrios` (KolibriOS)
- `linuxmint` (Linux Mint)
+- `lmde` (Linux Mint Debian Edition)
- `manjaro` (Manjaro)
- `mxlinux` (MX Linux)
- `netboot` (netboot.xyz)
@@ -243,6 +266,7 @@ Other Operating Systems
- `opensuse` (openSUSE)
- `oraclelinux` (Oracle Linux)
- `popos` (Pop!\_OS)
+- `reactos` (ReactOS)
- `regolith` (Regolith Linux)
- `rockylinux` (Rocky Linux)
- `slackware` (Slackware)
@@ -257,7 +281,7 @@ configuration.
- Download a .iso image of a Linux distribution
- Create a VM configuration file; for example `debian-bullseye.conf`
-``` {.bash}
+``` bash
guest_os="linux"
disk_img="debian-bullseye/disk.qcow2"
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
@@ -265,7 +289,7 @@ iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
- Use `quickemu` to start the virtual machine:
-``` {.bash}
+``` bash
quickemu --vm debian-bullseye.conf
```
@@ -276,13 +300,12 @@ quickemu --vm debian-bullseye.conf
- Install the SPICE WebDAV agent (`spice-webdavd`) to enable file
sharing.
-macOS Guest
------------
+## macOS Guest
`quickget` automatically downloads a macOS recovery image and creates a
virtual machine configuration.
-``` {.bash}
+``` bash
quickget macos catalina
quickemu --vm macos-catalina.conf
```
@@ -312,7 +335,7 @@ supported.
The default macOS configuration looks like this:
-``` {.bash}
+``` bash
guest_os="macos"
img="macos-catalina/RecoveryImage.img"
disk_img="macos-catalina/disk.qcow2"
@@ -356,15 +379,35 @@ There are some considerations when running macOS via Quickemu.
- UHCI (USB 2.0) on macOS Catalina and earlier.
- XHCI (USB 3.0) on macOS Big Sur and newer.
- Display resolution can only be changed via macOS System Preferences.
-- Full Duplex audio works on macOS High Sierra, Mojave and Catalina.
- - **macOS Big Sur and Monterey have no audio at all**.
+- **Full Duplex audio requires [VoodooHDA
+ OC](https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
+ audio-device to the macOS guest VM**.
+- NOTE! [Gatekeeper](https://disable-gatekeeper.github.io/) and
+ [System Integrity Protection
+ (SIP)](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
+ need to be disabled to install VoodooHDA OC
- File sharing between guest and host is available via
[virtio-9p](https://wiki.qemu.org/Documentation/9psetup) and [SPICE
webdavd](https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
- Copy/paste via SPICE agent is **not available on macOS**.
-Windows 8.1, 10 & 11 Guests
----------------------------
+### macOS App Store
+
+If you see *"Your device or computer could not be verified"* when you
+try to login to the App Store, make sure that your wired ethernet device
+is `en0`. Use `ifconfig` in a terminal to verify this.
+
+If the wired ethernet device is not `en0`, then then go to *System
+Preferences* -\> *Network*, delete all the network devices and apply the
+changes. Next, open a terminal and run the following:
+
+``` bash
+sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
+```
+
+Now reboot, and the App Store should work.
+
+## Windows 8.1, 10 & 11 Guests
`quickget` can automatically download Windows 8.1, [Windows
10](https://www.microsoft.com/en-gb/software-download/windows10ISO) and
@@ -374,13 +417,17 @@ with the [VirtIO drivers for
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)
and creates a virtual machine configuration.
-``` {.bash}
+``` bash
quickget windows 11
quickemu --vm windows-11.conf
```
- Complete the installation as you normally would.
- All relevant drivers and services should be installed automatically.
+- A local adminstrator user account is automatically created, with
+ these credentials:
+ - Username: `Quickemu`
+ - Password: `quickemu`
### Regional versions
@@ -388,18 +435,19 @@ By default `quickget` will download the *"English International"*
release, but you can optionally specify one of the supported languages:
For example:
-``` {.bash}
+``` bash
quickget windows 11 "Chinese (Traditional)"
```
The default Windows 11 configuration looks like this:
-``` {.bash}
+``` bash
guest_os="windows"
disk_img="windows-11/disk.qcow2"
iso="windows-11/Win11_EnglishInternational_x64.iso"
fixed_iso="windows-11/virtio-win.iso"
tpm="on"
+secureboot="on"
```
- `guest_os="windows"` instructs `quickemu` to optimise for Windows.
@@ -407,8 +455,7 @@ tpm="on"
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
device using `swtpm`.
-SPICE
-=====
+# SPICE
The following features are available while using the SPICE protocol:
@@ -420,49 +467,49 @@ To use SPICE add `--display spice` to the Quickemu invocation, this
requires that the `spicy` client is installed, available from the
`spice-client-gtk` package in Debian/Ubuntu.
-``` {.bash}
-quickemu --vm ubuntu-20.04.conf --display spice
+``` bash
+quickemu --vm ubuntu-22.04.conf --display spice
```
-Headless
---------
+To enable copy/paste with a Windows guest, install [SPICE Windows guest
+tools](https://www.spice-space.org/download.html) in the guest VM.
+
+## Headless
To start a VM with SPICE enabled, but no display attached use
`--display none`. This requires that the `spicy` client is installed,
available from the `spice-client-gtk` package in Debian/Ubuntu to
connect to the running VM
-``` {.bash}
-quickemu --vm ubuntu-20.04.conf --display none
+``` bash
+quickemu --vm ubuntu-22.04.conf --display none
```
You can also use the `.ports` file in the VM directory to lookup what
SSH and SPICE ports the VM is connected to.
-``` {.bash}
-cat ubuntu-20.04/ubuntu-20.04.ports
+``` bash
+cat ubuntu-22.04/ubuntu-22.04.ports
```
If, for example, the SSH port is set to 22220, and assuming your VM has
a started SSH service (details vary by OS), you can typically SSH into
it from the host as follows:
-``` {.bash}
+``` bash
ssh -p 22220 your_vm_user@localhost
```
-Accessibility
-=============
+# Accessibility
Qemu provides support for using BrlAPI to display braille output on a
real or fake device.
-``` {.bash}
-quickemu --vm ubuntu-21.10.conf --braille --display sdl
+``` bash
+quickemu --vm ubuntu-22.04.conf --braille --display sdl
```
-BIOS and EFI
-============
+# BIOS and EFI
Since Quickemu 2.1.0 `efi` is the default boot option. If you want to
override this behaviour then add the following line to you VM
@@ -470,8 +517,7 @@ configuration to enable legacy BIOS.
- `boot="legacy"` - Enable Legacy BIOS boot
-Tuning CPU cores, RAM & disks
-=============================
+# Tuning CPU cores, RAM & disks
By default, Quickemu will calculate the number of CPUs cores and RAM to
allocate to a VM based on the specifications of your host computer. You
@@ -486,8 +532,7 @@ Add additional lines to your virtual machine configuration:
- `disk_size="16G"` - Specify the size of the virtual disk allocated
to the VM
-Disk preallocation
-------------------
+## Disk preallocation
Preallocation mode (allowed values: `off` (default), `metadata`,
`falloc`, `full`). An image with preallocated metadata is initially
@@ -499,16 +544,14 @@ configuration.
- `preallocation="metadata"`
-CD-ROM disks
-------------
+## CD-ROM disks
If you want to expose an ISO image from the host to guest add the
following line to the VM configuration:
- `fixed_iso="/path/to/image.iso"`
-Floppy disks
-------------
+## Floppy disks
If you're like [Alan Pope](https://popey.com) you'll probably want to
mount a floppy disk image in the guest. To do so add the following line
@@ -516,14 +559,12 @@ to the VM configuration:
- `floppy="/path/to/floppy.img"`
-File Sharing
-============
+# File Sharing
All File Sharing options will only expose `~/Public` (or localised
variations) for the current user to the guest VMs.
-Samba 🐧 🍏 🪟
------------
+## Samba 🐧 🍏 🪟
If `smbd` is available on the host, Quickemu will automatically enable
the built-in QEMU support for exposing a Samba share from the host to
@@ -531,22 +572,28 @@ the guest.
You can install the minimal Samba components on Ubuntu using:
-``` {.bash}
+``` bash
sudo apt install --no-install-recommends samba
```
-SPICE WebDAV 🐧 🪟
-----------------
+If everything is set up correctly, the `smbd` address will be printed
+when the virtual machine is started. For example:
+
+ - smbd: On guest: smb://10.0.2.4/qemu
+
+If using a Windows guest, right-click on "This PC", click "Add a network
+location", and paste this address, removing `smb:` and replacing forward
+slashes with backslashes (in this example `\\10.0.2.4\qemu`).
+
+## SPICE WebDAV 🐧 🪟
- TBD
-VirtIO-9P 🐧 🍏
--------------
+## VirtIO-9P 🐧 🍏
- TBD
-Network port forwarding
-=======================
+# Network port forwarding
Add an additional line to your virtual machine configuration. For
example:
@@ -558,30 +605,54 @@ In the example above:
- Port 8123 on the host is forwarded to port 8123 on the guest.
- Port 8888 on the host is forwarded to port 80 on the guest.
-Bridged networking
-==================
+# Disable networking
+
+To completely disable all network interfaces in a guest VM add this
+additional line to your virtual machine configuration:
+
+- `network="none"`
+
+# Restricted networking
+
+You can isolate the guest from the host (and broader network) using the
+restrict option, which will restrict networking to just the guest and
+any virtual devices.
+
+This can be used to prevent software running inside the guest from
+phoning home while still providing a network inside the guest. Add this
+additional line to your virtual machine configuration:
+
+- `network="restrict"`
+
+# Bridged networking
Connect your virtual machine to a preconfigured network bridge. Add an
-additional line to your virtual machine configuration
+additional line to your virtual machine configuration:
-- `bridge="br0"`
+- `network="br0"`
-USB redirection
-===============
+If you want to have a persistent MAC address for your bridged network
+interface in the guest VM you can add `macaddr` to the virtual machine
+configuration. QEMU requires that the MAC address is in the range:
+**52:54:00:AB:00:00 - 52:54:00:AB:FF:FF**
+
+So you can generate your own MAC addresses with:
+
+- `macaddr="52:54:00:AB:51:AE"`
+
+# USB redirection
Quickemu supports USB redirection via SPICE pass-through and host
pass-through.
-SPICE redirection (recommended)
--------------------------------
+## SPICE redirection (recommended)
Using SPICE for USB pass-through is easiest as it doesn't require any
elevated permission, start Quickemu with `--display spice` and then
select `Input` -\> `Select USB Device for redirection` from the menu to
choose which device(s) you want to attach to the guest.
-Host redirection **NOT Recommended**
-------------------------------------
+## Host redirection **NOT Recommended**
**USB host redirection is not recommended**, it is provided purely for
backwards compatibility to older versions of Quickemu. Using SPICE is
@@ -594,9 +665,9 @@ example:
In the example above:
-- The USB device with vendor\_id 046d and product\_id 082d will be
+- The USB device with vendor_id 046d and product_id 082d will be
exposed to the guest.
-- The USB device with vendor\_id 046d and product\_id 085e will be
+- The USB device with vendor_id 046d and product_id 085e will be
exposed to the guest.
If the USB devices are not writable, `quickemu` will display the
@@ -608,55 +679,79 @@ like this:
sudo chown -v root:user /dev/bus/usb/001/005
ERROR! USB permission changes are required 👆
-TPM
-===
+# TPM
Since Quickemu 2.2.0 a software emulated TPM device can be added to
guest virtual machines. Just add `tpm="on"` to your VM configuration.
`quickget` will automatically add this line to Windows 11 virtual
machines.
-All the options
-===============
+# All the options
Here are the usage instructions:
-``` {.bash}
+
+
+```
Usage
quickemu --vm ubuntu.conf
You can also pass optional parameters
- --braille : Enable braille support. Requires SDL.
- --delete-disk : Delete the disk image and EFI variables
- --delete-vm : Delete the entire VM and it's configuration
- --display : Select display backend. 'sdl' (default), 'gtk', 'none', or 'spice'
- --fullscreen : Starts VM in full screen mode (Ctl+Alt+f to exit)
- --ignore-msrs-always : Configure KVM to always ignore unhandled machine-specific registers
- --screen : Use specified screen to determine the window size.
- --shortcut : Create a desktop shortcut
- --snapshot apply : Apply/restore a snapshot.
- --snapshot create : Create a snapshot.
- --snapshot delete : Delete a snapshot.
- --snapshot info : Show disk/snapshot info.
- --status-quo : Do not commit any changes to disk/snapshot.
- --version : Print version
+ --braille : Enable braille support. Requires SDL.
+ --delete-disk : Delete the disk image and EFI variables
+ --delete-vm : Delete the entire VM and it's configuration
+ --display : Select display backend. 'sdl' (default), 'gtk', '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
+ --screen : Use specified screen to determine the window size.
+ --shortcut : Create a desktop shortcut
+ --snapshot apply : Apply/restore a snapshot.
+ --snapshot create : Create a snapshot.
+ --snapshot delete : Delete a snapshot.
+ --snapshot info : Show disk/snapshot info.
+ --status-quo : Do not commit any changes to disk/snapshot.
+ --viewer : Choose an alternative viewer. @Options: 'spicy' (default), 'remote-viewer', 'none'
+ --ssh-port : Set ssh-port manually
+ --spice-port : Set spice-port manually
+ --public-dir : expose share directory. @Options: '' (default: xdg-user-dir PUBLICSHARE), '', 'none'
+ --monitor : Set monitor connection type. @Options: 'socket' (default), 'telnet', 'none'
+ --monitor-telnet-host : Set telnet host for monitor. (default: 'localhost')
+ --monitor-telnet-port : Set telnet port for monitor. (default: '4440')
+ --monitor-cmd : Send command to monitor if available. (Example: system_powerdown)
+ --serial : Set serial connection type. @Options: 'socket' (default), 'telnet', 'none'
+ --serial-telnet-host : Set telnet host for serial. (default: 'localhost')
+ --serial-telnet-port : Set telnet port for serial. (default: '6660')
+ --keyboard : Set keyboard. @Options: 'usb' (default), 'ps2', 'virtio'
+ --keyboard_layout : Set keyboard layout.
+ --mouse : Set mouse. @Options: 'tablet' (default), 'ps2', 'usb', 'virtio'
+ --usb-controller : Set usb-controller. @Options: 'ehci' (default), 'xhci', 'none'
+ --extra_args : Pass additional arguments to qemu
+ --version : Print version
```
-Desktop shortcuts
------------------
+
+
+## Desktop shortcuts
Desktop shortcuts can be created for a VM, the shortcuts are saved in
`~/.local/share/applications`. Here is an example of how to create a
shortcut.
-``` {.bash}
-quickemu --vm ubuntu-20.04-desktop.conf --shortcut
+``` bash
+quickemu --vm ubuntu-22.04-desktop.conf --shortcut
```
-Screen and window size (Linux guests only)
-------------------------------------------
+## Screen and window size (Linux guests only)
`qemu` will always default to the primary monitor to display the VM's
window.
@@ -677,13 +772,13 @@ must match the resolution of the screen.
To know which screen to use, type:
-``` {.bash}
+``` bash
xrandr --listmonitors | grep -v Monitors
```
The command will output something like this:
-``` {.bash}
+``` bash
0: +*HDMI-0 2560/597x1440/336+1920+0 HDMI-0
1: +DVI-D-0 1920/527x1080/296+0+0 DVI-D-0
```
@@ -692,7 +787,7 @@ The first number is what needs to be passed to the `--screen` option.
For example:
-``` {.bash}
+``` bash
quickemu --vm vm.conf --screen 0
```
@@ -701,8 +796,7 @@ which Quickemu sizes to 2048x1152. Without the `--screen` option,
Quickemu would have used the 1920x1080 monitor which results in a window
size of 1664x936.
-References
-==========
+# References
Useful reference that assisted the development of Quickemu.
diff --git a/build-docs b/build-docs
index 3ede604..da4705f 160000
--- a/build-docs
+++ b/build-docs
@@ -1 +1 @@
-Subproject commit 3ede604a11b7a666f91bb19705d32d73fb0bd4d7
+Subproject commit da4705f350bb95c08dfd7e31627285ffc8019045
diff --git a/docs/quickemu.1 b/docs/quickemu.1
index 75ec017..19493ed 100644
--- a/docs/quickemu.1
+++ b/docs/quickemu.1
@@ -1,6 +1,20 @@
-.\" Automatically generated by Pandoc 2.9.2.1
+.\" Automatically generated by Pandoc 2.19.2
.\"
-.TH "QUICKEMU" "1" "February 20, 2022" "quickemu" "Quickemu User Manual"
+.\" Define V font for inline verbatim, using C font in formats
+.\" that render this, and otherwise B font.
+.ie "\f[CB]x\f[]"x" \{\
+. ftr V B
+. ftr VI BI
+. ftr VB B
+. ftr VBI BI
+.\}
+.el \{\
+. ftr V CR
+. ftr VI CI
+. ftr VB CB
+. ftr VBI CBI
+.\}
+.TH "QUICKEMU" "1" "September 1, 2022" "quickemu" "Quickemu User Manual"
.hy
.SH NAME
.PP
@@ -61,8 +75,8 @@ Do not commit any changes to disk/snapshot.
Print version
.SH EXAMPLES
.TP
-\f[B]quickemu \[en]vm ubuntu-mate-21.10-.conf\f[R]
-Launches the VM specified in the file \f[I]ubuntu-mate-21.10-.conf\f[R]
+\f[B]quickemu \[en]vm ubuntu-mate-22.04.conf\f[R]
+Launches the VM specified in the file \f[I]ubuntu-mate-22.04.conf\f[R]
.SS Introduction
.PP
Quickly create and run highly optimised desktop virtual machines for
@@ -73,8 +87,8 @@ For example:
.IP
.nf
\f[C]
-quickget ubuntu-mate 21.10
-quickemu --vm ubuntu-mate-21.10-.conf
+quickget ubuntu-mate 22.04
+quickemu --vm ubuntu-mate-22.04.conf
\f[R]
.fi
.PP
@@ -105,7 +119,7 @@ QEMU Guest Agent support (https://wiki.qemu.org/Features/GuestAgent);
provides access to a system-level agent via standard QMP commands
.IP \[bu] 2
Samba file sharing for Linux, macOS and Windows guests (\f[I]if
-\f[CI]smbd\f[I] is installed on the host\f[R])
+\f[VI]smbd\f[I] is installed on the host\f[R])
.IP \[bu] 2
VirGL acceleration
.IP \[bu] 2
@@ -181,10 +195,49 @@ xrandr (https://gitlab.freedesktop.org/xorg/app/xrandr)
zsync (http://zsync.moria.org.uk/)
.IP \[bu] 2
unzip (http://www.info-zip.org/UnZip.html)
+.SS Installing Requirements
+.PP
+For Ubuntu, Arch and nixos systems the
+ppa (https://launchpad.net/~flexiondotorg/+archive/ubuntu/quickemu),
+AUR (https://aur.archlinux.org/packages/quickemu) or
+nix (https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/quickemu)
+packaging will take care of the dependencies.
+For other host distributions or operating systems it will be necessary
+to install the above requirements or their equivalents.
+.PP
+These examples may save a little typing
+.PP
+Debian:
+.IP
+.nf
+\f[C]
+sudo apt install qemu bash coreutils ovmf grep jq lsb procps python3 genisoimage usbutils util-linux sed spice-client-gtk swtpm wget xdg-user-dirs zsync unzip
+\f[R]
+.fi
+.PP
+Fedora:
+.IP
+.nf
+\f[C]
+sudo dnf install qemu bash coreutils edk2-tools grep jq lsb procps python3 genisoimage usbutils util-linux sed spice-gtk-tools swtpm wget xdg-user-dirs xrandr unzip
+\f[R]
+.fi
+.PP
+MacOS:
+.PP
+This is a work in progress (see issue
+248 (https://github.com/quickemu-project/quickemu/issues/248) for other
+steps and changes that may enable running on MacOS)
+.IP
+.nf
+\f[C]
+brew install qemu bash coreutils grep jq python\[at]3.10 cdrtools gnu-sed spice-gtk wget zsync
+\f[R]
+.fi
.SH Usage
.SS Graphical User Interfaces
.PP
-While \f[C]quickemu\f[R] and \f[C]quickget\f[R] are designed for the
+While \f[V]quickemu\f[R] and \f[V]quickget\f[R] are designed for the
terminal, a graphical user interface is also available:
.IP \[bu] 2
\f[B]Quickgui (https://github.com/quickgui/quickgui)\f[R] by Mark
@@ -206,13 +259,13 @@ sudo apt install quickgui
.fi
.SS Ubuntu Guest
.PP
-\f[C]quickget\f[R] will automatically download an Ubuntu release and
+\f[V]quickget\f[R] will automatically download an Ubuntu release and
create the virtual machine configuration.
.IP
.nf
\f[C]
-quickget ubuntu 20.04
-quickemu --vm ubuntu-20.04.conf
+quickget ubuntu 22.04
+quickemu --vm ubuntu-22.04.conf
\f[R]
.fi
.IP \[bu] 2
@@ -221,24 +274,24 @@ Complete the installation as normal.
Post-install:
.RS 2
.IP \[bu] 2
-Install the SPICE agent (\f[C]spice-vdagent\f[R]) to enable copy/paste
+Install the SPICE agent (\f[V]spice-vdagent\f[R]) to enable copy/paste
and USB redirection
.RS 2
.IP \[bu] 2
-\f[C]sudo apt install spice-vdagent\f[R]
+\f[V]sudo apt install spice-vdagent\f[R]
.RE
.IP \[bu] 2
-Install the SPICE WebDAV agent (\f[C]spice-webdavd\f[R]) to enable file
+Install the SPICE WebDAV agent (\f[V]spice-webdavd\f[R]) to enable file
sharing.
.RS 2
.IP \[bu] 2
-\f[C]sudo apt install spice-webdavd\f[R]
+\f[V]sudo apt install spice-webdavd\f[R]
.RE
.RE
.SS Ubuntu devel (daily-live) images
.PP
-\f[C]quickget\f[R] can also download/refresh devel images via
-\f[C]zsync\f[R] for Ubuntu developers and testers.
+\f[V]quickget\f[R] can also download/refresh devel images via
+\f[V]zsync\f[R] for Ubuntu developers and testers.
.IP
.nf
\f[C]
@@ -247,106 +300,118 @@ quickemu --vm ubuntu-devel.conf
\f[R]
.fi
.PP
-You can run \f[C]quickget ubuntu devel\f[R] to refresh your daily
+You can run \f[V]quickget ubuntu devel\f[R] to refresh your daily
development image as often as you like, it will even automatically
switch to a new series.
.SS Ubuntu Flavours
.PP
All the official Ubuntu flavours are supported, just replace
-\f[C]ubuntu\f[R] with your preferred flavour.
+\f[V]ubuntu\f[R] with your preferred flavour.
.IP \[bu] 2
-\f[C]kubuntu\f[R] (Kubuntu)
+\f[V]kubuntu\f[R] (Kubuntu)
.IP \[bu] 2
-\f[C]lubuntu\f[R] (Lubuntu)
+\f[V]lubuntu\f[R] (Lubuntu)
.IP \[bu] 2
-\f[C]ubuntu-budgie\f[R] (Ubuntu Budgie)
+\f[V]ubuntu-budgie\f[R] (Ubuntu Budgie)
.IP \[bu] 2
-\f[C]ubuntukylin\f[R] (Ubuntu Kylin)
+\f[V]ubuntukylin\f[R] (Ubuntu Kylin)
.IP \[bu] 2
-\f[C]ubuntu-mate\f[R] (Ubuntu MATE)
+\f[V]ubuntu-mate\f[R] (Ubuntu MATE)
.IP \[bu] 2
-\f[C]ubuntustudio\f[R] (Ubuntu Studio)
+\f[V]ubuntustudio\f[R] (Ubuntu Studio)
.IP \[bu] 2
-\f[C]ubuntu\f[R] (Ubuntu)
+\f[V]ubuntu\f[R] (Ubuntu)
.IP \[bu] 2
-\f[C]xubuntu\f[R] (Xubuntu)
+\f[V]xubuntu\f[R] (Xubuntu)
.SS Other Operating Systems
.PP
-\f[C]quickget\f[R] also supports:
+\f[V]quickget\f[R] also supports:
.IP \[bu] 2
-\f[C]alma\f[R] (Alma Linux)
+\f[V]alma\f[R] (Alma Linux)
.IP \[bu] 2
-\f[C]alpine\f[R] (Alpine Linux)
+\f[V]alpine\f[R] (Alpine Linux)
.IP \[bu] 2
-\f[C]android\f[R] (Android x86)
+\f[V]android\f[R] (Android x86)
.IP \[bu] 2
-\f[C]archlinux\f[R] (Arch Linux)
+\f[V]archlinux\f[R] (Arch Linux)
.IP \[bu] 2
-\f[C]arcolinux\f[R] (Arco Linux)
+\f[V]arcolinux\f[R] (Arco Linux)
.IP \[bu] 2
-\f[C]cachyos\f[R] (CachyOS)
+\f[V]batocera\f[R] (Batocera)
.IP \[bu] 2
-\f[C]debian\f[R] (Debian)
+\f[V]cachyos\f[R] (CachyOS)
.IP \[bu] 2
-\f[C]devuan\f[R] (Devuan)
+\f[V]centos-stream\f[R] (CentOS Stream)
.IP \[bu] 2
-\f[C]dragonflybsd\f[R] (DragonFlyBSD)
+\f[V]debian\f[R] (Debian)
.IP \[bu] 2
-\f[C]elementary\f[R] (elementary OS)
+\f[V]deepin\f[R] (Deepin)
.IP \[bu] 2
-\f[C]fedora\f[R] (Fedora)
+\f[V]devuan\f[R] (Devuan)
.IP \[bu] 2
-\f[C]freebsd\f[R] (FreeBSD)
+\f[V]dragonflybsd\f[R] (DragonFlyBSD)
.IP \[bu] 2
-\f[C]freedos\f[R] (FreeDOS)
+\f[V]elementary\f[R] (elementary OS)
.IP \[bu] 2
-\f[C]garuda\f[R] (Garuda Linux)
+\f[V]endeavouros\f[R] (EndeavourOS)
.IP \[bu] 2
-\f[C]gentoo\f[R] (Gentoo)
+\f[V]fedora\f[R] (Fedora)
.IP \[bu] 2
-\f[C]ghostbsd\f[R] (GhostBSD)
+\f[V]freebsd\f[R] (FreeBSD)
.IP \[bu] 2
-\f[C]haiku\f[R] (Haiku)
+\f[V]freedos\f[R] (FreeDOS)
.IP \[bu] 2
-\f[C]kali\f[R] (Kali)
+\f[V]garuda\f[R] (Garuda Linux)
.IP \[bu] 2
-\f[C]kdeneon\f[R] (KDE Neon)
+\f[V]gentoo\f[R] (Gentoo)
.IP \[bu] 2
-\f[C]kolibrios\f[R] (KolibriOS)
+\f[V]ghostbsd\f[R] (GhostBSD)
.IP \[bu] 2
-\f[C]linuxmint\f[R] (Linux Mint)
+\f[V]haiku\f[R] (Haiku)
.IP \[bu] 2
-\f[C]manjaro\f[R] (Manjaro)
+\f[V]kali\f[R] (Kali)
.IP \[bu] 2
-\f[C]mxlinux\f[R] (MX Linux)
+\f[V]kdeneon\f[R] (KDE Neon)
.IP \[bu] 2
-\f[C]netboot\f[R] (netboot.xyz)
+\f[V]kolibrios\f[R] (KolibriOS)
.IP \[bu] 2
-\f[C]netbsd\f[R] (NetBSD)
+\f[V]linuxmint\f[R] (Linux Mint)
.IP \[bu] 2
-\f[C]nixos\f[R] (NixOS)
+\f[V]lmde\f[R] (Linux Mint Debian Edition)
.IP \[bu] 2
-\f[C]openbsd\f[R] (OpenBSD)
+\f[V]manjaro\f[R] (Manjaro)
.IP \[bu] 2
-\f[C]opensuse\f[R] (openSUSE)
+\f[V]mxlinux\f[R] (MX Linux)
.IP \[bu] 2
-\f[C]oraclelinux\f[R] (Oracle Linux)
+\f[V]netboot\f[R] (netboot.xyz)
.IP \[bu] 2
-\f[C]popos\f[R] (Pop!_OS)
+\f[V]netbsd\f[R] (NetBSD)
.IP \[bu] 2
-\f[C]regolith\f[R] (Regolith Linux)
+\f[V]nixos\f[R] (NixOS)
.IP \[bu] 2
-\f[C]rockylinux\f[R] (Rocky Linux)
+\f[V]openbsd\f[R] (OpenBSD)
.IP \[bu] 2
-\f[C]slackware\f[R] (Slackware)
+\f[V]opensuse\f[R] (openSUSE)
.IP \[bu] 2
-\f[C]solus\f[R] (Solus)
+\f[V]oraclelinux\f[R] (Oracle Linux)
.IP \[bu] 2
-\f[C]tails\f[R] (Tails)
+\f[V]popos\f[R] (Pop!_OS)
.IP \[bu] 2
-\f[C]void\f[R] (Void Linux)
+\f[V]reactos\f[R] (ReactOS)
.IP \[bu] 2
-\f[C]zorin\f[R] (Zorin OS)
+\f[V]regolith\f[R] (Regolith Linux)
+.IP \[bu] 2
+\f[V]rockylinux\f[R] (Rocky Linux)
+.IP \[bu] 2
+\f[V]slackware\f[R] (Slackware)
+.IP \[bu] 2
+\f[V]solus\f[R] (Solus)
+.IP \[bu] 2
+\f[V]tails\f[R] (Tails)
+.IP \[bu] 2
+\f[V]void\f[R] (Void Linux)
+.IP \[bu] 2
+\f[V]zorin\f[R] (Zorin OS)
.PP
Or you can download a Linux image and manually create a VM
configuration.
@@ -354,7 +419,7 @@ configuration.
Download a .iso image of a Linux distribution
.IP \[bu] 2
Create a VM configuration file; for example
-\f[C]debian-bullseye.conf\f[R]
+\f[V]debian-bullseye.conf\f[R]
.IP
.nf
\f[C]
@@ -364,7 +429,7 @@ iso=\[dq]debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso\[dq]
\f[R]
.fi
.IP \[bu] 2
-Use \f[C]quickemu\f[R] to start the virtual machine:
+Use \f[V]quickemu\f[R] to start the virtual machine:
.IP
.nf
\f[C]
@@ -377,15 +442,15 @@ Complete the installation as normal.
Post-install:
.RS 2
.IP \[bu] 2
-Install the SPICE agent (\f[C]spice-vdagent\f[R]) to enable copy/paste
+Install the SPICE agent (\f[V]spice-vdagent\f[R]) to enable copy/paste
and USB redirection.
.IP \[bu] 2
-Install the SPICE WebDAV agent (\f[C]spice-webdavd\f[R]) to enable file
+Install the SPICE WebDAV agent (\f[V]spice-webdavd\f[R]) to enable file
sharing.
.RE
.SS macOS Guest
.PP
-\f[C]quickget\f[R] automatically downloads a macOS recovery image and
+\f[V]quickget\f[R] automatically downloads a macOS recovery image and
creates a virtual machine configuration.
.IP
.nf
@@ -395,8 +460,8 @@ quickemu --vm macos-catalina.conf
\f[R]
.fi
.PP
-macOS \f[C]high-sierra\f[R], \f[C]mojave\f[R], \f[C]catalina\f[R],
-\f[C]big-sur\f[R] and \f[C]monterey\f[R] are supported.
+macOS \f[V]high-sierra\f[R], \f[V]mojave\f[R], \f[V]catalina\f[R],
+\f[V]big-sur\f[R] and \f[V]monterey\f[R] are supported.
.IP \[bu] 2
Use cursor keys and enter key to select the \f[B]macOS Base System\f[R]
.IP \[bu] 2
@@ -409,19 +474,19 @@ Click \f[B]Disk Utility\f[R] and \f[B]Continue\f[R]
On macOS Catalina, Big Sur & Monterey
.RS 2
.IP \[bu] 2
-Select \f[C]Apple Inc. VirtIO Block Media\f[R] from the list and click
+Select \f[V]Apple Inc. VirtIO Block Media\f[R] from the list and click
\f[B]Erase\f[R].
.RE
.IP \[bu] 2
On macOS Mojave and High Sierra
.RS 2
.IP \[bu] 2
-Select \f[C]QEMU HARDDISK Media\f[R] (\[ti]103.08GB) from the list and
+Select \f[V]QEMU HARDDISK Media\f[R] (\[ti]103.08GB) from the list and
click \f[B]Erase\f[R].
.RE
.RE
.IP \[bu] 2
-Enter a \f[C]Name:\f[R] for the disk and click \f[B]Erase\f[R].
+Enter a \f[V]Name:\f[R] for the disk and click \f[B]Erase\f[R].
.IP \[bu] 2
Click \f[B]Done\f[R].
.IP \[bu] 2
@@ -455,10 +520,10 @@ macos_release=\[dq]catalina\[dq]
\f[R]
.fi
.IP \[bu] 2
-\f[C]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
+\f[V]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
macOS.
.IP \[bu] 2
-\f[C]macos_release=\[dq]catalina\[dq]\f[R] instructs Quickemu to
+\f[V]macos_release=\[dq]catalina\[dq]\f[R] instructs Quickemu to
optimise for a particular macOS release.
.RS 2
.IP \[bu] 2
@@ -486,7 +551,7 @@ Big Sur
Monterey
.RE
.IP \[bu] 2
-\f[C]quickemu\f[R] will automatically download the required
+\f[V]quickemu\f[R] will automatically download the required
OpenCore (https://github.com/acidanthera/OpenCorePkg) bootloader and
OVMF firmware from OSX-KVM (https://github.com/kholia/OSX-KVM).
.IP \[bu] 2
@@ -499,11 +564,11 @@ VirtIO Block
Media (https://www.kraxel.org/blog/2019/06/macos-qemu-guest/) is used
for the system disk where supported.
.IP \[bu] 2
-VirtIO \f[C]usb-tablet\f[R] (http://philjordan.eu/osx-virt/) is used for
+VirtIO \f[V]usb-tablet\f[R] (http://philjordan.eu/osx-virt/) is used for
the mouse.
.IP \[bu] 2
-VirtIO Network (\f[C]virtio-net\f[R]) is supported and enabled on macOS
-Big Sur and newer but previous releases use \f[C]vmxnet3\f[R].
+VirtIO Network (\f[V]virtio-net\f[R]) is supported and enabled on macOS
+Big Sur and newer but previous releases use \f[V]vmxnet3\f[R].
.IP \[bu] 2
VirtIO Memory Ballooning is supported and enabled on macOS Big Sur and
newer but disabled for other support macOS releases.
@@ -519,20 +584,43 @@ XHCI (USB 3.0) on macOS Big Sur and newer.
.IP \[bu] 2
Display resolution can only be changed via macOS System Preferences.
.IP \[bu] 2
-Full Duplex audio works on macOS High Sierra, Mojave and Catalina.
-.RS 2
+\f[B]Full Duplex audio requires VoodooHDA
+OC (https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
+audio-device to the macOS guest VM\f[R].
.IP \[bu] 2
-\f[B]macOS Big Sur and Monterey have no audio at all\f[R].
-.RE
+NOTE!
+Gatekeeper (https://disable-gatekeeper.github.io/) and System Integrity
+Protection
+(SIP) (https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
+need to be disabled to install VoodooHDA OC
.IP \[bu] 2
File sharing between guest and host is available via
virtio-9p (https://wiki.qemu.org/Documentation/9psetup) and SPICE
webdavd (https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
.IP \[bu] 2
Copy/paste via SPICE agent is \f[B]not available on macOS\f[R].
+.SS macOS App Store
+.PP
+If you see \f[I]\[lq]Your device or computer could not be
+verified\[rq]\f[R] when you try to login to the App Store, make sure
+that your wired ethernet device is \f[V]en0\f[R].
+Use \f[V]ifconfig\f[R] in a terminal to verify this.
+.PP
+If the wired ethernet device is not \f[V]en0\f[R], then then go to
+\f[I]System Preferences\f[R] -> \f[I]Network\f[R], delete all the
+network devices and apply the changes.
+Next, open a terminal and run the following:
+.IP
+.nf
+\f[C]
+sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
+\f[R]
+.fi
+.PP
+Now reboot, and the App Store should work.
.SS Windows 8.1, 10 & 11 Guests
.PP
-\f[C]quickget\f[R] can automatically download Windows 8.1, Windows
+\f[V]quickget\f[R] can automatically download Windows 8.1, Windows
10 (https://www.microsoft.com/en-gb/software-download/windows10ISO) and
Windows 11 (https://www.microsoft.com/en-gb/software-download/windows11)
along with the VirtIO drivers for
@@ -549,9 +637,18 @@ quickemu --vm windows-11.conf
Complete the installation as you normally would.
.IP \[bu] 2
All relevant drivers and services should be installed automatically.
+.IP \[bu] 2
+A local adminstrator user account is automatically created, with these
+credentials:
+.RS 2
+.IP \[bu] 2
+Username: \f[V]Quickemu\f[R]
+.IP \[bu] 2
+Password: \f[V]quickemu\f[R]
+.RE
.SS Regional versions
.PP
-By default \f[C]quickget\f[R] will download the \f[I]\[lq]English
+By default \f[V]quickget\f[R] will download the \f[I]\[lq]English
International\[rq]\f[R] release, but you can optionally specify one of
the supported languages: For example:
.IP
@@ -570,74 +667,89 @@ disk_img=\[dq]windows-11/disk.qcow2\[dq]
iso=\[dq]windows-11/Win11_EnglishInternational_x64.iso\[dq]
fixed_iso=\[dq]windows-11/virtio-win.iso\[dq]
tpm=\[dq]on\[dq]
+secureboot=\[dq]on\[dq]
\f[R]
.fi
.IP \[bu] 2
-\f[C]guest_os=\[dq]windows\[dq]\f[R] instructs \f[C]quickemu\f[R] to
+\f[V]guest_os=\[dq]windows\[dq]\f[R] instructs \f[V]quickemu\f[R] to
optimise for Windows.
.IP \[bu] 2
-\f[C]fixed_iso=\f[R] specifies the ISO image that provides VirtIO
+\f[V]fixed_iso=\f[R] specifies the ISO image that provides VirtIO
drivers.
.IP \[bu] 2
-\f[C]tpm=\[dq]on\[dq]\f[R] instructs \f[C]quickemu\f[R] to create a
-software emulated TPM device using \f[C]swtpm\f[R].
+\f[V]tpm=\[dq]on\[dq]\f[R] instructs \f[V]quickemu\f[R] to create a
+software emulated TPM device using \f[V]swtpm\f[R].
.SH All the options
.PP
Here are the usage instructions:
.IP
.nf
\f[C]
-
Usage
quickemu --vm ubuntu.conf
You can also pass optional parameters
- --braille : Enable braille support. Requires SDL.
- --delete-disk : Delete the disk image and EFI variables
- --delete-vm : Delete the entire VM and it\[aq]s configuration
- --display : Select display backend. \[aq]sdl\[aq] (default), \[aq]gtk\[aq], \[aq]none\[aq], or \[aq]spice\[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
- --screen : Use specified screen to determine the window size.
- --shortcut : Create a desktop shortcut
- --snapshot apply : Apply/restore a snapshot.
- --snapshot create : Create a snapshot.
- --snapshot delete : Delete a snapshot.
- --snapshot info : Show disk/snapshot info.
- --status-quo : Do not commit any changes to disk/snapshot.
- --version : Print version
-
+ --braille : Enable braille support. Requires SDL.
+ --delete-disk : Delete the disk image and EFI variables
+ --delete-vm : Delete the entire VM and it\[aq]s configuration
+ --display : Select display backend. \[aq]sdl\[aq] (default), \[aq]gtk\[aq], \[aq]none\[aq], \[aq]spice\[aq] or \[aq]spice-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
+ --screen : Use specified screen to determine the window size.
+ --shortcut : Create a desktop shortcut
+ --snapshot apply : Apply/restore a snapshot.
+ --snapshot create : Create a snapshot.
+ --snapshot delete : Delete a snapshot.
+ --snapshot info : Show disk/snapshot info.
+ --status-quo : Do not commit any changes to disk/snapshot.
+ --viewer : Choose an alternative viewer. \[at]Options: \[aq]spicy\[aq] (default), \[aq]remote-viewer\[aq], \[aq]none\[aq]
+ --ssh-port : Set ssh-port manually
+ --spice-port : Set spice-port manually
+ --public-dir : expose share directory. \[at]Options: \[aq]\[aq] (default: xdg-user-dir PUBLICSHARE), \[aq]\[aq], \[aq]none\[aq]
+ --monitor : Set monitor connection type. \[at]Options: \[aq]socket\[aq] (default), \[aq]telnet\[aq], \[aq]none\[aq]
+ --monitor-telnet-host : Set telnet host for monitor. (default: \[aq]localhost\[aq])
+ --monitor-telnet-port : Set telnet port for monitor. (default: \[aq]4440\[aq])
+ --monitor-cmd : Send command to monitor if available. (Example: system_powerdown)
+ --serial : Set serial connection type. \[at]Options: \[aq]socket\[aq] (default), \[aq]telnet\[aq], \[aq]none\[aq]
+ --serial-telnet-host : Set telnet host for serial. (default: \[aq]localhost\[aq])
+ --serial-telnet-port : Set telnet port for serial. (default: \[aq]6660\[aq])
+ --keyboard : Set keyboard. \[at]Options: \[aq]usb\[aq] (default), \[aq]ps2\[aq], \[aq]virtio\[aq]
+ --keyboard_layout : Set keyboard layout.
+ --mouse : Set mouse. \[at]Options: \[aq]tablet\[aq] (default), \[aq]ps2\[aq], \[aq]usb\[aq], \[aq]virtio\[aq]
+ --usb-controller : Set usb-controller. \[at]Options: \[aq]ehci\[aq] (default), \[aq]xhci\[aq], \[aq]none\[aq]
+ --extra_args : Pass additional arguments to qemu
+ --version : Print version
\f[R]
.fi
.SS Desktop shortcuts
.PP
Desktop shortcuts can be created for a VM, the shortcuts are saved in
-\f[C]\[ti]/.local/share/applications\f[R].
+\f[V]\[ti]/.local/share/applications\f[R].
Here is an example of how to create a shortcut.
.IP
.nf
\f[C]
-quickemu --vm ubuntu-20.04-desktop.conf --shortcut
+quickemu --vm ubuntu-22.04-desktop.conf --shortcut
\f[R]
.fi
.SS Screen and window size (Linux guests only)
.PP
-\f[C]qemu\f[R] will always default to the primary monitor to display the
+\f[V]qemu\f[R] will always default to the primary monitor to display the
VM\[cq]s window.
.PP
-Without the \f[C]--screen\f[R] option, \f[C]quickemu\f[R] will look for
+Without the \f[V]--screen\f[R] option, \f[V]quickemu\f[R] will look for
the size of the smallest monitor, and use a size that fits on said
monitor.
.PP
-The \f[C]--screen\f[R] option forces \f[C]quickemu\f[R] to use the size
+The \f[V]--screen\f[R] option forces \f[V]quickemu\f[R] to use the size
of the given monitor to compute the size of the window.
\f[B]It won\[cq]t use that monitor to display the VM\[cq]s window if
it\[cq]s not the primary monitor\f[R].
This is useful if the primary monitor if not the smallest one, and if
the VM\[cq]s window doesn\[cq]t need to be moved around.
.PP
-The \f[C]--screen\f[R] option is also useful with the
-\f[C]--fullscreen\f[R] option, again because \f[C]qemu\f[R] will always
+The \f[V]--screen\f[R] option is also useful with the
+\f[V]--fullscreen\f[R] option, again because \f[V]qemu\f[R] will always
use the primary monitor.
In order for the fullscreen mode to work properly, the resolution of the
VM\[cq]s window must match the resolution of the screen.
@@ -659,7 +771,7 @@ The command will output something like this:
\f[R]
.fi
.PP
-The first number is what needs to be passed to the \f[C]--screen\f[R]
+The first number is what needs to be passed to the \f[V]--screen\f[R]
option.
.PP
For example:
@@ -672,7 +784,7 @@ quickemu --vm vm.conf --screen 0
.PP
The above uses the 2560x1440 screen to compute the size of the window,
which Quickemu sizes to 2048x1152.
-Without the \f[C]--screen\f[R] option, Quickemu would have used the
+Without the \f[V]--screen\f[R] option, Quickemu would have used the
1920x1080 monitor which results in a window size of 1664x936.
.SH References
.PP
diff --git a/docs/quickemu.1.md b/docs/quickemu.1.md
index c1d878d..3279bed 100644
--- a/docs/quickemu.1.md
+++ b/docs/quickemu.1.md
@@ -1,30 +1,26 @@
---
author: Martin Wimpress
-date: 'February 20, 2022'
+date: September 1, 2022
footer: quickemu
header: Quickemu User Manual
section: 1
title: QUICKEMU
---
-NAME
-====
+# NAME
quickemu - A quick VM builder and manager
-SYNOPSIS
-========
+# SYNOPSIS
**quickemu** \[*OPTION*\]...
-DESCRIPTION
-===========
+# DESCRIPTION
**quickemu** will create and run highly optimised desktop virtual
machines for Linux, macOS and Windows
-OPTIONS
-=======
+# OPTIONS
**--vm**
: vm configuration file
@@ -70,23 +66,21 @@ You can also pass optional parameters
**--version**
: Print version
-EXAMPLES
-========
+# EXAMPLES
-**quickemu --vm ubuntu-mate-21.10-.conf**
-: Launches the VM specified in the file *ubuntu-mate-21.10-.conf*
+**quickemu --vm ubuntu-mate-22.04.conf**
+: Launches the VM specified in the file *ubuntu-mate-22.04.conf*
-Introduction
-------------
+## Introduction
Quickly create and run highly optimised desktop virtual machines for
Linux, macOS and Windows; with just two commands. You decide what
operating system you want to run and Quickemu will figure out the best
way to do it for you. For example:
-``` {.bash}
-quickget ubuntu-mate 21.10
-quickemu --vm ubuntu-mate-21.10-.conf
+``` bash
+quickget ubuntu-mate 22.04
+quickemu --vm ubuntu-mate-22.04.conf
```
The original objective of the project was to enable quick testing of
@@ -96,8 +90,7 @@ and no elevated permissions are required to run the virtual machines.
**Quickemu now also includes comprehensive support for macOS and
Windows**.
-Features
---------
+## Features
- **macOS** Monterey, Big Sur, Catalina, Mojave & High Sierra
- **Windows** 8.1, 10 and 11 including TPM 2.0
@@ -135,8 +128,7 @@ Quickemu.
[](https://www.youtube.com/watch?v=AOTYWEgw0hI)
-Requirements
-------------
+## Requirements
- [QEMU](https://www.qemu.org/) (*6.0.0 or newer*) **with GTK, SDL,
SPICE & VirtFS support**
@@ -161,11 +153,37 @@ Requirements
- [zsync](http://zsync.moria.org.uk/)
- [unzip](http://www.info-zip.org/UnZip.html)
-Usage
-=====
+### Installing Requirements
-Graphical User Interfaces
--------------------------
+For Ubuntu, Arch and nixos systems the
+[ppa](https://launchpad.net/~flexiondotorg/+archive/ubuntu/quickemu),
+[AUR](https://aur.archlinux.org/packages/quickemu) or
+[nix](https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/quickemu)
+packaging will take care of the dependencies. For other host
+distributions or operating systems it will be necessary to install the
+above requirements or their equivalents.
+
+These examples may save a little typing
+
+Debian:
+
+ sudo apt install qemu bash coreutils ovmf grep jq lsb procps python3 genisoimage usbutils util-linux sed spice-client-gtk swtpm wget xdg-user-dirs zsync unzip
+
+Fedora:
+
+ sudo dnf install qemu bash coreutils edk2-tools grep jq lsb procps python3 genisoimage usbutils util-linux sed spice-gtk-tools swtpm wget xdg-user-dirs xrandr unzip
+
+MacOS:
+
+This is a work in progress (see [issue
+248](https://github.com/quickemu-project/quickemu/issues/248) for other
+steps and changes that may enable running on MacOS)
+
+ brew install qemu bash coreutils grep jq python@3.10 cdrtools gnu-sed spice-gtk wget zsync
+
+# Usage
+
+## Graphical User Interfaces
While `quickemu` and `quickget` are designed for the terminal, a
graphical user interface is also available:
@@ -180,21 +198,20 @@ Many thanks to [Luke Wesley-Holley](https://github.com/Lukewh) and
### Quickgui for Ubuntu
-``` {.bash}
+``` bash
sudo add-apt-repository ppa:yannick-mauray/quickgui
sudo apt update
sudo apt install quickgui
```
-Ubuntu Guest
-------------
+## Ubuntu Guest
`quickget` will automatically download an Ubuntu release and create the
virtual machine configuration.
-``` {.bash}
-quickget ubuntu 20.04
-quickemu --vm ubuntu-20.04.conf
+``` bash
+quickget ubuntu 22.04
+quickemu --vm ubuntu-22.04.conf
```
- Complete the installation as normal.
@@ -211,7 +228,7 @@ quickemu --vm ubuntu-20.04.conf
`quickget` can also download/refresh devel images via `zsync` for Ubuntu
developers and testers.
-``` {.bash}
+``` bash
quickget ubuntu devel
quickemu --vm ubuntu-devel.conf
```
@@ -234,8 +251,7 @@ with your preferred flavour.
- `ubuntu` (Ubuntu)
- `xubuntu` (Xubuntu)
-Other Operating Systems
------------------------
+## Other Operating Systems
`quickget` also supports:
@@ -244,11 +260,15 @@ Other Operating Systems
- `android` (Android x86)
- `archlinux` (Arch Linux)
- `arcolinux` (Arco Linux)
+- `batocera` (Batocera)
- `cachyos` (CachyOS)
+- `centos-stream` (CentOS Stream)
- `debian` (Debian)
+- `deepin` (Deepin)
- `devuan` (Devuan)
- `dragonflybsd` (DragonFlyBSD)
- `elementary` (elementary OS)
+- `endeavouros` (EndeavourOS)
- `fedora` (Fedora)
- `freebsd` (FreeBSD)
- `freedos` (FreeDOS)
@@ -260,6 +280,7 @@ Other Operating Systems
- `kdeneon` (KDE Neon)
- `kolibrios` (KolibriOS)
- `linuxmint` (Linux Mint)
+- `lmde` (Linux Mint Debian Edition)
- `manjaro` (Manjaro)
- `mxlinux` (MX Linux)
- `netboot` (netboot.xyz)
@@ -269,6 +290,7 @@ Other Operating Systems
- `opensuse` (openSUSE)
- `oraclelinux` (Oracle Linux)
- `popos` (Pop!\_OS)
+- `reactos` (ReactOS)
- `regolith` (Regolith Linux)
- `rockylinux` (Rocky Linux)
- `slackware` (Slackware)
@@ -283,7 +305,7 @@ configuration.
- Download a .iso image of a Linux distribution
- Create a VM configuration file; for example `debian-bullseye.conf`
-``` {.bash}
+``` bash
guest_os="linux"
disk_img="debian-bullseye/disk.qcow2"
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
@@ -291,7 +313,7 @@ iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
- Use `quickemu` to start the virtual machine:
-``` {.bash}
+``` bash
quickemu --vm debian-bullseye.conf
```
@@ -302,13 +324,12 @@ quickemu --vm debian-bullseye.conf
- Install the SPICE WebDAV agent (`spice-webdavd`) to enable file
sharing.
-macOS Guest
------------
+## macOS Guest
`quickget` automatically downloads a macOS recovery image and creates a
virtual machine configuration.
-``` {.bash}
+``` bash
quickget macos catalina
quickemu --vm macos-catalina.conf
```
@@ -338,7 +359,7 @@ supported.
The default macOS configuration looks like this:
-``` {.bash}
+``` bash
guest_os="macos"
img="macos-catalina/RecoveryImage.img"
disk_img="macos-catalina/disk.qcow2"
@@ -382,15 +403,35 @@ There are some considerations when running macOS via Quickemu.
- UHCI (USB 2.0) on macOS Catalina and earlier.
- XHCI (USB 3.0) on macOS Big Sur and newer.
- Display resolution can only be changed via macOS System Preferences.
-- Full Duplex audio works on macOS High Sierra, Mojave and Catalina.
- - **macOS Big Sur and Monterey have no audio at all**.
+- **Full Duplex audio requires [VoodooHDA
+ OC](https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
+ audio-device to the macOS guest VM**.
+- NOTE! [Gatekeeper](https://disable-gatekeeper.github.io/) and
+ [System Integrity Protection
+ (SIP)](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
+ need to be disabled to install VoodooHDA OC
- File sharing between guest and host is available via
[virtio-9p](https://wiki.qemu.org/Documentation/9psetup) and [SPICE
webdavd](https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
- Copy/paste via SPICE agent is **not available on macOS**.
-Windows 8.1, 10 & 11 Guests
----------------------------
+### macOS App Store
+
+If you see *"Your device or computer could not be verified"* when you
+try to login to the App Store, make sure that your wired ethernet device
+is `en0`. Use `ifconfig` in a terminal to verify this.
+
+If the wired ethernet device is not `en0`, then then go to *System
+Preferences* -\> *Network*, delete all the network devices and apply the
+changes. Next, open a terminal and run the following:
+
+``` bash
+sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
+```
+
+Now reboot, and the App Store should work.
+
+## Windows 8.1, 10 & 11 Guests
`quickget` can automatically download Windows 8.1, [Windows
10](https://www.microsoft.com/en-gb/software-download/windows10ISO) and
@@ -400,13 +441,17 @@ with the [VirtIO drivers for
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)
and creates a virtual machine configuration.
-``` {.bash}
+``` bash
quickget windows 11
quickemu --vm windows-11.conf
```
- Complete the installation as you normally would.
- All relevant drivers and services should be installed automatically.
+- A local adminstrator user account is automatically created, with
+ these credentials:
+ - Username: `Quickemu`
+ - Password: `quickemu`
### Regional versions
@@ -414,18 +459,19 @@ By default `quickget` will download the *"English International"*
release, but you can optionally specify one of the supported languages:
For example:
-``` {.bash}
+``` bash
quickget windows 11 "Chinese (Traditional)"
```
The default Windows 11 configuration looks like this:
-``` {.bash}
+``` bash
guest_os="windows"
disk_img="windows-11/disk.qcow2"
iso="windows-11/Win11_EnglishInternational_x64.iso"
fixed_iso="windows-11/virtio-win.iso"
tpm="on"
+secureboot="on"
```
- `guest_os="windows"` instructs `quickemu` to optimise for Windows.
@@ -433,47 +479,57 @@ tpm="on"
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
device using `swtpm`.
-All the options
-===============
+# All the options
Here are the usage instructions:
-``` {.bash}
-Usage
- quickemu --vm ubuntu.conf
+ Usage
+ quickemu --vm ubuntu.conf
-You can also pass optional parameters
- --braille : Enable braille support. Requires SDL.
- --delete-disk : Delete the disk image and EFI variables
- --delete-vm : Delete the entire VM and it's configuration
- --display : Select display backend. 'sdl' (default), 'gtk', 'none', or 'spice'
- --fullscreen : Starts VM in full screen mode (Ctl+Alt+f to exit)
- --ignore-msrs-always : Configure KVM to always ignore unhandled machine-specific registers
- --screen : Use specified screen to determine the window size.
- --shortcut : Create a desktop shortcut
- --snapshot apply : Apply/restore a snapshot.
- --snapshot create : Create a snapshot.
- --snapshot delete : Delete a snapshot.
- --snapshot info : Show disk/snapshot info.
- --status-quo : Do not commit any changes to disk/snapshot.
- --version : Print version
+ You can also pass optional parameters
+ --braille : Enable braille support. Requires SDL.
+ --delete-disk : Delete the disk image and EFI variables
+ --delete-vm : Delete the entire VM and it's configuration
+ --display : Select display backend. 'sdl' (default), 'gtk', '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
+ --screen : Use specified screen to determine the window size.
+ --shortcut : Create a desktop shortcut
+ --snapshot apply : Apply/restore a snapshot.
+ --snapshot create : Create a snapshot.
+ --snapshot delete : Delete a snapshot.
+ --snapshot info : Show disk/snapshot info.
+ --status-quo : Do not commit any changes to disk/snapshot.
+ --viewer : Choose an alternative viewer. @Options: 'spicy' (default), 'remote-viewer', 'none'
+ --ssh-port : Set ssh-port manually
+ --spice-port : Set spice-port manually
+ --public-dir : expose share directory. @Options: '' (default: xdg-user-dir PUBLICSHARE), '', 'none'
+ --monitor : Set monitor connection type. @Options: 'socket' (default), 'telnet', 'none'
+ --monitor-telnet-host : Set telnet host for monitor. (default: 'localhost')
+ --monitor-telnet-port : Set telnet port for monitor. (default: '4440')
+ --monitor-cmd : Send command to monitor if available. (Example: system_powerdown)
+ --serial : Set serial connection type. @Options: 'socket' (default), 'telnet', 'none'
+ --serial-telnet-host : Set telnet host for serial. (default: 'localhost')
+ --serial-telnet-port : Set telnet port for serial. (default: '6660')
+ --keyboard : Set keyboard. @Options: 'usb' (default), 'ps2', 'virtio'
+ --keyboard_layout : Set keyboard layout.
+ --mouse : Set mouse. @Options: 'tablet' (default), 'ps2', 'usb', 'virtio'
+ --usb-controller : Set usb-controller. @Options: 'ehci' (default), 'xhci', 'none'
+ --extra_args : Pass additional arguments to qemu
+ --version : Print version
-```
-
-Desktop shortcuts
------------------
+## Desktop shortcuts
Desktop shortcuts can be created for a VM, the shortcuts are saved in
`~/.local/share/applications`. Here is an example of how to create a
shortcut.
-``` {.bash}
-quickemu --vm ubuntu-20.04-desktop.conf --shortcut
+``` bash
+quickemu --vm ubuntu-22.04-desktop.conf --shortcut
```
-Screen and window size (Linux guests only)
-------------------------------------------
+## Screen and window size (Linux guests only)
`qemu` will always default to the primary monitor to display the VM's
window.
@@ -494,13 +550,13 @@ must match the resolution of the screen.
To know which screen to use, type:
-``` {.bash}
+``` bash
xrandr --listmonitors | grep -v Monitors
```
The command will output something like this:
-``` {.bash}
+``` bash
0: +*HDMI-0 2560/597x1440/336+1920+0 HDMI-0
1: +DVI-D-0 1920/527x1080/296+0+0 DVI-D-0
```
@@ -509,7 +565,7 @@ The first number is what needs to be passed to the `--screen` option.
For example:
-``` {.bash}
+``` bash
quickemu --vm vm.conf --screen 0
```
@@ -518,8 +574,7 @@ which Quickemu sizes to 2048x1152. Without the `--screen` option,
Quickemu would have used the 1920x1080 monitor which results in a window
size of 1664x936.
-References
-==========
+# References
Useful reference that assisted the development of Quickemu.
@@ -556,20 +611,17 @@ Useful reference that assisted the development of Quickemu.
-
-
-AUTHORS
-=======
+# AUTHORS
Written by Martin Wimpress.
-BUGS
-====
+# BUGS
Submit bug reports online at:
-SEE ALSO
-========
+# SEE ALSO
Full sources at:
-quickemu\_conf(1), quickget(1), quickgui(1)
+quickemu_conf(1), quickget(1), quickgui(1)
diff --git a/docs/quickemu_conf.1 b/docs/quickemu_conf.1
index 5f3472f..c012bdd 100644
--- a/docs/quickemu_conf.1
+++ b/docs/quickemu_conf.1
@@ -1,6 +1,20 @@
-.\" Automatically generated by Pandoc 2.9.2.1
+.\" Automatically generated by Pandoc 2.19.2
.\"
-.TH "QUICKEMU_CONF" "1" "February 20, 2022" "quickemu_conf" "Quickemu Configuration Manual"
+.\" Define V font for inline verbatim, using C font in formats
+.\" that render this, and otherwise B font.
+.ie "\f[CB]x\f[]"x" \{\
+. ftr V B
+. ftr VI BI
+. ftr VB B
+. ftr VBI BI
+.\}
+.el \{\
+. ftr V CR
+. ftr VI CI
+. ftr VB CB
+. ftr VBI CBI
+.\}
+.TH "QUICKEMU_CONF" "1" "September 1, 2022" "quickemu_conf" "Quickemu Configuration Manual"
.hy
.SH NAME
.PP
@@ -21,7 +35,6 @@ These are the options and defaults for the .conf file
\f[C]
# Lowercase variables are used in the VM config file only
boot=\[dq]efi\[dq]
-bridge=\[dq]\[dq]
cpu_cores=\[dq]\[dq]
disk_img=\[dq]\[dq]
disk_size=\[dq]\[dq]
@@ -30,7 +43,9 @@ floppy=\[dq]\[dq]
guest_os=\[dq]linux\[dq]
img=\[dq]\[dq]
iso=\[dq]\[dq]
+macaddr=\[dq]\[dq]
macos_release=\[dq]\[dq]
+network=\[dq]\[dq]
port_forwards=()
preallocation=\[dq]off\[dq]
ram=\[dq]\[dq]
@@ -60,10 +75,10 @@ macos_release=\[dq]catalina\[dq]
\f[R]
.fi
.IP \[bu] 2
-\f[C]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
+\f[V]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
macOS.
.IP \[bu] 2
-\f[C]macos_release=\[dq]catalina\[dq]\f[R] instructs Quickemu to
+\f[V]macos_release=\[dq]catalina\[dq]\f[R] instructs Quickemu to
optimise for a particular macOS release.
.RS 2
.IP \[bu] 2
@@ -83,24 +98,25 @@ disk_img=\[dq]windows-11/disk.qcow2\[dq]
iso=\[dq]windows-11/Win11_EnglishInternational_x64.iso\[dq]
fixed_iso=\[dq]windows-11/virtio-win.iso\[dq]
tpm=\[dq]on\[dq]
+secureboot=\[dq]on\[dq]
\f[R]
.fi
.IP \[bu] 2
-\f[C]guest_os=\[dq]windows\[dq]\f[R] instructs \f[C]quickemu\f[R] to
+\f[V]guest_os=\[dq]windows\[dq]\f[R] instructs \f[V]quickemu\f[R] to
optimise for Windows.
.IP \[bu] 2
-\f[C]fixed_iso=\f[R] specifies the ISO image that provides VirtIO
+\f[V]fixed_iso=\f[R] specifies the ISO image that provides VirtIO
drivers.
.IP \[bu] 2
-\f[C]tpm=\[dq]on\[dq]\f[R] instructs \f[C]quickemu\f[R] to create a
-software emulated TPM device using \f[C]swtpm\f[R].
+\f[V]tpm=\[dq]on\[dq]\f[R] instructs \f[V]quickemu\f[R] to create a
+software emulated TPM device using \f[V]swtpm\f[R].
.SH BIOS and EFI
.PP
-Since Quickemu 2.1.0 \f[C]efi\f[R] is the default boot option.
+Since Quickemu 2.1.0 \f[V]efi\f[R] is the default boot option.
If you want to override this behaviour then add the following line to
you VM configuration to enable legacy BIOS.
.IP \[bu] 2
-\f[C]boot=\[dq]legacy\[dq]\f[R] - Enable Legacy BIOS boot
+\f[V]boot=\[dq]legacy\[dq]\f[R] - Enable Legacy BIOS boot
.SH Tuning CPU cores, RAM & disks
.PP
By default, Quickemu will calculate the number of CPUs cores and RAM to
@@ -110,18 +126,18 @@ your liking.
.PP
Add additional lines to your virtual machine configuration:
.IP \[bu] 2
-\f[C]cpu_cores=\[dq]4\[dq]\f[R] - Specify the number of CPU cores
+\f[V]cpu_cores=\[dq]4\[dq]\f[R] - Specify the number of CPU cores
allocated to the VM
.IP \[bu] 2
-\f[C]ram=\[dq]4G\[dq]\f[R] - Specify the amount of RAM to allocate to
+\f[V]ram=\[dq]4G\[dq]\f[R] - Specify the amount of RAM to allocate to
the VM
.IP \[bu] 2
-\f[C]disk_size=\[dq]16G\[dq]\f[R] - Specify the size of the virtual disk
+\f[V]disk_size=\[dq]16G\[dq]\f[R] - Specify the size of the virtual disk
allocated to the VM
.SS Disk preallocation
.PP
-Preallocation mode (allowed values: \f[C]off\f[R] (default),
-\f[C]metadata\f[R], \f[C]falloc\f[R], \f[C]full\f[R]).
+Preallocation mode (allowed values: \f[V]off\f[R] (default),
+\f[V]metadata\f[R], \f[V]falloc\f[R], \f[V]full\f[R]).
An image with preallocated metadata is initially larger but can improve
performance when the image needs to grow.
.PP
@@ -129,27 +145,27 @@ Specify what disk preallocation should be used, if any, when creating
the system disk image by adding a line like this to your VM
configuration.
.IP \[bu] 2
-\f[C]preallocation=\[dq]metadata\[dq]\f[R]
+\f[V]preallocation=\[dq]metadata\[dq]\f[R]
.SS CD-ROM disks
.PP
If you want to expose an ISO image from the host to guest add the
following line to the VM configuration:
.IP \[bu] 2
-\f[C]fixed_iso=\[dq]/path/to/image.iso\[dq]\f[R]
+\f[V]fixed_iso=\[dq]/path/to/image.iso\[dq]\f[R]
.SS Floppy disks
.PP
If you\[cq]re like Alan Pope (https://popey.com) you\[cq]ll probably
want to mount a floppy disk image in the guest.
To do so add the following line to the VM configuration:
.IP \[bu] 2
-\f[C]floppy=\[dq]/path/to/floppy.img\[dq]\f[R]
+\f[V]floppy=\[dq]/path/to/floppy.img\[dq]\f[R]
.SH File Sharing
.PP
-All File Sharing options will only expose \f[C]\[ti]/Public\f[R] (or
+All File Sharing options will only expose \f[V]\[ti]/Public\f[R] (or
localised variations) for the current user to the guest VMs.
.SS Samba \[u1F427] \[u1F34F] \[u1FA9F]
.PP
-If \f[C]smbd\f[R] is available on the host, Quickemu will automatically
+If \f[V]smbd\f[R] is available on the host, Quickemu will automatically
enable the built-in QEMU support for exposing a Samba share from the
host to the guest.
.PP
@@ -160,6 +176,21 @@ You can install the minimal Samba components on Ubuntu using:
sudo apt install --no-install-recommends samba
\f[R]
.fi
+.PP
+If everything is set up correctly, the \f[V]smbd\f[R] address will be
+printed when the virtual machine is started.
+For example:
+.IP
+.nf
+\f[C]
+ - smbd: On guest: smb://10.0.2.4/qemu
+\f[R]
+.fi
+.PP
+If using a Windows guest, right-click on \[lq]This PC\[rq], click
+\[lq]Add a network location\[rq], and paste this address, removing
+\f[V]smb:\f[R] and replacing forward slashes with backslashes (in this
+example \f[V]\[rs]\[rs]10.0.2.4\[rs]qemu\f[R]).
.SS SPICE WebDAV \[u1F427] \[u1FA9F]
.IP \[bu] 2
TBD
@@ -171,19 +202,46 @@ TBD
Add an additional line to your virtual machine configuration.
For example:
.IP \[bu] 2
-\f[C]port_forwards=(\[dq]8123:8123\[dq] \[dq]8888:80\[dq])\f[R]
+\f[V]port_forwards=(\[dq]8123:8123\[dq] \[dq]8888:80\[dq])\f[R]
.PP
In the example above:
.IP \[bu] 2
Port 8123 on the host is forwarded to port 8123 on the guest.
.IP \[bu] 2
Port 8888 on the host is forwarded to port 80 on the guest.
+.SH Disable networking
+.PP
+To completely disable all network interfaces in a guest VM add this
+additional line to your virtual machine configuration:
+.IP \[bu] 2
+\f[V]network=\[dq]none\[dq]\f[R]
+.SH Restricted networking
+.PP
+You can isolate the guest from the host (and broader network) using the
+restrict option, which will restrict networking to just the guest and
+any virtual devices.
+.PP
+This can be used to prevent software running inside the guest from
+phoning home while still providing a network inside the guest.
+Add this additional line to your virtual machine configuration:
+.IP \[bu] 2
+\f[V]network=\[dq]restrict\[dq]\f[R]
.SH Bridged networking
.PP
Connect your virtual machine to a preconfigured network bridge.
-Add an additional line to your virtual machine configuration
+Add an additional line to your virtual machine configuration:
.IP \[bu] 2
-\f[C]bridge=\[dq]br0\[dq]\f[R]
+\f[V]network=\[dq]br0\[dq]\f[R]
+.PP
+If you want to have a persistent MAC address for your bridged network
+interface in the guest VM you can add \f[V]macaddr\f[R] to the virtual
+machine configuration.
+QEMU requires that the MAC address is in the range:
+\f[B]52:54:00:AB:00:00 - 52:54:00:AB:FF:FF\f[R]
+.PP
+So you can generate your own MAC addresses with:
+.IP \[bu] 2
+\f[V]macaddr=\[dq]52:54:00:AB:51:AE\[dq]\f[R]
.SH USB redirection
.PP
Quickemu supports USB redirection via SPICE pass-through and host
@@ -191,9 +249,9 @@ pass-through.
.SS SPICE redirection (recommended)
.PP
Using SPICE for USB pass-through is easiest as it doesn\[cq]t require
-any elevated permission, start Quickemu with \f[C]--display spice\f[R]
-and then select \f[C]Input\f[R] ->
-\f[C]Select USB Device for redirection\f[R] from the menu to choose
+any elevated permission, start Quickemu with \f[V]--display spice\f[R]
+and then select \f[V]Input\f[R] ->
+\f[V]Select USB Device for redirection\f[R] from the menu to choose
which device(s) you want to attach to the guest.
.SS Host redirection \f[B]NOT Recommended\f[R]
.PP
@@ -204,7 +262,7 @@ Using SPICE is preferred, see above.
Add an additional line to your virtual machine configuration.
For example:
.IP \[bu] 2
-\f[C]usb_devices=(\[dq]046d:082d\[dq] \[dq]046d:085e\[dq])\f[R]
+\f[V]usb_devices=(\[dq]046d:082d\[dq] \[dq]046d:085e\[dq])\f[R]
.PP
In the example above:
.IP \[bu] 2
@@ -214,7 +272,7 @@ to the guest.
The USB device with vendor_id 046d and product_id 085e will be exposed
to the guest.
.PP
-If the USB devices are not writable, \f[C]quickemu\f[R] will display the
+If the USB devices are not writable, \f[V]quickemu\f[R] will display the
appropriate commands to modify the USB device(s) access permissions,
like this:
.IP
@@ -230,8 +288,8 @@ like this:
.PP
Since Quickemu 2.2.0 a software emulated TPM device can be added to
guest virtual machines.
-Just add \f[C]tpm=\[dq]on\[dq]\f[R] to your VM configuration.
-\f[C]quickget\f[R] will automatically add this line to Windows 11
+Just add \f[V]tpm=\[dq]on\[dq]\f[R] to your VM configuration.
+\f[V]quickget\f[R] will automatically add this line to Windows 11
virtual machines.
.SH AUTHORS
.PP
diff --git a/docs/quickemu_conf.1.md b/docs/quickemu_conf.1.md
index a978739..6c52fed 100644
--- a/docs/quickemu_conf.1.md
+++ b/docs/quickemu_conf.1.md
@@ -1,19 +1,17 @@
---
author: Martin Wimpress
-date: 'February 20, 2022'
-footer: quickemu\_conf
+date: September 1, 2022
+footer: quickemu_conf
header: Quickemu Configuration Manual
section: 1
-title: QUICKEMU\_CONF
+title: QUICKEMU_CONF
---
-NAME
-====
+# NAME
-quickemu\_conf - Options and parameters in the quickemu \.conf
+quickemu_conf - Options and parameters in the quickemu \.conf
-DESCRIPTION
-===========
+# DESCRIPTION
**quickemu** will create and run highly optimised desktop virtual
machines for Linux, macOS and Windows. It uses sensible defaults, but
@@ -21,15 +19,13 @@ many configuration options can be overridden in the required
configuration file, which will as a minimum specify the path to the
installation ISO and QEMU disk for the installed VM
-OPTIONS
-=======
+# OPTIONS
These are the options and defaults for the \.conf file
-``` {.bash}
+``` bash
# Lowercase variables are used in the VM config file only
boot="efi"
-bridge=""
cpu_cores=""
disk_img=""
disk_size=""
@@ -38,7 +34,9 @@ floppy=""
guest_os="linux"
img=""
iso=""
+macaddr=""
macos_release=""
+network=""
port_forwards=()
preallocation="off"
ram=""
@@ -47,10 +45,9 @@ tpm="off"
usb_devices=()
```
-EXAMPLES
-========
+# EXAMPLES
-``` {.bash}
+``` bash
guest_os="linux"
disk_img="debian-bullseye/disk.qcow2"
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
@@ -58,7 +55,7 @@ iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
The default macOS configuration looks like this:
-``` {.bash}
+``` bash
guest_os="macos"
img="macos-catalina/RecoveryImage.img"
disk_img="macos-catalina/disk.qcow2"
@@ -75,12 +72,13 @@ macos_release="catalina"
The default Windows 11 configuration looks like this:
-``` {.bash}
+``` bash
guest_os="windows"
disk_img="windows-11/disk.qcow2"
iso="windows-11/Win11_EnglishInternational_x64.iso"
fixed_iso="windows-11/virtio-win.iso"
tpm="on"
+secureboot="on"
```
- `guest_os="windows"` instructs `quickemu` to optimise for Windows.
@@ -88,8 +86,7 @@ tpm="on"
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
device using `swtpm`.
-BIOS and EFI
-============
+# BIOS and EFI
Since Quickemu 2.1.0 `efi` is the default boot option. If you want to
override this behaviour then add the following line to you VM
@@ -97,8 +94,7 @@ configuration to enable legacy BIOS.
- `boot="legacy"` - Enable Legacy BIOS boot
-Tuning CPU cores, RAM & disks
-=============================
+# Tuning CPU cores, RAM & disks
By default, Quickemu will calculate the number of CPUs cores and RAM to
allocate to a VM based on the specifications of your host computer. You
@@ -113,8 +109,7 @@ Add additional lines to your virtual machine configuration:
- `disk_size="16G"` - Specify the size of the virtual disk allocated
to the VM
-Disk preallocation
-------------------
+## Disk preallocation
Preallocation mode (allowed values: `off` (default), `metadata`,
`falloc`, `full`). An image with preallocated metadata is initially
@@ -126,16 +121,14 @@ configuration.
- `preallocation="metadata"`
-CD-ROM disks
-------------
+## CD-ROM disks
If you want to expose an ISO image from the host to guest add the
following line to the VM configuration:
- `fixed_iso="/path/to/image.iso"`
-Floppy disks
-------------
+## Floppy disks
If you're like [Alan Pope](https://popey.com) you'll probably want to
mount a floppy disk image in the guest. To do so add the following line
@@ -143,14 +136,12 @@ to the VM configuration:
- `floppy="/path/to/floppy.img"`
-File Sharing
-============
+# File Sharing
All File Sharing options will only expose `~/Public` (or localised
variations) for the current user to the guest VMs.
-Samba 🐧 🍏 🪟
------------
+## Samba 🐧 🍏 🪟
If `smbd` is available on the host, Quickemu will automatically enable
the built-in QEMU support for exposing a Samba share from the host to
@@ -158,22 +149,28 @@ the guest.
You can install the minimal Samba components on Ubuntu using:
-``` {.bash}
+``` bash
sudo apt install --no-install-recommends samba
```
-SPICE WebDAV 🐧 🪟
-----------------
+If everything is set up correctly, the `smbd` address will be printed
+when the virtual machine is started. For example:
+
+ - smbd: On guest: smb://10.0.2.4/qemu
+
+If using a Windows guest, right-click on "This PC", click "Add a network
+location", and paste this address, removing `smb:` and replacing forward
+slashes with backslashes (in this example `\\10.0.2.4\qemu`).
+
+## SPICE WebDAV 🐧 🪟
- TBD
-VirtIO-9P 🐧 🍏
--------------
+## VirtIO-9P 🐧 🍏
- TBD
-Network port forwarding
-=======================
+# Network port forwarding
Add an additional line to your virtual machine configuration. For
example:
@@ -185,30 +182,54 @@ In the example above:
- Port 8123 on the host is forwarded to port 8123 on the guest.
- Port 8888 on the host is forwarded to port 80 on the guest.
-Bridged networking
-==================
+# Disable networking
+
+To completely disable all network interfaces in a guest VM add this
+additional line to your virtual machine configuration:
+
+- `network="none"`
+
+# Restricted networking
+
+You can isolate the guest from the host (and broader network) using the
+restrict option, which will restrict networking to just the guest and
+any virtual devices.
+
+This can be used to prevent software running inside the guest from
+phoning home while still providing a network inside the guest. Add this
+additional line to your virtual machine configuration:
+
+- `network="restrict"`
+
+# Bridged networking
Connect your virtual machine to a preconfigured network bridge. Add an
-additional line to your virtual machine configuration
+additional line to your virtual machine configuration:
-- `bridge="br0"`
+- `network="br0"`
-USB redirection
-===============
+If you want to have a persistent MAC address for your bridged network
+interface in the guest VM you can add `macaddr` to the virtual machine
+configuration. QEMU requires that the MAC address is in the range:
+**52:54:00:AB:00:00 - 52:54:00:AB:FF:FF**
+
+So you can generate your own MAC addresses with:
+
+- `macaddr="52:54:00:AB:51:AE"`
+
+# USB redirection
Quickemu supports USB redirection via SPICE pass-through and host
pass-through.
-SPICE redirection (recommended)
--------------------------------
+## SPICE redirection (recommended)
Using SPICE for USB pass-through is easiest as it doesn't require any
elevated permission, start Quickemu with `--display spice` and then
select `Input` -\> `Select USB Device for redirection` from the menu to
choose which device(s) you want to attach to the guest.
-Host redirection **NOT Recommended**
-------------------------------------
+## Host redirection **NOT Recommended**
**USB host redirection is not recommended**, it is provided purely for
backwards compatibility to older versions of Quickemu. Using SPICE is
@@ -221,9 +242,9 @@ example:
In the example above:
-- The USB device with vendor\_id 046d and product\_id 082d will be
+- The USB device with vendor_id 046d and product_id 082d will be
exposed to the guest.
-- The USB device with vendor\_id 046d and product\_id 085e will be
+- The USB device with vendor_id 046d and product_id 085e will be
exposed to the guest.
If the USB devices are not writable, `quickemu` will display the
@@ -235,27 +256,23 @@ like this:
sudo chown -v root:user /dev/bus/usb/001/005
ERROR! USB permission changes are required 👆
-TPM
-===
+# TPM
Since Quickemu 2.2.0 a software emulated TPM device can be added to
guest virtual machines. Just add `tpm="on"` to your VM configuration.
`quickget` will automatically add this line to Windows 11 virtual
machines.
-AUTHORS
-=======
+# AUTHORS
Written by Martin Wimpress.
-BUGS
-====
+# BUGS
Submit bug reports online at:
-SEE ALSO
-========
+# SEE ALSO
Full sources at:
diff --git a/docs/quickget.1 b/docs/quickget.1
index 2ee7927..911c807 100644
--- a/docs/quickget.1
+++ b/docs/quickget.1
@@ -1,6 +1,20 @@
-.\" Automatically generated by Pandoc 2.9.2.1
+.\" Automatically generated by Pandoc 2.19.2
.\"
-.TH "QUICKGET" "1" "February 20, 2022" "quickget" "Quickget User Manual"
+.\" Define V font for inline verbatim, using C font in formats
+.\" that render this, and otherwise B font.
+.ie "\f[CB]x\f[]"x" \{\
+. ftr V B
+. ftr VI BI
+. ftr VB B
+. ftr VBI BI
+.\}
+.el \{\
+. ftr V CR
+. ftr VI CI
+. ftr VB CB
+. ftr VBI CBI
+.\}
+.TH "QUICKGET" "1" "September 1, 2022" "quickget" "Quickget User Manual"
.hy
.SH NAME
.PP
@@ -12,7 +26,7 @@ quickget - download and prepare materials for building a quickemu VM
.SH DESCRIPTION
.PP
\f[B]quickget\f[R] will download the requisite materials and prepare a
-configuration for \f[C]quickemu\f[R] to use to build and run
+configuration for \f[V]quickemu\f[R] to use to build and run
.SH OPTIONS
.TP
\f[B]version | -version | \[en]version\f[R]
@@ -29,13 +43,13 @@ Editions may not apply and will be defaulted if not provided.
.SH NOTES
.SS Ubuntu Guest
.PP
-\f[C]quickget\f[R] will automatically download an Ubuntu release and
+\f[V]quickget\f[R] will automatically download an Ubuntu release and
create the virtual machine configuration.
.IP
.nf
\f[C]
-quickget ubuntu 20.04
-quickemu --vm ubuntu-20.04.conf
+quickget ubuntu 22.04
+quickemu --vm ubuntu-22.04.conf
\f[R]
.fi
.IP \[bu] 2
@@ -44,24 +58,24 @@ Complete the installation as normal.
Post-install:
.RS 2
.IP \[bu] 2
-Install the SPICE agent (\f[C]spice-vdagent\f[R]) to enable copy/paste
+Install the SPICE agent (\f[V]spice-vdagent\f[R]) to enable copy/paste
and USB redirection
.RS 2
.IP \[bu] 2
-\f[C]sudo apt install spice-vdagent\f[R]
+\f[V]sudo apt install spice-vdagent\f[R]
.RE
.IP \[bu] 2
-Install the SPICE WebDAV agent (\f[C]spice-webdavd\f[R]) to enable file
+Install the SPICE WebDAV agent (\f[V]spice-webdavd\f[R]) to enable file
sharing.
.RS 2
.IP \[bu] 2
-\f[C]sudo apt install spice-webdavd\f[R]
+\f[V]sudo apt install spice-webdavd\f[R]
.RE
.RE
.SS Ubuntu devel (daily-live) images
.PP
-\f[C]quickget\f[R] can also download/refresh devel images via
-\f[C]zsync\f[R] for Ubuntu developers and testers.
+\f[V]quickget\f[R] can also download/refresh devel images via
+\f[V]zsync\f[R] for Ubuntu developers and testers.
.IP
.nf
\f[C]
@@ -70,106 +84,118 @@ quickemu --vm ubuntu-devel.conf
\f[R]
.fi
.PP
-You can run \f[C]quickget ubuntu devel\f[R] to refresh your daily
+You can run \f[V]quickget ubuntu devel\f[R] to refresh your daily
development image as often as you like, it will even automatically
switch to a new series.
.SS Ubuntu Flavours
.PP
All the official Ubuntu flavours are supported, just replace
-\f[C]ubuntu\f[R] with your preferred flavour.
+\f[V]ubuntu\f[R] with your preferred flavour.
.IP \[bu] 2
-\f[C]kubuntu\f[R] (Kubuntu)
+\f[V]kubuntu\f[R] (Kubuntu)
.IP \[bu] 2
-\f[C]lubuntu\f[R] (Lubuntu)
+\f[V]lubuntu\f[R] (Lubuntu)
.IP \[bu] 2
-\f[C]ubuntu-budgie\f[R] (Ubuntu Budgie)
+\f[V]ubuntu-budgie\f[R] (Ubuntu Budgie)
.IP \[bu] 2
-\f[C]ubuntukylin\f[R] (Ubuntu Kylin)
+\f[V]ubuntukylin\f[R] (Ubuntu Kylin)
.IP \[bu] 2
-\f[C]ubuntu-mate\f[R] (Ubuntu MATE)
+\f[V]ubuntu-mate\f[R] (Ubuntu MATE)
.IP \[bu] 2
-\f[C]ubuntustudio\f[R] (Ubuntu Studio)
+\f[V]ubuntustudio\f[R] (Ubuntu Studio)
.IP \[bu] 2
-\f[C]ubuntu\f[R] (Ubuntu)
+\f[V]ubuntu\f[R] (Ubuntu)
.IP \[bu] 2
-\f[C]xubuntu\f[R] (Xubuntu)
+\f[V]xubuntu\f[R] (Xubuntu)
.SS Other Operating Systems
.PP
-\f[C]quickget\f[R] also supports:
+\f[V]quickget\f[R] also supports:
.IP \[bu] 2
-\f[C]alma\f[R] (Alma Linux)
+\f[V]alma\f[R] (Alma Linux)
.IP \[bu] 2
-\f[C]alpine\f[R] (Alpine Linux)
+\f[V]alpine\f[R] (Alpine Linux)
.IP \[bu] 2
-\f[C]android\f[R] (Android x86)
+\f[V]android\f[R] (Android x86)
.IP \[bu] 2
-\f[C]archlinux\f[R] (Arch Linux)
+\f[V]archlinux\f[R] (Arch Linux)
.IP \[bu] 2
-\f[C]arcolinux\f[R] (Arco Linux)
+\f[V]arcolinux\f[R] (Arco Linux)
.IP \[bu] 2
-\f[C]cachyos\f[R] (CachyOS)
+\f[V]batocera\f[R] (Batocera)
.IP \[bu] 2
-\f[C]debian\f[R] (Debian)
+\f[V]cachyos\f[R] (CachyOS)
.IP \[bu] 2
-\f[C]devuan\f[R] (Devuan)
+\f[V]centos-stream\f[R] (CentOS Stream)
.IP \[bu] 2
-\f[C]dragonflybsd\f[R] (DragonFlyBSD)
+\f[V]debian\f[R] (Debian)
.IP \[bu] 2
-\f[C]elementary\f[R] (elementary OS)
+\f[V]deepin\f[R] (Deepin)
.IP \[bu] 2
-\f[C]fedora\f[R] (Fedora)
+\f[V]devuan\f[R] (Devuan)
.IP \[bu] 2
-\f[C]freebsd\f[R] (FreeBSD)
+\f[V]dragonflybsd\f[R] (DragonFlyBSD)
.IP \[bu] 2
-\f[C]freedos\f[R] (FreeDOS)
+\f[V]elementary\f[R] (elementary OS)
.IP \[bu] 2
-\f[C]garuda\f[R] (Garuda Linux)
+\f[V]endeavouros\f[R] (EndeavourOS)
.IP \[bu] 2
-\f[C]gentoo\f[R] (Gentoo)
+\f[V]fedora\f[R] (Fedora)
.IP \[bu] 2
-\f[C]ghostbsd\f[R] (GhostBSD)
+\f[V]freebsd\f[R] (FreeBSD)
.IP \[bu] 2
-\f[C]haiku\f[R] (Haiku)
+\f[V]freedos\f[R] (FreeDOS)
.IP \[bu] 2
-\f[C]kali\f[R] (Kali)
+\f[V]garuda\f[R] (Garuda Linux)
.IP \[bu] 2
-\f[C]kdeneon\f[R] (KDE Neon)
+\f[V]gentoo\f[R] (Gentoo)
.IP \[bu] 2
-\f[C]kolibrios\f[R] (KolibriOS)
+\f[V]ghostbsd\f[R] (GhostBSD)
.IP \[bu] 2
-\f[C]linuxmint\f[R] (Linux Mint)
+\f[V]haiku\f[R] (Haiku)
.IP \[bu] 2
-\f[C]manjaro\f[R] (Manjaro)
+\f[V]kali\f[R] (Kali)
.IP \[bu] 2
-\f[C]mxlinux\f[R] (MX Linux)
+\f[V]kdeneon\f[R] (KDE Neon)
.IP \[bu] 2
-\f[C]netboot\f[R] (netboot.xyz)
+\f[V]kolibrios\f[R] (KolibriOS)
.IP \[bu] 2
-\f[C]netbsd\f[R] (NetBSD)
+\f[V]linuxmint\f[R] (Linux Mint)
.IP \[bu] 2
-\f[C]nixos\f[R] (NixOS)
+\f[V]lmde\f[R] (Linux Mint Debian Edition)
.IP \[bu] 2
-\f[C]openbsd\f[R] (OpenBSD)
+\f[V]manjaro\f[R] (Manjaro)
.IP \[bu] 2
-\f[C]opensuse\f[R] (openSUSE)
+\f[V]mxlinux\f[R] (MX Linux)
.IP \[bu] 2
-\f[C]oraclelinux\f[R] (Oracle Linux)
+\f[V]netboot\f[R] (netboot.xyz)
.IP \[bu] 2
-\f[C]popos\f[R] (Pop!_OS)
+\f[V]netbsd\f[R] (NetBSD)
.IP \[bu] 2
-\f[C]regolith\f[R] (Regolith Linux)
+\f[V]nixos\f[R] (NixOS)
.IP \[bu] 2
-\f[C]rockylinux\f[R] (Rocky Linux)
+\f[V]openbsd\f[R] (OpenBSD)
.IP \[bu] 2
-\f[C]slackware\f[R] (Slackware)
+\f[V]opensuse\f[R] (openSUSE)
.IP \[bu] 2
-\f[C]solus\f[R] (Solus)
+\f[V]oraclelinux\f[R] (Oracle Linux)
.IP \[bu] 2
-\f[C]tails\f[R] (Tails)
+\f[V]popos\f[R] (Pop!_OS)
.IP \[bu] 2
-\f[C]void\f[R] (Void Linux)
+\f[V]reactos\f[R] (ReactOS)
.IP \[bu] 2
-\f[C]zorin\f[R] (Zorin OS)
+\f[V]regolith\f[R] (Regolith Linux)
+.IP \[bu] 2
+\f[V]rockylinux\f[R] (Rocky Linux)
+.IP \[bu] 2
+\f[V]slackware\f[R] (Slackware)
+.IP \[bu] 2
+\f[V]solus\f[R] (Solus)
+.IP \[bu] 2
+\f[V]tails\f[R] (Tails)
+.IP \[bu] 2
+\f[V]void\f[R] (Void Linux)
+.IP \[bu] 2
+\f[V]zorin\f[R] (Zorin OS)
.PP
Or you can download a Linux image and manually create a VM
configuration.
@@ -177,7 +203,7 @@ configuration.
Download a .iso image of a Linux distribution
.IP \[bu] 2
Create a VM configuration file; for example
-\f[C]debian-bullseye.conf\f[R]
+\f[V]debian-bullseye.conf\f[R]
.IP
.nf
\f[C]
@@ -187,7 +213,7 @@ iso=\[dq]debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso\[dq]
\f[R]
.fi
.IP \[bu] 2
-Use \f[C]quickemu\f[R] to start the virtual machine:
+Use \f[V]quickemu\f[R] to start the virtual machine:
.IP
.nf
\f[C]
@@ -200,15 +226,15 @@ Complete the installation as normal.
Post-install:
.RS 2
.IP \[bu] 2
-Install the SPICE agent (\f[C]spice-vdagent\f[R]) to enable copy/paste
+Install the SPICE agent (\f[V]spice-vdagent\f[R]) to enable copy/paste
and USB redirection.
.IP \[bu] 2
-Install the SPICE WebDAV agent (\f[C]spice-webdavd\f[R]) to enable file
+Install the SPICE WebDAV agent (\f[V]spice-webdavd\f[R]) to enable file
sharing.
.RE
.SS macOS Guest
.PP
-\f[C]quickget\f[R] automatically downloads a macOS recovery image and
+\f[V]quickget\f[R] automatically downloads a macOS recovery image and
creates a virtual machine configuration.
.IP
.nf
@@ -218,8 +244,8 @@ quickemu --vm macos-catalina.conf
\f[R]
.fi
.PP
-macOS \f[C]high-sierra\f[R], \f[C]mojave\f[R], \f[C]catalina\f[R],
-\f[C]big-sur\f[R] and \f[C]monterey\f[R] are supported.
+macOS \f[V]high-sierra\f[R], \f[V]mojave\f[R], \f[V]catalina\f[R],
+\f[V]big-sur\f[R] and \f[V]monterey\f[R] are supported.
.IP \[bu] 2
Use cursor keys and enter key to select the \f[B]macOS Base System\f[R]
.IP \[bu] 2
@@ -232,19 +258,19 @@ Click \f[B]Disk Utility\f[R] and \f[B]Continue\f[R]
On macOS Catalina, Big Sur & Monterey
.RS 2
.IP \[bu] 2
-Select \f[C]Apple Inc. VirtIO Block Media\f[R] from the list and click
+Select \f[V]Apple Inc. VirtIO Block Media\f[R] from the list and click
\f[B]Erase\f[R].
.RE
.IP \[bu] 2
On macOS Mojave and High Sierra
.RS 2
.IP \[bu] 2
-Select \f[C]QEMU HARDDISK Media\f[R] (\[ti]103.08GB) from the list and
+Select \f[V]QEMU HARDDISK Media\f[R] (\[ti]103.08GB) from the list and
click \f[B]Erase\f[R].
.RE
.RE
.IP \[bu] 2
-Enter a \f[C]Name:\f[R] for the disk and click \f[B]Erase\f[R].
+Enter a \f[V]Name:\f[R] for the disk and click \f[B]Erase\f[R].
.IP \[bu] 2
Click \f[B]Done\f[R].
.IP \[bu] 2
@@ -278,10 +304,10 @@ macos_release=\[dq]catalina\[dq]
\f[R]
.fi
.IP \[bu] 2
-\f[C]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
+\f[V]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
macOS.
.IP \[bu] 2
-\f[C]macos_release=\[dq]catalina\[dq]\f[R] instructs Quickemu to
+\f[V]macos_release=\[dq]catalina\[dq]\f[R] instructs Quickemu to
optimise for a particular macOS release.
.RS 2
.IP \[bu] 2
@@ -309,7 +335,7 @@ Big Sur
Monterey
.RE
.IP \[bu] 2
-\f[C]quickemu\f[R] will automatically download the required
+\f[V]quickemu\f[R] will automatically download the required
OpenCore (https://github.com/acidanthera/OpenCorePkg) bootloader and
OVMF firmware from OSX-KVM (https://github.com/kholia/OSX-KVM).
.IP \[bu] 2
@@ -322,11 +348,11 @@ VirtIO Block
Media (https://www.kraxel.org/blog/2019/06/macos-qemu-guest/) is used
for the system disk where supported.
.IP \[bu] 2
-VirtIO \f[C]usb-tablet\f[R] (http://philjordan.eu/osx-virt/) is used for
+VirtIO \f[V]usb-tablet\f[R] (http://philjordan.eu/osx-virt/) is used for
the mouse.
.IP \[bu] 2
-VirtIO Network (\f[C]virtio-net\f[R]) is supported and enabled on macOS
-Big Sur and newer but previous releases use \f[C]vmxnet3\f[R].
+VirtIO Network (\f[V]virtio-net\f[R]) is supported and enabled on macOS
+Big Sur and newer but previous releases use \f[V]vmxnet3\f[R].
.IP \[bu] 2
VirtIO Memory Ballooning is supported and enabled on macOS Big Sur and
newer but disabled for other support macOS releases.
@@ -342,20 +368,43 @@ XHCI (USB 3.0) on macOS Big Sur and newer.
.IP \[bu] 2
Display resolution can only be changed via macOS System Preferences.
.IP \[bu] 2
-Full Duplex audio works on macOS High Sierra, Mojave and Catalina.
-.RS 2
+\f[B]Full Duplex audio requires VoodooHDA
+OC (https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
+audio-device to the macOS guest VM\f[R].
.IP \[bu] 2
-\f[B]macOS Big Sur and Monterey have no audio at all\f[R].
-.RE
+NOTE!
+Gatekeeper (https://disable-gatekeeper.github.io/) and System Integrity
+Protection
+(SIP) (https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
+need to be disabled to install VoodooHDA OC
.IP \[bu] 2
File sharing between guest and host is available via
virtio-9p (https://wiki.qemu.org/Documentation/9psetup) and SPICE
webdavd (https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
.IP \[bu] 2
Copy/paste via SPICE agent is \f[B]not available on macOS\f[R].
+.SS macOS App Store
+.PP
+If you see \f[I]\[lq]Your device or computer could not be
+verified\[rq]\f[R] when you try to login to the App Store, make sure
+that your wired ethernet device is \f[V]en0\f[R].
+Use \f[V]ifconfig\f[R] in a terminal to verify this.
+.PP
+If the wired ethernet device is not \f[V]en0\f[R], then then go to
+\f[I]System Preferences\f[R] -> \f[I]Network\f[R], delete all the
+network devices and apply the changes.
+Next, open a terminal and run the following:
+.IP
+.nf
+\f[C]
+sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
+\f[R]
+.fi
+.PP
+Now reboot, and the App Store should work.
.SS Windows 8.1, 10 & 11 Guests
.PP
-\f[C]quickget\f[R] can automatically download Windows 8.1, Windows
+\f[V]quickget\f[R] can automatically download Windows 8.1, Windows
10 (https://www.microsoft.com/en-gb/software-download/windows10ISO) and
Windows 11 (https://www.microsoft.com/en-gb/software-download/windows11)
along with the VirtIO drivers for
@@ -372,9 +421,18 @@ quickemu --vm windows-11.conf
Complete the installation as you normally would.
.IP \[bu] 2
All relevant drivers and services should be installed automatically.
+.IP \[bu] 2
+A local adminstrator user account is automatically created, with these
+credentials:
+.RS 2
+.IP \[bu] 2
+Username: \f[V]Quickemu\f[R]
+.IP \[bu] 2
+Password: \f[V]quickemu\f[R]
+.RE
.SS Regional versions
.PP
-By default \f[C]quickget\f[R] will download the \f[I]\[lq]English
+By default \f[V]quickget\f[R] will download the \f[I]\[lq]English
International\[rq]\f[R] release, but you can optionally specify one of
the supported languages: For example:
.IP
@@ -393,17 +451,18 @@ disk_img=\[dq]windows-11/disk.qcow2\[dq]
iso=\[dq]windows-11/Win11_EnglishInternational_x64.iso\[dq]
fixed_iso=\[dq]windows-11/virtio-win.iso\[dq]
tpm=\[dq]on\[dq]
+secureboot=\[dq]on\[dq]
\f[R]
.fi
.IP \[bu] 2
-\f[C]guest_os=\[dq]windows\[dq]\f[R] instructs \f[C]quickemu\f[R] to
+\f[V]guest_os=\[dq]windows\[dq]\f[R] instructs \f[V]quickemu\f[R] to
optimise for Windows.
.IP \[bu] 2
-\f[C]fixed_iso=\f[R] specifies the ISO image that provides VirtIO
+\f[V]fixed_iso=\f[R] specifies the ISO image that provides VirtIO
drivers.
.IP \[bu] 2
-\f[C]tpm=\[dq]on\[dq]\f[R] instructs \f[C]quickemu\f[R] to create a
-software emulated TPM device using \f[C]swtpm\f[R].
+\f[V]tpm=\[dq]on\[dq]\f[R] instructs \f[V]quickemu\f[R] to create a
+software emulated TPM device using \f[V]swtpm\f[R].
.SH AUTHORS
.PP
Written by Martin Wimpress.
diff --git a/docs/quickget.1.md b/docs/quickget.1.md
index fa7939b..a3693f9 100644
--- a/docs/quickget.1.md
+++ b/docs/quickget.1.md
@@ -1,35 +1,31 @@
---
author: Martin Wimpress
-date: 'February 20, 2022'
+date: September 1, 2022
footer: quickget
header: Quickget User Manual
section: 1
title: QUICKGET
---
-NAME
-====
+# NAME
quickget - download and prepare materials for building a quickemu VM
-SYNOPSIS
-========
+# SYNOPSIS
**quickget** \[*os*\] \[*release*\] \[*edition*\] \| \[*OPTION*\]\*
-DESCRIPTION
-===========
+# DESCRIPTION
**quickget** will download the requisite materials and prepare a
configuration for `quickemu` to use to build and run
-OPTIONS
-=======
+# OPTIONS
**version \| -version \| --version**
: show version (from Quickemu)
-**list \| list\_csv \| list\_json**
+**list \| list_csv \| list_json**
: provide a csv list of all supported guest OSes, versions and
variants.
@@ -39,18 +35,16 @@ OPTIONS
script will exit. Editions may not apply and will be defaulted if
not provided.
-NOTES
-=====
+# NOTES
-Ubuntu Guest
-------------
+## Ubuntu Guest
`quickget` will automatically download an Ubuntu release and create the
virtual machine configuration.
-``` {.bash}
-quickget ubuntu 20.04
-quickemu --vm ubuntu-20.04.conf
+``` bash
+quickget ubuntu 22.04
+quickemu --vm ubuntu-22.04.conf
```
- Complete the installation as normal.
@@ -67,7 +61,7 @@ quickemu --vm ubuntu-20.04.conf
`quickget` can also download/refresh devel images via `zsync` for Ubuntu
developers and testers.
-``` {.bash}
+``` bash
quickget ubuntu devel
quickemu --vm ubuntu-devel.conf
```
@@ -90,8 +84,7 @@ with your preferred flavour.
- `ubuntu` (Ubuntu)
- `xubuntu` (Xubuntu)
-Other Operating Systems
------------------------
+## Other Operating Systems
`quickget` also supports:
@@ -100,11 +93,15 @@ Other Operating Systems
- `android` (Android x86)
- `archlinux` (Arch Linux)
- `arcolinux` (Arco Linux)
+- `batocera` (Batocera)
- `cachyos` (CachyOS)
+- `centos-stream` (CentOS Stream)
- `debian` (Debian)
+- `deepin` (Deepin)
- `devuan` (Devuan)
- `dragonflybsd` (DragonFlyBSD)
- `elementary` (elementary OS)
+- `endeavouros` (EndeavourOS)
- `fedora` (Fedora)
- `freebsd` (FreeBSD)
- `freedos` (FreeDOS)
@@ -116,6 +113,7 @@ Other Operating Systems
- `kdeneon` (KDE Neon)
- `kolibrios` (KolibriOS)
- `linuxmint` (Linux Mint)
+- `lmde` (Linux Mint Debian Edition)
- `manjaro` (Manjaro)
- `mxlinux` (MX Linux)
- `netboot` (netboot.xyz)
@@ -125,6 +123,7 @@ Other Operating Systems
- `opensuse` (openSUSE)
- `oraclelinux` (Oracle Linux)
- `popos` (Pop!\_OS)
+- `reactos` (ReactOS)
- `regolith` (Regolith Linux)
- `rockylinux` (Rocky Linux)
- `slackware` (Slackware)
@@ -139,7 +138,7 @@ configuration.
- Download a .iso image of a Linux distribution
- Create a VM configuration file; for example `debian-bullseye.conf`
-``` {.bash}
+``` bash
guest_os="linux"
disk_img="debian-bullseye/disk.qcow2"
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
@@ -147,7 +146,7 @@ iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
- Use `quickemu` to start the virtual machine:
-``` {.bash}
+``` bash
quickemu --vm debian-bullseye.conf
```
@@ -158,13 +157,12 @@ quickemu --vm debian-bullseye.conf
- Install the SPICE WebDAV agent (`spice-webdavd`) to enable file
sharing.
-macOS Guest
------------
+## macOS Guest
`quickget` automatically downloads a macOS recovery image and creates a
virtual machine configuration.
-``` {.bash}
+``` bash
quickget macos catalina
quickemu --vm macos-catalina.conf
```
@@ -194,7 +192,7 @@ supported.
The default macOS configuration looks like this:
-``` {.bash}
+``` bash
guest_os="macos"
img="macos-catalina/RecoveryImage.img"
disk_img="macos-catalina/disk.qcow2"
@@ -238,15 +236,35 @@ There are some considerations when running macOS via Quickemu.
- UHCI (USB 2.0) on macOS Catalina and earlier.
- XHCI (USB 3.0) on macOS Big Sur and newer.
- Display resolution can only be changed via macOS System Preferences.
-- Full Duplex audio works on macOS High Sierra, Mojave and Catalina.
- - **macOS Big Sur and Monterey have no audio at all**.
+- **Full Duplex audio requires [VoodooHDA
+ OC](https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
+ audio-device to the macOS guest VM**.
+- NOTE! [Gatekeeper](https://disable-gatekeeper.github.io/) and
+ [System Integrity Protection
+ (SIP)](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
+ need to be disabled to install VoodooHDA OC
- File sharing between guest and host is available via
[virtio-9p](https://wiki.qemu.org/Documentation/9psetup) and [SPICE
webdavd](https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
- Copy/paste via SPICE agent is **not available on macOS**.
-Windows 8.1, 10 & 11 Guests
----------------------------
+### macOS App Store
+
+If you see *"Your device or computer could not be verified"* when you
+try to login to the App Store, make sure that your wired ethernet device
+is `en0`. Use `ifconfig` in a terminal to verify this.
+
+If the wired ethernet device is not `en0`, then then go to *System
+Preferences* -\> *Network*, delete all the network devices and apply the
+changes. Next, open a terminal and run the following:
+
+``` bash
+sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
+```
+
+Now reboot, and the App Store should work.
+
+## Windows 8.1, 10 & 11 Guests
`quickget` can automatically download Windows 8.1, [Windows
10](https://www.microsoft.com/en-gb/software-download/windows10ISO) and
@@ -256,13 +274,17 @@ with the [VirtIO drivers for
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)
and creates a virtual machine configuration.
-``` {.bash}
+``` bash
quickget windows 11
quickemu --vm windows-11.conf
```
- Complete the installation as you normally would.
- All relevant drivers and services should be installed automatically.
+- A local adminstrator user account is automatically created, with
+ these credentials:
+ - Username: `Quickemu`
+ - Password: `quickemu`
### Regional versions
@@ -270,18 +292,19 @@ By default `quickget` will download the *"English International"*
release, but you can optionally specify one of the supported languages:
For example:
-``` {.bash}
+``` bash
quickget windows 11 "Chinese (Traditional)"
```
The default Windows 11 configuration looks like this:
-``` {.bash}
+``` bash
guest_os="windows"
disk_img="windows-11/disk.qcow2"
iso="windows-11/Win11_EnglishInternational_x64.iso"
fixed_iso="windows-11/virtio-win.iso"
tpm="on"
+secureboot="on"
```
- `guest_os="windows"` instructs `quickemu` to optimise for Windows.
@@ -289,20 +312,17 @@ tpm="on"
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
device using `swtpm`.
-AUTHORS
-=======
+# AUTHORS
Written by Martin Wimpress.
-BUGS
-====
+# BUGS
Submit bug reports online at:
-SEE ALSO
-========
+# SEE ALSO
Full sources at:
-quickemu(1), quickemu\_conf(1), quickgui(1)
+quickemu(1), quickemu_conf(1), quickgui(1)
diff --git a/quickemu b/quickemu
index f97feb4..2fa4277 100755
--- a/quickemu
+++ b/quickemu
@@ -162,7 +162,10 @@ function enable_usb_passthrough() {
USB_BUS=$(lsusb -d "${VENDOR_ID}:${PRODUCT_ID}" | cut -d' ' -f2)
USB_DEV=$(lsusb -d "${VENDOR_ID}:${PRODUCT_ID}" | cut -d' ' -f4 | cut -d':' -f1)
USB_NAME=$(lsusb -d "${VENDOR_ID}:${PRODUCT_ID}" | cut -d' ' -f7-)
- if [ -w "/dev/bus/usb/${USB_BUS}/${USB_DEV}" ]; then
+ if [ -z "${USB_NAME}" ]; then
+ echo " ! USB device ${VENDOR_ID}:${PRODUCT_ID} not found. Check your configuration"
+ continue
+ elif [ -w "/dev/bus/usb/${USB_BUS}/${USB_DEV}" ]; then
echo " o ${USB_NAME} on bus ${USB_BUS} device ${USB_DEV} is accessible."
else
echo " x ${USB_NAME} on bus ${USB_BUS} device ${USB_DEV} needs permission changes:"
@@ -173,7 +176,7 @@ function enable_usb_passthrough() {
done
if [ "${USB_NOT_READY}" -eq 1 ]; then
- echo " ERROR! USB permission changes are required 👆"
+ echo " ERROR! USB permission changes are required 👆"
exit 1
fi
fi
@@ -212,7 +215,7 @@ function vm_boot() {
local DISK_USED=""
local DISPLAY_DEVICE=""
local DISPLAY_RENDER=""
- local EFI_CODE=""
+ local EFI_CODE="${EFI_CODE}"
local EFI_VARS=""
local GUEST_CPU_CORES=""
local GUEST_CPU_LOGICAL_CORES=""
@@ -221,21 +224,20 @@ function vm_boot() {
local HOST_CPU_SMT=""
local HOST_CPU_SOCKETS=""
local HOST_CPU_VENDOR=""
- local GL="on"
local GUEST_TWEAKS=""
local KERNEL_NAME="Unknown"
local KERNEL_NODE=""
local KERNEL_VER="?"
local LSB_DESCRIPTION="Unknown OS"
- local MACHINE_TYPE="q35"
+ local MACHINE_TYPE="${MACHINE_TYPE:-q35}"
local MAC_BOOTLOADER=""
local MAC_MISSING=""
- local MAC_DISK_DEV="ide-hd,bus=ahci.2"
- local MOUSE="usb-tablet"
- local NET_DEVICE="virtio-net"
+ local MAC_DISK_DEV="${MAC_DISK_DEV:-ide-hd,bus=ahci.2}"
+ local NET_DEVICE="${NET_DEVICE:-virtio-net}"
local OSK=""
- local SMM="off"
+ local SMM="${SMM:-off}"
local USB_HOST_PASSTHROUGH_CONTROLLER="qemu-xhci"
+ local VGA=""
local VIDEO=""
KERNEL_NAME=$(uname --kernel-name)
@@ -338,6 +340,11 @@ function vm_boot() {
boot=${boot,,}
guest_os=${guest_os,,}
+ if [ "${guest_os}" == "macos" ] || [ "${guest_os}" == "windows" ]; then
+ # Display MSRs alert if the guest is macOS or windows
+ ignore_msrs_alert
+ fi
+
# Always Boot macOS using EFI
if [ "${guest_os}" == "macos" ]; then
boot="efi"
@@ -381,61 +388,59 @@ function vm_boot() {
# does not support SMM.
# https://bugzilla.redhat.com/show_bug.cgi?id=1929357#c5
- case ${secureboot} in
- on)
- if [ -e "/usr/share/OVMF/OVMF_CODE_4M.secboot.fd" ]; then
- EFI_CODE="/usr/share/OVMF/OVMF_CODE_4M.secboot.fd"
- efi_vars "/usr/share/OVMF/OVMF_VARS_4M.fd" "${EFI_VARS}"
- elif [ -e "/usr/share/edk2/ovmf/OVMF_CODE.secboot.fd" ]; then
- EFI_CODE="/usr/share/edk2/ovmf/OVMF_CODE.secboot.fd"
- efi_vars "/usr/share/edk2/ovmf/OVMF_VARS.fd" "${EFI_VARS}"
- elif [ -e "/usr/share/OVMF/x64/OVMF_CODE.secboot.fd" ]; then
- EFI_CODE="/usr/share/OVMF/x64/OVMF_CODE.secboot.fd"
- efi_vars "/usr/share/OVMF/x64/OVMF_VARS.fd" "${EFI_VARS}"
- elif [ -e "/usr/share/edk2-ovmf/OVMF_CODE.secboot.fd" ]; then
- EFI_CODE="/usr/share/edk2-ovmf/OVMF_CODE.secboot.fd"
- efi_vars "/usr/share/edk2-ovmf/OVMF_VARS.fd" "${EFI_VARS}"
- elif [ -e "/usr/share/qemu/ovmf-x86_64-smm-ms-code.bin" ]; then
- EFI_CODE="/usr/share/qemu/ovmf-x86_64-smm-ms-code.bin"
- efi_vars "/usr/share/qemu/ovmf-x86_64-smm-ms-vars.bin" "${EFI_VARS}"
- elif [ -e "/usr/share/qemu/edk2-x86_64-secure-code.fd" ]; then
- EFI_CODE="/usr/share/qemu/edk2-x86_64-secure-code.fd"
- efi_vars "/usr/share/qemu/edk2-x86_64-code.fd" "${EFI_VARS}"
- else
- echo "ERROR! SecureBoot was requested but no SecureBoot capable firmware was found."
- echo " Please install OVMF firmware."
- exit 1
+ if [ -n "${EFI_CODE}" ] || [ ! -e "${EFI_CODE}" ]; then
+ case ${secureboot} in
+ on)
+ ovmfs=("/usr/share/OVMF/OVMF_CODE_4M.secboot.fd","/usr/share/OVMF/OVMF_VARS_4M.fd" \
+ "/usr/share/edk2/ovmf/OVMF_CODE.secboot.fd","/usr/share/edk2/ovmf/OVMF_VARS.fd" \
+ "/usr/share/OVMF/x64/OVMF_CODE.secboot.fd","/usr/share/OVMF/x64/OVMF_VARS.fd" \
+ "/usr/share/edk2-ovmf/OVMF_CODE.secboot.fd","/usr/share/edk2-ovmf/OVMF_VARS.fd" \
+ "/usr/share/qemu/ovmf-x86_64-smm-ms-code.bin","/usr/share/qemu/ovmf-x86_64-smm-ms-vars.bin" \
+ "/usr/share/qemu/edk2-x86_64-secure-code.fd","/usr/share/qemu/edk2-x86_64-code.fd" \
+ "/usr/share/edk2-ovmf/x64/OVMF_CODE.secboot.fd","/usr/share/edk2-ovmf/x64/OVMF_VARS.fd"
+ )
+ ;;
+ *)
+ ovmfs=("/usr/share/OVMF/OVMF_CODE_4M.fd","/usr/share/OVMF/OVMF_VARS_4M.fd" \
+ "/usr/share/edk2/ovmf/OVMF_CODE.fd","/usr/share/edk2/ovmf/OVMF_VARS.fd" \
+ "/usr/share/OVMF/OVMF_CODE.fd","/usr/share/OVMF/OVMF_VARS.fd" \
+ "/usr/share/OVMF/x64/OVMF_CODE.fd","/usr/share/OVMF/x64/OVMF_VARS.fd" \
+ "/usr/share/edk2-ovmf/OVMF_CODE.fd","/usr/share/edk2-ovmf/OVMF_VARS.fd" \
+ "/usr/share/qemu/ovmf-x86_64-4m-code.bin","/usr/share/qemu/ovmf-x86_64-4m-vars.bin" \
+ "/usr/share/qemu/edk2-x86_64-code.fd","/usr/share/qemu/edk2-x86_64-code.fd" \
+ "/usr/share/edk2-ovmf/x64/OVMF_CODE.fd","/usr/share/edk2-ovmf/x64/OVMF_VARS.fd"
+ )
+ ;;
+ esac
+ # Attempt each EFI_CODE file one by one, selecting the corresponding code and vars
+ # when an existing file is found.
+ _IFS=$IFS
+ IFS=","
+ for f in "${ovmfs[@]}"; do
+ set -- $f;
+ if [ -e "${1}" ]; then
+ EFI_CODE="${1}"
+ EFI_EXTRA_VARS="${2}"
fi
- ;;
- *)
- if [ -e "/usr/share/OVMF/OVMF_CODE_4M.fd" ]; then
- EFI_CODE="/usr/share/OVMF/OVMF_CODE_4M.fd"
- efi_vars "/usr/share/OVMF/OVMF_VARS_4M.fd" "${EFI_VARS}"
- elif [ -e "/usr/share/edk2/ovmf/OVMF_CODE.fd" ]; then
- EFI_CODE="/usr/share/edk2/ovmf/OVMF_CODE.fd"
- efi_vars "/usr/share/edk2/ovmf/OVMF_VARS.fd" "${EFI_VARS}"
- elif [ -e "/usr/share/OVMF/OVMF_CODE.fd" ]; then
- EFI_CODE="/usr/share/OVMF/OVMF_CODE.fd"
- efi_vars "/usr/share/OVMF/OVMF_VARS.fd" "${EFI_VARS}"
- elif [ -e "/usr/share/OVMF/x64/OVMF_CODE.fd" ]; then
- EFI_CODE="/usr/share/OVMF/x64/OVMF_CODE.fd"
- efi_vars "/usr/share/OVMF/x64/OVMF_VARS.fd" "${EFI_VARS}"
- elif [ -e "/usr/share/edk2-ovmf/OVMF_CODE.fd" ]; then
- EFI_CODE="/usr/share/edk2-ovmf/OVMF_CODE.fd"
- efi_vars "/usr/share/edk2-ovmf/OVMF_VARS.fd" "${EFI_VARS}"
- elif [ -e "/usr/share/qemu/ovmf-x86_64-4m-code.bin" ]; then
- EFI_CODE="/usr/share/qemu/ovmf-x86_64-4m-code.bin"
- efi_vars "/usr/share/qemu/ovmf-x86_64-4m-vars.bin" "${EFI_VARS}"
- elif [ -e "/usr/share/qemu/edk2-x86_64-code.fd" ]; then
- EFI_CODE="/usr/share/qemu/edk2-x86_64-code.fd"
- efi_vars "/usr/share/qemu/edk2-x86_64-code.fd" "${EFI_VARS}"
- else
- echo "ERROR! EFI boot requested but no EFI firmware found."
- echo " Please install OVMF firmware."
- exit 1
- fi
- ;;
- esac
+ done
+ IFS=$_IFS
+ fi
+ if [ -z "${EFI_CODE}" ] || [ ! -e "${EFI_CODE}" ]; then
+ if [ "$secureboot" == "on" ]; then
+ echo "ERROR! SecureBoot was requested but no SecureBoot capable firmware was found."
+ else
+ echo "ERROR! EFI boot requested but no EFI firmware found."
+ fi
+ echo " Please install OVMF firmware."
+ exit 1
+ fi
+ if [ ! -z "${EFI_EXTRA_VARS}" ]; then
+ if [ ! -e "${EFI_EXTRA_VARS}" ]; then
+ echo " - EFI: ERROR! EFI_EXTRA_VARS file ${EFI_EXTRA_VARS} does not exist."
+ exit 1
+ fi
+ efi_vars "${EFI_EXTRA_VARS}" "${EFI_VARS}"
+ fi
# Make sure EFI_VARS references an actual, writeable, file
if [ ! -f "${EFI_VARS}" ] || [ ! -w "${EFI_VARS}" ]; then
@@ -463,15 +468,15 @@ function vm_boot() {
# Make any OS specific adjustments
case ${guest_os} in
- *bsd|haiku|freedos|linux)
+ batocera|*bsd|freedos|haiku|linux)
CPU="-cpu host,kvm=on"
if [ "${HOST_CPU_VENDOR}" == "AuthenticAMD" ]; then
CPU="${CPU},topoext"
fi
if [ "${guest_os}" == "freebsd" ] || [ "${guest_os}" == "ghostbsd" ]; then
- MOUSE="usb-mouse"
- elif [ "${guest_os}" == "haiku" ] || [ "${guest_os}" == "freedos" ]; then
+ MOUSE="usb"
+ elif [ "${guest_os}" == "batocera" ] || [ "${guest_os}" == "freedos" ] || [ "${guest_os}" == "haiku" ]; then
MACHINE_TYPE="pc"
NET_DEVICE="rtl8139"
fi
@@ -481,7 +486,6 @@ function vm_boot() {
SMM="on"
fi
-
if [ -z "${disk_size}" ]; then
disk_size="16G"
fi
@@ -501,24 +505,38 @@ function vm_boot() {
CPU="${CPU},topoext"
fi
MACHINE_TYPE="pc"
- NET_DEVICE="rtl8139"
+ case ${guest_os} in
+ kolibrios) NET_DEVICE="rtl8139";;
+ reactos)
+ NET_DEVICE="e1000"
+ KEYBOARD="ps2"
+ ;;
+ esac
;;
macos)
#https://www.nicksherlock.com/2020/06/installing-macos-big-sur-on-proxmox/
# A CPU with SSE4.1 support is required for >= macOS Sierra
- if check_cpu_flag sse4_1; then
- case ${HOST_CPU_VENDOR} in
- GenuineIntel)
- CPU="-cpu host,kvm=on,vendor=GenuineIntel,+hypervisor,+invtsc,+kvm_pv_eoi,+kvm_pv_unhalt";;
- AuthenticAMD|*)
+ # A CPU with AVX2 support is required for >= macOS Ventura
+ case ${macos_release} in
+ ventura)
+ if check_cpu_flag sse4_1 && check_cpu_flag avx2; then
+ CPU="-cpu Haswell,kvm=on,vendor=GenuineIntel,+hypervisor,+invtsc,+kvm_pv_eoi,+kvm_pv_unhalt"
+ else
+ echo "ERROR! macOS ${macos_release} requires a CPU with SSE 4.1 and AVX2 support."
+ exit 1
+ fi
+ ;;
+ *)
+ if check_cpu_flag sse4_1; then
# Used in past versions: +movbe,+smep,+xgetbv1,+xsavec,+avx2
# Warn on AMD: +fma4,+pcid
- CPU="-cpu Penryn,kvm=on,vendor=GenuineIntel,+aes,+avx,+bmi1,+bmi2,+fma,+hypervisor,+invtsc,+kvm_pv_eoi,+kvm_pv_unhalt,+popcnt,+ssse3,+sse4.2,vmware-cpuid-freq=on,+xsave,+xsaveopt,check";;
- esac
- else
- echo "ERROR! macOS requires a CPU with SSE 4.1 support."
- exit 1
- fi
+ CPU="-cpu Penryn,kvm=on,vendor=GenuineIntel,+aes,+avx,+bmi1,+bmi2,+fma,+hypervisor,+invtsc,+kvm_pv_eoi,+kvm_pv_unhalt,+popcnt,+ssse3,+sse4.2,vmware-cpuid-freq=on,+xsave,+xsaveopt,check"
+ else
+ echo "ERROR! macOS ${macos_release} requires a CPU with SSE 4.1 support."
+ exit 1
+ fi
+ ;;
+ esac
OSK=$(echo "bheuneqjbexolgurfrjbeqfthneqrqcyrnfrqbagfgrny(p)NccyrPbzchgreVap" | tr 'A-Za-z' 'N-ZA-Mn-za-m')
# Disable S3 support in the VM to prevent macOS suspending during install
@@ -537,7 +555,7 @@ function vm_boot() {
NET_DEVICE="vmxnet3"
USB_HOST_PASSTHROUGH_CONTROLLER="usb-ehci"
;;
- big-sur|monterey)
+ big-sur|monterey|ventura)
BALLOON="-device virtio-balloon"
MAC_DISK_DEV="virtio-blk-pci"
NET_DEVICE="virtio-net"
@@ -637,11 +655,6 @@ function vm_boot() {
img=""
fi
- if [ "${guest_os}" == "macos" ] || [ "${guest_os}" == "windows" ]; then
- # Display MSRs alert if the guest is macOS
- ignore_msrs_alert
- fi
-
# Has the status quo been requested?
if [ "${STATUS_QUO}" == "-snapshot" ]; then
if [ -z "${img}" ] && [ -z "${iso}" ]; then
@@ -661,8 +674,9 @@ function vm_boot() {
# Setup the appropriate audio device based on the display output
case ${OUTPUT} in
- spice|spice-app|none) AUDIO_DEV="spice,id=audio0";;
- *) AUDIO_DEV="pa,id=audio0,out.mixing-engine=off,out.stream-name=${LAUNCHER}-${VMNAME},in.stream-name=${LAUNCHER}-${VMNAME}";;
+ none|spice|spice-app) AUDIO_DEV="spice,id=audio0";;
+ sdl) AUDIO_DEV="sdl,id=audio0";;
+ *) AUDIO_DEV="pa,id=audio0";;
esac
# Determine a sane resolution for Linux guests.
@@ -703,48 +717,45 @@ function vm_boot() {
# https://www.kraxel.org/blog/2019/09/display-devices-in-qemu/
if [ "${guest_os}" == "linux" ]; then
case ${OUTPUT} in
- none|spice) DISPLAY_DEVICE="qxl-vga";;
- *) DISPLAY_DEVICE="virtio-vga";;
+ none|spice|spice-app)
+ DISPLAY_DEVICE="virtio-gpu";;
+ *)
+ DISPLAY_DEVICE="virtio-vga";;
esac
elif [ "${guest_os}" == "macos" ]; then
- # Displays in System Preferences can be used to select a resolution if:
- # - Mojave only offers 4:3 resolutions
- # - High Sierra will run at the default 1920x1080 only.
- # QXL prevents seamless mouse working with a SPICE client
- # - https://github.com/wimpysworld/quickemu/issues/222
- DISPLAY_DEVICE="VGA"
- elif [ "${guest_os}" == "windows" ]; then
+ # qxl-vga supports seamless mouse and sane resolutions if only one scanout
+ # is used. Which is whay '-vga none' is added to the QEMU command line.
DISPLAY_DEVICE="qxl-vga"
+ elif [ "${guest_os}" == "windows" ]; then
+ case ${OUTPUT} in
+ # virtio-gpu "works" with gtk but is limited to 1024x1024 and exhibits other issues.
+ # https://kevinlocke.name/bits/2021/12/10/windows-11-guest-virtio-libvirt/#video
+ gtk|none|spice) DISPLAY_DEVICE="qxl-vga";;
+ sdl|spice-app) DISPLAY_DEVICE="virtio-vga";;
+ esac
else
DISPLAY_DEVICE="qxl-vga"
fi
- echo -n " - Display: ${OUTPUT^^}, ${DISPLAY_DEVICE}"
-
# Map Quickemu OUTPUT to QEMU -display
case ${OUTPUT} in
- gtk)
- DISPLAY_RENDER="${OUTPUT},grab-on-hover=on,zoom-to-fit=off"
- # GL is not working with GTK and virtio-vga
- if [ "${DISPLAY_DEVICE}" == "virtio-vga" ]; then
- GL="off"
- fi
- ;;
- none|spice)
- DISPLAY_RENDER="none";;
- *)
- DISPLAY_RENDER="${OUTPUT},gl=${GL}";;
+ gtk) DISPLAY_RENDER="${OUTPUT},grab-on-hover=on,zoom-to-fit=off,gl=${gl}";;
+ none|spice) DISPLAY_RENDER="none";;
+ sdl) DISPLAY_RENDER="${OUTPUT},gl=${gl}";;
+ spice-app) DISPLAY_RENDER="${OUTPUT},gl=${gl}";;
+ *) DISPLAY_RENDER="${OUTPUT}";;
esac
- if [ "${GL}" == "on" ] && [[ "${DISPLAY_DEVICE}" == *"virtio"* ]]; then
+ # https://www.kraxel.org/blog/2021/05/virtio-gpu-qemu-graphics-update/
+ if [ "${gl}" == "on" ] && [ "${DISPLAY_DEVICE}" == "virtio-vga" ]; then
if [ "${QEMU_VER_SHORT}" -ge 61 ]; then
DISPLAY_DEVICE="${DISPLAY_DEVICE}-gl"
else
DISPLAY_DEVICE="${DISPLAY_DEVICE},virgl=on"
fi
- echo ", GL (${GL}), VirGL (on)"
+ echo " - Display: ${OUTPUT^^}, ${DISPLAY_DEVICE}, GL (${gl}), VirGL (on)"
else
- echo ", GL (${GL}), VirGL (off)"
+ echo " - Display: ${OUTPUT^^}, ${DISPLAY_DEVICE}, GL (${gl}), VirGL (off)"
fi
# Build the video configuration
@@ -762,17 +773,31 @@ function vm_boot() {
ati-vga|cirrus-vga|VGA) VIDEO="${VIDEO},vgamem_mb=64";;
esac
+ # Configure multiscreen if max_outputs was provided in the .conf file
+ if [ -v max_outputs ]; then
+ VIDEO="${VIDEO},max_outputs=${max_outputs}"
+ fi
+
+ # Run QEMU with '-vga none' to avoid having two scanouts, one for VGA and
+ # another for virtio-vga-gl. This works around a GTK assertion failure and
+ # allows seamless mouse in macOS when using the qxl-vga device.
+ # https://www.collabora.com/news-and-blog/blog/2021/11/26/venus-on-qemu-enabling-new-virtual-vulkan-driver/
+ # https://github.com/quickemu-project/quickemu/issues/222
+ VGA="-vga none"
+
# Add fullscreen options
- VIDEO="${VIDEO} ${FULLSCREEN}"
+ VIDEO="${VGA} ${VIDEO} ${FULLSCREEN}"
# Set the hostname of the VM
local NET="user,hostname=${VMNAME}"
echo -n "" > "${VMDIR}/${VMNAME}.ports"
- # Find a free port to expose ssh to the guest
- local SSH_PORT=""
- SSH_PORT=$(get_port 22220 9)
+ if [ -z "${SSH_PORT}" ]; then
+ # Find a free port to expose ssh to the guest
+ SSH_PORT=$(get_port 22220 9)
+ fi
+
if [ -n "${SSH_PORT}" ]; then
echo "ssh,${SSH_PORT}" >> "${VMDIR}/${VMNAME}.ports"
NET="${NET},hostfwd=tcp::${SSH_PORT}-:22"
@@ -789,43 +814,56 @@ function vm_boot() {
GUEST_PORT=$(echo "${FORWARD}" | cut -d':' -f2)
echo " - ${HOST_PORT} => ${GUEST_PORT}"
NET="${NET},hostfwd=tcp::${HOST_PORT}-:${GUEST_PORT}"
+ NET="${NET},hostfwd=udp::${HOST_PORT}-:${GUEST_PORT}"
done
fi
- # Find a free port for spice
- local SPICE="disable-ticketing=on"
- local SPICE_PORT=""
- SPICE_PORT=$(get_port 5930 9)
- if [ -z "${SPICE_PORT}" ]; then
- echo " - SPICE: All SPICE ports have been exhausted."
- if [ "${OUTPUT}" == "none" ] || [ "${OUTPUT}" == "spice" ] || [ "${OUTPUT}" == "spice-app" ]; then
- echo " ERROR! Requested SPICE display, but no SPICE ports are free."
- exit 1
- fi
- else
+ if [ "${OUTPUT}" == "none" ] || [ "${OUTPUT}" == "spice" ] || [ "${OUTPUT}" == "spice-app" ]; then
+ local SPICE="disable-ticketing=on"
+ # gl=on can be use with 'spice' too, but only over local connections (not tcp ports)
if [ "${OUTPUT}" == "spice-app" ]; then
- echo " - SPICE: Enabled"
- else
- echo "spice,${SPICE_PORT}" >> "${VMDIR}/${VMNAME}.ports"
- echo -n " - SPICE: On host: spicy --title \"${VMNAME}\" --port ${SPICE_PORT}"
- if [ "${guest_os}" != "macos" ] && [ -n "${PUBLIC}" ]; then
- echo -n " --spice-shared-dir ${PUBLIC}"
- fi
- echo "${FULLSPICY}"
- SPICE="${SPICE},port=${SPICE_PORT}"
+ SPICE+=",gl=${gl}"
fi
- if [ -n "${PUBLIC}" ]; then
- case ${guest_os} in
- macos)
+ # TODO: Don't use ports so local-only connections can be used with gl=on
+ if [ -z "${SPICE_PORT}" ]; then
+ # Find a free port for spice
+ SPICE_PORT=$(get_port 5930 9)
+ fi
+
+ if [ -z "${SPICE_PORT}" ]; then
+ echo " - SPICE: All SPICE ports have been exhausted."
+ if [ "${OUTPUT}" == "none" ] || [ "${OUTPUT}" == "spice" ] || [ "${OUTPUT}" == "spice-app" ]; then
+ echo " ERROR! Requested SPICE display, but no SPICE ports are free."
+ exit 1
+ fi
+ else
+ if [ "${OUTPUT}" == "spice-app" ]; then
+ echo " - SPICE: Enabled"
+ else
+ echo "spice,${SPICE_PORT}" >> "${VMDIR}/${VMNAME}.ports"
+ echo -n " - SPICE: On host: spicy --title \"${VMNAME}\" --port ${SPICE_PORT}"
+ if [ "${guest_os}" != "macos" ] && [ -n "${PUBLIC}" ]; then
+ echo -n " --spice-shared-dir ${PUBLIC}"
+ fi
+ echo "${FULLSPICY}"
+ SPICE="${SPICE},port=${SPICE_PORT},addr=127.0.0.1"
+ fi
+ fi
+ fi
+
+ if [ -n "${PUBLIC}" ]; then
+ case ${guest_os} in
+ macos)
+ if [ "${OUTPUT}" == "none" ] || [ "${OUTPUT}" == "spice" ] || [ "${OUTPUT}" == "spice-app" ]; then
# Reference: https://gitlab.gnome.org/GNOME/phodav/-/issues/5
echo " - WebDAV: On guest: build spice-webdavd (https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24)"
echo " - WebDAV: On guest: Finder -> Connect to Server -> http://localhost:9843/"
- ;;
- *)
- echo " - WebDAV: On guest: dav://localhost:9843/";;
- esac
- fi
+ fi
+ ;;
+ *)
+ echo " - WebDAV: On guest: dav://localhost:9843/";;
+ esac
fi
if [ "${guest_os}" != "windows" ] && [ -n "${PUBLIC}" ]; then
@@ -878,21 +916,23 @@ function vm_boot() {
-m ${RAM_VM} ${BALLOON}
-smbios type=2,manufacturer="Quickemu Project",product="Quickemu",version="${VERSION}",serial="0xDEADBEEF",location="quickemu.com",asset="${VMNAME}"
${VIDEO} -display ${DISPLAY_RENDER}
- -device usb-ehci,id=input
- -device usb-kbd,bus=input.0
- -device ${MOUSE},bus=input.0
-audiodev ${AUDIO_DEV}
-device intel-hda -device hda-duplex,audiodev=audio0
- -rtc base=localtime,clock=host,driftfix=slew
- -spice ${SPICE}
- -device virtio-serial-pci
- -chardev socket,id=agent0,path="${VMDIR}/${VMNAME}-agent.sock",server=on,wait=off
- -device virtserialport,chardev=agent0,name=org.qemu.guest_agent.0
- -chardev spicevmc,id=vdagent0,name=vdagent
- -device virtserialport,chardev=vdagent0,name=com.redhat.spice.0
- -chardev spiceport,id=webdav0,name=org.spice-space.webdav.0
- -device virtserialport,chardev=webdav0,name=org.spice-space.webdav.0
- -device virtio-rng-pci,rng=rng0
+ -rtc base=localtime,clock=host,driftfix=slew)
+
+ # Only enable SPICE is using SPICE display
+ if [ "${OUTPUT}" == "none" ] || [ "${OUTPUT}" == "spice" ] || [ "${OUTPUT}" == "spice-app" ]; then
+ args+=(-spice ${SPICE}
+ -device virtio-serial-pci
+ -chardev socket,id=agent0,path="${VMDIR}/${VMNAME}-agent.sock",server=on,wait=off
+ -device virtserialport,chardev=agent0,name=org.qemu.guest_agent.0
+ -chardev spicevmc,id=vdagent0,name=vdagent
+ -device virtserialport,chardev=vdagent0,name=com.redhat.spice.0
+ -chardev spiceport,id=webdav0,name=org.spice-space.webdav.0
+ -device virtserialport,chardev=webdav0,name=org.spice-space.webdav.0)
+ fi
+
+ args+=(-device virtio-rng-pci,rng=rng0
-object rng-random,id=rng0,filename=/dev/urandom
-device ${USB_HOST_PASSTHROUGH_CONTROLLER},id=spicepass
-chardev spicevmc,id=usbredirchardev1,name=usbredir
@@ -905,21 +945,92 @@ function vm_boot() {
-device usb-ccid
-chardev spicevmc,id=ccid,name=smartcard
-device ccid-card-passthru,chardev=ccid
- -monitor none
- -serial mon:stdio)
+ )
+
+ # setup usb-controller
+ [ -z "${USB_CONTROLLER}" ] && USB_CONTROLLER="$usb_controller"
+ if [ "${USB_CONTROLLER}" == "ehci" ]; then
+ args+=(-device usb-ehci,id=input)
+ elif [ "${USB_CONTROLLER}" == "xhci" ]; then
+ args+=(-device qemu-xhci,id=input)
+ elif [ -z "${USB_CONTROLLER}" ] || [ "${USB_CONTROLLER}" == "none" ]; then
+ # add nothing
+ :
+ else
+ echo "WARNING! Unknown usb-controller value: '${USB_CONTROLLER}'"
+ fi
+
+ # setup keyboard
+ # @INFO: must be set after usb-controller
+ [ -z "${KEYBOARD}" ] && KEYBOARD="$keyboard"
+ if [ "${KEYBOARD}" == "usb" ]; then
+ args+=(-device usb-kbd,bus=input.0)
+ elif [ "${KEYBOARD}" == "virtio" ]; then
+ args+=(-device virtio-keyboard)
+ elif [ "${KEYBOARD}" == "ps2" ] || [ -z "${KEYBOARD}" ]; then
+ # add nothing, default is ps/2 keyboard
+ :
+ else
+ echo "WARNING! Unknown keyboard value: '${KEYBOARD}'; Fallback to ps2"
+ fi
+
+ # setup keyboard_layout
+ # @INFO: When using the VNC display, you must use the -k parameter to set the keyboard layout if you are not using en-us.
+ [ -z "${KEYBOARD_LAYOUT}" ] && KEYBOARD_LAYOUT="$keyboard_layout"
+ if [ -n "${KEYBOARD_LAYOUT}" ]; then
+ args+=(-k ${KEYBOARD_LAYOUT})
+ fi
# FIXME: Check for device availability. qemu will fail to start otherwise
if [ -n "${BRAILLE}" ]; then
- # shellcheck disable=SC2054
- args+=(-chardev braille,id=brltty
- -device usb-braille,id=usbbrl,chardev=brltty)
+ # shellcheck disable=SC2054
+ args+=(-chardev braille,id=brltty
+ -device usb-braille,id=usbbrl,chardev=brltty)
fi
- if [ -n "${bridge}" ]; then
- # Enable bridge mode networking
- # shellcheck disable=SC2054,SC2206
- args+=(-nic bridge,br=${bridge},model=virtio-net-pci)
+ # setup mouse
+ # @INFO: must be set after usb-controller
+ [ -z "${MOUSE}" ] && MOUSE="$mouse"
+ if [ "${MOUSE}" == "usb" ]; then
+ args+=(-device usb-mouse,bus=input.0)
+ elif [ "${MOUSE}" == "tablet" ]; then
+ args+=(-device usb-tablet,bus=input.0)
+ elif [ "${MOUSE}" == "virtio" ]; then
+ args+=(-device virtio-mouse)
+ elif [ "${MOUSE}" == "ps2" ] || [ -z "${MOUSE}" ]; then
+ # add nothing, default is ps/2 mouse
+ :
else
+ echo "WARNING! Unknown mouse value: '${MOUSE}; Fallback to ps2'"
+ fi
+
+ # $bridge backwards compatibility for Quickemu <= 4.0
+ if [ -n "${bridge}" ]; then
+ network="${bridge}"
+ fi
+
+ if [ "${network}" == "none" ]; then
+ # Disbale all networking
+ echo " - Network: Disabled"
+ args+=(-nic none)
+ elif [ "${network}" == "restrict" ]; then
+ echo " - Network: Restricted (${NET_DEVICE})"
+ # shellcheck disable=SC2054,SC2206
+ args+=(-device ${NET_DEVICE},netdev=nic -netdev ${NET},restrict=y,id=nic)
+ elif [ -n "${network}" ]; then
+ # Enable bridge mode networking
+ echo " - Network: Bridged (${network})"
+
+ # If a persistent MAC address is provided, use it.
+ local MAC=""
+ if [ -n "${macaddr}" ]; then
+ MAC=",mac=${macaddr}"
+ fi
+
+ # shellcheck disable=SC2054,SC2206
+ args+=(-nic bridge,br=${network},model=virtio-net-pci${MAC})
+ else
+ echo " - Network: User (${NET_DEVICE})"
# shellcheck disable=SC2054,SC2206
args+=(-device ${NET_DEVICE},netdev=nic -netdev ${NET},id=nic)
fi
@@ -933,6 +1044,27 @@ function vm_boot() {
-drive if=pflash,format=raw,unit=1,file="${EFI_VARS}")
fi
+ if [ -n "${iso}" ] && [ "${guest_os}" == "freedos" ]; then
+ # FreeDOS reboots after partitioning the disk, and QEMU tries to boot from disk after first restart
+ # This flag sets the boot order to cdrom,disk. It will persist until powering down the VM
+ args+=(-boot order=dc)
+ elif [ -n "${iso}" ] && [ "${guest_os}" == "kolibrios" ]; then
+ # Since there is bug (probably) in KolibriOS: cdrom indexes 0 or 1 make system show an extra unexisting iso, so we use index=2
+ # shellcheck disable=SC2054
+ args+=(-drive media=cdrom,index=2,file="${iso}")
+ iso=""
+ elif [ -n "${iso}" ] && [ "${guest_os}" == "reactos" ]; then
+ # https://reactos.org/wiki/QEMU
+ # shellcheck disable=SC2054
+ args+=(-boot order=d
+ -drive if=ide,index=2,media=cdrom,file="${iso}")
+ iso=""
+ elif [ -n "${iso}" ] && [ "${guest_os}" == "windows" ] && [ -e "${VMDIR}/unattended.iso" ]; then
+ # Attach the unattended configuration to Windows guests when booting from ISO
+ # shellcheck disable=SC2054
+ args+=(-drive media=cdrom,index=2,file="${VMDIR}/unattended.iso")
+ fi
+
if [ -n "${floppy}" ]; then
# shellcheck disable=SC2054
args+=(-drive if=floppy,format=raw,file="${floppy}")
@@ -948,21 +1080,6 @@ function vm_boot() {
args+=(-drive media=cdrom,index=1,file="${fixed_iso}")
fi
- if [ -n "${iso}" ] && [ "${guest_os}" == "freedos" ]; then
- # FreeDOS reboots after partitioning the disk, and QEMU tries to boot from disk after first restart
- # This flag sets the boot order to cdrom,disk. It will persist until powering down the VM
- args+=(-boot order=dc)
- elif [ -n "${iso}" ] && [ "${guest_os}" == "kolibrios" ]; then
- # Since there is bug (probably) in KolibriOS: cdrom indexes 0 or 1 make system show an extra unexisting iso, so we use index=2
- # shellcheck disable=SC2054
- args+=(-drive media=cdrom,index=2,file="${iso}")
- iso=""
- elif [ -n "${iso}" ] && [ "${guest_os}" == "windows" ] && [ -e "${VMDIR}/unattended.iso" ]; then
- # Attach the unattended configuration to Windows guests when booting from ISO
- # shellcheck disable=SC2054
- args+=(-drive media=cdrom,index=2,file="${VMDIR}/unattended.iso")
- fi
-
if [ "${guest_os}" == "macos" ]; then
# shellcheck disable=SC2054
args+=(-device ahci,id=ahci
@@ -983,6 +1100,16 @@ function vm_boot() {
args+=(-device ahci,id=ahci
-device ide-hd,bus=ahci.0,drive=SystemDisk
-drive id=SystemDisk,if=none,format=qcow2,file="${disk_img}" ${STATUS_QUO})
+ elif [ "${guest_os}" == "batocera" ] ; then
+ # shellcheck disable=SC2054,SC2206
+ args+=(-device virtio-blk-pci,drive=BootDisk
+ -drive id=BootDisk,if=none,format=raw,file="${img}"
+ -device virtio-blk-pci,drive=SystemDisk
+ -drive id=SystemDisk,if=none,format=qcow2,file="${disk_img}" ${STATUS_QUO})
+ elif [ "${guest_os}" == "reactos" ]; then
+ # https://reactos.org/wiki/QEMU
+ # shellcheck disable=SC2054,SC2206
+ args+=(-drive if=ide,index=0,media=disk,file="${disk_img}")
elif [ "${guest_os}" == "ludos" ] ; then
# shellcheck disable=SC2054,SC2206
args+=(-device virtio-blk-pci,drive=BootDisk
@@ -1016,8 +1143,87 @@ function vm_boot() {
-device tpm-tis,tpmdev=tpm0)
fi
- if [ -n "${extra_args}" ]; then
- args+=("${extra_args}")
+ if [ -z "${MONITOR}" ]; then
+ MONITOR="${monitor:-none}"
+ fi
+
+ if [ -z "${MONITOR_TELNET_HOST}" ]; then
+ MONITOR_TELNET_HOST="${monitor_telnet_host:-localhost}"
+ fi
+ if [ -z "${MONITOR_TELNET_PORT}" ]; then
+ MONITOR_TELNET_PORT="${monitor_telnet_port}"
+ fi
+ if [ -n "${MONITOR_TELNET_PORT}" ] && ! is_numeric "${MONITOR_TELNET_PORT}"; then
+ echo "ERROR: telnet-port must be a number!"
+ exit 1
+ fi
+
+ if [ "${MONITOR}" == "none" ]; then
+ args+=(-monitor none)
+ echo " - Monitor: (off)"
+ elif [ "${MONITOR}" == "telnet" ]; then
+ # Find a free port to expose monitor-telnet to the guest
+ local temp_port="$(get_port ${MONITOR_TELNET_PORT} 9)"
+ if [ -z "${temp_port}" ]; then
+ echo " - Monitor: All Monitor-Telnet ports have been exhausted."
+ else
+ MONITOR_TELNET_PORT="${temp_port}"
+ args+=(-monitor telnet:${MONITOR_TELNET_HOST}:${MONITOR_TELNET_PORT},server,nowait)
+ echo " - Monitor: On host: telnet ${MONITOR_TELNET_HOST} ${MONITOR_TELNET_PORT}"
+ echo "monitor-telnet,${MONITOR_TELNET_PORT},${MONITOR_TELNET_HOST}" >> "${VMDIR}/${VMNAME}.ports"
+ fi
+ elif [ "${MONITOR}" == "socket" ]; then
+ args+=(-monitor unix:${VM_MONITOR_SOCKETPATH},server,nowait)
+ echo " - Monitor: On host: nc -U \"${VM_MONITOR_SOCKETPATH}\""
+ echo " or : socat -,echo=0,icanon=0 unix-connect:${VM_MONITOR_SOCKETPATH}"
+ else
+ echo "ERROR! \"${MONITOR}\" is an unknown monitor option."
+ exit 1
+ fi
+
+ if [ -z "${SERIAL}" ]; then
+ SERIAL="${serial:-none}"
+ fi
+
+ if [ -z "${SERIAL_TELNET_HOST}" ]; then
+ SERIAL_TELNET_HOST="${serial_telnet_host:-localhost}"
+ fi
+ if [ -z "${SERIAL_TELNET_PORT}" ]; then
+ SERIAL_TELNET_PORT="${serial_telnet_port}"
+ fi
+ if [ -n "${SERIAL_TELNET_PORT}" ] && ! is_numeric "${SERIAL_TELNET_PORT}"; then
+ echo "ERROR: serial-port must be a number!"
+ exit 1
+ fi
+
+ if [ "${SERIAL}" == "none" ]; then
+ args+=(-serial none)
+ elif [ "${SERIAL}" == "telnet" ]; then
+ # Find a free port to expose serial-telnet to the guest
+ local temp_port="$(get_port ${SERIAL_TELNET_PORT} 9)"
+ if [ -z "${temp_port}" ]; then
+ echo " - Serial: All Serial-Telnet ports have been exhausted."
+ else
+ SERIAL_TELNET_PORT="${temp_port}"
+ args+=(-serial telnet:${SERIAL_TELNET_HOST}:${SERIAL_TELNET_PORT},server,nowait)
+ echo " - Serial: On host: telnet ${SERIAL_TELNET_HOST} ${SERIAL_TELNET_PORT}"
+ echo "serial-telnet,${SERIAL_TELNET_PORT},${SERIAL_TELNET_HOST}" >> "${VMDIR}/${VMNAME}.ports"
+ fi
+ elif [ "${SERIAL}" == "socket" ]; then
+ args+=(-serial unix:${VM_SERIAL_SOCKETPATH},server,nowait)
+ echo " - Serial: On host: nc -U \"${VM_SERIAL_SOCKETPATH}\""
+ echo " or : socat -,echo=0,icanon=0 unix-connect:${VM_SERIAL_SOCKETPATH}"
+ else
+ echo "ERROR! \"${SERIAL}\" is an unknown serial option."
+ exit 1
+ fi
+
+
+ if [ -z "${EXTRA_ARGS}" ]; then
+ EXTRA_ARGS="${extra_args}"
+ fi
+ if [ -n "${EXTRA_ARGS}" ]; then
+ args+=(${EXTRA_ARGS})
fi
# The OSK parameter contains parenthesis, they need to be escaped in the shell
@@ -1028,19 +1234,52 @@ function vm_boot() {
SHELL_ARGS="${SHELL_ARGS//)/\\)}"
SHELL_ARGS="${SHELL_ARGS//Quickemu Project/\"Quickemu Project\"}"
- echo "${QEMU}" "${SHELL_ARGS}" >> "${VMDIR}/${VMNAME}.sh"
- ${QEMU} "${args[@]}" > "${VMDIR}/${VMNAME}.log" &
+ if [ ${VM_UP} -eq 0 ]; then
+ echo "${QEMU}" "${SHELL_ARGS}" >> "${VMDIR}/${VMNAME}.sh"
+ ${QEMU} "${args[@]}" > "${VMDIR}/${VMNAME}.log" &
+ sleep 0.25
+ fi
- # If output is 'none' then SPICE was requested.
- if [ "${OUTPUT}" == "spice" ]; then
- if [ -n "${PUBLIC}" ]; then
- spicy --title "${VMNAME}" --port "${SPICE_PORT}" --spice-shared-dir "${PUBLIC}" "${FULLSPICY}" >/dev/null 2>&1 &
- else
- spicy --title "${VMNAME}" --port "${SPICE_PORT}" "${FULLSPICY}" >/dev/null 2>&1 &
+ echo " - Process: Starting ${VM} as ${VMNAME} ($(cat "${VMDIR}/${VMNAME}.pid"))"
+}
+
+function start_viewer {
+ errno=0
+ if [ "${VIEWER}" != "none" ]; then
+
+ # If output is 'none' then SPICE was requested.
+ if [ "${OUTPUT}" == "spice" ]; then
+ if [ "${VIEWER}" == "remote-viewer" ]; then
+ # show via viewer: remote-viewer
+
+ if [ -n "${PUBLIC}" ]; then
+ echo " - Viewer: ${VIEWER} --title \"${VMNAME}\" --spice-shared-dir \"${PUBLIC}\" ${FULLSPICY} \"spice://localhost:${SPICE_PORT}\" >/dev/null 2>&1 &"
+ ${VIEWER} --title "${VMNAME}" --spice-shared-dir "${PUBLIC}" ${FULLSPICY} "spice://localhost:${SPICE_PORT}" >/dev/null 2>&1 &
+ errno=$?
+ else
+ echo " - Viewer: ${VIEWER} --title \"${VMNAME}\" ${FULLSPICY} \"spice://localhost:${SPICE_PORT}\" >/dev/null 2>&1 &"
+ ${VIEWER} --title "${VMNAME}" ${FULLSPICY} "spice://localhost:${SPICE_PORT}" >/dev/null 2>&1 &
+ errno=$?
+ fi
+
+ elif [ "${VIEWER}" == "spicy" ]; then
+ # show via viewer: spicy
+
+ if [ -n "${PUBLIC}" ]; then
+ echo " - Viewer: ${VIEWER} --title \"${VMNAME}\" --port \"${SPICE_PORT}\" --spice-shared-dir \"${PUBLIC}\" \"${FULLSPICY}\" >/dev/null 2>&1 &"
+ ${VIEWER} --title "${VMNAME}" --port "${SPICE_PORT}" --spice-shared-dir "${PUBLIC}" "${FULLSPICY}" >/dev/null 2>&1 &
+ errno=$?
+ else
+ echo " - Viewer: ${VIEWER} --title \"${VMNAME}\" --port \"${SPICE_PORT}\" \"${FULLSPICY}\" >/dev/null 2>&1 &"
+ ${VIEWER} --title "${VMNAME}" --port "${SPICE_PORT}" "${FULLSPICY}" >/dev/null 2>&1 &
+ errno=$?
+ fi
+ fi
+ if [ $errno -ne 0 ]; then
+ echo "WARNING! Could not start viewer(${VIEWER}) Err: $errno"
+ fi
fi
fi
- sleep 0.25
- echo " - Process: Starting ${VM} as ${VMNAME} ($(cat "${VMDIR}/${VMNAME}.pid"))"
}
function shortcut_create {
@@ -1069,36 +1308,129 @@ function usage() {
echo " ${LAUNCHER} --vm ubuntu.conf"
echo
echo "You can also pass optional parameters"
- echo " --braille : Enable braille support. Requires SDL."
- echo " --delete-disk : Delete the disk image and EFI variables"
- echo " --delete-vm : Delete the entire VM and it's configuration"
- echo " --display : Select display backend. 'sdl' (default), 'gtk', 'none', or 'spice'"
- echo " --fullscreen : Starts VM in full screen mode (Ctl+Alt+f to exit)"
- echo " --ignore-msrs-always : Configure KVM to always ignore unhandled machine-specific registers"
- echo " --screen : Use specified screen to determine the window size."
- echo " --shortcut : Create a desktop shortcut"
- echo " --snapshot apply : Apply/restore a snapshot."
- echo " --snapshot create : Create a snapshot."
- echo " --snapshot delete : Delete a snapshot."
- echo " --snapshot info : Show disk/snapshot info."
- echo " --status-quo : Do not commit any changes to disk/snapshot."
- echo " --version : Print version"
+ echo " --braille : Enable braille support. Requires SDL."
+ echo " --delete-disk : Delete the disk image and EFI variables"
+ echo " --delete-vm : Delete the entire VM and it's configuration"
+ echo " --display : Select display backend. 'sdl' (default), 'gtk', 'none', 'spice' or 'spice-app'"
+ echo " --fullscreen : Starts VM in full screen mode (Ctl+Alt+f to exit)"
+ echo " --ignore-msrs-always : Configure KVM to always ignore unhandled machine-specific registers"
+ echo " --screen : Use specified screen to determine the window size."
+ echo " --shortcut : Create a desktop shortcut"
+ echo " --snapshot apply : Apply/restore a snapshot."
+ echo " --snapshot create : Create a snapshot."
+ echo " --snapshot delete : Delete a snapshot."
+ echo " --snapshot info : Show disk/snapshot info."
+ echo " --status-quo : Do not commit any changes to disk/snapshot."
+ echo " --viewer : Choose an alternative viewer. @Options: 'spicy' (default), 'remote-viewer', 'none'"
+ echo " --ssh-port : Set ssh-port manually"
+ echo " --spice-port : Set spice-port manually"
+ echo " --public-dir : expose share directory. @Options: '' (default: xdg-user-dir PUBLICSHARE), '', 'none'"
+ echo " --monitor : Set monitor connection type. @Options: 'socket' (default), 'telnet', 'none'"
+ echo " --monitor-telnet-host : Set telnet host for monitor. (default: 'localhost')"
+ echo " --monitor-telnet-port : Set telnet port for monitor. (default: '4440')"
+ echo " --monitor-cmd : Send command to monitor if available. (Example: system_powerdown)"
+ echo " --serial : Set serial connection type. @Options: 'socket' (default), 'telnet', 'none'"
+ echo " --serial-telnet-host : Set telnet host for serial. (default: 'localhost')"
+ echo " --serial-telnet-port : Set telnet port for serial. (default: '6660')"
+ echo " --keyboard : Set keyboard. @Options: 'usb' (default), 'ps2', 'virtio'"
+ echo " --keyboard_layout : Set keyboard layout."
+ echo " --mouse : Set mouse. @Options: 'tablet' (default), 'ps2', 'usb', 'virtio'"
+ echo " --usb-controller : Set usb-controller. @Options: 'ehci' (default), 'xhci', 'none'"
+ echo " --extra_args : Pass additional arguments to qemu"
+ echo " --version : Print version"
exit 1
}
function display_param_check() {
- if [ "${OUTPUT}" != "gtk" ] && [ "${OUTPUT}" != "none" ] && [ "${OUTPUT}" != "sdl" ] && [ "${OUTPUT}" != "spice" ]; then
+ if [ "${OUTPUT}" != "gtk" ] && [ "${OUTPUT}" != "none" ] && [ "${OUTPUT}" != "sdl" ] && [ "${OUTPUT}" != "spice" ] && [ "${OUTPUT}" != "spice-app" ]; then
echo "ERROR! Requested output '${OUTPUT}' is not recognised."
exit 1
- elif [ "${OUTPUT}" == "spice" ] && ! command -v spicy &>/dev/null; then
- echo "ERROR! Requested SPICE display, but 'spicy' is not installed."
- exit 1
fi
}
+function viewer_param_check() {
+ if [ "${VIEWER}" != "none" ] && [ "${VIEWER}" != "spicy" ] && [ "${VIEWER}" != "remote-viewer" ]; then
+ echo "ERROR! Requested viewer '${VIEWER}' is not recognised."
+ exit 1
+ fi
+ if [ "${VIEWER}" == "spicy" ] && ! command -v spicy &>/dev/null; then
+ echo "ERROR! Requested 'spicy' as viewer, but 'spicy' is not installed."
+ exit 1
+ elif [ "${VIEWER}" == "remote-viewer" ] && ! command -v remote-viewer &>/dev/null; then
+ echo "ERROR! Requested 'remote-viewer' as viewer, but 'remote-viewer' is not installed."
+ exit 1
+ fi
+}
+
+function parse_ports_from_file {
+ local FILE="${VMDIR}/${VMNAME}.ports"
+
+ # parse ports
+ local port_name=( $(cat "$FILE" | cut -d, -f1) )
+ local port_number=( $(cat "$FILE" | cut -d, -f2) )
+ local host_name=( $(cat "$FILE" | gawk 'FS="," {print $3,"."}') )
+
+ for ((i=0; i<${#port_name[@]}; i++)); do
+ if [ "${port_name[$i]}" == "ssh" ]; then
+ SSH_PORT="${port_number[$i]}"
+ elif [ "${port_name[$i]}" == "spice" ]; then
+ SPICE_PORT="${port_number[$i]}"
+ elif [ "${port_name[$i]}" == "monitor-telnet" ]; then
+ MONITOR_TELNET_PORT="${port_number[$i]}"
+ MONITOR_TELNET_HOST="${host_name[$i]}"
+ elif [ "${port_name[$i]}" == "serial-telnet" ]; then
+ SERIAL_TELNET_PORT="${port_number[$i]}"
+ SERIAL_TELNET_HOST="${host_name[$i]}"
+ fi
+ done
+}
+
+function is_numeric {
+ [[ "$1" =~ ^[0-9]+$ ]]
+}
+
+function monitor_send_cmd {
+ local MSG="${1}"
+
+ if [ -z "${MSG}" ]; then
+ echo "WARNING! Send to QEMU-Monitor: Message empty!"
+ return 1
+ fi
+
+ # Determine monitor channel
+ local monitor_channel=""
+
+ if [ -S "${VMDIR}/${VMNAME}-monitor.socket" ]; then
+ monitor_channel="socket"
+ elif [ -n "${MONITOR_TELNET_PORT}" ] && [ -n "${MONITOR_TELNET_HOST}" ]; then
+ monitor_channel="telnet"
+ else
+ echo "WARNING! No qemu-monitor channel available - Couldn't send message to monitor!"
+ return
+ fi
+
+ case "${monitor_channel}" in
+ socket)
+ echo -e " - Sending: ${MSG}"
+ echo -e "${MSG}" | socat -,shut-down unix-connect:"${VM_MONITOR_SOCKETPATH}" 2>&1 > /dev/null
+ ;;
+ telnet)
+ echo -e " - Sending: ${MSG}"
+ echo -e "${MSG}" | socat - tcp:"${MONITOR_TELNET_HOST}":"${MONITOR_TELNET_PORT}" 2>&1 > /dev/null
+ ;;
+ *)
+ echo "ERROR! This should never happen!"
+ exit 1
+ ;;
+ esac
+
+ return 0
+}
+
+### MAIN
+
# Lowercase variables are used in the VM config file only
boot="efi"
-bridge=""
cpu_cores=""
disk_img=""
disk_size=""
@@ -1108,13 +1440,33 @@ floppy=""
guest_os="linux"
img=""
iso=""
+macaddr=""
macos_release=""
+network=""
port_forwards=()
preallocation="off"
ram=""
secureboot="off"
tpm="off"
usb_devices=()
+viewer="spicy"
+ssh_port=""
+spice_port=""
+public_dir=""
+monitor="socket"
+monitor_telnet_port="4440"
+monitor_telnet_host="localhost"
+monitor_cmd=""
+serial="socket"
+serial_telnet_port="6660"
+serial_telnet_host="localhost"
+# options: ehci(USB2.0), xhci(USB3.0)
+usb_controller="ehci"
+# options: ps2, usb, virtio
+keyboard="usb"
+keyboard_layout="en-us"
+# options: ps2, usb, tablet, virtio
+mouse="tablet"
BRAILLE=""
DELETE_DISK=0
@@ -1135,27 +1487,28 @@ VM=""
VMDIR=""
VMNAME=""
VMPATH=""
+VIEWER=""
+SSH_PORT=""
+SPICE_PORT=""
+MONITOR=""
+MONITOR_TELNET_PORT=""
+MONITOR_TELNET_HOST=""
+MONITOR_CMD=""
+VM_MONITOR_SOCKETPATH=""
+VM_SERIAL_SOCKETPATH=""
+SERIAL=""
+SERIAL_TELNET_PORT=""
+SERIAL_TELNET_HOST=""
+KEYBOARD=""
+KEYBOARD_LAYOUT=""
+MOUSE=""
+USB_CONTROLLER=""
+EXTRA_ARGS=""
# shellcheck disable=SC2155
readonly LAUNCHER=$(basename "${0}")
readonly DISK_MIN_SIZE=$((197632 * 8))
-readonly VERSION="3.14"
-
-# PUBLICSHARE is the only directory exposed to guest VMs for file
-# sharing via 9P, spice-webdavd and Samba. This path is not configurable.
-if command -v xdg-user-dir &>/dev/null; then
- PUBLIC=$(xdg-user-dir PUBLICSHARE)
- if [ "${PUBLIC%/}" != "${HOME}" ]; then
- if [ ! -d "${PUBLIC}" ]; then
- mkdir -p "${PUBLIC}"
- fi
- PUBLIC_TAG="Public-${USER,,}"
- # shellcheck disable=SC2012
- PUBLIC_PERMS=$(ls -ld "${PUBLIC}" | cut -d' ' -f1)
- else
- PUBLIC=""
- fi
-fi
+readonly VERSION="4.1"
# TODO: Make this run the native architecture binary
QEMU=$(command -v qemu-system-x86_64)
@@ -1228,6 +1581,66 @@ else
VM="${2}"
shift
shift;;
+ -viewer|--viewer)
+ VIEWER="${2}"
+ shift
+ shift;;
+ -ssh-port|--ssh-port)
+ SSH_PORT="${2}"
+ shift;
+ shift;;
+ -spice-port|--spice-port)
+ SPICE_PORT="${2}"
+ shift;
+ shift;;
+ -public-dir|--public-dir)
+ PUBLIC="${2}"
+ shift;
+ shift;;
+ -monitor|--monitor)
+ MONITOR="${2}"
+ shift;
+ shift;;
+ -monitor-cmd|--monitor-cmd)
+ MONITOR_CMD="${2}"
+ shift;
+ shift;;
+ -monitor-telnet-host|--monitor-telnet-host)
+ MONITOR_TELNET_HOST="${2}"
+ shift;
+ shift;;
+ -monitor-telnet-port|--monitor-telnet-port)
+ MONITOR_TELNET_PORT="${2}"
+ shift;
+ shift;;
+ -serial|--serial)
+ SERIAL="${2}"
+ shift;
+ shift;;
+ -serial-telnet-host|--serial-telnet-host)
+ SERIAL_TELNET_HOST="${2}"
+ shift;
+ shift;;
+ -serial-telnet-port|--serial-telnet-port)
+ SERIAL_TELNET_PORT="${2}"
+ shift;
+ shift;;
+ -keyboard|--keyboard)
+ KEYBOARD="${2}"
+ shift;
+ shift;;
+ -mouse|--mouse)
+ MOUSE="${2}"
+ shift;
+ shift;;
+ -usb-controller|--usb-controller)
+ USB_CONTROLLER="${2}"
+ shift;
+ shift;;
+ -extra_args|--extra_args)
+ EXTRA_ARGS="${2}"
+ shift;
+ shift;;
-version|--version)
echo "${VERSION}"
exit;;
@@ -1251,6 +1664,8 @@ if [ -n "${VM}" ] && [ -e "${VM}" ]; then
VMDIR=$(dirname "${disk_img}")
VMNAME=$(basename "${VM}" .conf)
VMPATH=$(realpath "$(dirname "${VM}")")
+ VM_MONITOR_SOCKETPATH="${VMDIR}/${VMNAME}-monitor.socket"
+ VM_SERIAL_SOCKETPATH="${VMDIR}/${VMNAME}-serial.socket"
# Backwards compatibility for ${driver_iso}
if [ -n "${driver_iso}" ] && [ -z "${fixed_iso}" ]; then
@@ -1262,15 +1677,76 @@ if [ -n "${VM}" ] && [ -e "${VM}" ]; then
disk_size="${disk}"
fi
+ # Set the default OUTPUT if not provided by user
if [ -z "${OUTPUT}" ]; then
- # Braille support requires SDL. Override OUTPUT if braille was requested.
- if [ -n "${BRAILLE}" ]; then
- OUTPUT="sdl"
- elif [ -z "${display}" ]; then
- OUTPUT="sdl"
- else
- OUTPUT="${display}"
- display_param_check
+ OUTPUT="sdl"
+ fi
+
+ # Braille support requires SDL. Override OUTPUT if braille was requested.
+ if [ -n "${BRAILLE}" ]; then
+ OUTPUT="sdl"
+ fi
+
+ if [ -z "${VIEWER}" ]; then
+ VIEWER="${viewer}"
+ fi
+ viewer_param_check
+
+ # Set the default 3D acceleration.
+ if [ -z "${gl}" ]; then
+ gl="on"
+ fi
+
+ if [ -z "${PUBLIC}" ]; then
+ PUBLIC="${public_dir}"
+ fi
+
+ if [ "${PUBLIC}" == "none" ]; then
+ PUBLIC=""
+ else
+ # PUBLICSHARE is the only directory exposed to guest VMs for file
+ # sharing via 9P, spice-webdavd and Samba. This path is not configurable.
+ if [ -z "${PUBLIC}" ]; then
+ if command -v xdg-user-dir &>/dev/null; then
+ PUBLIC=$(xdg-user-dir PUBLICSHARE)
+ fi
+ fi
+
+ if [ ! -d "${PUBLIC}" ]; then
+ echo "ERROR! Public directory: '${PUBLIC}' doesn't exist!"
+ exit 1
+ fi
+
+ PUBLIC_TAG="Public-${USER,,}"
+ # shellcheck disable=SC2012
+ PUBLIC_PERMS=$(ls -ld "${PUBLIC}" | cut -d' ' -f1)
+ fi
+
+ if [ -z "${SSH_PORT}" ]; then
+ SSH_PORT=${ssh_port}
+ fi
+ if [ -n "${SSH_PORT}" ] && ! is_numeric "${SSH_PORT}"; then
+ echo "ERROR: ssh-port must be a number!"
+ exit 1
+ fi
+
+ if [ -z "${SPICE_PORT}" ]; then
+ SPICE_PORT=${spice_port}
+ fi
+ if [ -n "${SPICE_PORT}" ] && ! is_numeric "${SPICE_PORT}"; then
+ echo "ERROR: spice-port must be a number!"
+ exit 1
+ fi
+
+ # Check if vm is already run
+ VM_PID=0
+ VM_UP=0
+ if [ -r "${VMDIR}/${VMNAME}.pid" ]; then
+ VM_PID=$(head -c50 "${VMDIR}/${VMNAME}.pid")
+ kill -0 ${VM_PID} 2>&1 >/dev/null
+ if [ $? -eq 0 ]; then
+ echo "VM already started!"
+ VM_UP=1
fi
fi
@@ -1324,6 +1800,19 @@ if [ ${SHORTCUT} -eq 1 ]; then
exit
fi
-vm_boot
+if [ ${VM_UP} -eq 0 ]; then
+ vm_boot
+ # If the VM being started is an uninstalled Windows VM then auto-skip the press-any key prompt.
+ if [ -n "${iso}" ] && [ "${guest_os}" == "windows" ]; then
+ sleep 3.5
+ monitor_send_cmd "sendkey ret"
+ fi
+ start_viewer
+else
+ parse_ports_from_file
+ start_viewer
+fi
+
+[ -n "${MONITOR_CMD}" ] && monitor_send_cmd "${MONITOR_CMD}"
# vim:tabstop=2:shiftwidth=2:expandtab
diff --git a/quickget b/quickget
index 7744dfb..cf4ab39 100755
--- a/quickget
+++ b/quickget
@@ -36,8 +36,10 @@ function pretty_name() {
archlinux) PRETTY_NAME="Arch Linux";;
arcolinux) PRETTY_NAME="Arco Linux";;
cachyos) PRETTY_NAME="CachyOS";;
+ centos-stream) PRETTY_NAME="CentOS Stream";;
dragonflybsd) PRETTY_NAME="DragonFlyBSD";;
elementary) PRETTY_NAME="elementary OS";;
+ endeavouros) PRETTY_NAME="EndeavourOS";;
freebsd) PRETTY_NAME="FreeBSD";;
freedos) PRETTY_NAME="FreeDOS";;
garuda) PRETTY_NAME="Garuda Linux";;
@@ -45,6 +47,7 @@ function pretty_name() {
kdeneon) PRETTY_NAME="KDE Neon";;
kolibrios) PRETTY_NAME="KolibriOS";;
linuxmint) PRETTY_NAME="Linux Mint";;
+ lmde) PRETTY_NAME="Linux Mint Debian Edition";;
ludos) PRETTY_NAME="LudOS";;
mxlinux) PRETTY_NAME="MX Linux";;
netboot) PRETTY_NAME="netboot.xyz";;
@@ -55,6 +58,7 @@ function pretty_name() {
opensuse) PRETTY_NAME="openSUSE";;
oraclelinux) PRETTY_NAME="Oracle Linux";;
popos) PRETTY_NAME="Pop!_OS";;
+ reactos) PRETTY_NAME="ReactOS";;
regolith) PRETTY_NAME="Regolith Linux";;
rockylinux) PRETTY_NAME="Rocky Linux";;
ubuntu-budgie) PRETTY_NAME="Ubuntu Budgie";;
@@ -161,11 +165,15 @@ function os_support() {
android \
archlinux \
arcolinux \
+ batocera \
cachyos \
+ centos-stream \
debian \
+ deepin \
devuan \
dragonflybsd \
elementary \
+ endeavouros \
fedora \
freebsd \
freedos \
@@ -178,6 +186,7 @@ function os_support() {
kolibrios \
kubuntu \
linuxmint \
+ lmde \
ludos \
manjaro \
mxlinux \
@@ -190,6 +199,7 @@ function os_support() {
opensuse \
oraclelinux \
popos \
+ reactos \
regolith \
rockylinux \
slackware \
@@ -207,7 +217,7 @@ function os_support() {
}
function releases_alma() {
- echo 8.4 8.5
+ echo 8.6 9.0
}
function editions_alma() {
@@ -239,17 +249,33 @@ function editions_arcolinux() {
}
function releases_cachyos() {
- echo 2022.01.09 2022.02.11
+ echo 220731
+}
+
+function editions_cachyos() {
+ echo kde gnome xfce
+}
+
+function releases_centos-stream() {
+ echo 8 9
+}
+
+function editions_centos-stream() {
+ echo dvd1 boot
}
function releases_debian() {
- echo 10.11.0 11.2.0
+ echo 10.11.0 11.2.0 11.3.0 11.4.0
}
function editions_debian() {
echo standard cinnamon gnome kde lxde lxqt mate xfce netinst
}
+function releases_deepin() {
+ echo 20 20.1 20.2 20.2.1 20.2.2 20.2.3 20.2.4 20.3 20.4 20.5
+}
+
function releases_devuan() {
echo beowulf chimaera
}
@@ -262,8 +288,18 @@ function releases_elementary() {
echo 6.1
}
+function releases_endeavouros() {
+ echo apollo_22_1 \
+ atlantis-21_4 \
+ atlantis_neo-21_5
+}
+
function releases_fedora() {
- echo 33 34 35
+ echo 33 34 35 36
+}
+
+function releases_batocera() {
+ echo 32 33 34
}
function editions_fedora() {
@@ -280,7 +316,7 @@ function editions_fedora() {
}
function releases_freebsd(){
- echo 12.2 12.3 13.0
+ echo 12.3 13.0
}
function editions_freebsd(){
@@ -292,23 +328,12 @@ function releases_freedos() {
}
function releases_garuda() {
- echo 220131
+ echo latest
}
function editions_garuda() {
- echo dr460nized \
- dr460nized-blackarch \
- dr460nized-gaming \
- bspwm \
- cinnamon \
- gnome \
- i3 \
- kde-barebones \
- lxqt-kwin \
- mate \
- qtile \
- sway \
- xfce
+ URL="https://mirrors.fossho.st/garuda/iso/latest/garuda/"
+ echo $(wget -q -O - ${URL} | grep '^ dvd at 9.0
function editions_rockylinux() {
echo minimal \
- dvd1
+ "dvd (dvd1 prior to 9.0)"
}
function releases_slackware() {
@@ -447,7 +484,7 @@ function releases_tails() {
}
function releases_ubuntu() {
- local LTS_SUPPORT="14.04 16.04 18.04 20.04"
+ local LTS_SUPPORT="14.04 16.04 18.04 20.04 22.04"
case "${OS}" in
kubuntu|lubuntu|ubuntukylin|\
ubuntu-mate|ubuntustudio|xubuntu)
@@ -460,7 +497,7 @@ function releases_ubuntu() {
;;
esac
echo ${LTS_SUPPORT} \
- 21.10 \
+ jammy-daily \
daily-live \
daily-canary \
eol-4.10 \
@@ -668,6 +705,9 @@ function make_vm_config() {
IMAGE_FILE="${1}"
ISO_FILE="${2}"
case "${OS}" in
+ batocera)
+ GUEST="batocera"
+ IMAGE_TYPE="img";;
dragonflybsd)
GUEST="dragonflybsd"
IMAGE_TYPE="iso";;
@@ -695,6 +735,9 @@ function make_vm_config() {
openbsd)
GUEST="openbsd"
IMAGE_TYPE="iso";;
+ reactos)
+ GUEST="reactos"
+ IMAGE_TYPE="iso";;
windows)
GUEST="windows"
IMAGE_TYPE="iso";;
@@ -712,18 +755,29 @@ function make_vm_config() {
if [ ! -e "${CONF_FILE}" ]; then
echo "Making ${CONF_FILE}"
cat << EOF > "${CONF_FILE}"
+#!$(which quickemu) --vm
guest_os="${GUEST}"
disk_img="${VM_PATH}/disk.qcow2"
${IMAGE_TYPE}="${VM_PATH}/${IMAGE_FILE}"
EOF
+ echo "Giving user execute permissions on ${CONF_FILE},"
+ chmod u+x "${CONF_FILE}"
if [ -n "${ISO_FILE}" ]; then
echo "fixed_iso=\"${VM_PATH}/${ISO_FILE}\"" >> "${CONF_FILE}"
fi
# OS specific tweaks
case ${OS} in
- alma|oraclelinux|rockylinux) echo "disk_size=\"32G\"" >> "${CONF_FILE}";;
- dragonflybsd|haiku|openbsd|netbsd|slackware|tails) echo "boot=\"legacy\"" >> "${CONF_FILE}";;
+ alma|centos-stream|oraclelinux|rockylinux)
+ echo "disk_size=\"32G\"" >> "${CONF_FILE}";;
+ batocera)
+ echo "disk_size=\"8G\"" >> "${CONF_FILE}";;
+ dragonflybsd|haiku|openbsd|netbsd|slackware|tails)
+ echo "boot=\"legacy\"" >> "${CONF_FILE}";;
+ deepin)
+ echo "disk_size=\"64G\"" >> "${CONF_FILE}"
+ echo "ram=\"4G\"" >> "${CONF_FILE}"
+ ;;
freedos)
echo "boot=\"legacy\"" >> "${CONF_FILE}"
echo "disk_size=\"4G\"" >> "${CONF_FILE}"
@@ -734,7 +788,24 @@ EOF
echo "disk_size=\"2G\"" >> "${CONF_FILE}"
echo "ram=\"128M\"" >> "${CONF_FILE}"
;;
- macos) echo "macos_release=\"${RELEASE}\"" >> "${CONF_FILE}";;
+ zorin)
+ case ${EDITION} in
+ education64|edulite64)
+ echo "disk_size=\"32G\"" >> "${CONF_FILE}";;
+ esac
+ ;;
+ reactos)
+ echo "boot=\"legacy\"" >> "${CONF_FILE}"
+ echo "disk_size=\"12G\"" >> "${CONF_FILE}"
+ echo "ram=\"2048M\"" >> "${CONF_FILE}"
+ ;;
+ macos)
+ echo "macos_release=\"${RELEASE}\"" >> "${CONF_FILE}"
+ # https://github.com/quickemu-project/quickemu/issues/438
+ if [ "${RELEASE}" == "monterey" ]; then
+ echo "cpu_cores=2" >> "${CONF_FILE}"
+ fi
+ ;;
esac
# Enable TPM for Windows 11
@@ -760,7 +831,7 @@ function get_alma() {
local EDITION="${1:-}"
local HASH=""
local ISO="AlmaLinux-${RELEASE}-x86_64-${EDITION}.iso"
- local URL="http://lon.mirror.rackspace.com/almalinux/${RELEASE}/isos/x86_64/"
+ local URL="http://lon.mirror.rackspace.com/almalinux/${RELEASE/beta-1/beta}/isos/x86_64/"
HASH="$(wget -q -O- "${URL}/CHECKSUM" | grep "(${ISO}" | cut -d' ' -f4)"
echo "${URL}/${ISO} ${HASH}"
}
@@ -794,8 +865,8 @@ function get_android() {
ISO=$(echo "${JSON_REL}" | jq -r .n)
HASH=$(echo "${JSON_REL}" | jq -r .hash.sha256)
# Traverse the directories to find the .iso location
- for DIR in $(wget -q -O- "${URL}" | grep -o -E '[0-9]{5}' | sort -ur); do
- if wget -q -O- "${URL}/${DIR}" | grep "${ISO}" &>/dev/null; then
+ for DIR in $(wget -4 -q -O- "${URL}" | grep -o -E '[0-9]{5}' | sort -ur); do
+ if wget -4 -q -O- "${URL}/${DIR}" | grep "${ISO}" &>/dev/null; then
URL="${URL}/${DIR}"
break
fi
@@ -821,10 +892,52 @@ function get_arcolinux() {
echo "${URL}/${ISO} ${HASH}"
}
+function get_batocera() {
+ local HASH=""
+ local URL="https://mirrors.o2switch.fr/batocera/x86_64/stable/last"
+ local ISO="$(curl -sl ${URL}/ | grep -e 'batocera.*img.gz'|cut -d\" -f2)"
+ local CURRENT_RELEASE=$(echo "${ISO}"| cut -d\- -f3)
+
+
+ case ${RELEASE} in
+ ${CURRENT_RELEASE}) #Current release
+ URL+=""
+ ;;
+ *)
+ URL+="/archives/${RELEASE}"
+ ISO="$(curl -sl ${URL}/ | grep -e 'batocera.*img.gz'|cut -d\" -f2)"
+ ;; # non-current are here
+
+ esac
+
+
+ echo "${URL}/${ISO} ${HASH}"
+}
+
function get_cachyos() {
local HASH=""
- local ISO="cachyos-${RELEASE}-x86_64.iso"
- local URL="https://mirror.cachyos.org/ISO"
+ local ISO="cachyos-${EDITION}-linux-${RELEASE}.iso"
+ local URL="https://mirror.cachyos.org/ISO/${EDITION}/${RELEASE}"
+ HASH=$(wget -q -O- "${URL}/${ISO}.sha256" | cut -d' ' -f1)
+ echo "${URL}/${ISO} ${HASH}"
+}
+
+function get_centos-stream() {
+ local HASH=""
+ local ISO=""
+ case ${RELEASE} in
+ 8)
+ ISO="CentOS-Stream-${RELEASE}-x86_64-latest-${EDITION}.iso"
+ URL="https://mirrors.ocf.berkeley.edu/centos/8-stream/isos/x86_64"
+ HASH=$(wget -q -O- ${URL}/CHECKSUM | grep "SHA256 (${ISO}" | cut -d' ' -f4)
+ ;;
+ 9)
+ ISO="CentOS-Stream-${RELEASE}-latest-x86_64-${EDITION}.iso"
+ URL="https://mirrors.ocf.berkeley.edu/centos-stream/9-stream/BaseOS/x86_64/iso"
+ HASH=$(wget -q -O- ${URL}/${ISO}.SHA256SUM | grep "SHA256 (${ISO}" | cut -d' ' -f4)
+ ;;
+ esac
+
echo "${URL}/${ISO} ${HASH}"
}
@@ -835,7 +948,7 @@ function get_debian() {
local URL=""
case ${RELEASE} in
- 11.2.0) URL="https://cdimage.debian.org/debian-cd/${RELEASE}-live/amd64/iso-hybrid";;
+ 11.4.0) URL="https://cdimage.debian.org/debian-cd/${RELEASE}-live/amd64/iso-hybrid";;
*) URL="https://cdimage.debian.org/cdimage/archive/${RELEASE}-live/amd64/iso-hybrid/";;
esac
@@ -849,6 +962,30 @@ function get_debian() {
echo "${URL}/${ISO} ${HASH}"
}
+function get_deepin() {
+ local HASH=""
+ local EDITION=""
+ local ISO="deepin-desktop-community-${RELEASE}-amd64.iso"
+ # deepin-desktop-community-20.3-amd64.iso
+ local URL="https://cdimage.deepin.com/releases/"${RELEASE}
+
+ # fix iso name
+ if [[ "${RELEASE}" == *"20" ]] ; then
+ EDITION="1003"
+ ISO="deepin-desktop-community-${EDITION}-amd64.iso"
+ elif [[ "${RELEASE}" == *"20.1" ]]; then
+ EDITION="1010"
+ ISO="deepin-desktop-community-${EDITION}-amd64.iso"
+ fi
+
+ HASH=$(wget -q -O- "${URL}/SHA256SUMS" | grep "${ISO}" | cut -d' ' -f1)
+
+ #echo "${URL}/${ISO} ${HASH}"
+ web_get "${URL}/${ISO}" "${VM_PATH}"
+ check_hash "${ISO}" "${HASH}"
+ make_vm_config "${ISO}"
+}
+
function get_devuan() {
local HASH=""
local ISO=""
@@ -878,6 +1015,16 @@ function get_elementary() {
echo "${URL}/$(date +%s | base64)/${ISO} ${HASH}"
}
+function get_endeavouros() {
+ local HASH=""
+ # Endeavour release names are Capitalized and our $RELEASE is forced to lowercase so we have to revert it
+ local ISO="EndeavourOS_${RELEASE@u}.iso"
+ local URL="https://github.com/endeavouros-team/ISO/releases/download/1-EndeavourOS-ISO-releases-archive"
+
+ HASH=$(wget -q -O- "${URL}/${ISO}.sha512sum" | cut -d' ' -f1)
+ echo "${URL}/${ISO} ${HASH}"
+}
+
function get_fedora() {
local EDITION="${1:-}"
local HASH=""
@@ -927,22 +1074,15 @@ function get_freedos() {
}
function get_garuda() {
- local EDITION="${1:-}"
- local HASH=""
- local ISO=""
- local URL=""
+ local EDITION="${1:-}"
+ local HASH=""
+ local ISO=""
+ local URL="https://mirrors.fossho.st/garuda/iso/latest/garuda/"
- case ${EDITION} in
- cinnamon|mate) URL="http://mirrors.fossho.st/garuda/iso/community/${EDITION}/${RELEASE}";;
- *) URL="http://mirrors.fossho.st/garuda/iso/garuda/${EDITION}/${RELEASE}";;
- esac
- case ${EDITION} in
- xfce|kde-barebones) ISO="garuda-${EDITION}-linux-lts-${RELEASE}.iso";;
- *) ISO="garuda-${EDITION}-linux-zen-${RELEASE}.iso";;
- esac
+ ISO=${EDITION}/latest.iso
- HASH="$(wget -q -O- "${URL}/${ISO}.sha256" | cut -d' ' -f1)"
- echo "${URL}/${ISO} ${HASH}"
+ HASH="$(wget -q -O- "${URL}/${ISO}.sha256" | cut -d' ' -f1)"
+ echo "${URL}/${ISO} ${HASH}"
}
function get_gentoo() {
@@ -972,8 +1112,10 @@ function get_ghostbsd() {
function get_haiku() {
local EDITION="${1:-}"
local ISO="haiku-${RELEASE}-${EDITION}-anyboot.iso"
- local URL="https://cdn.haiku-os.org/haiku-release/${RELEASE}"
- local HASH=""
+ # local URL="https://cdn.haiku-os.org/haiku-release/${RELEASE}" # domain gone
+ local URL="http://mirror.rit.edu/haiku/${RELEASE}" # NY, USA
+ # local URL="https://mirrors.tnonline.net/haiku/haiku-release/${RELEASE}" # Sweden
+ # local URL="https://mirror.aarnet.edu.au/pub/haiku/${RELEASE}" # Aus
HASH=$(wget -q -O- "${URL}/${ISO}.sha256" | grep "${ISO}" | cut -d' ' -f4)
echo "${URL}/${ISO} ${HASH}"
@@ -1016,6 +1158,16 @@ function get_linuxmint() {
echo "${URL}/${ISO} ${HASH}"
}
+function get_lmde() {
+ local EDITION="${1:-}"
+ local HASH=""
+ local ISO="lmde-${RELEASE}-${EDITION}-64bit.iso"
+ local URL="https://mirror.bytemark.co.uk/linuxmint/debian"
+
+ HASH=$(wget -q -O- "${URL}/sha256sum.txt" | grep "${ISO}" | cut -d' ' -f1)
+ echo "${URL}/${ISO} ${HASH}"
+}
+
function get_ludos() {
# not considering betas as editions at this point
#local EDITION="${1:-}"
@@ -1032,7 +1184,8 @@ function get_macos() {
local BOARD_ID=""
local CWD=""
local MACRECOVERY=""
- local MLB=""
+ local MLB="00000000000000000"
+ local OS_TYPE="default"
case ${RELEASE} in
high-sierra)
@@ -1042,11 +1195,10 @@ function get_macos() {
BOARD_ID="Mac-7BA5B2DFE22DDD8C"
MLB="00000000000KXPG00";;
catalina)
- BOARD_ID="Mac-CFF7D910A743CAAF"
+ BOARD_ID="Mac-C3EC7CD22292981F"
MLB="00000000000PHCD00";;
big-sur)
- BOARD_ID="Mac-35C1E88140C3E6CF"
- MLB="00000000000000000";;
+ BOARD_ID="Mac-3CBD00234E554E41";;
monterey)
BOARD_ID="Mac-06F11F11946D27C5"
MLB="00000000000000000";;
@@ -1083,6 +1235,7 @@ function get_macos() {
${MACRECOVERY} \
--board-id "${BOARD_ID}" \
--mlb "${MLB}" \
+ --os-type "${OS_TYPE}" \
--basename RecoveryImage \
--outdir "${VM_PATH}" \
download
@@ -1190,8 +1343,8 @@ function get_oraclelinux() {
local URL="https://yum.oracle.com/ISOS/OracleLinux/OL${VER_MAJ}/u${VER_MIN}/x86_64/"
case ${VER_MAJ} in
- 8) ISO="OracleLinux-R${VER_MAJ}-U${VER_MIN}-x86_64-dvd.iso";;
- *) ISO="OracleLinux-R${VER_MAJ}-U${VER_MIN}-Server-x86_64-dvd.iso";;
+ 7) ISO="OracleLinux-R${VER_MAJ}-U${VER_MIN}-Server-x86_64-dvd.iso";;
+ *) ISO="OracleLinux-R${VER_MAJ}-U${VER_MIN}-x86_64-dvd.iso";;
esac
HASH=$(wget -q -O- "https://linux.oracle.com/security/gpg/checksum/OracleLinux-R${VER_MAJ}-U${VER_MIN}-Server-x86_64.checksum" | grep "${ISO}" | cut -d' ' -f1)
echo "${URL}/${ISO} ${HASH}"
@@ -1207,6 +1360,16 @@ function get_popos() {
echo "${URL} ${HASH}"
}
+function get_reactos() {
+ local HASH=""
+ local URL=""
+ local TMPURL=""
+
+ TMPURL=$(wget -q -S -O- --max-redirect=0 "https://sourceforge.net/projects/reactos/files/latest/download" 2>&1 | grep Location | cut -d' ' -f4)
+ URL=${TMPURL%\?*}
+ echo "${URL} ${HASH}"
+}
+
function get_regolith() {
local EDITION="${1:-}"
local HASH=""
@@ -1228,7 +1391,7 @@ function get_rockylinux() {
local URL=""
case ${RELEASE} in
- 8.5) URL="https://download.rockylinux.org/pub/rocky/${RELEASE}/isos/x86_64";;
+ 9.0) URL="https://download.rockylinux.org/pub/rocky/${RELEASE}/isos/x86_64";;
*) URL="http://dl.rockylinux.org/vault/rocky/${RELEASE}/isos/x86_64/";;
esac
HASH=$(wget -q -O- "${URL}/CHECKSUM" | grep "SHA256" | grep "${ISO})" | cut -d' ' -f4)
@@ -1280,6 +1443,10 @@ function get_ubuntu() {
if [[ "${RELEASE}" == "eol-"* ]]; then
URL="https://old-releases.ubuntu.com/releases/${RELEASE/eol-/}"
+ elif [[ "${RELEASE}" == "jammy-daily" ]]; then
+ URL="https://cdimage.ubuntu.com/${OS}/jammy/daily-live/current"
+ VM_PATH="${OS}-jammy-live"
+
elif [[ "${RELEASE}" == *"daily"* ]] || [ "${RELEASE}" == "dvd" ]; then
URL="https://cdimage.ubuntu.com/${OS}/${RELEASE}/current"
VM_PATH="${OS}-daily-live"
@@ -1290,11 +1457,11 @@ function get_ubuntu() {
fi
if wget -q --spider "${URL}/SHA256SUMS"; then
- ISO=$(wget -q -O- "${URL}/SHA256SUMS" | grep 'desktop\|dvd\|install' | grep amd64 | cut -d'*' -f2)
- HASH=$(wget -q -O- "${URL}/SHA256SUMS" | grep 'desktop\|dvd\|install' | grep amd64 | cut -d' ' -f1)
+ ISO=$(wget -q -O- "${URL}/SHA256SUMS" | grep 'desktop\|dvd\|install' | grep amd64 | grep iso | cut -d'*' -f2)
+ HASH=$(wget -q -O- "${URL}/SHA256SUMS" | grep 'desktop\|dvd\|install' | grep amd64 | grep iso |cut -d' ' -f1)
else
- ISO=$(wget -q -O- "${URL}/MD5SUMS" | grep 'desktop\|dvd\|install' | grep amd64 | cut -d' ' -f3)
- HASH=$(wget -q -O- "${URL}/MD5SUMS" | grep 'desktop\|dvd\|install' | grep amd64 | cut -d' ' -f1)
+ ISO=$(wget -q -O- "${URL}/MD5SUMS" | grep 'desktop\|dvd\|install' | grep amd64 | grep iso | cut -d' ' -f3)
+ HASH=$(wget -q -O- "${URL}/MD5SUMS" | grep 'desktop\|dvd\|install' | grep amd64 | grep iso | cut -d' ' -f1)
fi
#echo "${URL}/${ISO} ${HASH}"
@@ -1348,44 +1515,28 @@ function unattended_windows() {
https://docs.microsoft.com/en-us/windows-hardware/customize/desktop/unattend/
-->
-
+
+ false
+
+
*
-
+
true
+
+ 1
+
-
+
true
-
+
*
Quickemu Project
@@ -1396,26 +1547,15 @@ function unattended_windows() {
https://github.com/quickemu-project/quickemu/issues
Quickemu Project
+ W269N-WFGWX-YVC9B-4J6C9-T83GX
-
+
0
-
+
false
@@ -1518,18 +1658,17 @@ function unattended_windows() {
true
+ Quickemu
+ Quickemu Project
+
- VK7JG-NPHTM-C97JM-9MPGT-3V66T
+ W269N-WFGWX-YVC9B-4J6C9-T83GX
Never
-
+