VirtualBox

From ArchWiki
Revision as of 18:14, 27 September 2009 by VitaminJ (Talk | contribs) (Starting headless VMs at startup...needs revision, I'm not a shell programmer)

Jump to: navigation, search

Template:I18n links start Template:I18n entry Template:I18n entry Template:I18n entry Template:I18n entry Template:I18n entry Template:I18n entry Template:I18n links end

What is VirtualBox

VirtualBox is a virtual pc emulator like vmware. It has many of the features vmware has, as well as some of its own. It is in constant development and new features are implemented all the time. eg. version 2.2 introduced OpenGL 3D acceleration support for Linux and Solaris guests. It has a nice GUI interface (Qt and/or SDL) or command line tools for managing virtual machines. Headless operation is also supported. Running iTunes under VirtualBox is the only way (currently) to sync iPod Touch/iPhone firmware 3.0+.

Editions

VirtualBox is available in two editions: VirtualBox (OSE) and VirtualBox (Personal Use and Evaluation License (PUEL))

VirtualBox (OSE)

VirtualBox (OSE) is the open source version of VirtualBox, which can be found in the community repository. It lacks some features such as USB device support and the built-in RDP server.

VirtualBox (PUEL)

VirtualBox PUEL is a binary-only version (free for personal use). There are several available from the AUR, but the most popular PKGBUILD was written and is maintained by thotypous. You can download it from the AUR at this link or directly from the VirtualBox website. The PUEL edition offers the following advantages:

  • Remote Display Protocol (RDP) Server - a complete RDP server on top of the virtual hardware, allowing users to connect to a virtual machine remotely using any RDP compatible client
  • USB support - a virtual USB controller which allows USB 1.1 and USB 2.0 devices to be passed through to virtual machines
  • USB over RDP - a combination of the RDP server and USB support, allowing users to make USB devices available to virtual machines running remotely
  • iSCSI initiator - a builtin iSCSI initiator making it possible to use iSCSI targets as virtual disks without the guest requiring support for iSCSI

Installation

Install VirtualBox (OSE)

VirtualBox (OSE) is available from the community repository:

# pacman -S virtualbox-ose
Note: This package is not in x86_64 Repositories. See the link to the PKGBUILD by thotypous in the AUR above if you are running Arch x86_64 and want to use VirtualBox.

This will select by default virtualbox-ose and virtualbox-modules packages. Once installed, a desktop entry can be located in Applications → System Tools → VirtualBox OSE

Now, add the desired username to the vboxusers group:

# gpasswd -a USERNAME vboxusers
Note: You must logout/login in order for this change to take effect.

Lastly, edit Template:Filename as root and add vboxdrv to the MODULES array in order to load the VirtualBox drivers at startup. For example:

MODULES=(loop vboxdrv fuse ...)

To load the module manually, run the following in a terminal as root:

# modprobe vboxdrv

Install VirtualBox PUEL (virtualbox_bin)

VirtualBox PUEL is available from the AUR: virtualbox_bin.

Download the tarball from the above page. As a normal user, unpack, change directory, and Template:Codeline:

# tar -xzf virtualbox_bin.tar.gz
# cd virtualbox_bin
# makepkg

This will create a .pkg.tar.gz file in the virtualbox_bin directory. Then, as root:

# pacman -U PACKAGE-NAME.pkg.tar.gz

This will compile the vboxdrv kernel modules and install VirtualBox in Template:Filename, and add the vboxusers group.

However, there's an alternative way to install the virtualbox_bin package: This method adds a non-standard pacman source, and downloads a precompiled binary package. Please understand the risks associated with trusting binary distribution sources.

Firstly, add as root the following into Template:Filename:

[archlinuxfr]
Server = http://repo.archlinux.fr/i686

or

[archlinuxfr]
Server = http://repo.archlinux.fr/x86_64

depending on your CPU's architecture.

Now you can can install directly via:

# pacman -Sy virtualbox_bin


Now, add the desired username to the vboxusers group:

# gpasswd -a USERNAME vboxusers
Note: You must logout/login in order for this change to take effect.

Lastly, edit Template:Filename as root and add vboxdrv to the MODULES array in order to load the VirtualBox drivers at startup. For example:

MODULES=(loop vboxdrv fuse ...)

To load the module manually, run the following in a terminal as root:

# modprobe vboxdrv

Install required QT libraries

Currently, VirtualBox relies on QT4 for its graphical interface. If you require a GUI, ensure you have QT4 installed:

# pacman -S qt

Install VirtualBox 2.1 (another alternative)

VirtualBox.run install can be done using the All Distributions package from the Linux section of the VirtualBox Website.

Make sure the Qt 4.3.0 and SDL 1.2.7 or higher packages are installed:

# pacman -Sy qt sdl 

Download the appropriate architecture file i386/AMD64. In a terminal window, browse to the download folder and as root run:

# sh VirtualBox-2.XXXX-Linux_ARCH.run

This will install the package to the /opt/VirtualBox-2.XXX folder.

After installation, a desktop entry can be located in Applications → System Tools → Sun xVM VirtualBox

Now, add the desired username to the vboxusers group:

# gpasswd -a USERNAME vboxusers

Lastly, edit Template:Filename as root and add vboxdrv to the MODULES array in order to load the VirtualBox drivers at startup.

Start the VirtualBox GUI either with the command:

# VirtualBox 

or using the Applications desktop entry. In version 2.1.x, an installation wizard should start and take you through the process of setting up a virtual machine. Otherwise, use the help menu to get started. Continue reading to see the more advanced options and setups...

Configuration

After we have installed VirtualBox on our system and added ourselves in the vboxusers group we can start configuring our system in order to make all the features of VirtualBox available to us. Create a new virtual machine using the wizard provided by the GUI and then click settings in order to edit the virtual machine settings.

Keyboard and mouse between the host and the guest

  • To capture the keyboard and mouse, click the mouse inside the Virtual Machine display.
  • To uncapture, press Ctrl-Alt-Delete.

If Xorg freezes mouse and keyboard you will have to disable the new hot plugging feature of Xorg 1.5 by adding in Template:Filename:

Section "ServerLayout"
       . . .
       Option "AutoAddDevices" "False"
       . . .
EndSection

This is needed for Linux guests in a Mac OS X or Windows host. Also needed for Linux hosts (tested with Arch64 host and Arch64 guest).

Also, mouse pointer integration doesn't work out of the box. To fix it, make sure you have the following sections in your Template:Filename:

Section "InputDevice"
   Identifier "Mouse0"
   Driver "vboxmouse"
   Option         "Protocol" "auto"
   Option         "Device" "/dev/input/mice"
   Option         "ZAxisMapping" "4 5 6 7"
EndSection
Section "ServerLayout"
   Identifier     "X.org Configured"
   Screen      0  "Screen0" 0 0
   InputDevice    "Mouse0" "CorePointer"
   InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

When generating your Template:Filename with Template:Codeline, you'll end up with an InputDevice section that uses the Template:Codeline driver. After installing the Guest Additions, you should replace Template:Codeline with Template:Codeline and then restart X or reboot your VM.

Getting network in the guest machine to work

First let's get network working in the guest machine. Click the network tab. The not attached option means you'll have "Network cable unplugged" or similar error in the guest computer.

Using NAT network

This is the simplest way to get network. Select NAT network and it should be ready to use. Then, the guest operating system can be automatically configured by using DHCP.

The NAT IP address on the first card is 10.0.2.0, 10.0.3.0 on the second and so on.

Also in VirtualBox 2.2.0+ NAT network DHCP clients will not configure your nameserver (DNS server for windows guests) you will have to manually configure the nameserver(DNS server)

Using host interface networking (the VirtualBox way)

Since VirtuaBox 2.1.0 it has a native support for host interface networking. Just add vboxnetflt to your MODULES section in Template:Filename and choose Host Interface Networking (or Bridged adapter in 2.2) in the virtual machine configuration.

Note: DHCP broadcasting doesn't seem to work properly under this way. Set up your guest networking with static IP assignment.

Using host interface networking (the Arch way)

You are going to just edit these files and reboot:

Ready? Let's go!

Template:Filename

bridge_br0="eth0 vbox0" # Put any interfaces you need.
BRIDGE_INTERFACES=(br0)

Template:Filename

First add the bridge module to your MODULES line

MODULES=( <your other modules> bridge)

Then, in your NETWORKING section, make the following changes:

br0="dhcp" # Maybe you have some static configuration... I use DHCP.
INTERFACES=(eth0 br0)

Note by gpan:

Template:Filename

First add the vboxdrv (and vboxnetflt in case of 2.1.0 version) module to your MODULES line:

MODULES=( <your other modules> vboxdrv vboxnetflt )

Note by vit:

Template:Filename

In my case it didn't work untill adding vboxnetadp to modules.

Next, you should edit your Template:Filename and type:

KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="vboxusers", MODE="0660"

Save it and exit.

Then open terminal and type:

# pacman -S bridge-utils uml_utilities

Create a new bridge with this command:

# brctl addbr br0

Template:Filename

(You can set up more interfaces if you want. Sky is the limit!):

vbox0 your_user br0 # Be sure that your user is in the vboxusers group.

Reboot and enjoy!

Note: Remember to set up your virtual machine with proper network configuration.
Note: If you have any issue, make sure that you have the bridge-utils package installed and vboxnet daemon loaded.

Using host interface networking (generic)

This way is a bit harder, but it allows you to see the VirtualMachine as a "real" computer on your local network. You need to get bridge-utils

# pacman -S bridge-utils uml_utilities

Note by Sp1d3rmxn:

You also need to have the TUN module loaded... in Template:Filename add Template:Codeline (without the quotes) to your MODULES section. For testing this out right now without rebooting you can load the module from the command line by Template:Codeline.
Then you MUST set these permissions otherwise you'll never get VBox to init the interface. The command is Template:Codeline (without the quotes).
Now proceed with the rest as it's written below.

Note

As said by Sp1d3rmxn, we must set these permissions, but, instead of using the
command, we can set them in Template:Filename, which will set them
on boot:
KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="vboxusers", MODE="0660"
KERNEL=="tun", OWNER="root", GROUP="vboxusers", MODE="0660"


1. Create a new bridge with this command:

# brctl addbr br0

2. If you are not using DHCP, run ifconfig and note down the network configuration of your existing network interface (e.g. eth0), which we will need to copy to the bridge in a minute.

Note: You will need this settings so make sure you don't lose them!!!

3. Switch your physical network adapter to "promiscuous" mode so that it will accept Ethernet frames for MAC addresses other than its own (replace Template:Codeline with your network interface):

# ifconfig eth0 0.0.0.0 promisc 
Note: You will lose network connectivity on eth0 at this point.

4. Add your network adapter to the bridge:

# brctl addif br0 eth0

5. Transfer the network configuration previously used with your physical ethernet adapter to the new bridge. If you are using DHCP, this should work:

# dhclient br0

Note by Sp1d3rmxn:

Use Template:Codeline instead of the above

Otherwise, run Template:Codeline and use the values that you noted down previously.

6. To create a permanent host interface called vbox0 (all host interfaces created in this way must be called vbox followed by a number) and add it to the network bridge created above, use the following command:

VBoxAddIF vbox0 vboxuser br0

Replace Template:Codeline with the name of the user who is supposed to be able to use the new interface.

Note: VboxAddIF is located in /opt/VirtualBox-VERSION OF VIRTUALBOX/VBoxAddIF

Alternatively, you can setup VirtualBox networking through your Template:Filename to enable a bridged connection.

Using host interface networking with a wireless device

Bridging as described above won't work with a wireless device. Using parprouted however it can be accomplished.

  1. Install parprouted and iproute
  2. Template:Codeline
  3. Make sure IP fowarding is enabled: Template:Codeline, and/or edit Template:Filename.
  4. Template:Codeline, to create the tap device
  5. Template:Codeline, needs to be a manually set IP on the same network your wireless device is.
  6. Template:Codeline

Getting USB to work in the guest machine

(Only available in the PUEL edition)

Note: As of VirtualBox>2.2.4 this is no longer necessary to mount a usb filesystem.

First in order to make USB available for use to the virtual machine you must add this line to your Template:Filename:

none      /proc/bus/usb usbfs     auto,busgid=108,busmode=0775,devgid=108,devmode=0664 0 0

Template:Codeline is is the id of the group which should be allowed to access USB-devices. Change it to the id of your vboxusers group. You can get the id by running:

$ grep vboxusers /etc/group

If you don't mind a security hole change devmode from 664 to 666.

Remount /proc/bus/usb:

# mount -o remount /proc/bus/usb/

Restart Virtualbox and click the USB tab in the settings of the virtual machine and select which devices are available to your pc on boot. If you wish your virtual machine to use device that you have just plugged in (assuming the virtual machine has booted already), go to the VirtualMachine screen go to Devices → USB Devices and select the device you wish to plug in the virtual PC.

Note by bjimba:

Recent versions of VirtualBox, as noted above, do not require usbfs, however you will need the HAL daemon running if you do not use usbfs. See the HAL wiki page for details.


Installing Guest Additions

For VirtualBox (OSE) version 1.6.2 =>, read:
VirtualBox-HowTo

The Guest Additions make the shared folders feature available, as well as better video (3D available in version 2.1+) and mouse drivers. You will have mouse integration, thus no need to release the mouse after using it in the guest and one can also enable a bidirectional clipboard.

Note: The instructions immediately below are for an Archlinux guest on an Archlinux host.

After you booted the virtual machine, go to menu Devices → Install Guest Additions... Once you've clicked it, VirtualBox loads an ISO into the current CD-ROM, so you won't see anything happen yet ;).

You will require gcc and make if you don't already have them so install them typing the following as root:

# pacman -S gcc make

Then do the following as root:

# mount /media/cdrom

for i686 systems (32 bit):

# sh /media/cdrom/VBoxLinuxAdditions-x86.run

for x86-64 systems (64 bit):

# sh /media/cdrom/VBoxLinuxAdditions-amd64.run


It will build and install the kernel modules, install the Xorg drivers and create init scripts. It will most probably print out errors about init scripts and run levels and what not. Ignore them. You will find Template:Filename in /etc/rc.d which will load them on demand. To have the Guest Additions loaded at boot time, just add those to the DAEMONS array in Template:Filename eg.:

DAEMONS=(syslog-ng network netfs crond alsa rc.vboxadd)

Another option is to install one of these packages:

# pacman -S virtualbox-additions

or

# pacman -S virtualbox-ose-additions

You will then have an ISO to mount as a loop device. Remember to load the loop kernel module before:

# modprobe loop
# mount /usr/lib/virtualbox/additions/VBoxGuestAdditions.iso /media/cdrom -o loop

Then execute Template:Filename as before. Before adding Template:Filename to DAEMONS check Template:Filename for commands to load the vboxadd daemons put by the installation script.

Windows Guests

After installing Windows (XP etc.) on your virtual machine, simply select Devices → Install Guest Additions...

This will mount the iso image and windows should then automatically launch the guest additions installer. Follow the instructions to the end.

Sharing folders between the host and the guest

For VirtualBox (OSE) version 1.6.2 =>, read VirtualBox-HowTo.

In the settings of the virtual machine go to shared folders tab and add the folders you want to share.

  • NOTE: You need to install Guest Additions in order to use this feature.
In a Linux host, Devices → Install Guest Additions
Yes (when asked to download the CD image)
Mount (when asked to register and mount)

In a Linux host, create one folder for sharing files.

In a Windows guest, starting with VirtualBox 1.5.0, shared folders are browseable and are therefore visible in Windows Explorer. Open Windows Explorer and look for it under My Networking Places → Entire Network → VirtualBox Shared Folders.

Alternatively, on the Windows command line, you can also use the following:

net use x: \\VBOXSVR\sharename

While Template:Codeline is a fixed name, replace Template:Codeline with the drive letter that you want to use for the share, and sharename with the share name specified with VBoxManage.

In a Linux guest, use the following command:

# mount -t vboxsf [-o OPTIONS] sharename mountpoint

Replace Template:Codeline with the share name specified with VBoxManage, and mountpoint with the path where you want the share to be mounted (e.g. /mnt/share). The usual mount rules apply, that is, create this directory first if it does not exist yet.

Beyond the standard options supplied by the mount command, the following are available:

iocharset=CHARSET

to set the character set used for I/O operations (utf8 by default) and

convertcp=CHARSET

to specify the character set used for the shared folder name (utf8 by default).

Getting audio to work in the guest machine

In the machine settings, go to the audio tab and select the correct driver according to your sound system (ALSA, OSS or PulseAudio).

Setting up the RAM and Video Memory for the virtual PC

You can change the default values by going to Settings → General.

Setting up CD-ROM for the Virtual PC

You can change the default values by going to Settings → CD/DVD-ROM.

Check mount CD/DVD drive and select one of the following options.

Note: If no CD-ROM drive is detected, make sure the HAL daemon is running. To start it, run the following command as root:

# /etc/rc.d/hal start

Enabling D3D acceleration in Windows Guests

Recent versions of Virtualbox have support for accelerating OpenGL inside guests. This can be enabled with a simple checkbox in the machine's settings, right below where video ram is set, and installing the Virtualbox guest additions. However, most Windows games use Direct3D (part of DirectX), not OpenGL, and are thus not helped by this method. However, it is possible to gain accelerated Direct3D in your Windows guests by borrowing the d3d libraries from Wine, which translate d3d calls into OpenGL, which is then accelerated.

After enabling OpenGL acceleration as described above, go to http://www.nongnu.org/wined3d/ in your Windows guest and grab the "Latest version (Installer):". Reboot the guest into safe mode (press F8 before the Windows screen appears but after the Virtualbox screen disappears), and install wined3d, accepting the defaults during the install. (You may check the box for DirectX 10 support if you like, dont touch anything else.) Reboot back to normal mode and you should have accelerated Direct3D.

Note: This hack may or may not work for some games depending on what hardware checks they make and what parts of D3D they use.
Note: This has only been tried on Windows XP and Windows 7 RC guests AFAIK, and does not work on the Windows 7 guest. If you have experience with this on a different windows version, please add that data here.

Start VirtualBox

To start Virtualbox, run the following command in a terminal:

$ VirtualBox

Or in KDE menu, select: <System><Sun Virtualbox>

Virtualized OS Setup

Virtualbox needs to be setup to virtualize another operating system.

Test a LiveCD/DVD

Click the 'New' button to create a new virtual environment. Name it appropriately and select Operating System type and version. Select base memory size (note: most operating systems will need at least 512MB to function properly). Create a new hard disk image (a hard disk image is a file that will contain the operating system's filesystem and files).

When the new image has been created, click 'Settings', then CD/DVD-ROM, check 'Mount CD/DVD Drive' then select an ISO image.

Maintenance

Rebuild the vboxdrv Module

Note that any time your kernel version changes (due to upgrade, recompile, etc.) you must also rebuild the VirtualBox kernel. To do this, on virtualbox_bin from AUR or on versions earlier than 2.1, run the following command:

# vbox_build_module

This binary will be located in one of the following locations: /sbin, /bin, or /usr/bin.

Note: If you are using one of the Virtualbox PKGBUILD's from the AUR, you will also need to update your modules via this method. In most cases, users of x86_64 will need to use one of the PKBUILDS of Virtualbox since the official repos only have support for the i686 architecture.

On versions 2.1+, update the kernel module by running the following command:

# /etc/rc.d/rc.vboxdrv setup

After rebuilding the module, don't forget to load it with

# modprobe vboxdrv

Compact a Disk Image

See How to compact a VirtualBox virtual disk image (VDI)

Windows Xp and Nokia phones

To get working Windows XP and Nokia phones with Pc Suite mode, Virtualbox needs two simple steps:

1. Add a rule to udev with Template:Filename:

LABEL="usb_serial_start"
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", \
GROUP="usbfs", MODE="0660", GROUP="dialout"
LABEL="usb_serial_end"

2. Create the group usbfs and add its user to it

$ sudo groupadd usbfs
$ sudo usermod -a -G usbfs $USER

After a logout, connect a Nokia phone with PC Suite mode and start Windows XP to test new rule.

Migrating From Another VM

The qemu-img program can be used to convert images from one format to another, or add compression or encryption to an image.

  # pacman -S qemu

Converting from QEMU images

To convert a QEMU image for use with VirtualBox, first convert it to raw format, then use VirtualBox's conversion utility to convert and compact it in its native format.

  $ qemu-img convert -O raw test.qcow2 test.raw
  $ VBoxManage modifyvdi /full/path/to/test.vdi compact

Converting from VMware images

Do

  $ qemu-img convert image.vmdk image.bin
  $ VBoxManage convertdd image.bin image.vdi

This may not be needed anymore with recent virtualbox versions (to be confirmed)

Tips and Tricks

Sending a CTRL+ALT+F1 to the Guest

If your guest O/S is a Linux distro, and you want to open a new tty text shell or exit X via typing Template:Keypress+Template:Keypress+Template:Keypress, you can easily send this command to the guest O/S simply by hitting your 'Host Key' (usually the Template:Keypress in the Right side of your keyboard) + Template:Keypress or Template:Keypress, etc.

Speeding up HDD Access for the Guest

Enabling the SATA(AHCI) controller within Virtualbox can speed up Host disk operations. This is available though Settings>Hard Disks in current versions of Virtual Box.

Starting VMs at System Boot on Headless Servers

exec /bin/su PREFERRED_USER -l -c "/bin/bash --login -c \"VBoxHeadless -startvm {UUID}\" >/dev/null 2>&1"

Where PREFERRED_USER is the user profile that contains the VM definitions and .vdi files. This will start the VM with a RDP server running on port 3389. To determine the available VMs for a user:

su PREFERRED_USER -c "VBoxManage list vms"

To suspend the VM:

su PREFERRED_USER -c "VBoxManage controlvm {UUID} savestate"

External Resources