-
-
Save alexanderadam/67575c308f5e0646ba6fdb3d60f4b66e to your computer and use it in GitHub Desktop.
Fast OS X launch on QEMU with KVM support enabled. Credits to: https://github.com/kholia, original repository: https://github.com/kholia/OSX-KVM
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# qemu-img create -f qcow2 mac_hdd.img 64G | |
# echo 1 > /sys/module/kvm/parameters/ignore_msrs | |
# | |
# Type the following after boot, | |
# -v "KernelBooter_kexts"="Yes" "CsrActiveConfig"="103" | |
# | |
# printf 'DE:AD:BE:EF:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256)) | |
# | |
# no_floppy = 1 is required for OS X guests! | |
# | |
# Commit 473a49460db0a90bfda046b8f3662b49f94098eb (qemu) makes "no_floppy = 0" | |
# for pc-q35-2.3 hardware, and OS X doesn't like this (it hangs at "Waiting for | |
# DSMOS" message). Hence, we switch to pc-q35-2.4 hardware. | |
# | |
# Network device "-device e1000-82545em" can be replaced with "-device vmxnet3" | |
# for possibly better performance. | |
# | |
# Replace line 46 with this if networking is not working properly: | |
# -netdev user,id=net0 -device e1000-82545em,netdev=net0 \ | |
# this is not using tun/tap interfacing and does not require you to be root | |
# on macOS, connect to ethernet using DHCP (auto IP assign) method, and you're done! | |
# | |
if ! which qemu-system-x86_64 2>/dev/null >>/dev/null ; then | |
echo "Cannot find qemu-system-x86_64... Aborting" | |
exit 1 | |
fi | |
KVM="-enable-kvm" | |
DEDICATED_RAM="8192" | |
KERNEL_IMAGE="/home/$USER/.qemu/osx_sierra/enoch_rev2839_boot" | |
HDD_IMAGE="/home/$USER/.qemu/osx_sierra/sierra.img" | |
qemu-system-x86_64 $KVM -m $DEDICATED_RAM -cpu Penryn,kvm=off,vendor=GenuineIntel \ | |
-machine pc-q35-2.4 \ | |
-smp 4,cores=2 \ | |
-usb -device usb-kbd -device usb-mouse \ | |
-device isa-applesmc,osk="ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc" \ | |
-kernel $KERNEL_IMAGE \ | |
-smbios type=2 \ | |
-device ide-drive,bus=ide.2,drive=MacHDD \ | |
-drive id=MacHDD,if=none,file=$HDD_IMAGE \ | |
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device e1000-82545em,netdev=net0,id=net0,mac=52:54:00:c9:18:27 \ | |
-monitor stdio | |
# -vnc 0.0.0.0:0 -k en-us \ | |
# -redir tcp:5901::5900 \ | |
# -netdev user,id=hub0port0 -device e1000-82545em,netdev=hub0port0,id=mac_vnet0 \ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Thanks to kholia (https://github.com/kholia) | |
# https://github.com/kholia/OSX-KVM | |
# He did the hard work! | |
BOOT_MACOS_SH="boot-macOS.sh" | |
ENOCH_REV2839_BOOT="enoch_rev2839_boot" | |
BOOT_MACOS_SCRIPT="https://raw.githubusercontent.com/kholia/OSX-KVM/master/${BOOT_MACOS_SH}" | |
ENOCH_REV2839_BOOT_KERNEL="https://raw.githubusercontent.com/kholia/OSX-KVM/master/${ENOCH_REV2839_BOOT}" | |
IMAGE_HDD_NAME="${1}.img" | |
IMAGE_HDD_SIZE=$2 | |
ISO="$(pwd)/$3" | |
INSTALL_DIR=$4 | |
DL_BOOT_MACOS_RC="wget $BOOT_MACOS_SCRIPT" | |
DL_ENOCH_REV2839_BOOT_RC="wget $ENOCH_REV2839_BOOT_KERNEL" | |
PERM_RC="sudo sh boot-macOS.sh" | |
RAM_MB="4096" | |
echo | |
echo " ** THANKS TO ** " | |
echo " -> Dhiru Kholia : the man who did the hard work for us, not me" | |
echo " -> GitHub profile : https://github.com/kholia" | |
echo " -> Original OSX-KVM repository: https://github.com/kholia/OSX-KVM, be sure to star this!" | |
echo | |
if [[ $# < 4 ]]; then | |
echo "Usage: <$0> [target HDD name] [target HDD size(including unit: M,G,K,..)] [ISO file] [Install directory] (dedicated RAM memory) [in Megabytes]" | |
exit 1 | |
fi | |
if [[ $# == 5 ]] || [[ $# > 5 ]]; then | |
RAM_MB=$5 | |
echo "Dedicated RAM size: ${RAM_MB}MB" | |
fi | |
if [ ! -f $ISO ]; then | |
echo "Cannot find your iso file named: $ISO ... Aborting" | |
exit 5 | |
fi | |
if [ ! -d $INSTALL_DIR ]; then | |
echo "Creating $INSTALL_DIR for you..." | |
mkdir -p $INSTALL_DIR || exit 1 && echo "Done" | |
fi | |
if ! which wget 2>/dev/null >>/dev/null; then | |
echo "wget not found, trying curl..." | |
if ! which curl 2>/dev/null >>/dev/null; then | |
echo "Cannot find curl... Aborting" | |
exit 1 | |
else | |
DL_BOOT_MACOS_RC="curl -O $BOOT_MACOS_SCRIPT" | |
DL_ENOCH_REV2839_BOOT_RC="curl -O $ENOCH_REV2839_BOOT_SCRIPT" | |
fi | |
fi | |
if ! which sudo 2>/dev/null >>/dev/null; then | |
echo "Using su as privilege escalation method" | |
PERM_RC="su -c \"sh boot-macOS.sh\"" | |
fi | |
if ! which qemu-system-x86_64 2>/dev/null >>/dev/null; then | |
echo "Cannot find QEMU (x86_64)... Aborting" | |
exit 2 | |
fi | |
if ! which qemu-img 2>/dev/null >>/dev/null; then | |
echo "Cannot find QEMU IMG (needed to create image)... Aborting" | |
exit 3 | |
fi | |
echo "Changing directory to: $INSTALL_DIR" | |
cd $INSTALL_DIR || exit 1 | |
if [ -f $IMAGE_HDD_NAME ]; then | |
echo -n "$IMAGE_HDD_NAME already exists, continue[y/N] ? " | |
read CONTINUE | |
if [[ $CONTINUE == "y" ]] || [[ $CONTINUE == "Y" ]]; then | |
echo "Keep going..." | |
elif [[ $CONTINUE == "n" ]] || [[ $CONTINUE == "N" ]]; then | |
echo "Good choice..." | |
exit 1 | |
fi | |
fi | |
qemu-img create -f qcow2 $IMAGE_HDD_NAME $IMAGE_HDD_SIZE | |
if [ -f $BOOT_MACOS_SH ]; then | |
echo "$BOOT_MACOS_SH already exists" | |
else | |
echo "Getting boot-macOS.sh..." | |
$DL_BOOT_MACOS_RC >>/dev/null || exit 1 | |
sed -i "s:./mac_hdd.img:$IMAGE_HDD_NAME:" boot-macOS.sh | |
sed -i "s:./'Install_macOS_Sierra_(OS_X_10.12).iso':${ISO}:" boot-macOS.sh | |
sed -i "s:-m 8192:-m $RAM_MB:" boot-macOS.sh | |
fi | |
if [ -f $ENOCH_REV2839_BOOT ]; then | |
echo "$ENOCH_REV2839_BOOT already exists" | |
else | |
echo "Getting enoch_rev2839_boot..." | |
$DL_ENOCH_REV2839_BOOT_RC >>/dev/null || exit 1 | |
fi | |
echo "(Waiting 3 secs) Launching QEMU... Starting OSX ($ISO) installation..." | |
sleep 3 | |
echo "Here we go" | |
$PERM_RC |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment