Blame
|
1 | # VM 201 – macOS Sequoia (Hackintosh) |
||||||
| 2 | ||||||||
| 3 | Stand: April 2026 |
|||||||
| 4 | ||||||||
| 5 | > [!NOTE] |
|||||||
| 6 | > macOS Sequoia als KVM-VM auf Proxmox. Läuft über OpenCore-Bootloader mit SMBIOS-Spoofing – kein nativer Apple-Support, aber vollständig funktionsfähig inkl. iCloud. |
|||||||
| 7 | ||||||||
| 8 | ## Basisdaten |
|||||||
| 9 | ||||||||
| 10 | | Parameter | Wert | |
|||||||
| 11 | |---|---| |
|||||||
| 12 | | **VM-ID** | `201` | |
|||||||
| 13 | | **Name** | `macos-sequoia` | |
|||||||
| 14 | | **OS** | macOS Sequoia 15.6.1 (24G90) | |
|||||||
| 15 | | **CPU** | `host` passthrough, 4 Cores | |
|||||||
| 16 | | **RAM** | 8.192 MB | |
|||||||
| 17 | | **Firmware** | OVMF (UEFI), kein Secure Boot | |
|||||||
| 18 | | **Machine** | q35 | |
|||||||
| 19 | | **Display** | VMware SVGA | |
|||||||
| 20 | | **Netzwerk** | vmxnet3, DHCP | |
|||||||
| 21 | ||||||||
| 22 | ## Disk-Übersicht |
|||||||
| 23 | ||||||||
| 24 | | Slot | LVM-Volume | Inhalt | Größe | |
|||||||
| 25 | |---|---|---|---| |
|||||||
| 26 | | `efidisk0` | `vm-201-disk-0` | OVMF UEFI NVRAM | 4 MB | |
|||||||
| 27 | | `sata0` | `vm-201-disk-1` | macOS BaseSystem (Recovery-Image) | 1,3 GB | |
|||||||
| 28 | | `sata2` | `vm-201-disk-3` | Macintosh HD (macOS-Installation) | 100 GB | |
|||||||
| 29 | | `sata3` | `vm-201-disk-2` | OpenCore v21 Bootloader (GPT-Disk) | 152 MB | |
|||||||
| 30 | ||||||||
| 31 | **Boot-Reihenfolge:** `sata3` (OpenCore) → `sata0` (BaseSystem) → `sata2` (Macintosh HD) |
|||||||
| 32 | ||||||||
| 33 | ## Bootloader – OpenCore |
|||||||
| 34 | ||||||||
| 35 | - **Projekt:** [KVM-Opencore v21](https://github.com/thenickdude/KVM-Opencore) (REL-100, März 2024) |
|||||||
| 36 | - **SMBIOS:** `iMacPro1,1` |
|||||||
| 37 | - **SecureBootModel:** `j137` (T1-Chip-Simulation – für iCloud zwingend erforderlich) |
|||||||
| 38 | - **ScanPolicy:** `0x0` (alle Disk-Typen) |
|||||||
| 39 | ||||||||
| 40 | > [!WARNING] |
|||||||
| 41 | > Das OpenCore-„ISO" ist kein echtes ISO 9660, sondern ein **raw GPT-Disk-Image**. Es muss als **SATA-Disk** (nicht als CD-ROM) eingebunden werden – sonst findet OVMF keinen Bootloader. |
|||||||
| 42 | ||||||||
| 43 | ## SMBIOS-Seriennummern (iCloud-fähig) |
|||||||
| 44 | ||||||||
| 45 | | Feld | Wert | |
|||||||
| 46 | |---|---| |
|||||||
| 47 | | SystemSerialNumber | `C02YJRZXHX87` | |
|||||||
| 48 | | MLB | `C02914310QXJG361M` | |
|||||||
| 49 | | SystemUUID | `6B7D3ACC-FA73-4437-94ED-3CEF31EF773C` | |
|||||||
| 50 | | ROM | `BC2411E13CD2` (= VM-MAC ohne Doppelpunkte) | |
|||||||
| 51 | ||||||||
| 52 | ## OpenCore config.plist bearbeiten |
|||||||
| 53 | ||||||||
| 54 | > [!IMPORTANT] |
|||||||
| 55 | > Nur bei **gestoppter VM** durchführen. |
|||||||
| 56 | ||||||||
| 57 | ```bash |
|||||||
| 58 | qm stop 201 |
|||||||
| 59 | mkdir -p /mnt/oc_efi |
|||||||
| 60 | losetup -f --show -o $((40*512)) /dev/pve/vm-201-disk-2 # gibt /dev/loopX aus |
|||||||
| 61 | mount /dev/loopX /mnt/oc_efi |
|||||||
| 62 | nano /mnt/oc_efi/EFI/OC/config.plist |
|||||||
| 63 | umount /mnt/oc_efi && losetup -d /dev/loopX |
|||||||
| 64 | qm start 201 |
|||||||
| 65 | ``` |
|||||||
| 66 | ||||||||
| 67 | ## iCloud & Apple-Dienste |
|||||||
| 68 | ||||||||
| 69 | | Dienst | Status | |
|||||||
| 70 | |---|---| |
|||||||
| 71 | | iCloud Drive, Fotos, Keychain | ✅ funktioniert | |
|||||||
| 72 | | App Store | ✅ funktioniert | |
|||||||
| 73 | | iMessage / FaceTime | ⚠️ manchmal blockiert – 24h warten, dann nochmal | |
|||||||
| 74 | | Handoff, AirDrop, Sidecar | ❌ kein Bluetooth/WLAN in VM | |
|||||||
| 75 | | GPU-Beschleunigung | ❌ kein Passthrough | |
|||||||
| 76 | | Sleep / Standby | ❌ in macOS deaktivieren | |
|||||||
| 77 | ||||||||
| 78 | **Troubleshooting „Prüfung fehlgeschlagen":** |
|||||||
| 79 | 1. SecureBootModel muss `j137` sein (nicht `Disabled`) |
|||||||
| 80 | 2. iPhone/iPad: Einstellungen → Apple-ID → Passwort & Sicherheit → Bestätigungsdialog? |
|||||||
| 81 | 3. Nochmal versuchen oder kurz über anderen IP-Bereich (Hotspot) |
|||||||
| 82 | ||||||||
| 83 | ## Neue SMBIOS-Seriennummern generieren |
|||||||
| 84 | ||||||||
| 85 | ```bash |
|||||||
| 86 | # macserial herunterladen (einmalig) |
|||||||
| 87 | curl -L https://github.com/acidanthera/OpenCorePkg/releases/download/1.0.7/OpenCore-1.0.7-RELEASE.zip -o /tmp/oc.zip |
|||||||
| 88 | unzip /tmp/oc.zip 'Utilities/macserial/macserial.linux' -d /tmp/oc/ |
|||||||
| 89 | chmod +x /tmp/oc/Utilities/macserial/macserial.linux |
|||||||
| 90 | ||||||||
| 91 | # 3 Seriennummern generieren, einen Satz auswählen |
|||||||
| 92 | /tmp/oc/Utilities/macserial/macserial.linux -m iMacPro1,1 -n 3 |
|||||||
| 93 | ||||||||
| 94 | # EFI mounten und patchen |
|||||||
| 95 | qm stop 201 |
|||||||
| 96 | losetup -f --show -o $((40*512)) /dev/pve/vm-201-disk-2 |
|||||||
| 97 | mount /dev/loopX /mnt/oc_efi |
|||||||
| 98 | ||||||||
| 99 | python3 << 'PYEOF' |
|||||||
| 100 | import plistlib, uuid |
|||||||
| 101 | with open('/mnt/oc_efi/EFI/OC/config.plist', 'rb') as f: |
|||||||
| 102 | p = plistlib.load(f) |
|||||||
| 103 | pi = p['PlatformInfo']['Generic'] |
|||||||
| 104 | pi['SystemSerialNumber'] = 'NEUE_SERIAL' # ← anpassen |
|||||||
| 105 | pi['MLB'] = 'NEUE_MLB' # ← anpassen |
|||||||
| 106 | pi['SystemUUID'] = str(uuid.uuid4()).upper() |
|||||||
| 107 | pi['ROM'] = bytes.fromhex('BC2411E13CD2') |
|||||||
| 108 | with open('/mnt/oc_efi/EFI/OC/config.plist', 'wb') as f: |
|||||||
| 109 | plistlib.dump(p, f) |
|||||||
| 110 | print('Fertig:', pi['SystemSerialNumber']) |
|||||||
| 111 | PYEOF |
|||||||
| 112 | ||||||||
| 113 | umount /mnt/oc_efi && losetup -d /dev/loopX |
|||||||
| 114 | qm start 201 |
|||||||
| 115 | ``` |
|||||||
| 116 | ||||||||
| 117 | --- |
|||||||
| 118 | ||||||||
| 119 | ## VM vollständig entfernen (Rollback) |
|||||||
| 120 | ||||||||
| 121 | > [!WARNING] |
|||||||
| 122 | > Diese Schritte löschen die VM und **alle zugehörigen Daten unwiderruflich**. Kein Backup nötig, aber sicher sein. |
|||||||
| 123 | ||||||||
| 124 | ### Schritt 1 – VM stoppen und vollständig löschen |
|||||||
| 125 | ||||||||
| 126 | ```bash |
|||||||
| 127 | qm stop 201 |
|||||||
| 128 | qm destroy 201 --purge |
|||||||
| 129 | ``` |
|||||||
| 130 | ||||||||
| 131 | `--purge` entfernt automatisch alle LVM-Volumes: |
|||||||
| 132 | - `vm-201-disk-0` (EFI NVRAM, 4 MB) |
|||||||
| 133 | - `vm-201-disk-1` (BaseSystem, 1,3 GB) |
|||||||
| 134 | - `vm-201-disk-2` (OpenCore, 152 MB) |
|||||||
| 135 | - `vm-201-disk-3` (Macintosh HD, 100 GB) |
|||||||
| 136 | - `/etc/pve/qemu-server/201.conf` |
|||||||
| 137 | ||||||||
| 138 | ### Schritt 2 – Heruntergeladene Dateien entfernen |
|||||||
| 139 | ||||||||
| 140 | ```bash |
|||||||
| 141 | # OpenCore ISO aus local-Storage |
|||||||
| 142 | rm -f /var/lib/vz/template/iso/OpenCore-v21.iso |
|||||||
| 143 | ||||||||
| 144 | # BaseSystem-Dateien auf HDD (hdd5tb) |
|||||||
| 145 | rm -f /mnt/storage/pve-data/iso/BaseSystem.dmg |
|||||||
| 146 | rm -f /mnt/storage/pve-data/iso/BaseSystem.img |
|||||||
| 147 | rm -f /mnt/storage/pve-data/iso/BaseSystem.chunklist |
|||||||
| 148 | ||||||||
| 149 | # OSX-KVM Projektverzeichnis |
|||||||
| 150 | rm -rf /opt/OSX-KVM |
|||||||
| 151 | ||||||||
| 152 | # macserial / OpenCorePkg (falls vorhanden) |
|||||||
| 153 | rm -rf /tmp/oc/ /tmp/oc.zip /tmp/oc107* /tmp/oc107.zip |
|||||||
| 154 | ``` |
|||||||
| 155 | ||||||||
| 156 | ### Schritt 3 – Optionale Aufräumarbeiten |
|||||||
| 157 | ||||||||
| 158 | ```bash |
|||||||
| 159 | # Mount-Verzeichnisse entfernen |
|||||||
| 160 | rmdir /mnt/oc_efi /mnt/macos_installer 2>/dev/null || true |
|||||||
| 161 | ||||||||
| 162 | # Tools deinstallieren (nur wenn nicht anderweitig genutzt) |
|||||||
| 163 | apt remove -y dmg2img p7zip-full |
|||||||
| 164 | ``` |
|||||||
| 165 | ||||||||
| 166 | ### Verifikation – alles weg? |
|||||||
| 167 | ||||||||
| 168 | ```bash |
|||||||
| 169 | qm list # VM 201 darf nicht erscheinen |
|||||||
| 170 | lvs | grep vm-201 # darf keine Ausgabe liefern |
|||||||
| 171 | ls /var/lib/vz/template/iso/ | grep -i opencore |
|||||||
| 172 | ls /mnt/storage/pve-data/iso/ | grep -iE 'base|opencore' |
|||||||
| 173 | ls /opt/OSX-KVM 2>/dev/null && echo 'NOCH DA' # nichts ausgeben = OK |
|||||||
| 174 | ``` |
|||||||
| 175 | ||||||||
| 176 | --- |
|||||||
| 177 | ||||||||
| 178 | ## Prüfung / Status |
|||||||
| 179 | ||||||||
| 180 | ```bash |
|||||||
| 181 | qm status 201 |
|||||||
| 182 | qm config 201 |
|||||||
| 183 | ``` |
|||||||
| 184 | ||||||||
| 185 | ## Verwandte Seiten |
|||||||
| 186 | ||||||||
| 187 | - [[container-und-vms]] |
|||||||
| 188 | - [[vm-200-windows11pro]] |
|||||||
| 189 | - [[infrastruktur-uebersicht]] |
|||||||
