diff --git a/README.md b/README.md index 83488df..981e5dd 100644 --- a/README.md +++ b/README.md @@ -8,17 +8,16 @@
Quickemu Screenshot

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. [![Replace VirtualBox with Bash & QEMU](https://img.youtube.com/vi/AOTYWEgw0hI/0.jpg)](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 [![Packaging status](https://repology.org/badge/vertical-allrepos/quickgui.svg)](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. [![Replace VirtualBox with Bash & QEMU](https://img.youtube.com/vi/AOTYWEgw0hI/0.jpg)](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 '^ "${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 - +