Solution Verified in:
- OpenNebula: 5.10
This step-by-step tutorial will help users to build a Windows 10 Image to be used within an OpenNebula cloud to create KVM-based Windows Virtual Machines.
The solution offered by this article is based on the CLI, but if want to know how to perform this task by using only OpenNebula's WebUI—Sunstone—have a look at the following screencast:
Step 1: OpenNebula Installation
To setup quickly an OpenNebula environment we will use miniONE, an easy-to-use tool for deploying an evaluation OpenNebula cloud based on either KVM virtual machines or LXD system containers.
To setup a KVM-based environment (OpenNebula frontend plus a KVM hypervisor node) you need a physical host (x86-64 Intel or AMD processor) with virtualization capabilities and with one of these supported Operating Systems.
Then you can run the following commands:
wget 'https://github.com/OpenNebula/minione/releases/latest/download/minione' sudo bash minione
During the installation you will get a report like this:
### Checks & detection Checking AppArmor SKIP will try to modify ### Main deployment steps: Install OpenNebula frontend version 5.10 Configure bridge minionebr with IP 172.16.100.1/24 Enable NAT over wlp2s0 Modify AppArmor Install OpenNebula KVM node Export appliance and update VM template Do you agree? [yes/no]: yes ### Installation Updating APT cache OK Download augeas lens oned.aug OK Creating bridge interface minionebr OK Bring bridge interfaces up OK Configuring NAT using iptables OK Saving iptables changes OK Installing DNSMasq OK Starting DNSMasq OK Configuring repositories OK Updating APT cache OK Installing OpenNebula packages OK Installing Ruby gems OK Installing OpenNebula node packages OK Updating AppArmor OK Disable default libvirtd networking OK Restart libvirtd OK ### Configuration Switching OneGate endpoint in oned.conf OK Switching scheduler interval in oned.conf OK Setting initial password for current user and oneadmin OK Changing WebUI to listen on port 80 OK Starting OpenNebula services OK Enabling OpenNebula services OK Add ssh key to oneadmin user OK Update ssh configs to allow VM addresses reusig OK Ensure own hostname is resolvable OK Checking OpenNebula is working OK Disabling ssh from virtual network OK Adding localhost ssh key to known_hosts OK Testing ssh connection to localhost OK Updating datastores, TM_MAD=qcow2, SHARED=yes OK Creating KVM host OK Creating virtual network OK Exporting [CentOS 7] from Marketplace to local datastore OK Updating VM template OK ### Report OpenNebula 5.10 was installed Sunstone [the webui] is runninng on: http://192.168.1.25/ Use following to login: user: oneadmin password: 48h4dE8arj
Step 2: Download ISO Images
Windows 10 ISO
You need a Windows 10 installation ISO file. A Windows 10 Enterprise evaluation ISO can be downloaded from https://www.microsoft.com/en-us/evalcenter/evaluate-windows-10-enterprise
VirtIO Drivers for Windows
VirtIO is a virtualization standard for network and disk device drivers. You can download the stable ISO of VirtIO drivers and additional software agents for Windows virtual machines running on KVM from https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/
wget -O /archive/ISOS/virtio-win.iso https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
OpenNebula Windows VM Contextualization
Finally, you need the addon that provides contextualization package for the Windows guest virtual machines running in the OpenNebula cloud. Based on the provided contextualization parameters, the packages prepare the networking in the running guest virtual machine, set passwords, run custom start scripts, and many others. The ISO can be downloaded here.
wget -O /archive/ISOS/one-context-5.10.0.iso https://github.com/OpenNebula/addon-context-windows/releases/download/v5.10.0/one-context-5.10.0.iso
The ISO images should be downloaded in a folder of the frontend server that oneadmin user can access
Step 3: Register and Create Images in the Datastore
The following commands will be executed as the oneadmin user. You can run the following command to see the available datastores:
onedatastore list ID NAME SIZE AVA CLUSTERS IMAGES TYPE DS TM STAT 2 files 231.1G 32% 0 0 fil fs ssh on 1 default 231.1G 32% 0 0 img fs qcow2 on 0 system 231.1G 32% 0 0 sys - qcow2 on
You need to create CDROM images on the default datastore (ID=1) for the ISO images that have been downloaded in the previous step.
oneimage create -d 1 --name "Windows 10 ISO" --path /archive/ISOS/win10.iso --type CDROM oneimage create -d 1 --name "Virtio Windows Drivers ISO" --path /archive/ISOS/virtio-win.iso --type CDROM oneimage create -d 1 --name "ONE Windows Context ISO" --path /archive/ISOS/virtio-win.iso --type CDROM
You need to create also an empty disk to be used for the installation of Windows 10 operating system by running
oneimage create -d 1 --name "Windows 10" --type DATABLOCK --size 45G --persistent
Use persistent flag for the DATABLOCK image so the changes made inside the VM will be saved back to the datastore after the VM is terminated
You can check if the images are ready by running:
oneimage list ID USER GROUP NAME DATASTORE SIZE TYPE PER STAT RVMS 4 oneadmin oneadmin Windows 10 default 45G DB Yes rdy 0 3 oneadmin oneadmin ONE Windows Context ISO default 1M CD No rdy 0 2 oneadmin oneadmin Virtio Windows Drivers ISO default 355M CD No rdy 0 1 oneadmin oneadmin Windows 10 ISO default 4.6G CD No rdy 0
Step 4: Create a VM for Windows Installation
Now, you need need to create a VM template in order to proceed with the installation of Windows 10 by writing a file (template.txt) with the following content:
NAME = "Windows 10 Installation" MEMORY = "16384" MEMORY_UNIT_COST = "MB" CPU = "4" VCPU = "4" DISK = [ IMAGE = "Windows 10 ISO", IMAGE_UNAME = "oneadmin" ] DISK = [ IMAGE = "Virtio Windows Drivers ISO", IMAGE_UNAME = "oneadmin" ] DISK = [ IMAGE = "ONE Windows Context ISO", IMAGE_UNAME = "oneadmin" ] DISK = [ DEV_PREFIX = "vd", IMAGE = "Windows 10", IMAGE_UNAME = "oneadmin" ] NIC = [ NETWORK = "vnet", NETWORK_UNAME = "oneadmin", SECURITY_GROUPS = "0" ] NIC_DEFAULT = [ MODEL = "virtio" ] GRAPHICS = [ LISTEN = "0.0.0.0", TYPE = "VNC" ] INPUT = [ BUS = "usb", TYPE = "tablet" ] OS = [ BOOT = "disk0" ]
For the "Windows 10" DATABLOCK image and the Network, VirtIO should be specified, in particular, DEV_PREFIX=vd for the image, and MODEL=virtio for the network. For the INPUT section, BUS=usb and TYPE=tablet is needed to avoid issues with the mouse pointer when connecting to the VM via VNC.
and then executing:
onetemplate create template.txt
You can check the templates by running:
onetemplate list ID USER GROUP NAME REGTIME 1 oneadmin oneadmin Windows 10 Installation 04/29 07:40:19 0 oneadmin oneadmin CentOS 7 04/29 07:31:49
You have to create a Virtual Machine to proceed with the installation of Windows by running:
onetemplate instantiate 1
You can connect to the Sunstone portal by using oneadmin (username and password are provided by the miniONE installation report). Once you login, you can connect to the Windows virtual machine by using the integrated VNC console in Sunstone and proceed with Windows installation. You will need to install VirtIO drivers for the virtual SCSI controller, for the network card and for the PCI device that is used to control the memory ballooning. Have a look at this screencast to see how to do that.
Step 5: Create a VM template for Windows Virtual Machines
Once the installation of Windows has been completed, we can proceed to terminate the VM:
onevm terminate 0
You need to change the image disk with Windows 10 installed from Datablock to OS and to non persistent:
oneimage chtype 4 OS oneimage nonpersistent 4
You can build a VM template that can be used for creating Windows 10 Virtual Machines. Add the following content to a file "win_template.txt"
NAME="Windows 10 Enterprise" CPU="4" VCPU="4" MEMORY="16384" MEMORY_UNIT_COST="MB" DISK=[ DEV_PREFIX="vd", IMAGE="Windows 10", IMAGE_UNAME="oneadmin" ] GRAPHICS=[ LISTEN="0.0.0.0", TYPE="VNC" ] INPUT=[ BUS="usb", TYPE="tablet" ] NIC=[ NETWORK="vnet", NETWORK_UNAME="oneadmin", SECURITY_GROUPS="0" ] CONTEXT=[ NETWORK="YES", SSH_PUBLIC_KEY="$USER[SSH_PUBLIC_KEY]" ]
and then run:
onetemplate create win_template.txt
You can create a Windows 10 Virtual Machine by running:
onetemplate instantiate 2