Qemu Ubuntu For Mac
I first learned about libvirt
and QEMU
three years ago when I wrote a guide on how to virtualize macOS on a Linux system. Today I will be showing the opposite, virtualizing Linux on macOS using the same tools. I was surprised that with so many software developers using MacBooks everyday, nobody has created a guide on how to use libvirt
and QEMU
with macOS.
Step 3: Installing Mac OS X on the virtual machine. Sudo apt-get install qemu qemu-system qemu-user qemu-utils Step 1 (optional, if running 64-bit Ubuntu may be necessary): sudo apt-get install ia32-libs Step 2. Download latest build of QEMU for Mac (on top-right corner) Installation Installation - QEMU 1. Double-click on QEMU installer for Mac. Follow the instructions of QEMU installer. QEMU for Mac provides a graphical interface launcher for virtual machines. Create a new virtual machine configuration on QEMU launcher for Mac. Record the first number for QEMU, the second for GRUB. 00:14.0 USB controller 0c03: Intel Corporation Cannon Lake PCH USB 3.1 xHCI Host Controller 8086:a36d (rev 10) Add the second number to grub.
Why is libvirt
and QEMU
better? First of all, it's free and open-source. Unlike Parallels Desktop and VMWare Fusion, you won't need to pay for expensive subscriptions or manage licenses. There does exist an open-source alternative (from Oracle!) called VirtualBox, which works pretty well. However, VirtualBox does not support macOS's Hypervisor.Framework, a virtualization API created to limit kernel modification. This means the installer will ask for admin access to install kernel extensions, a feature Apple is now phasing out for security reasons. QEMU
on the other hand has had support for Hypervisor.Framework since 2018. Just say no to kexts!
Furthermore, like many developers, I like to run VMs headless, i.e. without a desktop GUI, so that I can SSH into them. Running VMs in the background seems like a simple feature, but it requires a lot of complex configuration for both VirtualBox and VMWare Fusion. And Parallels wants you buy the Pro Edition to gain access. Market segmentation at its finest... With libvirt
, VMs start headless. Plus, when you shutdown macOS, it sends a shutdown signal to your VMs as well.
To be clear, this method doesn't support USB Passthrough, GPU Passthrough, or bridge networking. But if you just need to test, for example, node.js or nginx on a Linux VM, then this method is great.
Installing libvirt and QEMU
- First, install homebrew, which is a package manager for macOS.
- Run
brew install qemu gcc libvirt
. - Since macOS doesn't support QEMU security features, we need to disable them:
- Finally start the libvirt service, with
brew services start libvirt
. It will start after boot as well.
Installing Ubuntu Server 20.04
There are two ways to access the virtual display of the VM, either using a VNC client or the virt-viewer program. I recommend RealVNC Viewer. The VNC client is responsive and quick to install, but if you have multiple VMs you need to manually manage the different ports. With virt-viewer, you get a popup with all the VMs currently running, but it is laggy and takes an eternity to install. virt-viewer can be installed through homebrew. The rest of this guide uses VNC.
Create a
vms
folder in your home directory, and generate a disk image. Change50g
to the size of your prefered disk:Download the Ubuntu Server 20.04 Install Image and my libvirt XML template and place the .iso and .xml files in the same folder.
Modify the following elements in the
ubuntu.xml
file to match your your VM preferences and file paths. Save, then runvirsh define ubuntu.xml
followed byvirsh start ubuntu
.Start RealVNC Viewer and connect to
localhost
. Click theCtrl+Alt+Del
button to reboot the machine, and quickly pressEsc
to get into the boot menu. Press the number that matches the Ubuntu Server image.Install Ubuntu Server normally, making sure to enable the SSH server. Once it restarts you can connect to the VM from your terminal by running
ssh -p 2222 user@localhost
.To send a shutdown signal to your VM, run
virsh shutdown ubuntu
. To force shutdown, runvirsh destroy ubuntu
.To forward a port, e.g. port 443 from the VM to port 8443 locally, run the following:
ssh -p 2222 -L8443:localhost:443 user@localhost
Multiple VMs
If you want to create multiple VMs, create an XML file for each machine with a unique UUID, VM name, and VNC port. Also, change the hostfwd
argument so that each VM exposes a different port for SSH, e.g. 2223
instead of 2222
. After you have defined them all, you can get a list of the VMs that are currently running with virsh list
.
References:
Note: More discussion on Hacker News
A new macOS release is nearing release, and it's a big one. So big that this time it's really, completely and definitely not OS X any longer. With the death of Kexts looming and the transition away from Intel CPUs spelling disaster for Hackintoshers and multi-OS users alike, it's certainly an interesting time.
Oh, and rounded edges. So many rounded edges. Good golly.
Update 2020-11-13: For the specific steps required to get the Big Sur public release to work, I made a companion post that you can find right here.
Update 2020-11-11: This guide has been updated to support Big Sur 11.0.1 Release Candidate 2 (Beta 3).
Today I'd like to walk you through how to get Big Sur installed and up and running in a virtual machine on your Ubuntu or similar host machine. In this article I'll focus on steps and commands that are tailored towards Ubuntu 20.04, but I'm sure you'll be able to tweak things a bit to tailor towards whatever flavor you're running to get things to work similarly.
Let's get to it.
As of this writing, Big Sur 11.0.1 Release Candidate 2 (Beta 3) is the recent-most beta release. While the guide should remain useful for all subsequent releases as-well as the eventual full release, the fetch-macOS
script might need updating for future beta releases and the eventual full release. Please check the relevant repositories for up-to-date information on this.
In this guide I'll assume you have already set up your host machine, including having set up QEMU, virt-manager, etc. As mentioned before, I'm focussing this guide on running Ubuntu 20.04 as the host OS.
No physical Mac needed
You do not need a physical Mac to download anything necessary to create this VM. We'll be using a few tools to fetch and extract the installer files needed right from your host machine.
Python
Be sure to have Python installed. In my case I already had Python installed but I needed to install an extra package called python-is-python2
to get certain tools to work, but you might also want to make sure python2
is actually installed.
Build tools
We'll be building a few tools from source, so we'll need build tools installed for that. To be honest I already had most of these installed, so I am probably going to miss one or two in this list. If one of the build steps later on this guide fails, it'll tell you what's missing so you can install it at that point. Please let me know if I did actually miss anything here.
Other utilities
Also be sure to install these tools if you don't have them already:
What's happening: We'll need dmg2img
to convert an image file, and while 7zip is optional, it's a great compression and decompression tool that I highly recommend you keep around as it's super convenient.
Both literally and figuratively. Most of the work has been done by the amazing people who have created and keep this repository up-to-date. There's a few minor tweaks we'll make to get Beta 3 to work, which at the time of this writing isn't yet working out of the box when relying on the original repo (I have submitted a PR for this). Hopefully this'll get added soon, but for now you can head over to my fork where I've already applied the fix needed to get Beta 3 to download. The main repo has since been updated and should automatically fetch the recent-most beta.
Go ahead and download the repo to your local machine.
Open up a Terminal and from the OSX-KVM repo you have just downloaded, and run:
You should see a bunch of things fly by and the tool will start downloading a relatively humongous InstallAssistant.pkg
file, clocking in at 12GB.
Note: If you have issues at this step, it is possible an incomplete plist file has been downloaded, or perhaps a complete but now out-of-date version. The tool keeps using an already downloaded file if it exists, so if you get a warning about something related to XML parsing or you're not getting the version you expect, try deleting the files found in content/catalogs/other
and running the tool again.
While this is downloading, let's set up a few additional things we'll need once the download is done.
Download & build XAR
Download the XAR repository here, and open another Terminal window/tab and head over to where you have downloaded this repository. Inside, run the following:
What's happening: We head into thexar
sub-directory, runautogen.sh
to generate the configure script, and then build the project withmake
. We're not installing the tool, so the results stay contained within this folder.
Download & build darling-dmg
Download the darling-dmg repository from here, and head on over to this directory in a Terminal window. Darling-dmg is a part of Darling, a sort of WINE for macOS software, which I didn't even know was a thing that existed until I was going through this process. Regardless, we don't need the entire Darling project, so that's why we're just pulling in darling-dmg.
If you already have Darling installed on your system, you can skip this step as you should already have darling-dmg
available.
From the darling-dmg repository folder, run the following:
What's happening: We're just configuring and building darling-dmg here. We're not installing it, so the results stay contained within this folder. If the build fails, please check the results as this is probably due to a missing library. Simply look through the messages to find the library you're missing, apt install
it, and try again.
By this point the download has hopefully finished, and you should have InstallAssistant.pkg
sitting right there in your OSX-KVM
folder. We'll have to take a few steps now to get to the actual installer image file, so let's do that now.
Make note where the XAR and darling-dmg folders are relative to your OSX-KVM folder, as we'll have to use these now.
Step 1: Extract InstallAssistant.pkg
Let's create a folder in which we'll extract all files to, to keep the repo from getting messy:
In a Terminal window opened to your OSX-KVM
folder, let's now extract the PKG file:
What's happening: We're using thexar
tool we build just before to extract the file by pointing to it relative to yourOSX-KVM
folder. The built tool should be atxar/src/xar
within the folder where you have checked out the XAR repository.-x
tells the tool you want to extract, and with-f filename
you specify which file you want to extract from. Lastly,-C ./extracted
tells it to extract the files to the specified folder we have created just previously.
After a bit, a few new files should have shown up inside the extracted
folder, including SharedSupport.dmg
.
Step 2: Mount SharedSupport.dmg
Now we'll use darwin-dmg
to mount SharedSupport.dmg
. In Terminal, run:
What's happening: We're creating a folder calledtmp
, which we'll use to mount the disk image to. We then usedarling-dmg
by referencing it from the folder we checked out its repository to, and specify we want to mountSharedSupport.dmg
to the just-createdtmp
folder.
If this went well, you should see a few messages in your Terminal, and a newly mounted drive show up in your file manager called tmp
. If you want to stick to using Terminal, you should also see these files when cd'ing into it; cd tmp && ls -la
.
Step 3: Extract BaseSystem.dmg
With SharedSupport.dmg
mounted, we need to extract BaseSystem.dmg
, which is located inside a ZIP file. Using 7zip, run this from your OSX-KVM
directory:
What's happening: We're extractingBaseSystem.dmg
from a ZIP file found inside theSharedSupport.dmg
image we have just before mounted to./tmp
. The ZIP file is located inside thecom_apple_MobileAsset_MacSoftwareUpdate
sub-directory, andBaseSystem.dmg
is located inAssetData/Restore
within that ZIP file. If you like, you can use your favorite file manager and archive tool to extract this directly too. The-o./extracted
flag lets 7zip extract to the 'extracted' folder we have just before created, to keep our repository directory nice and clean.
Step 4: Convert BaseSystem.dmg
We'll now use the dmg2img
tool to, as the name implies, convert the image to the img
format, something that QEMU can actually work with. Simply run:
A moment or two later you should have the macOS Big Sur installation disk image ready to go. Exciting!
We're now done with both DMG files, so let's unmount SharedSupport.dmg
and remove the tmp
dir. You can now also delete both files if you like:
The OSX-KVM
repository comes with a convenient shell script that you can use to easily launch the VM directly. This file has everything you need pre-configured, though the defaults are probably not ideal if you're planning to use this VM for anything more than just gazing upon it once or so. For example, only 3GB RAM is allocated to it, which is a tiny amount of course.
Qemu Gui Mac Os
If you're just curious, or if you want to use this script to sort of jump-start the installation of macOS after which you'll move the disk image with Big Sur installed on it over to a more permanent VM configuration, this might be a handy starting point. Otherwise, you might want to skip ahead to the section on using virt-manager
.
Method 1: For quick testing, momentary curiosity, or for use as a starting point
The script is called OpenCore-Boot.sh
and assumes you're launching it from within the repo's directory, have BaseSystem.img
ready to go, have a hard drive disk image created, and have the 'default' network adapter all set up and ready to go. We're two for four here, so let's go ahead and tackle those last two bits. First, let's create a disk image we'll install Big Sur onto:
What's happening: We're using theqemu-img
tool to create a new disk image calledmac_hdd_ng.img
that's 128GB in size. Be sure to customize the size to your liking, in case you need more (or less) space.
Note: If you get a message saying you don't haveqemu-img
installed, you probably didn't installqemu-utils
.
Next, let's set up some basic networking so this VM can actually boot up:
What's happening: We're basically setting up and configuring a bridge network connection which VMs can use to connect to the internet. For anything beyond quick testing you'll probably want to set up a more robust configuration or pass through an actual network adapter if you have multiple, but for now this should at least get you going.
Lastly, as we kept all prepared files in a subdirectory, we should modify the OpenCore-Boot.sh
script to point to the right directory. While we're in there, we might as-well update the RAM allocation, unless 3GB is enough for your specific needs of course.
You can find the reference to $REPO_PATH/BaseSystem.img
on line :52
. Simply update it to read $REPO_PATH/extracted/BaseSystem.img
and that should be it. If you have created the qemu hard drive image someplace else or used a different name, you can update that reference on line :53
. Lastly, the amount of RAM the VM will use is specified on line :21
in the ALLOCATED_RAM
variable. 8192
(8GiB) might be a good choice, or 16384
(16GiB) if you can spare it and are planning to do Mac/iOS development for example.
Now you should be able to boot up the VM for the first time! To start it, just run OpenCore-Boot.sh
from a Terminal window, and a QEMU remote viewer screen should show up soon thereafter.
After a brief moment, a familiar screen will show up with a few options. Simply hit enter to boot the first option (called macOS Base System
), which is the installation disk image.
Note: The OpenCore configuration included with this repository has verbose mode enabled, so you'll be seeing a lot of messages run by as the system (and the installer) boot up. This is normal and intended. You'll be able to modify the OpenCore configuration file to disable this should you want to, but that's outside the scope of this already rather lengthy article :).
From here you can proceed as you normally would. Before you start with the installation, be sure to launch into Disk Utility the first time so you can format the disk image.
After selecting and launching Disk Utility from the main menu, select Show All Devices
from the sidebar options menu. Then, with the correct disk image selected (you can double check the capacity to make sure you're looking at the right drive), click Erase, name your drive and select your preferred options (Encrypted or not, Case-sensitive or not), and click Erase.
Note that in my case I was not able to actually start the Big Sur Beta installation on a drive that I formatted using the APFS Encrypted option. I am not sure if it was a limitation of the specific beta I was installing or something else. If you run into the same issue, try re-formatting the drive to non-Encrypted APFS. Your root drive should already be encrypted so it's probably not the end of the world, and I'm sure the non-beta version will certainly support encrypted drives again.
When you're done with that, click Done, close Disk Utility, and select Reinstall macOS from the main menu. From there you can follow the steps as you normally would.
Note: As you probably know, at one point during installation the VM will reboot. To let it continue with the installation, at the boot selection screen be sure to select the macOS Install option, as that's the as-of-yet incomplete installation of macOS on the hard drive.
After about an hour or so of you should be greeted with the welcome stuff, where you can set up your user account and whatnot. And after that, well, get ready for border radii to dazzle you with their roundedness.
Qemu Ubuntu For Mac Virtualbox
At this point you should have a working macOS Big Sur VM. Congrats! But it might not be the most elegant of setups. You'll have to use OpenCore-Boot.sh
to launch the VM every time, and you'll probably notice that macOS itself feels rather sluggish too. The latter is due to the lack of any form of hardware acceleration, something you can only really fix by passing through a graphics card. That topic and several more might be interesting as a follow-up articles, so if you'd like to see that, please let me know.
Qemu On Mac Os
I hope this was useful for you and that this guide has helped you get to a working virtual machine. Enjoy, and happy coding!
Qemu Kvm Mac
Thank you.