How to run OSX in a VM on VirtualBox


Would it not be great to be able to run OSX on a virtual machine? Now you can*! All you need is a disk image of the retail DVD of “Apple Mac OSX Snow Leopard 10.6” and you can install it inside VirtualBox. Alternatively if you have a Mac (or know somebody who does) you can create a bootable image of (the free) “Apple Mac OSX Yosemite 10.10” and install that version. Instructions below.

Apple Mac OSX Snow Leopard 10.6

You need:

  1. VirtualBox 4
  2. ISO of retail DVD for “Apple Mac OSX Snow Leopard 10.6” (buy here)
  3. Follow instructions carefully

Open VirtualBox and create a virtual machine named “osx”. Then close the entire VirtualBox application and go to the command line. Run:

VBoxManage modifyvm osx --cpus 1
VBoxManage modifyvm osx --vram 128
VBoxManage setextradata osx VBoxInternal2/EfiGopMode 5
VBoxManage setextradata osx "VBoxInternal2/SmcDeviceKey" "ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"

Open VirtualBox again and start the virtual machine. Mount “Apple Mac OSX 10.6 Snow Leopard Retail.iso” and install. After installation (30 minutes) the system will reboot and it is ready for use.

Apple Mac OSX Yosemite 10.10

You need:

  1. VirtualBox 4
  2. Bootable image of “Apple Mac OSX Yosemite 10.10” (using “iesd”)
  3. Follow instructions carefully

The latest version of Apple’s OSX can also be run under VirtualBox. Download it for free from the “Apple App Store”. You do need a Mac with a valid Apple-id for this. Make sure you have the “XCode Command-Line tools” installed on this Mac. Then run the following commands to convert the download into a bootable disk image:

gem install iesd
iesd -i /Applications/Install\ OS\ X\ -o Desktop/yosemite.dmg -t BaseSystem

Move “yosemite.dmg” to your Virtualbox environment and use it instead of the Snow Leopard DVD image. Note that this image does support multiple CPUs, so this will allow you to speed things up.

*) Known issues

Here are the issues on the various platforms:

  • OSX 10.6 [Linux] can only be used with a single CPU
  • OSX 10.6 [Linux] sound is not working properly
  • OSX 10.10 [Linux] cannot login on Linux
  • OSX 10.10 [Linux] graphics are very slow
  • OSX 10.10 [Linux] sound is not working

Note that Apple only allows and supports running OSX in a VM on OSX. As you can see I only tested on Ubuntu 14.04 as a host (which is not supported). Let me know whether or not the above instructions work for you (on Windows or OSX).


It is not working very well (out-of-the-box), but it does work a little. Enough to get you started. With some serious tinkering you may even fix it to an acceptable level. If you do, please let me know!



How to test Apache CloudStack 4.2 on your local machine

LeaseWeb released its Private Cloud powered by Apache CloudStack two months ago [1]. Apache CloudStack [2] is an open source software platform that pools computing resources to build public, private, and hybrid Infrastructure as a Service (IaaS) clouds.

In this post, I will give a short introduction of Apache CloudStack and introduce an easy way to test Apache CloudStack 4.2 on our local machine using DevCloud.

Apache CloudStack manages the network, storage, and compute nodes that make up a cloud infrastructure. Apache CloudStack provides a first-class user interface (UI), a command line tool named CloudMonkey [3], and a full-featured RESTful API. Apache CloudStack currently supports the most popular hypervisors: VMware, KVM, XenServer and Xen Cloud Platform (XCP).

For now, the latest stable version of Apache CloudStack is 4.2.0. However, if you want to change and test your change in Apache CloudStack, or test the new features of CloudStack, you can check out the Apache CloudStack source code, build RPM/DEB packages, and install them on servers. However, Apache CloudStack also provides an easier way for testing.

DevCloud [4] is a virtual appliance shipped as an OVA image which runs on VirtualBox (an opensource type-2 or desktop hypervisor) and can be used for CloudStack’s development and testing. An NFS server is already configured in DevCloud, the System VM Template for Apache CloudStack 4.0/4.1 and a ttylinux virtual machine template are already installed on it. Moreover, Xen hypervisor and Xen Cloud Platform (XCP) are already installed in DevCloud, so virtual machines can be deployed in it.

Now we can test Apache Cloudstack on our local machines using DevCloud:

1. Preparation

(1)  Install VirtualBox

(2) Create a “host-only” network in VirtualBox if not exists. Set the IPv4 to


(3) It is recommended that we install a Linux (such as CentOS, Ubuntu) virtual machine in VirtualBox as the working VM (WORK-VM) at first. There are two network adaptor attached to the VM (on is attached to NAT , another one is attached to the Host-Only Adaptor created in Step 2). Suppose it has a IP .

Make sure the following programs have been installed: mysql-server, Python, Python-Dev (python-devel), mysql-connector-java, Java, tomcat6, python-paramiko, nfs-utils, Jsvc, maven, mysql-connector-python (pip install), requests (pip install)

(4) Get DevCloud2 [5] and import it to VirtualBox. Please do NOT select “re-initialize the MAC address of all network cards”. Make sure ‘Enable PAE/NX’ mode under VM settings -> System -> Processor Tab is checked. Change the network setting like Step 3. The network configuration should like this:

2. Management server installation from CloudStack source codes

(5) Checkout Apache CloudStack source code from Apache Git repository in WORK-VM (see step 3).

git clone testing
cd testing
git checkout 4.2    # or other branches or tags (like 4.2.0)

Revert commit 7f9463bb54f19e7676f8c6049d1ebc02330a730f which make DevCloud not working on Apache CloudStack 4.2 branch.

[root@weizhou-centos testing(4.2)]# git show 7f9463bb54f19e7676f8c6049d1ebc02330a730f
commit 7f9463bb54f19e7676f8c6049d1ebc02330a730f
Author: Anthony Xu <>;
Date:   Tue Dec 3 01:36:24 2013 -0800

    put shell scripts to a seperate directory in XS
    use same scripts for both XS and XCP
[root@weizhou-centos testing(4.2)]# git revert 7f9463bb54f19e7676f8c6049d1ebc02330a730f

(6) Compile Apache CloudStack source code, deploy database, and run the management server

mvn -P developer,systemvm clean install
mvn -P developer -pl developer,tools/devcloud –Ddeploydb
mvn -pl :cloud-client-ui jetty:run

Now we can see the Apache CloudStack UI on (username:admin, password:password)
(7) Change some global configuration in Apache CloudStack, and restart management server. Or you can change by MySQL:

mysql -e &quot;update cloud.configuration set value='' where name='host'&quot;;
# the value should be the ip of WORK-VM.
mysql -e &quot;update cloud.configuration set value='10' where name='cpu.overprovisioning.factor'&quot;;
mvn -pl :cloud-client-ui jetty:run

3. DevCloud deployment and testing

(8) Start DevCloud in VirtualBox. And run the following command in WORK-VM for testing Apache CloudStack 4.2 and newer.

mkdir /mnt/secondary
mount /mnt/secondary
wget -O /root/systemvmtemplate-2013-07-12-master-xen.vhd.bz2
./client/target/generated-webapp/WEB-INF/classes/scripts/storage/secondary/cloud-install-sys-tmplt -m /mnt/secondary -f /root/systemvmtemplate-2013-07-12-master-xen.vhd.bz2 -h xenserver -F

This is because the system VM (System Virtual Machines) [6] template changed between Apache CloudStack 4.1 and 4.2. So the old system VM template inside DevCloud is no longer valid when we test Apache CloudStack 4.2. These commands download the new system VM template and install it to Secondary Storage (NFS inside DevCloud).
After this, take a snapshot of DevCloud in VirtualBox, so that we do not need to update systemvm template any more. Each time when we want a clean DevCloud, we can restore the snapshot.
(9) Using Marvin to deploy DevCloud. Open another session and run the following commands:

cd tools/marvin
python install	# run only the first time. Check python-devel package if fails
cd ../../
mvn -P developer -pl tools/devcloud -Ddeploysvr	# Basic Network

If you want to use other type of networks, you can replace the last command with one of the following commands.

python tools/marvin/marvin/ -i tools/devcloud/devcloud.cfg    # Basic Network, same to before
python tools/marvin/marvin/ -i tools/devcloud/devcloud-advanced.cfg     # Advanced Network
python tools/marvin/marvin/ -i tools/devcloud/devcloud-advancedsg.cfg  # Advanced with Security Groups

(10) After Step (9), a Zone/Pod/Cluster have been created, and DevCloud has been added as a host. After a few minutes, we can see that the system VMs are running on Apache CloudStack UI -> Infrastructure -> System VMs.
(11) Now we can deploy a VM on Apache CloudStack UI -> Instances -> Add Instance -> Template -> select “tty Linux” -> select “tinyOffering” -> next . After a few minutes, the VM will be up.
A virtual router (for default network) is also running.

4. Limitation and future work

Now we have an testing environment with Apache CloudStack 4.2. We can test the functionalities in CloudStack like virtual machine operations, network, template, domain/account.

However, in this environment, we have only one host (devcloud) with local storage (this means the volumes of virtual machines are stored on the host, not shared storage, so virtual machines live migration is disabled). In the next post, I will introduce how to test with multiple devcloud hosts, and shared storage (like NFS).


(1) It is better for testing Apache CloudStack 4.2. The 4.3/master branch have not been tested.

(2) If you are new to CloudStack, you can get some concepts from Apache CloudStack Installation Guide [7] and Apache CloudStack Admin Guide [6]. Please note a new type of network (Advanced Network with Security Groups) was introduced in Apache CloudStack 4.2.0.

(3) You can use XCP command lines [8] to manage virtual machines inside DevCloud. For example:

root@devcloud:~# xe vm-list
uuid ( RO)           : 576aacc8-4c8e-e0b4-f035-79001b4a7284
     name-label ( RW): r-4-VM
    power-state ( RO): running

uuid ( RO)           : 1efad534-bcd5-c183-9bfa-5eaf4a4afe80
     name-label ( RW): i-2-3-VM
    power-state ( RO): running

uuid ( RO)           : c8c2f1a3-40d3-308f-70bf-687f7f49b9a5
     name-label ( RW): Control domain on host: devcloud
    power-state ( RO): running

uuid ( RO)           : 61721ac5-c139-de00-c167-9e2edda49471
     name-label ( RW): v-2-VM
    power-state ( RO): running

uuid ( RO)           : 464b1a57-1d82-eb33-b8da-93f029289389
     name-label ( RW): s-1-VM
    power-state ( RO): running

(4) You can find more details in log files:

1. vmops.log in testing directory (WORK-VM).
2. /var/log/xcp-xapi.log inside DevCloud.

(5) If you want to attach the git branch name to directory path, please follow the article: “Git tip: Show your branch name on the Linux prompt”

(6) If we change some source codes, but now willing to build all projects as it take a long time. We can build the specified projects using maven.

mvn –P developer –pl api,server		# if you want to re-build api and server projects
cp ./api/target/cloud-api-4.2.1-SNAPSHOT.jar ./client/target/cloud-client-ui-4.2.1-SNAPSHOT/WEB-INF/lib/cloud-api-4.2.1-SNAPSHOT.jar
cp ./server/target/cloud-server-4.2.1-SNAPSHOT.jar ./client/target/cloud-client-ui-4.2.1-SNAPSHOT/WEB-INF/lib/cloud-server-4.2.1-SNAPSHOT.jar

If you want to re-build systemvm.iso which is attached to system VMs when they start.

mvn -P developer,systemvm -pl patches/,services/console-proxy/,services/console-proxy/server/
cp ./services/console-proxy/server/dist/systemvm.iso ./client/target/cloud-client-ui-4.2.1-SNAPSHOT/WEB-INF/classes/vms/systemvm.iso
scp ./services/console-proxy/server/dist/systemvm.iso