KVM (Kernel-based Virtual Machine) was developed in Linux as a very speedy in-kernel virtualization solution that takes advantage of Intel’s VT and AMD’s V technology. Recently, it was ported to Open Solaris derived operating systems such as Joyent’s SmartOS and Open Indiana. Currently, libvirt is not supported so creating a virtual machine is a bit of a manual process. In this post, I will describe my process for creating KVM based virtual machines on my Open Indiana 151a server. I will describe how to install a Debian Linux system.
First download an install ISO of the operating system you’d like to install. I am fortunate enough to work for a university with access to Internet2 and I like to download ISO’s from the University of Texas. Here is their Debian mirror.
Now, on your Open Indiana 151a server, install the KVM module, application, and driver packages by executing:
# pkg install driver/i86pc/kvm \ system/qemu \ system/qemu/kvm
Next, if you’re using ZFS, create a zvol for your virtual machine hard drive. On my server, I have a mirrored zpool named local that I plan to install my virtual machines on.
# zpool status pool: local state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM local ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 c2d1 ONLINE 0 0 0 c3d1 ONLINE 0 0 0 c5d0 ONLINE 0 0 0 errors: No known data errors pool: rpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 c4d0s0 ONLINE 0 0 0 errors: No known data errors
# zfs list -r local NAME USED AVAIL REFER MOUNTPOINT local 256G 657G 31K /local local/shared 256G 657G 172G /shared local/shared/Virtual 83.8G 657G 33K /shared/Virtual local/shared/Virtual/ISO 3.56G 657G 3.56G /shared/Virtual/ISO local/shared/Virtual/KVM 80.2G 657G 43K /shared/Virtual/KVM
I decided to create a 10 gigabyte volume for my Debian virtual machine hard disk to live on. Here’s the command I used to create it:
# zfs create -p -V 10G local/shared/Virtual/KVM/debian/disk0
The -p option creates parent directories (if they don’t already exist) underneath the given ZFS dataset path. -V tells ZFS this dataset is a zvol and 10G says it’s going to be 10 gigabytes in size. You can see the new zvol by executing the zfs list again:
# zfs list -r local NAME USED AVAIL REFER MOUNTPOINT local 292G 622G 31K /local local/shared 292G 622G 174G /shared local/shared/Virtual 117G 622G 33K /shared/Virtual local/shared/Virtual/ISO 26.7G 622G 26.7G /shared/Virtual/ISO local/shared/Virtual/KVM 90.6G 622G 46K /shared/Virtual/KVM local/shared/Virtual/KVM/debian 10.3G 622G 31K /shared/Virtual/KVM/debian local/shared/Virtual/KVM/debian/disk0 10.3G 632G 16K -
Now, we need to create a virtual network interface for the virtual machine to use. Use dladm to list your current virtual network devices:
# dladm show-vnic LINK OVER SPEED MACADDRESS MACADDRTYPE VID vnic0 igb0 1000 0:0:dc:79:f6:e3 fixed 0 vnic1 igb0 1000 0:0:dc:79:f6:e4 fixed 0 vnic2 igb0 1000 0:0:dc:79:f6:b8 fixed 0
If you do not have any virtual network devices, nothing will be listed. Go ahead and create a new one for your new Debian instance using the physical network interface the virtual machine will be communicating on (mine is igb0, your’s could be e1000g0, etc…):
# sudo dladm create-vnic -l igb0 vnic3
List the virtual network interfaces once again and make sure your new device is listed:
# dladm show-vnic LINK OVER SPEED MACADDRESS MACADDRTYPE VID vnic0 igb0 1000 0:0:dc:79:f6:e3 fixed 0 vnic1 igb0 1000 0:0:dc:79:f6:e4 fixed 0 vnic2 igb0 1000 0:0:dc:79:f6:b8 fixed 0 vnic3 igb0 1000 2:8:20:28:d8:67 random 0
Now create a start-up script for your new virtual machine. Below is the simple script I use to start my virtual machines. For this new Debian instance, I set the CD and HD variables to the Debian install ISO and my new zvol respectively. The VNIC variable is set to the new virtual network interface we created above. I set the memory to 1024MB and the VNC session number to 5.
#!/usr/bin/bash VNIC=vnic3 HD=/dev/zvol/dsk/local/shared/Virtual/KVM/debian/disk0 CD=/shared/Virtual/ISO/debian-504-i386-netinst.iso VNC=5 MEM=1024 MAC=`dladm show-vnic -po macaddress $VNIC` /usr/bin/qemu-kvm \ -boot cd \ -enable-kvm \ -vnc 0.0.0.0:$VNC \ -smp 2 \ -m $MEM \ -no-hpet \ -localtime \ -drive file=$HD,if=ide,index=0 \ -drive file=$CD,media=cdrom,if=ide,index=2 \ -net nic,vlan=0,name=net0,model=e1000,macaddr=$MAC \ -net vnic,vlan=0,name=net0,ifname=$VNIC,macaddr=$MAC \ -vga std
The /usr/bin/qemu-kvm executable requires root level permissions so I run the script with sudo. Like this:
# sudo ./start-debian.sh
If all goes well, the virtual machine should boot. A windowed screen with a graphical interface will not appear like in VirtualBox or VMWare. You’ll only see a bunch of text like this scroll by:
... drive 0x000fda80: PCHS=16383/16/63 translation=lba LCHS=1024/255/63 s=20971520 Running option rom at cb00:0003 ebda moved from 9fc00 to 9f400 Returned 53248 bytes of ZoneHigh e820 map has 7 items: 0: 0000000000000000 - 000000000009f400 = 1 1: 000000000009f400 - 00000000000a0000 = 2 2: 00000000000f0000 - 0000000000100000 = 2 3: 0000000000100000 - 000000003fffd000 = 1 4: 000000003fffd000 - 0000000040000000 = 2 5: 00000000feffc000 - 00000000ff000000 = 2 6: 00000000fffc0000 - 0000000100000000 = 2 enter handle_19: NULL Booting from Hard Disk... Boot failed: not a bootable disk enter handle_18: NULL Booting from DVD/CD... 150MB medium detected Booting from 0000:7c00
From your workstation, use a VNC client (I use TightVNC) and connect to your KVM server using the session number you setup above. On my Linux workstation, I run:
jgrafton@pod:~$ vncviewer orion:5
If all has gone well and your KVM server firewall is not blocking port 5905, (5900 + your VNC session number) the VNC client should connect to your KVM server and you should see something similar to this screenshot:
Install Debian and enjoy your new KVM virtual machine! Remember, you’ll need a separate VNIC and VNC session number for each new virtual machine you create. Have fun!
Let me know if it works for you by either leaving comments or tweeting me at @Graftolistic.