VirtualBox
Reference
- http://www.virtualbox.org
- Chapter 8. VBoxManage (all the VBoxManage commands)
- All about VDI
Terminology
- P2V
- Physical-2-Virtual. Conversion of an existing (physical) configuration such that it can run in a virtual machine.
Installation
Reference instructions can be found here.
Installation using repository
- For VirtualBox 4.x:
- Add the following lines to /etc/apt/sources.list (here for Ubuntu Lucid — now in contrib):
- Add the Oracle public key for apt-secure, then install
wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add - sudo apt-get update sudo apt-get install virtualbox-4.0
- Download the extension pack from here, and install it using File → Preferences → Extensions menu, or with
- For VirtualBox 3.2.x:
- Add the following lines to /etc/apt/sources.list (here for Ubuntu Lucid):
- Add the Oracle public key for apt-secure, then install
wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add - sudo apt-get update sudo apt-get install virtualbox-3.2
- For VirtualBox 3.1.x:
- Add the following lines to /etc/apt/sources.list (here for Ubuntu Karmic):
- Add the Sun public key for apt-secure, then install
wget -q http://download.virtualbox.org/virtualbox/debian/sun_vbox.asc -O- | sudo apt-key add - sudo apt-get update sudo apt-get install virtualbox-3.1
deb http://download.virtualbox.org/virtualbox/debian lucid contrib
VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-4.0.0-69151.vbox-extpack
deb http://download.virtualbox.org/virtualbox/debian lucid non-free
deb http://download.virtualbox.org/virtualbox/debian karmic non-free
The group vboxusers is created during installation.
- Users of the VirtualBox must be member of that group. New users can be added with
sudo usermod -a -G vboxusers username
- The daemon for the network interfaces will be assigned to that group.
Recompiling the vboxdrv module after kernel update
VirtualBox requires a kernel module vboxdrv. This module must be recompiled every time the kernel is updated (if not, there will be typically errors related to missing network interfaces).
- The default location of the module is given by setting KDIR=[fullpath] in file /etc/default/virtualbox.
- When using Oracle's package, the kernel module can be compiled with
sudo /etc/init.d/vboxdrv setup
- When using virtualbox from Debian/Ubuntu distribution, use
sudo dpkg-reconfigure virtualbox-dkms
- Enable Dynamic Kernel Module Support to deal with Kernel Upgrade
Fixing DMKS issues
If you get error like
$ sudo /etc/init.d/vboxdrv setup [sudo] password for beq06659: * Stopping VirtualBox kernel [ OK ] * Uninstalling old VirtualBox DKMS kernel modules Error! Could not locate dkms.conf file. File: does not exist. [ OK ] * Trying to register the VirtualBox kernel modules using DKMS Error! DKMS tree already contains: vboxhost-4.2.12 You cannot add the same module/version combo more than once. * Failed, trying without DKMS * Recompiling VirtualBox kernel [ OK ] * Starting VirtualBox kernel [ OK ]
See [1] (and then [2] [3]). In my case:
cd /var/lib/dkms/vboxhost
sudo rm -rf 4.2.10
sudo rm kernel* # Delete all invalid symlinks
Configure ALSA on Host
On a Linux host, the standard VirtualBox interface allows to use ALSA as host driver, but doesn't let to specify the parameters. These can be given through environment variables [4]:
VBoxManage list vms
# "Winmachin-chose" {bfcc1fa1-d957-46a0-8cb6-899412a61fd7}
VBOX_ALSA_DAC_DEV="hw:2,0" VBOX_ALSA_ADC_DEV="hw:2,0" VBoxManage startvm bfcc1fa1-d957-46a0-8cb6-899412a61fd7
Launch VirtualBox as another user
- Create user vbox (disabled, uid 7000, group vbox + groups vboxusers, cdrom,
audio,video, plugdev, fuse, netdev). This user will store VirtualBox settings and disks, access bluetooth...
sudo useradd -u 7000 -g vboxusers -G cdrom,video,plugdev,fuse,netdev -m vbox
- Add user vbox to whatever groups it needs access to. For instance, add to current user group to give read access to current user's files:
sudo gpasswd -a vbox $USER
- Optionally, add current user to group vbox:
sudo gpasswd -a $USER vbox
- To enable audio, configure the current user to accept request from vbox pulseaudio server (see Linux sound). For the current user, edit file ~/.pulse/default.pa:
.include /etc/pulse/default.pa
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1
- Then for user vbox, edit file /home/vbox/.pulse/client.conf:
default-server = 127.0.0.1
- If user vbox needs to access a partition directly (e.g. because using a raw drive), give RW access on the selected partition. For instance, to give RW access to partition /dev/sda2, create a new udev rule in file /etc/udev/rules.d/99-vbox.rules:
# Rules to change the ownership of /dev/sda2 to user "vbox" (vbox will boot /dev/sda2 in VirtualBox + follow least privilege principle)
# reference: http://www.reactivated.net/writing_udev_rules.html#ownership
KERNEL=="sda2", SUBSYSTEM=="block", OWNER="vbox"
- Allow current user MYUSER to launch VirtualBox through user vbox. Add to /etc/sudoers:
MYUSER ALL = (vbox) NOPASSWD: /usr/bin/virtualbox
- Helper script e.g. ~/vbox.sh :
#First allow user vbox to connect to X11
xhost +SI:localuser:vbox
exec sudo -H -u vbox /usr/bin/virtualbox&
- Add a launcher ~/.local/share/applications/virtualbox-vbox.desktop (chmod 755, copied from /usr/share/applications/virtualbox.desktop:
#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon[en_US]=virtualbox
Name[en_US]=Oracle VM VirtualBox (vbox user)
Exec=/home/peetersm/bin/vbox.sh
Comment[en_US]=Run several virtual systems on a single host computer
Name=Oracle VM VirtualBox (vbox user)
Comment=Run several virtual systems on a single host computer
Icon=virtualbox
Windows guest installation
Miscellaneous
- For advanced installation like P2V (Physical-to-Virtual) or booting a VM directly from a physical disk partition, see section Advanced storage configuration in Ch. 9 Advanced topics.
- To enable 3D accelerated graphics, install the GuestAdditions in SAFE mode. Otherwise Windows file protection mechanism will revert the files to the original ones.
Windows 2000 P2V
Here are the steps I followed to migrate my W2K partition to a VirtualBox machine with .VDI disk:
- First copy the W2K partition (say /dev/sda1) to some file
sudo if=/dev/sda1 bs=4096 | gzip -c > w2k-sda1.dd.gz
- On the host, create an empty .VDI file of sufficient size.
- Attach the empty VDI to a new virtual machine, and boot from a Ubuntu Live CD or equivalent.
- Create a new NTFS partition on the empty disk (with gparted), and copy the partition above:
scp user@machine:/path/to/w2k-sda1.dd.gz >(gzip -d -c | sudo dd of=/dev/sda1 bs=4096)
- Again with gparted, resize the NTFS partition to full size (shrink then grow back if needed), and set the flag 'boot'.
- Shutdown the virtual machine, and attach an existing W2K disk to the virtual machine as master, and the migrated partition disk as slave. Start the machine.
- Delete the agp440.sys driver if present on the slave disk.
- Follow the mergeide.reg procedure here. Basically:
- Run regedt32, select HKEY_LOCAL_MACHINE, and load hive /WINNT/system32/config/system from slave disk in a key named aaaa. Close registry editor.
- Click on mergeide.reg to register the new keys.
- Run regedt32, and unload the hive aaaa. Close the editor.
- Stop the machine, remove the existing W2K disk, and set the migrated partition as master. Start the machine.
Reference links:
Windows XP P2V
Reference: http://www.virtualbox.org/wiki/Migrate_Windows
- Check HAL (enable or disable IO APIC in virtualbox as a result, or update the HAL in Windows by changing the files)
- Run MergeIDE to avoid the error message
STOP: 0x0000007B (0xF741B84C,0xC0000034,0x00000000,0x00000000) INACCESSIBLE_BOOT_DEVICE
- Delete agp440.sys (necessary on WinXP) and if needed intelppm.sys
Other links:
- http://www.techspot.com/vb/topic21511.html
- http://forums.virtualbox.org/viewtopic.php?f=7&t=19847
- http://forum.driverpacks.net/viewtopic.php?id=3865
- http://ubuntuforums.org/showthread.php?t=769883
Windows XP P2V - from Physical Partition
Host Setup
- Dell Latitude E6500 (with virtualization instructions)
- VirtualBox 3.2.0, Ubuntu 10.04 Lucid Lynx
Guest Setup
- Windows XP SP3
- Base Memory 1536 MB, 2 cpus, VT-x/AMD-V enabled, Nested Paging enabled
- Video memory 48 MB, 2 monitors, 3D accel enabled, 2D accel enabled
- Audio host driver PulseAudio, controller ICH AC97
- Network PCnet-FAST III, bridged, eth0
Let's say the Windows partition is on partition /dev/sda2.
- First, as described in [5], delete agp440.sys (or rename) from C:\Windows\system32\drivers. This driver will conflict with the virtual video card installed by VirtualBox and will make it crash.
- Next, create the raw disk as a vmdk volume. Update the MBR code to remove GRUB. Repeat this every time the partitions change:
sudo dd if=/dev/sda of=vm.mbr bs=512 count=1
sudo apt-get install mbr # For command "install-mbr"
sudo install-mbr -i n -p D -t 0 vm.mbr
sudo VBoxManage internalcommands createrawvmdk -filename nxl67002-sda2-mbr.vmdk -rawdisk /dev/sda -partitions 2 -relative -mbr vm.mbr
- Boot the virtual machine with the raw disk above. When Windows is launched, install the VirtualBox guest additions.
This is done! When booting Windows natively, the VirtualBox guest additions will detect that VirtualBox is not running and will disable itself.
Windows Guest with BitLocker
Some interesting links:
- Locking down a Virtual Machine with BitLocker
- Enable BitLocker Without a TPM - Windows Vista and Windows 7 Help
Windows 7 P2V
- Disable BitLocker or any other disk encryption, if present.
- Remove restore points, hibernat.sys, cache file, etc.
- Shrink system partition (either via DISKPART.EXE or ntfsresize/gparted)
- Backup all partitions (with
ntfsclone
) - Fix bad BCD (Windows Boot Manager Error) — Boot once with Windows Recovery CD, and let auto-repair run
- Fix bad BCD (BSOD 0x0000007B) — Boot again with Windows Recovery CD, go to command prompt:
bcdedit /export C:\BCD_Backup
ren c:\boot/BCD bcd2.old
bootrec /rebuildbcd
- Fix missing drivers (BSOD 0x0000007B) — Still within Windows Recovery CD, import the following in regedit.
- If needed, create this file using a Linux Live CD.
- In regedit, mount SYSTEM hive as remote_SYSTEM, and merge file above into it.
- Then don't forget to unmount the hive.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\remote_SYSTEM\ControlSet001\Control\Class\{4D36E96A-E325-11CE-BFC1-08002BE10318}\0000]
"InfPath"="mshdc.inf"
"InfSection"="msahci_Inst"
"ProviderName"="Microsoft"
"DriverDateData"=hex:00,80,8c,a3,c5,94,c6,01
"DriverDate"="6-21-2006"
"DriverVersion"="6.1.7600.16385"
"MatchingDeviceId"="pci\\cc_010601"
"DriverDesc"="Standard AHCI 1.0 Serial ATA Controller"
"Migrated"=dword:00000001
[HKEY_LOCAL_MACHINE\remote_SYSTEM\ControlSet001\Control\PnP]
"DisableCDDB"=-
[HKEY_LOCAL_MACHINE\remote_SYSTEM\ControlSet001\services\atapi]
"Start"=dword:00000000
[HKEY_LOCAL_MACHINE\remote_SYSTEM\ControlSet001\services\msahci]
"Start"=dword:00000000
- Boot virtual box, and wait for all devices to be detected.
- DO NOT reboot when prompted, but instead start regedit again:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\nxl_SYSTEM\ControlSet001\Control\PnP]
"DisableCDDB"=-
Detailed troubleshooting of startup sequence:
Other general tips:
- Run
MergeIDE
- Delete AGP440.SYS, intelppm.sys
In case of BSOD x0000007B
:
- Select another virtual disk controller, i.e. either IDE PIIX3 or PIIX4 [6]
Linux guest installation
Linux P2V on Windows Host
- Create a raw disk file from secondary sata drive (from [7])
- Start Windows Disk Management, and identify index of secondary drive (say Disk 1)
- Start cmd.exe as Administrator, and type
"c:\Program Files\Oracle\VirtualBox\VBoxManage.exe" internalcommands createrawvmdk -filename "filename.vmdk" -rawdisk "\\.\\PhysicalDrive1"
- Start VirtualBox as Administrator, and add the raw disk to the virtual machine.
How-To
Clone a .VDI disk
Reference [8]
- The supported method is either via the GUI, or using the command-line:
VBoxManage clonehd original.vdi clone.vdi
- A much faster method however (but unsupported) is to copy the .VDI file as a regular file, and then change the UUID attached to the disk:
cp original.vdi copy.vdi # Both VDI will have identical UUID, which VirtualBox forbids
VBoxManage internalcommands setvdiuuid copy.vdi # ... this sets a new random UUID to the new .VDI
READ THIS! — if you want to mount both disks in Windows:
- Windows will see both drives as being identical and will only mount one of them (even if both have different UUID).
The second drive will be offline. - To bring the drive back online, open the Disk Management control panel
- Click right on the drive, and select Online.
Doing so, Windows will generate a new ID and write it in the volume boot record.
Detach / attach USB and network
When using NAT network and Bluetooth USB on a Windows guest, it is recommended to detach / attach these devices when the network environment changed on the host, or after suspend/resume. The usual method is to go in the GUI. However we can also do via command-line using vboxmanage
.
First we need the VM name and USB device UUID:
vboxmanage list runningvms # List our running vms - write down VM name
vboxmanage list usbhost # List available uid device - write down UID of Bluetooth devices
In our case, VM name is WINGUEST
and USB UUID is 0cd50991-b2ad-4a2b-86cb-da08772bd5e2
. So now, we can write out script to automatically reset the connections when necessary:
#! /bin/bash
vboxmanage controlvm WINGUEST setlinkstate1 off # Detach network cable (on 1st interface)
vboxmanage controlvm WINGUEST usbdetach 0cd50991-b2ad-4a2b-86cb-da08772bd5e2 # Detach USB bluetooth
sleep 3 # Wait 3 sec
vboxmanage controlvm WINGUEST setlinkstate1 on # Attach back network cable
vboxmanage controlvm WINGUEST usbattach 0cd50991-b2ad-4a2b-86cb-da08772bd5e2 # Attach back USB bluetooth
Note that we use controlvm
and not modifyvm
, which as the documentation explains, is only for VMs that are not running. Using the latter gives an error about locked session:
VBoxManage: error: The machine 'WINGUEST' is already locked for a session (or being unlocked)
If the VM is running as another user (say vbox
), and we want to extract the UUID automatically, we can adapt the script as follows :
#! /bin/bash
# Detach / attach network cable / bluetooth on WINGUEST vm
# (to reset guest after suspend/resume or when network env. changed on the host)
# Extract Bluetooth USB UUID
BTUUID=$(sudo -Hu vbox /usr/bin/vboxmanage list usbhost|egrep -i "uuid|manufacturer"|sed -rn 'N; s/\n/ /; /Broadcom Corp/!d; s/.* ([0-9a-f-]+) .*/\1/; p')
echo "Detaching network and bluetooth..."
sudo -Hu vbox /usr/bin/vboxmanage controlvm WINGUEST setlinkstate1 off # Detach network cable (on 1st interface)
sudo -Hu vbox /usr/bin/vboxmanage controlvm WINGUEST usbdetach $BTUUID # Detach USB bluetooth
echo "Waiting..."
sleep 3 # Wait 3 sec
echo "Attaching network and bluetooth..."
sudo -Hu vbox /usr/bin/vboxmanage controlvm WINGUEST setlinkstate1 on # Attach back network cable
sudo -Hu vbox /usr/bin/vboxmanage controlvm WINGUEST usbattach $BTUUID # Attach back USB bluetooth
And add the following to /etc/sudoers, which only gives permission to user john
:
john ALL = (vbox) NOPASSWD: /usr/bin/vboxmanage list usbhost john ALL = (vbox) NOPASSWD: /usr/bin/vboxmanage controlvm WINGUEST usbattach * john ALL = (vbox) NOPASSWD: /usr/bin/vboxmanage controlvm WINGUEST usbdetach * john ALL = (vbox) NOPASSWD: /usr/bin/vboxmanage controlvm WINGUEST setlinkstate1 *
Benchmarks
Settings:
- Dell Latitude E6500, 4GB RAM.
- VirtualBox 3.1.6.
- System: 1536 MB RAM, IO APIC, 2 CPU with PAE/NX, VT-x + Nested Paging.
- Video: 32 MB Video + 2D accel
- Storage: PIIX4 ctrl, raw vmdk image /dev/sda
- Audio: PulseAudio + ICH AC97
- Network: Bridged Adapter
task | U9.04-32 | U9.04-32 | U9.04-32 | U9.10-32 | U9.10-32 | U9.10-32 | U9.10-64 | U9.10-64 | U9.10-64 | U9.04-32 | U9.04-32 | Native | Native | Native |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
grub →hw profile | 2.86 s | 2.82 s | 2.77 s | 2.76 s | 2.68 s | 2.84 s | 2.50 s | 2.51 s | 2.61 s | 3.22 s | 2.73 s | 1.62 s | 1.57 s | 1.41 s |
... →login screen | 23.49 s | 23.46 s | 21.56 s | 42.07 s | 43.48 s | 40.28 s | 48.63 s | 52.00 s | 56.07 s | 33.15 s | 24.06 s | 29.52 s | 24.89 s | 25.16 s |
... →pwd typed | 17.69 s | 12.94 s | 12.62 s | 9.83 s | 9.69 s | 8.56 s | 15.41 s | 9.85 s | 9.31 s | 9.68 s | 8.75 s | 9.88 s | 8.42 s | 8.99 s |
... →communicator | 8.83 s | 7.73 s | 8.45 s | 32.51 s | 29.97 s | 36.57 s | 38.50 s | 33.53 s | 34.44 s | 20.48 s | 8.24 s | 9.47 s | 7.20 s | 6.81 s |
U9.04-32: Base Ubuntu 9.04 Jaunty i386 Live running on USB, 2.6.28-11-generic.
U9.10-32: Base Ubuntu 9.10 Karmic i386 Live running on USB
U9.10-64: Base Ubuntu 9.10 Karmic AMD64 running from HDD, 2.6.31-20-generic
Native: Running Windows directly, no emulation
Conclusions:
- Ubuntu 9.04 + VirtualBox 3.1.6 → FAST !!!
- Ubuntu 9.10 + VirtualBox 3.1.6 → SLOW !!!
External references:
- Interesting post about step-by-step configuration to run an existing Windows XP installation.
- Two posts about disabling IO APIC:[9] and [10]. But apparently this doesn't really fix anything (also the poster has a old cpu, etc).
Tuning
Improve the performance of your VirtualBox:
Troubleshooting
USB
lsusb # with or without -v
usb-devices
sudo VBoxManage list usbhost # sudo if vbox run as root
ls -Rl /dev/vboxusb
CIFS - Connection lost on linux guest
Guest mount via
# /etc/fstab //10.0.2.2/c$ /mnt/c cifs username=beq....,uid=1000,gid=1000,iocharset=utf8,sec=ntlm,noauto 0 0
Tell windows to disable autodisconnect (see [11]):
- via regedit:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters => ffffffff (default 0...0f) (unit = minutes)
- or via command-line:
net config server /autodisconnect:-1
Bugtracker
- Enhancement - #6854 - Allow hot-plug addition / removal of screens (monitors) in guest OS