Dizzy's Guide to Creating a Gaming VM
Virtualization is the future of computing and is already being used in many capacities today. In writing this guide I hope to educate our community to it's benefits, usage and limitations. The more support it has, the further developed it will become. That is also my goal for this guide; to see it become simplified and offer broader support for hardware and software.Some Benefits:
Beta version 0.20.1
Before we begin,
- Reset the VM without having to hard reset the system (WIP)
- Uninterrupted sessions of other VMs
- Ability to run the latest games on a VM
- Being able to use all that extra Memory and those Cores
be sure to make sure your system is VT-d or AMD-Vi (IOMMU) capable.VT-d is an extension on top of the normal Virtualization instructions provided by intel, and IOMMU (AMD-Vi) is the AMD version. These are not the same as VT-x and AMD-V. They are extra and you need to be sure you have them on your system before attempting this guide.For Intel this requires:
VT-d (Click to show)
For AMD this requires:
IOMMU (Click to show)
- CPU with VT-x Socket 775 and newer. Vpro rated chipset with VT-d in BIOS is also required by 775 CPUs (Most likely Q45)
- Core i5/i7 or Xeon Chip with VT-x and VT-d. Only Non-K, except C2 stepping 3930k and 3960x chips have the right instructions
- Motherboard with VT-d option in BIOS. (ASrock and Zotac have a good selection)
- Any reasonably new AMD processor (AM2 and newer or socket 940 Opteron and newer)
- Proper chipset. 880fx and 990fx or most server boards should have IOMMU. Check with the manufacturer or in the manual
- IOMMU (AMD-Vi) option enabled in BIOS (ASrock or ASUS 880/990FX and most server boards)
Video card is your choice. I suggest using a newer Radeon for now because it has good compatibility with Xen passthrough and HD audio on the card which means you won't need to pass through the motherboard audio to get sound from the VM.
Of course, you could pass motherboard or another discrete Audio device through too.Step 1:
Download Fedora 20 (Click to show)
Fedora 20 Download
Enable IOMMU/VT-d in the BIOS (Click to show)
-- Choose your flavor (Warning! LXDE does not currently have GUI bluetooth support)
See your motherboard manual for more info. This will be in northbridge options and listed as VT-d for intel and IOMMU or AMD-Vi for AMD. (Note that VT-x and AMD-V are not enough for this tutorial)
Disclaimer -- Back up any and all data you wish to keep before attempting this guide. I am working on a version that preserves data, but for now this is where I am.Step 3:
Install Fedora 20 as the base system (Click to show)
Update your system and install Xen (Click to show)
Boot the CD which is a live cd for F20 and run the install program from the applications list. Follow the prompts. Most importantly, choose "Specialized Storage Devices" which will let you set up software/ firmware RAID or otherwise and select the install medium. Next, choose a computer name. I chose the name xenhost.xenhome. The Root account is your administrator, so be sure to set a safe password.Step 3a:
Partitioning -- Simple (Click to show)
Partitioning -- Use Create Custom Layout (Click to show)
This is if you wish to contain your virtual machine disks as files, not as partitions.
- Select the disk on which you wish to install Fedora.
- Select other or custom partitioning
- Select recommended layout
- Delete the /home partition
- Resize the / partition to the largest it will go
- Continue the installation
For more advanced users:
You can create an LVM setup and manage your VMs disks this way or you could even add custom mount points for each VM. Please do not attempt unless you are a power user or want to do some research on linux partioning and LVM storage.
I created a user called xenhost. Don't forget to check the box to add the user to administrators.For this next session you will be using the terminal program provided with linux. You will be asked to use 'su' and 'sudo' commands which will require a password. When the prompt comes up, type your password. It is being entered even when no '*' show up.
Prepare for VMs! (Click to show)
Updating the system is very easy.
1. Download and install my kernel + headers with passthrough built in (I find that building it into the kernel is much more reliable and simpler than loading a module)
-- Kernel 3.12.8-300
-- Kernel-headers 3.12.8-300
2. After downloading the attachments just double-click them and install both
3. Install Xen (4.3.1 currently) In a terminal:
$ sudo yum install xen
4. Update your GRUB2 bootloader
UEFI (most common) (Click to show)
BIOS (older style and functionality) (Click to show)
in a terminal:
grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
in a terminal:
grub2-mkconfig -o /boot/grub2/grub.cfg
$ sudo nano /etc/selinux/config
change the line that says "enforcing" to "permissive" or "disabled" -- I suggest disabled for new users
You can use whichever text editor you want. If you run Gnome, replace nano with gedit and if you run xfce or LXDE replace nano with leafpad
Save and Exit.
-- At this point your system is able to be booted with xen as the hypervisor --
Create and Copy Install ISO to disk (Click to show)
Installing Virtual Machines (Click to show)
This step depends on you having a windows install disk and the means to Create a .iso file of your install disk. name the file win7ult.iso (or whatever you want to call it) and transfer it to your home folder in the xenhost linux install. This is critical for the configuration file later.
Create VM Storage Files (Click to show)
Create VM LVM Storage (Click to show)
I have started using this method because it makes migrating and backing up virtual machines very easy.
- Determine the size of the main disk for the VM (I keep mine on SSD and use a virtual server to host other files)
- Create a directory to house your file(s)
You can name it anything you want
$ mkdir ~/virtual_disks
- Create blank files to house your VMs
$ cd ~/virtual_disks
$ dd if=/dev/zero of=~/virtual_disks/VM_diskname bs=1M count=size_in_Megabytes
- Repeat for all the VMs you wish to host
I have started using the other method because it makes migrating and backing up virtual machines very easy. I know that LVMs are great too, but I am not an LVM master.
Please read the comments in the configuration file example to see how to use physical devices (LVM or physical partitions) as storage.
-- Virtual Drives should now be allocated --
Determine Devices for Passthrough (Click to show)
Configure the Network Bridge (Click to show)
$ sudo yum install pciutils
00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09)
00:01.0 PCI bridge: Intel Corporation Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port (rev 09)
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
00:16.0 Communication controller: Intel Corporation 6 Series/C200 Series Chipset Family MEI Controller #1 (rev 04)
00:1a.0 USB Controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2 (rev 05)
00:1b.0 Audio device: Intel Corporation 6 Series/C200 Series Chipset Family High Definition Audio Controller (rev 05)
00:1c.0 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 1 (rev b5)
00:1c.3 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 4 (rev b5)
00:1c.4 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 5 (rev b5)
00:1c.5 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 6 (rev b5)
00:1d.0 USB Controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1 (rev 05)
00:1f.0 ISA bridge: Intel Corporation H67 Express Chipset Family LPC Controller (rev 05)
00:1f.2 SATA controller: Intel Corporation 6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller (rev 05)
00:1f.3 SMBus: Intel Corporation 6 Series/C200 Series Chipset Family SMBus Controller (rev 05)
01:00.0 VGA compatible controller: ATI Technologies Inc Cypress [Radeon HD 5800 Series]
01:00.1 Audio device: ATI Technologies Inc Cypress HDMI Audio [Radeon HD 5800 Series]
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 06)
04:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8191SEvB Wireless LAN Controller (rev 10)
05:00.0 USB Controller: Device 1b6f:7023 (rev 01)
That is a sample of what my PCI devices look like. You can see the first thing on each line is the address of the PCI device. Write down the devices you wish to allocate to each virtual machine. Since I run 2 graphical virtual machines simultaneously, I have given each a video device and each a USB controller. I also dedicated my extra gigabit port to my media/file server and my wireless controller to my windows guest. The network bridge can handle all this, but I wanted extra fallback and throughput.
VM Configuration Files (Click to show)
Take notice of the entry that is your ethernet. Mine was titled p4p1. Be sure to write down the number after ether which is the MAC address.
$ sudo nano /etc/sysconfig/network-scripts/ifcfg-p4p1
edit the file to look like this. Replace the DEVICE= with the device and HWADDR with the ether you wrote down
then create the bridge
$ sudo nano /etc/sysconfig/network-scripts/ifcfg-xenbr0
Edit the file to look like this:
Then restart the network
$ sudo service network restart
$ gedit /etc/xen/win8.sxp
Copy and paste this code below into the file
# Example HVM guest configuration
# This configures an HVM rather than PV guest
builder = "hvm"
# Use this device model! Upstream qemu has poor support for GFX passthrough -- esp. intel
device_model_version = "qemu-xen-traditional"
# Guest name
name = "VM_name"
# Enable Microsoft Hyper-V compatibile paravirtualisation /
# enlightenment interfaces. Turning this on can improve Windows guest
# performance and is therefore recommended
viridian = 1
# Initial memory allocation (MB)
memory = 8224
# Number of VCPUS
vcpus = 7
#PAE is 32-bit only
# Network devices -- You can leave this vif = [ '' ] if you want DHCP to do the work
vif = [ 'bridge=xenbr0,ip=192.168.40.41' ]
# Disk Devices -- Replace filename and OS_install.iso with the names you chose earlier
disk = [ '/home/xenhost/virtual_drives/filename,raw,hda,rw', '/home/xenhost/OS_install.iso,hdb:cdrom,rw' ]
boot = "dc"
#Passthrough devices are inserted, but will be commented out for the time being because we need to install first.
#pci = [ '01:00.0', '01:00.1', '00:1a.0', '04:00.0' ]
#nographic = 1
vnc = 1
Save and exit
Polishing VMs and Installing Video Drivers (Click to show)
No PCI devices will be passed through for the install phase of this, step 7 will instruct on how to install drivers and pass devices through properly.
Install a VNC viewer.
$ sudo yum install tigervnc
Start the VM and connect to its VNC port.
$ sudo xl create win8.sxp
$ vncviewer localhost
Complete the install of the VM (in this case windows) and make sure it's stable (fully cycled through the reboots)
Repeat this for each VMHide PCI devices at boot (Click to show)
This step may cause you not to have graphical access to the Domain-0 anymore. Especially if you have only 1 video card or plan on assigning them all. This can easily be solved by connecting to the computer from another network device via SSH. Enable SSH:
Network Connect (Click to show)
$ sudo chkconfig sshd on
Tunnel in using SSH and x11 forwardingConnecting From Windows:
Xming Putty (Click to show)
Allowing OSX to Connect:
XQuartz/X11 (Click to show)
Start by downloading xming
Follow a default install of Xming and then run putty. Then follow these steps:
Input your Xen machine's IP address
Then open the ssh + menu and click on x11. Make the fields look like this photo:
After clicking open, a terminal window will appear and ask for your login. Use xenhost like you did from within linux. Then login as su like you did before and run the virt-manager command. You should end up with something like this:
Connecting from Linux or OSX:
In a terminal window: (Click to show)
Install x11 or XQuartz
(OSX 10.6.3 or newer, older versions or vanilla x11 will work)
Replace IP with Xen host IP
Paul-Youngs-MacBook-Pro:~ paul$ ssh -X [email protected][/SPOILER]
[email protected]'s password:
Last login: Tue Jan 24 22:38:03 2012 from 192.168.1.5
[B]Connecting from Host with Secondary Video Card:[/B]
[SPOILER=Simply]Make sure you are running your main display from the secondary card. If this means you have to leave the display unplugged from the primary, it is ok. In the terminal:
[code][[email protected] ~]$ su
[[email protected] xenhost]# virt-manager
$ sudo nano /etc/default/grub
Insert a line:
Add onto the end of the line GRUB_CMDLINE_LINUX=
Add all the entries for devices you wish to pass through. Remember, if you want direct access to the computer, leave one video device unhidden and one USB PCI controller unhidden (unless you use PS/2).
$ sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
When you reboot, be sure to select the proper entry for fedora WITH xen from the GRUB menu
Connect to your Domain-0 after rebooting (directly or over the network as laid out)Radeon HD2xxx and later (Click to show)
Integrated Intel HD graphics (Click to show)
Start your windows virtual machine and connect via VNC:
$ vncviewer localhost
Pass through the radeon GPU and Audio device with this command:
$ sudo xl pci-attach VM_name 01:00.0
$ sudo xl pci-attach VM_name 01:00.1
Replace VM_name with the name you gave it in the configuration file.
Download the latest catalyst driver and install. Then shutdown windows from the VM and turn it off from the console:
sudo xl destroy VM_name
Edit your configuration and uncomment the pci =  line (remove #)
Be sure to reboot the entire system and restart the VM. Wait a few minutes for windows to update the devices and you should have a fully graphical VM!
This is MUCH easier. All you have to do is uncomment (remove #) in the pci =  line and the gfx_passthru=1 line
Then start the VM:
$ sudo xl create win8.sxp
You can actually complete a full install with the integrated chips because they are able to be reset without a hard reboot. Continue using this VM normally.
NOTE: If installing GPLPV drivers, do so before activating windows!!!
Now if you had a second card, you could make a second fully functional system! You might want to create another system to use as a minecraft server. No problem, just install another VM to use for that and allocate however much you want to it. Use virt-manager or configuration scripts to create whatever you want -- the possibilities are endless.
Thanks for sticking in there!
Help me by trying this and reporting any errors. I want to make this easier and more compatible too, so any suggestions are welcome.
P.S. If you are a linux mint user, please take a look at PowerHouse's guide
It might be more complex than this, but it seems to work very well. Either guide when used properly will give good results.