Jump to content

OSX-KVM: Difference between revisions

From Official NixOS Wiki
imported>Wineee
No edit summary
Updated instructions for running; add alternative to fork with flake, since it is behind upstream.
 
(6 intermediate revisions by 4 users not shown)
Line 1: Line 1:
[https://github.com/kholia/OSX-KVM OSX-KVM] allows to run macOS on Linux machines.
The [https://github.com/kholia/OSX-KVM OSX-KVM] project provides a quick method of running macOS on Linux machines.


Use the following <code>shell.nix</code> to get all the tools required to boot OSX-KVM:
== Installation ==


<syntaxHighlight lang=nix>
Enable virtualisation support in your system configuration by adding following lines
with import <nixpkgs> {};
mkShell {
  buildInputs = [
    qemu
    python3
    iproute2
  ];
}
</syntaxHighlight>
 
On NixOS also add the following lines to your <code>configuration.nix</code>:


<syntaxHighlight lang=nix>
<syntaxHighlight lang=nix>
{
{
  # this is needed to get a bridge with DHCP enabled
   virtualisation.libvirtd.enable = true;
   virtualisation.libvirtd.enable = true;
  # Replace <youruser> with your actual username.
   users.extraUsers.youruser.extraGroups = [ "libvirtd" ];
   users.extraUsers.<youruser>.extraGroups = [ "libvirtd" ];


  # reboot your computer after adding those lines
   boot.extraModprobeConfig = ''
   boot.extraModprobeConfig = ''
     options kvm_intel nested=1
     options kvm_intel nested=1
Line 32: Line 18:
</syntaxHighlight>
</syntaxHighlight>


After cloning the repository use <code>./fetch-macOS.py</code> or <code>./fetch-macOS-v2.py</code> as described in the README
Replace <code>youruser</code> with the user name of your running system. After applying the configuration, reboot your system so the changes to the kernel modules can take effect.
to download macOS
 
Then do:
== Usage ==
Jonas Heinrich (GitHub user @onny) created a fork of the OSX-KVM repository with a flake. You can clone the fork and simply <code>nix run</code>, or, since the fork is several commits behind the original repo, you can complete the steps manually (see below), or copy the flake.nix to a clone of the original repo.
 
For the forked repo, git clone and run <code>nix run</code> to prepare and run a macOS system:<syntaxhighlight lang="bash">git clone -b flake https://github.com/onny/OSX-KVM.git
cd OSX-KVM
nix run</syntaxhighlight>


<syntaxHighlight lang=console>
Alternatively, clone the original repo, https://github.com/kholia/OSX-KVM. Then, copy over @onny's flake and <code>nix run</code>, or run the following manually. You will need the <code>python3</code> and <code>qemu</code> packages.<syntaxhighlight lang="bash">
$ qemu-img convert BaseSystem.dmg -O raw BaseSystem.img
# to fetch BaseSystem.dmg
</syntaxHighlight>
python ./fetch-macOS-v2.py


to create the base image containing the macOS installer, followed by creating
# to convert BaseSystem.dmg to BaseSystem.img
your actual disk image where later the macOS will be installed to:
qemu-img convert BaseSystem.dmg -O raw BaseSystem.img


<syntaxHighlight lang=console>
# to create virtual hard drive image file mac_hdd_ng.img
$ qemu-img create -f qcow2 mac_hdd_ng.img 128G  
qemu-img create -f qcow2 mac_hdd_ng.img 128G
</syntaxHighlight>


Last but not least, configure a tap interface that will be used in macOS for networking:
# run launch script
# this runs qemu-system-x86_64 with the necessary arguments
source ./OpenCore-Boot.sh
</syntaxhighlight>In all cases, you can adjust the CPU count, memory, or other options in <code>./OpenCore-Boot.sh</code>. Currently (commit [https://github.com/kholia/OSX-KVM/tree/da4b23b5e92c5b939568700034367e8b7649fe90 da4b23b]), the script [https://github.com/kholia/OSX-KVM/blob/da4b23b5e92c5b939568700034367e8b7649fe90/OpenCore-Boot.sh#L16 recommends changing the CPU to <code>Haswell-noTSX</code> for macOS Sonoma].


<syntaxHighlight lang=console>
On the first run, QEMU will boot into the macOS recovery image. From the boot menu, select the macOS Disk Utility and erase / format the virtual hard drive that will be used for installation (find the one with the same size as created in the script, 128GB by default).
$ sudo ip tuntap add dev tap0 mode tap
$ sudo ip link set tap0 up promisc on
$ sudo ip link set dev virbr0 up
$ sudo ip link set dev tap0 master virbr0
</syntaxHighlight>


Then boot the system with:
Then choose the (re-)installer from the boot menu and select the previously created disk image as the installation target. This will then download the full image of the selected macOS version.


<syntaxHighlight lang=console>
On the next boot, you will see a new boot entry containing the actual installation.
$ ./OpenCore-Boot.sh
</syntaxHighlight>


You may also want to adjust the cpu count/memory in <code>./OpenCore-Boot.sh</code> if your systems resources allow it.
== See also ==


On the first run, from the boot menu, select disk utilities and erase / format the Qemu disk that will be used for installation. Then choose the installer from the boot menu. Select the previously created disk image as install target.
* [https://github.com/ngi-nix/OSX-KVM ngi-nix/OSX-KVM]: This implementation is based on [https://github.com/foxlet/macOS-Simple-KVM macOS-Simple-KVM], and may not be as complete or polished as [https://github.com/kholia/OSX-KVM kholia/OSX-KVM]. Usage instructions are available in the repository README.


On the next boot you will a new boot entry containing the actual installation.
[[Category:Virtualization]]

Latest revision as of 14:49, 21 November 2025

The OSX-KVM project provides a quick method of running macOS on Linux machines.

Installation

Enable virtualisation support in your system configuration by adding following lines

{
  virtualisation.libvirtd.enable = true;
  users.extraUsers.youruser.extraGroups = [ "libvirtd" ];

  boot.extraModprobeConfig = ''
    options kvm_intel nested=1
    options kvm_intel emulate_invalid_guest_state=0
    options kvm ignore_msrs=1
  '';
}

Replace youruser with the user name of your running system. After applying the configuration, reboot your system so the changes to the kernel modules can take effect.

Usage

Jonas Heinrich (GitHub user @onny) created a fork of the OSX-KVM repository with a flake. You can clone the fork and simply nix run, or, since the fork is several commits behind the original repo, you can complete the steps manually (see below), or copy the flake.nix to a clone of the original repo.

For the forked repo, git clone and run nix run to prepare and run a macOS system:

git clone -b flake https://github.com/onny/OSX-KVM.git
cd OSX-KVM
nix run

Alternatively, clone the original repo, https://github.com/kholia/OSX-KVM. Then, copy over @onny's flake and nix run, or run the following manually. You will need the python3 and qemu packages.

# to fetch BaseSystem.dmg
python ./fetch-macOS-v2.py

# to convert BaseSystem.dmg to BaseSystem.img
qemu-img convert BaseSystem.dmg -O raw BaseSystem.img

# to create virtual hard drive image file mac_hdd_ng.img
qemu-img create -f qcow2 mac_hdd_ng.img 128G

# run launch script
# this runs qemu-system-x86_64 with the necessary arguments
source ./OpenCore-Boot.sh

In all cases, you can adjust the CPU count, memory, or other options in ./OpenCore-Boot.sh. Currently (commit da4b23b), the script recommends changing the CPU to Haswell-noTSX for macOS Sonoma.

On the first run, QEMU will boot into the macOS recovery image. From the boot menu, select the macOS Disk Utility and erase / format the virtual hard drive that will be used for installation (find the one with the same size as created in the script, 128GB by default).

Then choose the (re-)installer from the boot menu and select the previously created disk image as the installation target. This will then download the full image of the selected macOS version.

On the next boot, you will see a new boot entry containing the actual installation.

See also