Added sound and microphone support by default + Updated libvirt documentation.
22
README.md
@ -7,7 +7,7 @@ Run Windows applications (including [Microsoft 365](https://www.microsoft365.com
|
||||
|
||||
## Underlying Mechanism
|
||||
WinApps works by:
|
||||
1. Running Windows in a `Docker` or `libvirt + KVM/QEMU` virtual machine (deprecated).
|
||||
1. Running Windows in a `Docker`, `Podman` or `libvirt` virtual machine.
|
||||
2. Querying Windows for all installed applications.
|
||||
3. Creating shortcuts to selected Windows applications on the host GNU/Linux OS.
|
||||
4. Using [`FreeRDP`](https://www.freerdp.com/) as a backend to seamlessly render Windows applications alongside GNU/Linux applications.
|
||||
@ -75,13 +75,13 @@ Contributing to the list of supported applications is encouraged through submiss
|
||||
|
||||
## Installation
|
||||
### Step 1: Configure a Windows VM
|
||||
The optimal choice for running a Windows VM as a subsystem for WinApps is `Docker`. `Docker` facilitates automated installation processes while leveraging a `KVM/QEMU` backend. Despite continuing to provide documentation for configuring a Windows VM using `virt-manager`, this method is now considered deprecated.
|
||||
Both `Docker` and `Podman` are recommended backends for running the Windows virtual machine, as they facilitate an automated Windows installation process. WinApps is also compatible with `libvirt`. While this method requires considerably more manual configuration, it also provides greater virtual machine customisation options. All three methods leverage the `KVM` hypervisor, ensuring excellent virtual machine performance. Ultimately, the choice of backend depends on your specific use case.
|
||||
|
||||
The following guides are available:
|
||||
- [Creating a Windows VM with `Docker` or `Podman`](docs/docker.md)
|
||||
- [Creating a Windows VM with `virt-manager`](docs/KVM.md) (Deprecated)
|
||||
- [Creating a Windows VM with `libvirt`](docs/libvirt.md)
|
||||
|
||||
If you already have a Windows VM or server you wish to use with WinApps, you will need to merge `install/RDPApps.reg` into the Windows Registry.
|
||||
If you already have a Windows VM or server you wish to use with WinApps, you will need to merge `install/RDPApps.reg` into the Windows Registry manually.
|
||||
|
||||
### Step 2: Clone WinApps Repository and Dependencies
|
||||
1. Clone the WinApps GitHub repository.
|
||||
@ -137,14 +137,14 @@ RDP_PASS="MyWindowsPassword"
|
||||
> If you wish to use an alternative WinApps backend (other than `Docker`), uncomment and change `WAFLAVOR="docker"` to `WAFLAVOR="podman"` or `WAFLAVOR="libvirt"`.
|
||||
|
||||
#### Configuration Options Explained
|
||||
- When using a pre-existing non-KVM RDP server, you must use `RDP_IP` to specify the location of the Windows server.
|
||||
- If running a Windows VM in KVM with NAT enabled, leave `RDP_IP` commented out and WinApps will auto-detect the local IP address for the VM.
|
||||
- If using a pre-existing Windows RDP server on your LAN, you must use `RDP_IP` to specify the location of the Windows server. You may also wish to configure a static IP address for this server.
|
||||
- If running a Windows VM using `libvirt` with NAT enabled, leave `RDP_IP` commented out and WinApps will auto-detect the local IP address for the VM.
|
||||
- For domain users, you can uncomment and change `RDP_DOMAIN`.
|
||||
- On high-resolution (UHD) displays, you can set `RDP_SCALE` to the scale you would like to use [100|140|160|180].
|
||||
- To add flags to the FreeRDP call, such as `/audio-mode:1` to pass in a microphone, uncomment and use the `RDP_FLAGS` configuration option.
|
||||
- On high-resolution (UHD) displays, you can set `RDP_SCALE` to the scale you would like to use (100, 140 or 180).
|
||||
- To add additional flags to the FreeRDP call (e.g. `/prevent-session-lock 120`), uncomment and use the `RDP_FLAGS` configuration option.
|
||||
- For multi-monitor setups, you can try enabling `MULTIMON`. A FreeRDP bug may result in a black screen however, in which case you should revert this change.
|
||||
- If you enable `DEBUG`, a log will be created on each application start in `~/.local/share/winapps/winapps.log`
|
||||
- If using a system on which the FreeRDP command is not `xfreerdp`, the correct command can be specified using `FREERDP_COMMAND`.
|
||||
- If you enable `DEBUG`, a log will be created on each application start in `~/.local/share/winapps/winapps.log`.
|
||||
- If using a system on which the FreeRDP command is not `xfreerdp` or `xfreerdp3`, the correct command can be specified using `FREERDP_COMMAND`.
|
||||
|
||||
### Step 4: Run the WinApps Installer
|
||||
Run the WinApps installer.
|
||||
@ -161,7 +161,7 @@ Adding your own applications with custom icons and MIME types to the installer i
|
||||
1. Modify the name and variables to reflect the appropriate/desired values for your application.
|
||||
2. Replace `icon.svg` with an SVG for your application (ensuring the icon is appropriately licensed).
|
||||
3. Remove and reinstall WinApps.
|
||||
4. (Optional, but strongly encouraged) Submit a pull request to add your application to WinApps as an officially supported application once you have tested your configuration files to verify functionality.
|
||||
4. Submit a pull request to add your application to WinApps as an officially supported application once you have tested and verified your configuration (optional, but encouraged).
|
||||
|
||||
## Running Applications Manually
|
||||
WinApps offers a manual mode for running applications that were not configured by the WinApps installer. This is completed with the `manual` flag. Executables that are in the Windows PATH do not require full path definition.
|
||||
|
@ -310,6 +310,7 @@ function waRunCommand() {
|
||||
+dynamic-resolution \
|
||||
+auto-reconnect \
|
||||
+home-drive \
|
||||
/audio-mode:1 \
|
||||
/wm-class:"Microsoft Windows" \
|
||||
/v:"$RDP_IP" &>/dev/null &
|
||||
elif [ "$1" = "manual" ]; then
|
||||
@ -324,6 +325,7 @@ function waRunCommand() {
|
||||
+auto-reconnect \
|
||||
+clipboard \
|
||||
+home-drive \
|
||||
/audio-mode:1 \
|
||||
-wallpaper \
|
||||
+dynamic-resolution \
|
||||
"$MULTI_FLAG" \
|
||||
@ -358,6 +360,7 @@ function waRunCommand() {
|
||||
+auto-reconnect \
|
||||
+clipboard \
|
||||
+home-drive \
|
||||
/audio-mode:1 \
|
||||
-wallpaper \
|
||||
+dynamic-resolution \
|
||||
"$MULTI_FLAG" \
|
||||
@ -379,6 +382,7 @@ function waRunCommand() {
|
||||
+auto-reconnect \
|
||||
+clipboard \
|
||||
+home-drive \
|
||||
/audio-mode:1 \
|
||||
-wallpaper \
|
||||
+dynamic-resolution \
|
||||
"$MULTI_FLAG" \
|
||||
|
555
docs/libvirt.md
Normal file
@ -0,0 +1,555 @@
|
||||
# Creating a `libvirt` Windows VM
|
||||
## Understanding The Virtualisation Stack
|
||||
This method of configuring a Windows virtual machine for use with WinApps is significantly more involved than utilising `Docker` or `Podman`. Nevertheless, expert users may prefer this method due to its greater flexibility and wider range of customisation options.
|
||||
|
||||
Before beginning, it is important to have a basic understanding of the various components involved in this particular method.
|
||||
|
||||
1. `QEMU` is a FOSS emulator that performs hardware virtualisation, enabling operating systems and applications designed for one architecture (e.g., aarch64) to run on systems with differing architectures (e.g., amd64). When used in conjunction with `KVM`, it can run virtual machines at near-native speed (provided the guest virtual machine matches the host architecture) by utilising hardware extensions like Intel VT-x or AMD-V.
|
||||
2. `KVM` is a Linux kernel module that enables the kernel to function as a type-1 hypervisor. `KVM` runs directly on the underlying hardware (as opposed to on top of the GNU/Linux host OS). For many workloads, the performance overhead is minimal, often in the range of 2-5%. `KVM` requires a CPU with hardware virtualisation extensions.
|
||||
3. `libvirt` is an open-source API, daemon, and management tool for orchestrating platform virtualisation. It provides a consistent and stable interface for managing various virtualisation technologies, including `KVM` and `QEMU` (as well as others). `libvirt` offers a wide range of functionality to control the lifecycle of virtual machines, storage, networks, and interfaces, making it easier to interact with virtualisation capabilities programmatically or via command-line tools.
|
||||
4. `virt-manager` (Virtual Machine Manager) is a GUI desktop application that provides an easy-to-use interface for creating, configuring and controlling virtual machines. `virt-manager` utilises `libvirt` as a backend.
|
||||
|
||||
Together, these components form a powerful and flexible virtualization stack, with `KVM` providing low-level kernel-based virtualisation capabilities, `QEMU` providing high-level userspace-based virtualisation functionality, `libvirt` managing the resources and `virt-manager` offering an intuitive graphical management interface.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/Virtualisation_Stack.svg" width="500px"/>
|
||||
</p>
|
||||
|
||||
## Prerequisites
|
||||
1. Ensure your CPU supports hardware virtualisation extensions by [reading this article](https://wiki.archlinux.org/title/KVM).
|
||||
|
||||
2. Install all dependencies by installing `virt-manager`. This will ensure that your package manager automatically installs all the necessary components.
|
||||
```bash
|
||||
sudo apt install virt-manager # Debian/Ubuntu
|
||||
sudo dnf install virt-manager # Fedora/RHEL
|
||||
sudo pacman -S virt-manager # Arch Linux
|
||||
sudo emerge app-emulation/virt-manager # Gentoo Linux
|
||||
```
|
||||
|
||||
3. Download a [Windows 10](https://www.microsoft.com/software-download/windows10ISO) or [Windows 11](https://www.microsoft.com/software-download/windows11) installation `.ISO` image.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 'Professional', 'Enterprise' or 'Server' editions of Windows are required to run RDP applications. Windows 'Home' will NOT suffice.
|
||||
|
||||
4. Download [VirtIO drivers](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso) for the Windows virtual machine.
|
||||
|
||||
> [!NOTE]
|
||||
> VirtIO drivers enhance system performance and minimize overhead by enabling the Windows virtual machine to use specialised network and disk device drivers. These drivers are aware that they are operating inside a virtual machine, and cooperate with the hypervisor. This approach eliminates the need for the hypervisor to emulate physical hardware devices, which is a computationally expensive process. This setup allows guests to achieve high-performance network and disk operations, leveraging the benefits of paravirtualisation.
|
||||
> You can read more about `VirtIO` [here](https://wiki.libvirt.org/Virtio.html).
|
||||
|
||||
## Creating a Windows VM
|
||||
> [!NOTE] If you are an expert user, you may wish to:
|
||||
> - [Define a Windows virtual machine from an existing `.XML` file](#defining-windows-vm-from-xml)
|
||||
> - [Configure Rootless `libvirt`](#configuring-rootless-libvirt)
|
||||
|
||||
1. Open `virt-manager`.
|
||||
|
||||
> [!NOTE]
|
||||
> The name given to the application can vary between GNU/Linux distributions (e.g., 'Virtual Machines', 'Virtual Machine Manager', etc.)
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/00.png" width="500px"/>
|
||||
</p>
|
||||
|
||||
2. Navigate to `Edit`→`Preferences`. Ensure `Enable XML editing` is enabled, then click the `Close` button.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/01.png" width="500px"/>
|
||||
</p>
|
||||
|
||||
3. Create a new virtual machine by clicking the `+` button.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/02.png" width="500px" alt="Creating a new virtual machine in 'virt-manager'"/>
|
||||
</p>
|
||||
|
||||
4. Choose `Local install media` and click `Forward`.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/03.png" width="500px"/>
|
||||
</p>
|
||||
|
||||
5. Select the location of your Windows 10 or 11 `.ISO` by clicking `Browse...` and `Browse Local`. Ensure `Automatically detect from the installation media / source` is enabled.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/04_1.png" width="500px"/>
|
||||
<img src="./libvirt_images/04_2.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
5. Configure the RAM and CPU cores allocated to the Windows virtual machine. We recommend `2` CPUs and `4096MB` of RAM. We will use the `VirtIO` Memory Ballooning service, which means the virtual machine can use up to `4096MB` of memory, but it will only consume this amount if necessary.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/05.png" width="500px"/>
|
||||
</p>
|
||||
|
||||
6. Configure the virtual disk by setting its maximum size. While this size represents the largest it can grow to, the disk will only use this space as needed.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/06.png" width="500px"/>
|
||||
</p>
|
||||
|
||||
7. Name your virtual machine `RDPWindows` to ensure it is recognized by WinApps, and select the option to `Customize configuration before installation`.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/07.png" width="500px"/>
|
||||
</p>
|
||||
|
||||
8. After clicking `Finish`, select `Copy host CPU configuration` under 'CPUs', and then click `Apply`.
|
||||
|
||||
> [!NOTE]
|
||||
> Sometimes this feature gets disabled after installing Windows. Make sure to check and re-enable this option after the installation is complete.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/08.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
9. (Optional) Configure 'CPU pinning' by following [this excellent guide](https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF#CPU_pinning).
|
||||
|
||||
> [!NOTE]
|
||||
> CPU pinning involves assigning specific physical CPU cores to a virtual machine. This can improve performance by reducing context switching and ensuring that the VM's workload consistently uses the same cores, leading to better CPU cache utilisation.
|
||||
|
||||
5. Navigate to the `XML` tab, and edit the `<clock>` section to disable all timers except for the hypervclock, thereby drastically reducing idle CPU usage. Once changed, click `Apply`.
|
||||
```xml
|
||||
<clock offset='localtime'>
|
||||
<timer name='rtc' present='no' tickpolicy='catchup'/>
|
||||
<timer name='pit' present='no' tickpolicy='delay'/>
|
||||
<timer name='hpet' present='no'/>
|
||||
<timer name='kvmclock' present='no'/>
|
||||
<timer name='hypervclock' present='yes'/>
|
||||
</clock>
|
||||
```
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/09.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
6. Enable Hyper-V enlightenments by adding the following to the `<hyperv>` section. Once changed, click `Apply`.
|
||||
|
||||
```xml
|
||||
<hyperv>
|
||||
<relaxed state='on'/>
|
||||
<vapic state='on'/>
|
||||
<spinlocks state='on' retries='8191'/>
|
||||
<vpindex state='on'/>
|
||||
<synic state='on'/>
|
||||
<stimer state='on'>
|
||||
<direct state='on'/>
|
||||
</stimer>
|
||||
<reset state='on'/>
|
||||
<frequencies state='on'/>
|
||||
<reenlightenment state='on'/>
|
||||
<tlbflush state='on'/>
|
||||
<ipi state='on'/>
|
||||
</hyperv>
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> Hyper-V enlightenments make Windows (and other Hyper-V guests) think they are running on top of a Hyper-V compatible hypervisor. This enables use of Hyper-V specific features, allowing `KVM` to implement paravirtualised interfaces for improved virtual machine performance.
|
||||
|
||||
7. In the 'Memory' section, set the `Current allocation` to the minimum amount of memory you want the virtual machine to use, with a recommended value of `1024MB`.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/10.png" width="500px"/>
|
||||
</p>
|
||||
|
||||
8. (Optional) Under `Boot Options`, enable `Start virtual machine on host boot up`.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/11.png" width="500px"/>
|
||||
</p>
|
||||
|
||||
9. Navigate to 'SATA Disk 1' and set the `Disk bus` type to `VirtIO`. This allows disk access to be paravirtualised, improving virtual machine performance.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/12.png" width="500px"/>
|
||||
</p>
|
||||
|
||||
10. Navigate to 'NIC' and set the `Device model` type to `virtio` to enable paravirtualised networking.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/13.png" width="500px"/>
|
||||
</p>
|
||||
|
||||
11. Click the `Add Hardware` button in the lower left, and choose `Storage`. For `Device type`, select `CDROM device` and choose the VirtIO driver `.ISO` you downloaded earlier. Click `Finish` to add the new CD-ROM device.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If you skip this step, the Windows installer will fail to recognise and list the virtual hard drive you created earlier.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/14.png" width="500px"/>
|
||||
</p>
|
||||
|
||||
12. Click `Begin Installation` in the top left.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/15.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
### Example `.XML` File
|
||||
Below is an example `.XML` file that describes a Windows 11 virtual machine.
|
||||
|
||||
```xml
|
||||
<domain type="kvm">
|
||||
<name>RDPWindows</name>
|
||||
<uuid>4d76e36e-c632-43e0-83c0-dc9f36c2823a</uuid>
|
||||
<metadata>
|
||||
<libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
|
||||
<libosinfo:os id="http://microsoft.com/win/11"/>
|
||||
</libosinfo:libosinfo>
|
||||
</metadata>
|
||||
<memory unit="KiB">8388608</memory>
|
||||
<currentMemory unit="KiB">8388608</currentMemory>
|
||||
<vcpu placement="static">4</vcpu>
|
||||
<cputune>
|
||||
<vcpupin vcpu="0" cpuset="2"/>
|
||||
<vcpupin vcpu="1" cpuset="6"/>
|
||||
<vcpupin vcpu="2" cpuset="3"/>
|
||||
<vcpupin vcpu="3" cpuset="7"/>
|
||||
</cputune>
|
||||
<os firmware="efi">
|
||||
<type arch="x86_64" machine="pc-q35-8.1">hvm</type>
|
||||
<firmware>
|
||||
<feature enabled="yes" name="enrolled-keys"/>
|
||||
<feature enabled="yes" name="secure-boot"/>
|
||||
</firmware>
|
||||
<loader readonly="yes" secure="yes" type="pflash" format="qcow2">/usr/share/edk2/ovmf/OVMF_CODE_4M.secboot.qcow2</loader>
|
||||
<nvram template="/usr/share/edk2/ovmf/OVMF_VARS_4M.secboot.qcow2" format="qcow2">/var/lib/libvirt/qemu/nvram/RDPWindows_VARS.qcow2</nvram>
|
||||
<boot dev="hd"/>
|
||||
</os>
|
||||
<features>
|
||||
<acpi/>
|
||||
<apic/>
|
||||
<hyperv mode="custom">
|
||||
<relaxed state="on"/>
|
||||
<vapic state="on"/>
|
||||
<spinlocks state="on" retries="8191"/>
|
||||
<vpindex state="on"/>
|
||||
<synic state="on"/>
|
||||
<stimer state="on">
|
||||
<direct state="on"/>
|
||||
</stimer>
|
||||
<reset state="on"/>
|
||||
<frequencies state="on"/>
|
||||
<reenlightenment state="on"/>
|
||||
<tlbflush state="on"/>
|
||||
<ipi state="on"/>
|
||||
</hyperv>
|
||||
<vmport state="off"/>
|
||||
<smm state="on"/>
|
||||
</features>
|
||||
<cpu mode="host-passthrough" check="none" migratable="on">
|
||||
<topology sockets="1" dies="1" clusters="1" cores="2" threads="2"/>
|
||||
</cpu>
|
||||
<clock offset="localtime">
|
||||
<timer name="rtc" present="no" tickpolicy="catchup"/>
|
||||
<timer name="pit" present="no" tickpolicy="delay"/>
|
||||
<timer name="hpet" present="no"/>
|
||||
<timer name="kvmclock" present="no"/>
|
||||
<timer name="hypervclock" present="yes"/>
|
||||
</clock>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<pm>
|
||||
<suspend-to-mem enabled="no"/>
|
||||
<suspend-to-disk enabled="no"/>
|
||||
</pm>
|
||||
<devices>
|
||||
<emulator>/usr/bin/qemu-system-x86_64</emulator>
|
||||
<disk type="file" device="disk">
|
||||
<driver name="qemu" type="qcow2" discard="unmap"/>
|
||||
<source file="/var/lib/libvirt/images/RDPWindows.qcow2"/>
|
||||
<target dev="vda" bus="virtio"/>
|
||||
<address type="pci" domain="0x0000" bus="0x04" slot="0x00" function="0x0"/>
|
||||
</disk>
|
||||
<disk type="file" device="cdrom">
|
||||
<driver name="qemu" type="raw"/>
|
||||
<target dev="sdb" bus="sata"/>
|
||||
<readonly/>
|
||||
<address type="drive" controller="0" bus="0" target="0" unit="1"/>
|
||||
</disk>
|
||||
<controller type="usb" index="0" model="qemu-xhci" ports="15">
|
||||
<address type="pci" domain="0x0000" bus="0x02" slot="0x00" function="0x0"/>
|
||||
</controller>
|
||||
<controller type="pci" index="0" model="pcie-root"/>
|
||||
<controller type="pci" index="1" model="pcie-root-port">
|
||||
<model name="pcie-root-port"/>
|
||||
<target chassis="1" port="0x10"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x0" multifunction="on"/>
|
||||
</controller>
|
||||
<controller type="pci" index="2" model="pcie-root-port">
|
||||
<model name="pcie-root-port"/>
|
||||
<target chassis="2" port="0x11"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x1"/>
|
||||
</controller>
|
||||
<controller type="pci" index="3" model="pcie-root-port">
|
||||
<model name="pcie-root-port"/>
|
||||
<target chassis="3" port="0x12"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x2"/>
|
||||
</controller>
|
||||
<controller type="pci" index="4" model="pcie-root-port">
|
||||
<model name="pcie-root-port"/>
|
||||
<target chassis="4" port="0x13"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x3"/>
|
||||
</controller>
|
||||
<controller type="pci" index="5" model="pcie-root-port">
|
||||
<model name="pcie-root-port"/>
|
||||
<target chassis="5" port="0x14"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x4"/>
|
||||
</controller>
|
||||
<controller type="pci" index="6" model="pcie-root-port">
|
||||
<model name="pcie-root-port"/>
|
||||
<target chassis="6" port="0x15"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x5"/>
|
||||
</controller>
|
||||
<controller type="pci" index="7" model="pcie-root-port">
|
||||
<model name="pcie-root-port"/>
|
||||
<target chassis="7" port="0x16"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x6"/>
|
||||
</controller>
|
||||
<controller type="pci" index="8" model="pcie-root-port">
|
||||
<model name="pcie-root-port"/>
|
||||
<target chassis="8" port="0x17"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x7"/>
|
||||
</controller>
|
||||
<controller type="pci" index="9" model="pcie-root-port">
|
||||
<model name="pcie-root-port"/>
|
||||
<target chassis="9" port="0x18"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x0" multifunction="on"/>
|
||||
</controller>
|
||||
<controller type="pci" index="10" model="pcie-root-port">
|
||||
<model name="pcie-root-port"/>
|
||||
<target chassis="10" port="0x19"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x1"/>
|
||||
</controller>
|
||||
<controller type="pci" index="11" model="pcie-root-port">
|
||||
<model name="pcie-root-port"/>
|
||||
<target chassis="11" port="0x1a"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x2"/>
|
||||
</controller>
|
||||
<controller type="pci" index="12" model="pcie-root-port">
|
||||
<model name="pcie-root-port"/>
|
||||
<target chassis="12" port="0x1b"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x3"/>
|
||||
</controller>
|
||||
<controller type="pci" index="13" model="pcie-root-port">
|
||||
<model name="pcie-root-port"/>
|
||||
<target chassis="13" port="0x1c"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x4"/>
|
||||
</controller>
|
||||
<controller type="pci" index="14" model="pcie-root-port">
|
||||
<model name="pcie-root-port"/>
|
||||
<target chassis="14" port="0x1d"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x5"/>
|
||||
</controller>
|
||||
<controller type="sata" index="0">
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x1f" function="0x2"/>
|
||||
</controller>
|
||||
<controller type="virtio-serial" index="0">
|
||||
<address type="pci" domain="0x0000" bus="0x03" slot="0x00" function="0x0"/>
|
||||
</controller>
|
||||
<interface type="network">
|
||||
<mac address="52:54:00:81:ff:44"/>
|
||||
<source network="default"/>
|
||||
<model type="virtio"/>
|
||||
<address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
|
||||
</interface>
|
||||
<serial type="pty">
|
||||
<target type="isa-serial" port="0">
|
||||
<model name="isa-serial"/>
|
||||
</target>
|
||||
</serial>
|
||||
<console type="pty">
|
||||
<target type="serial" port="0"/>
|
||||
</console>
|
||||
<channel type="spicevmc">
|
||||
<target type="virtio" name="com.redhat.spice.0"/>
|
||||
<address type="virtio-serial" controller="0" bus="0" port="1"/>
|
||||
</channel>
|
||||
<input type="tablet" bus="usb">
|
||||
<address type="usb" bus="0" port="1"/>
|
||||
</input>
|
||||
<input type="mouse" bus="ps2"/>
|
||||
<input type="keyboard" bus="ps2"/>
|
||||
<tpm model="tpm-crb">
|
||||
<backend type="emulator" version="2.0"/>
|
||||
</tpm>
|
||||
<graphics type="spice" autoport="yes">
|
||||
<listen type="address"/>
|
||||
<image compression="off"/>
|
||||
</graphics>
|
||||
<sound model="ich9">
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x1b" function="0x0"/>
|
||||
</sound>
|
||||
<audio id="1" type="spice"/>
|
||||
<video>
|
||||
<model type="qxl" ram="65536" vram="65536" vgamem="16384" heads="1" primary="yes"/>
|
||||
<address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x0"/>
|
||||
</video>
|
||||
<hostdev mode="subsystem" type="usb" managed="yes">
|
||||
<source>
|
||||
<vendor id="0x0bda"/>
|
||||
<product id="0x554e"/>
|
||||
</source>
|
||||
<address type="usb" bus="0" port="4"/>
|
||||
</hostdev>
|
||||
<redirdev bus="usb" type="spicevmc">
|
||||
<address type="usb" bus="0" port="2"/>
|
||||
</redirdev>
|
||||
<watchdog model="itco" action="reset"/>
|
||||
<memballoon model="virtio">
|
||||
<address type="pci" domain="0x0000" bus="0x05" slot="0x00" function="0x0"/>
|
||||
</memballoon>
|
||||
</devices>
|
||||
</domain>
|
||||
```
|
||||
|
||||
## Install Windows
|
||||
Install Windows as you would on any other machine.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/16.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
Once you get to the point of selecting the location for installation, you will see there are no disks available. This is because the `VirtIO driver` needs to be specified manually.
|
||||
1. Select `Load driver`.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/17.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
2. The installer will then ask you to specify where the driver is located. Select the drive the `VirtIO` driver `.ISO` is mounted on.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/18.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
3. Choose the appropriate driver for the operating system you've selected, which is likely either the `w10` or `w11` drivers.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/19.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
4. The virtual hard disk should now be visible and available for selection.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/20.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
The next hurdle will be bypassing the network selection screen. As the `VirtIO` drivers
|
||||
for networking have not yet been loaded, the virtual machine will not be able to be connected to the internet.
|
||||
- For Windows 11: Press "Shift + F10" to open the command prompt. Type 'OOBE\BYPASSNRO' (without the surrounding quotation marks) and press Enter. The system will restart and now allow you to click `I don't have internet`.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/21.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
- For Windows 10: Simply click `I don't have internet`.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/22.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
Following the above, choose to `Continue with limited setup`.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/23.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
## Final Configuration Steps
|
||||
Open `File Explorer` and navigate to the drive where the `VirtIO` driver `.ISO` is mounted. Run `virt-win-gt-64.exe` to launch the `VirtIO` driver installer.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/24.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
Leave everything as default and click `Next` through the installer. This will install all required device drivers as well as the 'Memory Ballooning' service.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/25.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
Once you finish the `VirtIO` driver installation, you will need to make some registry changes to enable RDP Applications to run on the system. Start by downloading the [RDPApps.reg](/install/RDPApps.reg) file, right-clicking on the `Raw` button, and clicking on `Save target as`.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/26.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
Once you have downloaded the registry file, right-click on it, and choose `Merge`.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/27.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
Rename the Windows virtual machine so that WinApps can locate it by navigating to the start menu and typing `About` to bring up the `About your PC` settings.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/28.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
Scroll down and click on `Rename this PC`.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/29.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
Rename the PC to `RDPWindows`, but **DO NOT** restart the virtual machine.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/30.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
Scroll down to `Remote Desktop`, and enable `Enable Remote Desktop`.
|
||||
|
||||
<p align="center">
|
||||
<img src="./libvirt_images/31.png" width="700px"/>
|
||||
</p>
|
||||
|
||||
At this point, you will need to restart the Windows virtual machine.
|
||||
|
||||
You may now proceed to install other applications like 'Microsoft 365', 'Adobe Creative Cloud' or any other applications you would like to use through WinApps.
|
||||
|
||||
> [!NOTE]
|
||||
> You may also wish to install [Spice Guest Tools](https://www.spice-space.org/download/windows/spice-guest-tools/spice-guest-tools-latest.exe) inside the virtual machine, which enables features like auto-desktop resize and cut-and-paste when accessing the virtual machine through `virt-manager`. Since WinApps uses RDP, however, this is unnecessary if you don't plan to access the virtual machine via `virt-manager`.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Ensure `WAFLAVOR` is set to `"libvirt"` in your `~/.config/winapps/winapps.conf` to prevent WinApps looking for a `Docker` installation instead.
|
||||
|
||||
Finally, restart the virtual machine, but **DO NOT** log in. Close the virtual machine viewer and proceed to run the WinApps installation.
|
||||
|
||||
```bash
|
||||
./installer.sh
|
||||
```
|
||||
|
||||
## Expert Installations
|
||||
### Defining Windows VM from `.XML`
|
||||
This expert guide for `.XML` imports is specific to Ubuntu 20.04 and may not work on all hardware platforms. Please read this guide in conjunction with the steps outlined above.
|
||||
|
||||
1. Copy your Windows `.ISO` and `VirtIO` drivers `.ISO` files into the desired folder, updating the relevant paths in `kvm/RDPWindows.xml`.
|
||||
|
||||
2. Define a virtual machine called 'RDPWindows' from the sample XML file.
|
||||
``` bash
|
||||
virsh define kvm/RDPWindows.xml
|
||||
virsh autostart RDPWindows # Configure the VM to start automatically when the host machine boots
|
||||
```
|
||||
|
||||
3. Open the virtual machine's properties in `virt-manager` and ensure that `Copy host CPU configuration` is enabled.
|
||||
|
||||
4. Boot the virtual machine, install Windows and complete the final configuration steps as outlined in the main guide above.
|
||||
|
||||
### Configuring Rootless `libvirt`
|
||||
By default, `libvirt` requires sudo to run virtual machines. To enable your user to access `libvirt` and `kvm` without sudo, your user must be added to groups of the same name. Furthermore, modifications need to be made to `AppArmor` (if relevant to your distribution).
|
||||
|
||||
``` bash
|
||||
sudo sed -i "s/#user = "root"/user = "$(id -un)"/g" /etc/libvirt/qemu.conf # Uncomment the user = "root" line and replace root with the current username.
|
||||
sudo sed -i "s/#group = "root"/group = "$(id -gn)"/g" /etc/libvirt/qemu.conf # Uncomment the group = "root" line and replace root with the current user's primary group.
|
||||
sudo usermod -a -G kvm $(id -un) # Add the user to the 'kvm' group.
|
||||
sudo usermod -a -G libvirt $(id -un) # Add the user to the 'libvirt' group.
|
||||
sudo systemctl restart libvirtd # Restart the libvirt daemon.
|
||||
sudo ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/ # Disable AppArmor for the libvirt daemon by creating a symbolic link.
|
||||
```
|
||||
|
||||
You will need to reboot your system to ensure your user is added to the relevant groups.
|
||||
|
||||
> [!NOTE]
|
||||
> Systems with `SELinux` may also require security policy adjustments to enable correct functioning of the `libvirt` daemon.
|
BIN
docs/libvirt_images/00.png
Normal file
After Width: | Height: | Size: 101 KiB |
BIN
docs/libvirt_images/01.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
docs/libvirt_images/02.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
docs/libvirt_images/03.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
docs/libvirt_images/04_1.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
docs/libvirt_images/04_2.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
docs/libvirt_images/05.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
docs/libvirt_images/06.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
docs/libvirt_images/07.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
docs/libvirt_images/08.png
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
docs/libvirt_images/09.png
Normal file
After Width: | Height: | Size: 147 KiB |
BIN
docs/libvirt_images/10.png
Normal file
After Width: | Height: | Size: 72 KiB |
BIN
docs/libvirt_images/11.png
Normal file
After Width: | Height: | Size: 77 KiB |
BIN
docs/libvirt_images/12.png
Normal file
After Width: | Height: | Size: 88 KiB |
BIN
docs/libvirt_images/13.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
docs/libvirt_images/14.png
Normal file
After Width: | Height: | Size: 73 KiB |
BIN
docs/libvirt_images/15.png
Normal file
After Width: | Height: | Size: 96 KiB |
BIN
docs/libvirt_images/16.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
docs/libvirt_images/17.png
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
docs/libvirt_images/18.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
docs/libvirt_images/19.png
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
docs/libvirt_images/20.png
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
docs/libvirt_images/21.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
docs/libvirt_images/22.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
docs/libvirt_images/23.png
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
docs/libvirt_images/24.png
Normal file
After Width: | Height: | Size: 199 KiB |
BIN
docs/libvirt_images/25.png
Normal file
After Width: | Height: | Size: 225 KiB |
BIN
docs/libvirt_images/26.png
Normal file
After Width: | Height: | Size: 198 KiB |
BIN
docs/libvirt_images/27.png
Normal file
After Width: | Height: | Size: 168 KiB |
BIN
docs/libvirt_images/28.png
Normal file
After Width: | Height: | Size: 178 KiB |
BIN
docs/libvirt_images/29.png
Normal file
After Width: | Height: | Size: 171 KiB |
BIN
docs/libvirt_images/30.png
Normal file
After Width: | Height: | Size: 157 KiB |
BIN
docs/libvirt_images/31.png
Normal file
After Width: | Height: | Size: 160 KiB |
180
docs/libvirt_images/Virtualisation_Stack.svg
Normal file
@ -0,0 +1,180 @@
|
||||
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 586 384" width="586" height="384">
|
||||
<title>Open-source-virtualization-stack</title>
|
||||
<style>
|
||||
tspan { white-space:pre }
|
||||
.s0 { fill: #c8c8c8 }
|
||||
.t1 { font-size: 16px;fill: #000000;font-weight: 700;font-family: "Unageo-Bold", "Unageo" }
|
||||
.s2 { fill: #f99b0f }
|
||||
.t3 { font-size: 16px;fill: #ffffff;font-weight: 700;font-family: "Unageo-Bold", "Unageo" }
|
||||
.s4 { fill: #e95420 }
|
||||
.s5 { fill: #ffffff;stroke: #666666;stroke-miterlimit:100;stroke-width: 5 }
|
||||
.s6 { fill: #e5e5e5 }
|
||||
.s7 { fill: #772953 }
|
||||
.s8 { fill: #ffffff }
|
||||
</style>
|
||||
<g id="Hardware">
|
||||
<path id="Hardware_Layer" class="s0" d="m20 332h546c11 0 20 9 20 20v12c0 11-9 20-20 20h-546c-11 0-20-9-20-20v-12c0-11 9-20 20-20z"/>
|
||||
<text id="Hardware_Layer_Text" style="transform: matrix(1,0,0,1,27,364)" >
|
||||
<tspan x="0" y="0" class="t1">H</tspan><tspan y="0" class="t1">a</tspan><tspan y="0" class="t1">r</tspan><tspan y="0" class="t1">d</tspan><tspan y="0" class="t1">w</tspan><tspan y="0" class="t1">a</tspan><tspan y="0" class="t1">r</tspan><tspan y="0" class="t1">e
|
||||
</tspan>
|
||||
</text>
|
||||
<g id="Hardware_Layer_Children">
|
||||
<g id="CPU">
|
||||
<path id="CPU_Box" class="s2" d="m227 348v21h-55v-21z"/>
|
||||
<text id="CPU_Text" style="transform: matrix(1,0,0,1,172,351)" >
|
||||
<tspan x="11.7" y="12.1" class="t3">C</tspan><tspan y="12.1" class="t3">P</tspan><tspan y="12.1" class="t3">U</tspan><tspan y="12.1" class="t3">
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="RAM">
|
||||
<path id="RAM_Box" class="s2" d="m382 348v21h-55v-21z"/>
|
||||
<text id="RAM_Text" style="transform: matrix(1,0,0,1,327,351)" >
|
||||
<tspan x="10.7" y="13" class="t3">R</tspan><tspan y="13" class="t3">A</tspan><tspan y="13" class="t3">M
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Devices">
|
||||
<g id="Device_3">
|
||||
<path id="Device_Box" class="s2" d="m551 341v21h-55v-21z"/>
|
||||
<text id="Device_Text" style="transform: matrix(1,0,0,1,496,344)" >
|
||||
<tspan x="2.5" y="13" class="t3">D</tspan><tspan y="13" class="t3">e</tspan><tspan y="13" class="t3">v</tspan><tspan y="13" class="t3">i</tspan><tspan y="13" class="t3">c</tspan><tspan y="13" class="t3">e
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Device_2">
|
||||
<path id="Device_Box" class="s2" d="m544 348v21h-55v-21z"/>
|
||||
<text id="Device_Text" style="transform: matrix(1,0,0,1,489,351)" >
|
||||
<tspan x="2.5" y="13" class="t3">D</tspan><tspan y="13" class="t3">e</tspan><tspan y="13" class="t3">v</tspan><tspan y="13" class="t3">i</tspan><tspan y="13" class="t3">c</tspan><tspan y="13" class="t3">e
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Device_1">
|
||||
<path id="Device_Box" class="s2" d="m537 355v21h-55v-21z"/>
|
||||
<text id="Device_Text" style="transform: matrix(1,0,0,1,482,358)" >
|
||||
<tspan x="2.5" y="13" class="t3">D</tspan><tspan y="13" class="t3">e</tspan><tspan y="13" class="t3">v</tspan><tspan y="13" class="t3">i</tspan><tspan y="13" class="t3">c</tspan><tspan y="13" class="t3">e
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Linux_Kernel">
|
||||
<path id="Kernel_Layer" class="s0" d="m20 242h546c11 0 20 9 20 20v20c0 11-9 20-20 20h-546c-11 0-20-9-20-20v-20c0-11 9-20 20-20z"/>
|
||||
<text id="Kernel_Layer_Text" style="transform: matrix(1,0,0,1,65,268)" >
|
||||
<tspan x="-19.9" y="0" class="t1">L</tspan><tspan y="0" class="t1">i</tspan><tspan y="0" class="t1">n</tspan><tspan y="0" class="t1">u</tspan><tspan y="0" class="t1">x</tspan><tspan y="0" class="t1">
|
||||
</tspan>
|
||||
<tspan x="-23.6" y="19.2" class="t1">K</tspan><tspan y="19.2" class="t1">e</tspan><tspan y="19.2" class="t1">r</tspan><tspan y="19.2" class="t1">n</tspan><tspan y="19.2" class="t1">e</tspan><tspan y="19.2" class="t1">l
|
||||
</tspan>
|
||||
</text>
|
||||
<g id="KVM">
|
||||
<path id="KVM_Layer" class="s4" d="m578 249v45h-403v-45z"/>
|
||||
<text id="KVM_Text" style="transform: matrix(1,0,0,1,175,254)" >
|
||||
<tspan x="184.3" y="24.1" class="t3">K</tspan><tspan y="24.1" class="t3">V</tspan><tspan y="24.1" class="t3">M
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
</g>
|
||||
<g id="QEMU">
|
||||
<path id="QEMU_Layer" class="s0" d="m189 0h376c11 0 20 9 20 20v170c0 11-9 20-20 20h-376c-11 0-20-9-20-20v-170c0-11 9-20 20-20z"/>
|
||||
<g id="VM_1">
|
||||
<path id="VM_Box" class="s5" d="m305 43v160h-122v-160z"/>
|
||||
<g id="VM_Kernel">
|
||||
<path id="VM_Kernel_Box" class="s6" d="m294 147v45h-100v-45z"/>
|
||||
<text id="VM_Kernel_text" style="transform: matrix(1,0,0,1,194,150)" >
|
||||
<tspan x="12.6" y="24.1" class="t1">V</tspan><tspan y="24.1" class="t1">M</tspan><tspan y="24.1" class="t1"> </tspan><tspan y="24.1" class="t1">K</tspan><tspan y="24.1" class="t1">e</tspan><tspan y="24.1" class="t1">r</tspan><tspan y="24.1" class="t1">n</tspan><tspan y="24.1" class="t1">e</tspan><tspan y="24.1" class="t1">l
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="VM_Applications">
|
||||
<path id="VM_Applications_Box" class="s7" d="m294 91v45h-100v-45z"/>
|
||||
<text id="VM_Applications_Text" style="transform: matrix(1,0,0,1,194,94)" >
|
||||
<tspan x="17.5" y="24.1" class="t3">V</tspan><tspan y="24.1" class="t3">M</tspan><tspan y="24.1" class="t3"> </tspan><tspan y="24.1" class="t3">A</tspan><tspan y="24.1" class="t3">p</tspan><tspan y="24.1" class="t3">p</tspan><tspan y="24.1" class="t3">s
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<text id="VM_Box_Text" style="transform: matrix(1,0,0,1,244,73)" >
|
||||
<tspan x="-41.4" y="0" class="t1">G</tspan><tspan y="0" class="t1">u</tspan><tspan y="0" class="t1">e</tspan><tspan y="0" class="t1">s</tspan><tspan y="0" class="t1">t</tspan><tspan y="0" class="t1"> </tspan><tspan y="0" class="t1">(</tspan><tspan y="0" class="t1">V</tspan><tspan y="0" class="t1">M</tspan><tspan y="0" class="t1">)
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="VM_2">
|
||||
<path id="VM_Box" class="s5" d="m438 43v160h-122v-160z"/>
|
||||
<g id="VM_Kernel">
|
||||
<path id="VM_Kernel_Box" class="s6" d="m427 147v45h-100v-45z"/>
|
||||
<text id="VM_Kernel_text" style="transform: matrix(1,0,0,1,327,150)" >
|
||||
<tspan x="12.6" y="24.1" class="t1">V</tspan><tspan y="24.1" class="t1">M</tspan><tspan y="24.1" class="t1"> </tspan><tspan y="24.1" class="t1">K</tspan><tspan y="24.1" class="t1">e</tspan><tspan y="24.1" class="t1">r</tspan><tspan y="24.1" class="t1">n</tspan><tspan y="24.1" class="t1">e</tspan><tspan y="24.1" class="t1">l
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="VM_Applications">
|
||||
<path id="VM_Applications_Box" class="s7" d="m427 91v45h-100v-45z"/>
|
||||
<text id="VM_Applications_Text" style="transform: matrix(1,0,0,1,327,94)" >
|
||||
<tspan x="17.5" y="24.1" class="t3">V</tspan><tspan y="24.1" class="t3">M</tspan><tspan y="24.1" class="t3"> </tspan><tspan y="24.1" class="t3">A</tspan><tspan y="24.1" class="t3">p</tspan><tspan y="24.1" class="t3">p</tspan><tspan y="24.1" class="t3">s
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<text id="VM_Box_Text" style="transform: matrix(1,0,0,1,377,73)" >
|
||||
<tspan x="-41.4" y="0" class="t1">G</tspan><tspan y="0" class="t1">u</tspan><tspan y="0" class="t1">e</tspan><tspan y="0" class="t1">s</tspan><tspan y="0" class="t1">t</tspan><tspan y="0" class="t1"> </tspan><tspan y="0" class="t1">(</tspan><tspan y="0" class="t1">V</tspan><tspan y="0" class="t1">M</tspan><tspan y="0" class="t1">)
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="VM_3">
|
||||
<path id="VM_Box" class="s5" d="m571 43v160h-122v-160z"/>
|
||||
<g id="VM_Kernel">
|
||||
<path id="VM_Kernel_Box" class="s6" d="m560 147v45h-100v-45z"/>
|
||||
<text id="VM_Kernel_text" style="transform: matrix(1,0,0,1,460,150)" >
|
||||
<tspan x="12.6" y="24.1" class="t1">V</tspan><tspan y="24.1" class="t1">M</tspan><tspan y="24.1" class="t1"> </tspan><tspan y="24.1" class="t1">K</tspan><tspan y="24.1" class="t1">e</tspan><tspan y="24.1" class="t1">r</tspan><tspan y="24.1" class="t1">n</tspan><tspan y="24.1" class="t1">e</tspan><tspan y="24.1" class="t1">l
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="VM_Applications">
|
||||
<path id="VM_Applications_Box" class="s7" d="m560 91v45h-100v-45z"/>
|
||||
<text id="VM_Applications_Text" style="transform: matrix(1,0,0,1,460,94)" >
|
||||
<tspan x="17.5" y="24.1" class="t3">V</tspan><tspan y="24.1" class="t3">M</tspan><tspan y="24.1" class="t3"> </tspan><tspan y="24.1" class="t3">A</tspan><tspan y="24.1" class="t3">p</tspan><tspan y="24.1" class="t3">p</tspan><tspan y="24.1" class="t3">s
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<text id="VM_Box_Text" style="transform: matrix(1,0,0,1,510,73)" >
|
||||
<tspan x="-41.4" y="0" class="t1">G</tspan><tspan y="0" class="t1">u</tspan><tspan y="0" class="t1">e</tspan><tspan y="0" class="t1">s</tspan><tspan y="0" class="t1">t</tspan><tspan y="0" class="t1"> </tspan><tspan y="0" class="t1">(</tspan><tspan y="0" class="t1">V</tspan><tspan y="0" class="t1">M</tspan><tspan y="0" class="t1">)
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<text id="QEMU_Layer_Text" style="transform: matrix(1,0,0,1,377,27)" >
|
||||
<tspan x="-23.2" y="0" class="t1">Q</tspan><tspan y="0" class="t1">E</tspan><tspan y="0" class="t1">M</tspan><tspan y="0" class="t1">U
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="GNU/Linux_Applications">
|
||||
<path id="GNU/Linux_Applications_Box" class="s0" d="m20 0h90c11 0 20 9 20 20v170c0 11-9 20-20 20h-90c-11 0-20-9-20-20v-170c0-11 9-20 20-20z"/>
|
||||
<g id="libvirt">
|
||||
<path id="libvirt_Box" class="s7" d="m116 142v50h-102v-50z"/>
|
||||
<text id="libvirt" style="transform: matrix(1,0,0,1,14,145)" >
|
||||
<tspan x="29.4" y="26.6" class="t3">l</tspan><tspan y="26.6" class="t3">i</tspan><tspan y="26.6" class="t3">b</tspan><tspan y="26.6" class="t3">v</tspan><tspan y="26.6" class="t3">i</tspan><tspan y="26.6" class="t3">r</tspan><tspan y="26.6" class="t3">t
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="virt-manager">
|
||||
<path id="virt-manager_Box" class="s7" d="m117 67v46h-104v-46z"/>
|
||||
<text id="virt-manager" style="transform: matrix(1,0,0,1,13,70)" >
|
||||
<tspan x="1.8" y="24.6" class="t3">v</tspan><tspan y="24.6" class="t3">i</tspan><tspan y="24.6" class="t3">r</tspan><tspan y="24.6" class="t3">t</tspan><tspan y="24.6" class="t3">-</tspan><tspan y="24.6" class="t3">m</tspan><tspan y="24.6" class="t3">a</tspan><tspan y="24.6" class="t3">n</tspan><tspan y="24.6" class="t3">a</tspan><tspan y="24.6" class="t3">g</tspan><tspan y="24.6" class="t3">e</tspan><tspan y="24.6" class="t3">r
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<text id="GNU/Linux_Applications_Text" style="transform: matrix(1,0,0,1,65,26)" >
|
||||
<tspan x="-40.9" y="0" class="t1">G</tspan><tspan y="0" class="t1">N</tspan><tspan y="0" class="t1">U</tspan><tspan y="0" class="t1">/</tspan><tspan y="0" class="t1">L</tspan><tspan y="0" class="t1">i</tspan><tspan y="0" class="t1">n</tspan><tspan y="0" class="t1">u</tspan><tspan y="0" class="t1">x</tspan><tspan y="0" class="t1">
|
||||
</tspan>
|
||||
<tspan x="-46" y="19.2" class="t1">A</tspan><tspan y="19.2" class="t1">p</tspan><tspan y="19.2" class="t1">p</tspan><tspan y="19.2" class="t1">l</tspan><tspan y="19.2" class="t1">i</tspan><tspan y="19.2" class="t1">c</tspan><tspan y="19.2" class="t1">a</tspan><tspan y="19.2" class="t1">t</tspan><tspan y="19.2" class="t1">i</tspan><tspan y="19.2" class="t1">o</tspan><tspan y="19.2" class="t1">n</tspan><tspan y="19.2" class="t1">s
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g id="Arrows">
|
||||
<path id="Arrow_0" fill-rule="evenodd" class="s8" d="m75.7 115c-0.6-0.7-1.6-0.7-2.2 0l-6.2 6.2c-0.6 0.6-0.6 1.6 0 2.2 0.6 0.6 1.6 0.6 2.2 0l3.5-3.6v18c0 0.9 0.7 1.5 1.6 1.5 0.8 0 1.5-0.6 1.5-1.5v-18l3.6 3.6c0.6 0.6 1.6 0.6 2.2 0 0.6-0.6 0.6-1.6 0-2.2 0 0-6.2-6.2-6.2-6.2z"/>
|
||||
<path id="Arrow_1" fill-rule="evenodd" class="s8" d="m53.5 138.9c0.6 0.6 1.6 0.6 2.2 0l6.2-6.2c0.6-0.6 0.6-1.6 0-2.2-0.6-0.6-1.6-0.6-2.2 0l-3.6 3.5v-17.9c0-0.9-0.7-1.6-1.5-1.6-0.9 0-1.6 0.7-1.6 1.6v17.9l-3.5-3.5c-0.6-0.6-1.6-0.6-2.2 0-0.6 0.6-0.6 1.6 0 2.2 0 0 6.2 6.2 6.2 6.2z"/>
|
||||
<path id="Arrow_2" fill-rule="evenodd" class="s8" d="m159.5 158c0.7-0.6 0.7-1.6 0-2.2l-6.2-6.2c-0.6-0.6-1.6-0.6-2.2 0-0.6 0.6-0.6 1.6 0 2.2l3.6 3.6h-18c-0.9 0-1.5 0.7-1.5 1.5 0 0.9 0.6 1.6 1.5 1.6h18l-3.6 3.5c-0.6 0.6-0.6 1.6 0 2.2 0.6 0.6 1.6 0.6 2.2 0 0 0 6.2-6.2 6.2-6.2z"/>
|
||||
<path id="Arrow_3" fill-rule="evenodd" class="s8" d="m135.6 175.8c-0.6 0.6-0.6 1.6 0 2.2l6.2 6.2c0.6 0.6 1.6 0.6 2.2 0 0.6-0.6 0.6-1.6 0-2.2l-3.5-3.5h17.9c0.9 0 1.6-0.7 1.6-1.6 0-0.8-0.7-1.5-1.6-1.5h-17.9l3.5-3.6c0.6-0.6 0.6-1.6 0-2.2-0.6-0.6-1.6-0.6-2.2 0 0 0-6.2 6.2-6.2 6.2z"/>
|
||||
<path id="Arrow_4" fill-rule="evenodd" class="s8" d="m281.5 238.9c0.6 0.6 1.6 0.6 2.2 0l6.2-6.2c0.6-0.6 0.6-1.6 0-2.2-0.6-0.6-1.6-0.6-2.2 0l-3.6 3.5v-17.9c0-0.9-0.7-1.6-1.5-1.6-0.9 0-1.6 0.7-1.6 1.6v17.9l-3.5-3.5c-0.6-0.6-1.6-0.6-2.2 0-0.6 0.6-0.6 1.6 0 2.2 0 0 6.2 6.2 6.2 6.2z"/>
|
||||
<path id="Arrow_5" fill-rule="evenodd" class="s8" d="m303.7 215c-0.6-0.7-1.6-0.7-2.2 0l-6.2 6.2c-0.6 0.6-0.6 1.6 0 2.2 0.6 0.6 1.6 0.6 2.2 0l3.5-3.6v18c0 0.9 0.7 1.5 1.6 1.5 0.8 0 1.5-0.6 1.5-1.5v-18l3.6 3.6c0.6 0.6 1.6 0.6 2.2 0 0.6-0.6 0.6-1.6 0-2.2 0 0-6.2-6.2-6.2-6.2z"/>
|
||||
<path id="Arrow_6" fill-rule="evenodd" class="s8" d="m281.5 328.9c0.6 0.6 1.6 0.6 2.2 0l6.2-6.2c0.6-0.6 0.6-1.6 0-2.2-0.6-0.6-1.6-0.6-2.2 0l-3.6 3.5v-17.9c0-0.9-0.7-1.6-1.5-1.6-0.9 0-1.6 0.7-1.6 1.6v17.9l-3.5-3.5c-0.6-0.6-1.6-0.6-2.2 0-0.6 0.6-0.6 1.6 0 2.2 0 0 6.2 6.2 6.2 6.2z"/>
|
||||
<path id="Arrow_7" fill-rule="evenodd" class="s8" d="m303.7 305c-0.6-0.7-1.6-0.7-2.2 0l-6.2 6.2c-0.6 0.6-0.6 1.6 0 2.2 0.6 0.6 1.6 0.6 2.2 0l3.5-3.6v18c0 0.9 0.7 1.5 1.6 1.5 0.8 0 1.5-0.6 1.5-1.5v-18l3.6 3.6c0.6 0.6 1.6 0.6 2.2 0 0.6-0.6 0.6-1.6 0-2.2 0 0-6.2-6.2-6.2-6.2z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 14 KiB |
@ -76,8 +76,8 @@ RDP_USER=""
|
||||
RDP_PASS=""
|
||||
#RDP_DOMAIN="MYDOMAIN"
|
||||
#RDP_IP="192.168.123.111"
|
||||
#WAFLAVOR="docker"
|
||||
#RDP_SCALE=100
|
||||
#WAFLAVOR="docker" # Acceptable values are 'docker', 'podman' and 'libvirt'.
|
||||
#RDP_SCALE=100 # Acceptable values are 100, 140, and 180.
|
||||
#RDP_FLAGS=""
|
||||
#MULTIMON="true"
|
||||
#DEBUG="true"
|
||||
|