mirror of https://github.com/kholia/OSX-KVM.git
Added headless_opencore.service for background VM startup.
This commit is contained in:
parent
08e95d8580
commit
2bcec7346e
|
@ -8,3 +8,4 @@
|
|||
*.sucatalog
|
||||
OVMF_VARS*.fd
|
||||
OpenCore-Catalina/EFI/OC/Resources/
|
||||
*log.txt
|
||||
|
|
|
@ -1312,11 +1312,13 @@
|
|||
<key>AdviseFeatures</key>
|
||||
<false/>
|
||||
<key>MLB</key>
|
||||
<string>C02119700QXJG36JC</string>
|
||||
<string>C02731301GUJG36JC</string>
|
||||
<key>ProcessorType</key>
|
||||
<integer>0</integer>
|
||||
<key>ROM</key>
|
||||
<string>0022412e3d4a</string>
|
||||
<data>
|
||||
9PFai1o+
|
||||
</data>
|
||||
<key>SpoofVendor</key>
|
||||
<true/>
|
||||
<key>SystemMemoryStatus</key>
|
||||
|
@ -1324,9 +1326,9 @@
|
|||
<key>SystemProductName</key>
|
||||
<string>iMacPro1,1</string>
|
||||
<key>SystemSerialNumber</key>
|
||||
<string>C02FPBZPHX87</string>
|
||||
<string>C02V5SYMHX87</string>
|
||||
<key>SystemUUID</key>
|
||||
<string>213FA768-A62C-4299-8598-47AA666E436F</string>
|
||||
<string>DF0A0B37-D713-4408-BD6A-3F96139F8597</string>
|
||||
</dict>
|
||||
<key>UpdateDataHub</key>
|
||||
<true/>
|
|
@ -209,12 +209,7 @@ processors work just fine (even for macOS Sonoma).
|
|||
|
||||
### Headless macOS
|
||||
|
||||
- Use the provided [boot-macOS-headless.sh](./boot-macOS-headless.sh) script.
|
||||
|
||||
```
|
||||
./boot-macOS-headless.sh
|
||||
```
|
||||
|
||||
You can follow the instructions in the `headless_readme.md` file to run the macOS VM in a headless mode.
|
||||
|
||||
### Setting Expectations Right
|
||||
|
||||
|
|
|
@ -1,72 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Special thanks to:
|
||||
# https://github.com/Leoyzen/KVM-Opencore
|
||||
# https://github.com/thenickdude/KVM-Opencore/
|
||||
# https://github.com/qemu/qemu/blob/master/docs/usb2.txt
|
||||
#
|
||||
# qemu-img create -f qcow2 mac_hdd_ng.img 128G
|
||||
#
|
||||
# echo 1 | sudo tee -a /sys/module/kvm/parameters/ignore_msrs # this is required
|
||||
#
|
||||
# Usage:
|
||||
#
|
||||
# $ boot-macOS-headless.sh
|
||||
#
|
||||
# (qemu) change vnc password
|
||||
# Password: ********
|
||||
#
|
||||
# Note: Using RealVNC client, connect to `<localhost:5901>`.
|
||||
# E.g. `vncviewer localhost:5901`
|
||||
|
||||
############################################################################
|
||||
# NOTE: Tweak the "MY_OPTIONS" line in case you are having booting problems!
|
||||
############################################################################
|
||||
|
||||
MY_OPTIONS="+ssse3,+sse4.2,+popcnt,+avx,+aes,+xsave,+xsaveopt,check"
|
||||
|
||||
# This script works for Big Sur, Catalina, Mojave, and High Sierra. Tested with
|
||||
# macOS 10.15.6, macOS 10.14.6, and macOS 10.13.6.
|
||||
|
||||
ALLOCATED_RAM="7192" # MiB
|
||||
CPU_SOCKETS="1"
|
||||
CPU_CORES="2"
|
||||
CPU_THREADS="4"
|
||||
|
||||
REPO_PATH="."
|
||||
OVMF_DIR="."
|
||||
|
||||
# shellcheck disable=SC2054
|
||||
args=(
|
||||
-enable-kvm -m "$ALLOCATED_RAM" -cpu Penryn,kvm=on,vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on,"$MY_OPTIONS"
|
||||
-machine q35
|
||||
-device qemu-xhci,id=xhci
|
||||
-device usb-kbd,bus=xhci.0 -device usb-tablet,bus=xhci.0
|
||||
-smp "$CPU_THREADS",cores="$CPU_CORES",sockets="$CPU_SOCKETS"
|
||||
-device usb-ehci,id=ehci
|
||||
# -device usb-kbd,bus=ehci.0
|
||||
# -device usb-mouse,bus=ehci.0
|
||||
# -device nec-usb-xhci,id=xhci
|
||||
# -global nec-usb-xhci.msi=off
|
||||
-global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off
|
||||
# -device usb-host,vendorid=0x8086,productid=0x0808 # 2 USD USB Sound Card
|
||||
# -device usb-host,vendorid=0x1b3f,productid=0x2008 # Another 2 USD USB Sound Card
|
||||
-device isa-applesmc,osk="ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"
|
||||
-drive if=pflash,format=raw,readonly=on,file="$REPO_PATH/$OVMF_DIR/OVMF_CODE.fd"
|
||||
-drive if=pflash,format=raw,file="$REPO_PATH/$OVMF_DIR/OVMF_VARS-1920x1080.fd"
|
||||
-smbios type=2
|
||||
-device ich9-ahci,id=sata
|
||||
-drive id=OpenCoreBoot,if=none,snapshot=on,format=qcow2,file="$REPO_PATH/OpenCore/OpenCore.qcow2"
|
||||
-device ide-hd,bus=sata.2,drive=OpenCoreBoot
|
||||
-device ide-hd,bus=sata.3,drive=InstallMedia
|
||||
-drive id=InstallMedia,if=none,file="$REPO_PATH/BaseSystem.img",format=raw
|
||||
-drive id=MacHDD,if=none,file="$REPO_PATH/mac_hdd_ng.img",format=qcow2
|
||||
-device ide-hd,bus=sata.4,drive=MacHDD
|
||||
-netdev user,id=net0,hostfwd=tcp::2222-:22 -device vmxnet3,netdev=net0,id=net0,mac=52:54:00:c9:18:27
|
||||
-monitor stdio
|
||||
-device vmware-svga
|
||||
-display none
|
||||
-vnc 0.0.0.0:1,password=on -k en-us
|
||||
)
|
||||
|
||||
qemu-system-x86_64 "${args[@]}"
|
|
@ -7,7 +7,7 @@ CPU_SOCKETS="1"
|
|||
CPU_CORES="2"
|
||||
CPU_THREADS="4"
|
||||
|
||||
REPO_PATH="."
|
||||
REPO_PATH=$(dirname "$(readlink -f "$0")")
|
||||
OVMF_DIR="."
|
||||
|
||||
args=(
|
||||
|
@ -42,9 +42,20 @@ args=(
|
|||
-device virtio-net-pci,netdev=net0,id=net0,mac=52:54:00:c9:18:27
|
||||
|
||||
# Disable the QEMU monitor interface and graphical output
|
||||
# Comment out the following lines if you want to enable conectivity to the VM via VNC
|
||||
-monitor none
|
||||
-nographic
|
||||
|
||||
# Uncomment the following lines if you want to enable conectivity to the VM via VNC
|
||||
# -monitor stdio
|
||||
# -device vmware-svga
|
||||
# -display none
|
||||
# -vnc 0.0.0.0:1,password=on -k en-us
|
||||
)
|
||||
|
||||
# Start the QEMU virtual machine in the background and disown the process
|
||||
qemu-system-x86_64 "${args[@]}" > /dev/null 2>&1 & disown
|
||||
# Create log file for headless boot and clear it if it already exists
|
||||
touch "$REPO_PATH/headless_boot_log.txt"
|
||||
echo "" > "$REPO_PATH/headless_boot_log.txt"
|
||||
|
||||
# Start the QEMU virtual machine and redirect the output to the log file
|
||||
qemu-system-x86_64 "${args[@]}" > "$REPO_PATH/headless_boot_log.txt" 2>&1 &
|
|
@ -0,0 +1,12 @@
|
|||
[Unit]
|
||||
Description=OpenCore VM
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
ExecStart=%repo_path%/headless_boot.sh
|
||||
ExecStop=/usr/bin/pkill -f qemu-system-x86_64
|
||||
Restart=on-failure
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
|
@ -24,6 +24,13 @@ Complete the macOS setup and install XCode and other GUI-dependent tools.
|
|||
|
||||
If you need to install XCode, you'll need a unique serial number. Complete steps 1-5 below and start `./OpenCore-Boot.sh` again to connect to your Apple account, install XCode, and other tools.
|
||||
|
||||
```bash
|
||||
# Download XCode from [Apple Developer](https://developer.apple.com/download/all/?q=xcode)
|
||||
xip -x ~/Downloads/$xcode_version.xip -C /Applications
|
||||
|
||||
xcode-select --install
|
||||
```
|
||||
|
||||
1. Navigate or clone GenSMBIOS repository into workspace:
|
||||
|
||||
```bash
|
||||
|
@ -39,7 +46,7 @@ If you need to install XCode, you'll need a unique serial number. Complete steps
|
|||
```
|
||||
|
||||
3. Install/Update MacSerial.
|
||||
4. Select `$osx_kvm_path/OpenCore/Boot-NoUI/config.plist` as the configuration file.
|
||||
4. Select `$osx_kvm_path/OpenCore/headless/config.plist` as the configuration file.
|
||||
5. Generate SMBIOS for `iMacPro1,1`.
|
||||
6. Generate UUID.
|
||||
|
||||
|
@ -52,7 +59,7 @@ git submodule update --init --recursive ./resources/OcBinaryData
|
|||
cd ./OpenCore
|
||||
|
||||
# Generate OpenCore image with NoUI configuration
|
||||
rm -f OpenCore.qcow2; sudo ./opencore-image-ng.sh --cfg ./Boot-NoUI/config.plist --img OpenCore.qcow2
|
||||
rm -f OpenCore.qcow2; sudo ./opencore-image-ng.sh --cfg ./headless/config.plist --img OpenCore.qcow2
|
||||
```
|
||||
|
||||
### Step 6: Start OpenCore VM with NoUI Configuration
|
||||
|
@ -63,9 +70,9 @@ cd $osx_kvm_path
|
|||
# cd ..
|
||||
|
||||
# Make the shell script executable
|
||||
chmod +x ./OpenCore-Boot-NoUI.sh
|
||||
chmod +x ./headless_boot.sh
|
||||
|
||||
./OpenCore-Boot-NoUI.sh
|
||||
./headless_boot.sh
|
||||
```
|
||||
|
||||
### Step 7: Connect to macOS VM with SSH
|
||||
|
@ -106,3 +113,27 @@ I personally use Nix flakes to manage the environment, so I can install all the
|
|||
Additionally, I use GitHub to store my credentials, which allows me to just copy the `.gitconfig` and `.git-credentials` to the user home directory on the VM.
|
||||
|
||||
To debug iOS apps, it's easiest to use XCode Wi-Fi debugging, so you don't need to connect the phone to the VM.
|
||||
|
||||
### Install as a Service
|
||||
|
||||
To install the VM as a service, you can run the `headless_service_install.sh` script. This script will install the VM as a service that starts on boot.
|
||||
|
||||
```bash
|
||||
chmod +x ./headless_service_install.sh
|
||||
|
||||
./headless_service_install.sh
|
||||
```
|
||||
|
||||
#### Uninstall Service
|
||||
|
||||
Run the commands below to uninstall the service:
|
||||
|
||||
```bash
|
||||
sudo systemctl stop headless_opencore.service
|
||||
|
||||
sudo systemctl disable headless_opencore.service
|
||||
|
||||
sudo rm /etc/systemd/system/headless_opencore.service
|
||||
|
||||
sudo systemctl daemon-reload
|
||||
```
|
|
@ -0,0 +1,16 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Fetch script directory
|
||||
REPO_PATH=$(dirname "$(readlink -f "$0")")
|
||||
|
||||
# Replace %repo_path% in the service file with the actual path
|
||||
sed -i "s|%repo_path%|$REPO_PATH|g" "$REPO_PATH/headless_opencore.service"
|
||||
|
||||
# Copy the modified service file to /etc/systemd/system/
|
||||
sudo cp "$REPO_PATH/headless_opencore.service" /etc/systemd/system/
|
||||
|
||||
# Reload systemd daemon to apply the new service file
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# Enable the service to start on boot
|
||||
sudo systemctl enable headless_opencore.service
|
Loading…
Reference in New Issue