native-macos: Downloads-Bibliothek des Docker-Tools als zweite Quelle nutzbar machen

- Neuer Auswahlschritt: Apple-Server (Download) vs. lokale downloads/library
  (Docker-Tool) -- letzteres komplett offline nutzbar.
- InstallAssistant.pkg (Big Sur+) wird per installer -pkg -target / zur
  vollstaendigen Install-App entpackt, danach normaler
  createinstallmedia-Weg.
- BaseSystem.dmg/InstallESD.dmg (bis Catalina) ist bereits ein fertiges
  bootfaehiges Volume -- kein createinstallmedia noetig, stattdessen
  diskutil eraseDisk + asr restore --erase (etablierte Community-Technik).
- Flat-JSON-Parser (sed) fuer meta.json ohne jq/python3-Abhaengigkeit.
- Auswahl-/Verzweigungslogik unter Linux mit simulierter Bibliothek
  end-to-end durchgetestet (beide Modi laufen korrekt bis zum jeweils
  ersten macOS-only-Befehl).
This commit is contained in:
ARIA
2026-07-18 12:04:03 +02:00
parent e4dd003bd6
commit 0d0c137de3
2 changed files with 415 additions and 161 deletions
+80 -44
View File
@@ -1,34 +1,57 @@
# Nativer macOS-Weg (createinstallmedia)
# Nativer macOS-Weg (createinstallmedia / asr)
Alternative zum Docker/Linux-Tool im Projekt-Root — **nur nutzbar, wenn
gerade ein echter Mac zur Verfuegung steht** (macOS 10.15 Catalina oder
neuer). Dafuer bekommst du hierueber den offiziell von Apple sauber
funktionierenden Weg: die echte `createinstallmedia`, statt des
Recovery-Extraktions-Workarounds fuer den Big-Sur+-Pfad im Docker-Tool.
Alternative zum Docker/Linux-Tool im Projekt-Root **nur nutzbar, wenn
gerade ein echter Mac zur Verfuegung steht**. Zwei Quellen fuer den
Installer-Payload stehen zur Auswahl, direkt im Script:
## Warum ein eigenes Script, warum nicht die `downloads/`-Bibliothek wiederverwenden?
1. **Von Apple herunterladen** (macOS 10.15 Catalina oder neuer als Host
noetig) — der offiziell von Apple unterstuetzte Weg ueber
`softwareupdate --fetch-full-installer`.
2. **Aus der lokalen Downloads-Bibliothek des Docker-Tools** — wenn das
ganze Projekt inkl. `downloads/`-Ordner z.B. auf eine externe Platte
kopiert wurde, braucht dieser Weg **kein Internet und keinen erneuten
Download**.
Kurz: **andere Bildformate, nicht kompatibel.**
## Warum ein eigenes Script, warum nicht einfach dd wie das Docker-Tool?
- Das Docker-Tool laedt rohe Katalog-Images (`BaseSystem.dmg` bzw.
`InstallAssistant.pkg`) und schreibt sie per `dd` direkt auf den Stick.
Funktioniert ohne Mac, aber `createinstallmedia` kann mit diesen rohen
Dateien nichts anfangen — es braucht die komplette, fertig gepackte
**"Install macOS X.app"**.
- Der offizielle, von Apple unterstuetzte Weg an genau diese App zu kommen
(auch ohne App-Store-Anmeldung) ist der macOS-Bordbefehl
`softwareupdate --fetch-full-installer`. Das gibt es nur unter echtem
macOS ab Catalina.
Kurz: **`createinstallmedia` (der offiziell unterstuetzte macOS-Weg)
braucht die vollstaendige, fertig gepackte "Install macOS X.app"** —
nicht die rohen Katalog-Dateien, die das Docker-Tool per `dd` schreibt.
Deshalb dieser separate, macOS-native Pfad.
Deshalb ist dieses Script komplett unabhaengig vom `./downloads`-Ordner
des Docker-Tools. Es laedt sich seine App-Kopie selbst, direkt von Apple.
## Wie die Bibliotheks-Wiederverwendung funktioniert
Die `downloads/library/`-Bibliothek des Docker-Tools enthaelt pro
macOS-Version genau eine von zwei Rohdateien (siehe `meta.json` im
jeweiligen Unterordner, Feld `mode`):
- **`InstallAssistant.pkg`** (Big Sur und neuer, `mode: "recovery"`):
Apples eigenes `installer -pkg ... -target /` entpackt daraus die
komplette Install-App (inkl. `createinstallmedia`-Binary) nach
`/Applications` — bestaetigt per Apple-Community-Thread, dass ein
`.pkg`-Installer aus dem Software-Update-Katalog 1:1 dasselbe Paket
ist wie der App-Store-Download. Danach laeuft der normale
`createinstallmedia`-Weg wie bei der Apple-Quelle.
- **`BaseSystem.dmg`/`InstallESD.dmg`** (bis Catalina, `mode:
"legacy_dmg"`): das ist bereits ein fertiges, bootfaehiges Volume.
`createinstallmedia` braucht es gar nicht erst — Apples eigenes
Bordmittel `asr restore --source ... --target ... --erase --noprompt`
schreibt es direkt und sauber auf den Stick (etablierte Technik, siehe
Quellen unten). Kein App-Download, kein `createinstallmedia` noetig.
In beiden Faellen: **kein zweiter Download**, die Datei aus der Bibliothek
wird 1:1 weiterverwendet.
## Zukunftssicherheit
`softwareupdate --list-full-installers` fragt Apples eigene Server live ab
— genau wie der Katalog-Check im Docker-Tool, nur eben Apples eigenes
Tool statt eigenem Parser. Neue macOS-Versionen tauchen automatisch in der
Liste auf, ohne dass hier Code angepasst werden muss.
Bei der Apple-Quelle fragt `softwareupdate --list-full-installers`
Apples eigene Server live ab — genau wie der Katalog-Check im Docker-Tool,
nur eben Apples eigenes Tool statt eigenem Parser. Neue macOS-Versionen
tauchen automatisch in der Liste auf.
Bei der Bibliotheks-Quelle haengt die Auswahl logischerweise davon ab, was
das Docker-Tool zuletzt heruntergeladen hat — dafuer aber komplett ohne
Internetzugriff nutzbar.
## Nutzung
@@ -39,32 +62,45 @@ chmod +x create-stick.sh # falls das Ausfuehr-Bit beim Kopieren verloren ging
```
Fuehrt durch vier Schritte (reines Terminal-Menue, keine externen
Abhaengigkeiten — nur `softwareupdate`, `diskutil`, `PlistBuddy`,
`createinstallmedia`, alles Bordmittel):
Abhaengigkeiten nur `softwareupdate`, `diskutil`, `PlistBuddy`,
`installer`, `asr`, `createinstallmedia`, alles Bordmittel):
1. **Versionsliste** von Apple abrufen, Version auswaehlen.
2. **Download** der vollen Installer-App via `softwareupdate
--fetch-full-installer` (wird uebersprungen, wenn die App schon unter
`/Applications` liegt).
3. **USB-Stick auswaehlen** — Liste nur externer, physischer Laufwerke
1. **Quelle + Version waehlen** — Apple-Server oder lokale Bibliothek
(Pfad wird abgefragt, Default rät `../downloads/library` relativ zum
Script — passt, wenn das komplette Projekt kopiert wurde).
2. **Installer-Payload besorgen** — je nach Quelle/Modus: Download via
`softwareupdate`, Entpacken via `installer -pkg`, oder (legacy_dmg
aus der Bibliothek) gar nichts, das Image liegt schon bereit.
3. **USB-Stick auswaehlen** — Liste nur externer, physischer Laufwerke
(`diskutil list -plist external physical`), danach Sicherheitsabfrage:
exakter Geraetepfad muss nochmal eingetippt werden, bevor irgendwas
geloescht wird.
4. **`createinstallmedia --nointeraction`** laeuft mit `sudo`, live-Ausgabe
im Terminal. Am Ende optional die (mehrere GB grosse) Installer-App
wieder loeschen.
4. **Schreiben** — je nach Modus entweder `createinstallmedia
--nointeraction` (Apple-Quelle und Bibliothek/Big-Sur+) oder
`diskutil eraseDisk` + `asr restore --erase` (Bibliothek,
bis Catalina). Beides mit `sudo`, live-Ausgabe im Terminal.
## Grenzen
- Nur macOS 10.15+ (Catalina oder neuer) als **Host**, auf dem das Script
laeuft — das Zielsystem, auf das installiert wird, kann trotzdem
jede von Apple unterstuetzte Version sein.
- Kein Multiboot-Support (anders als das Docker-Tool) —
`createinstallmedia` erstellt immer einen kompletten Single-Version-Stick.
Waere technisch nachruestbar (mehrere Partitionen, mehrere
`createinstallmedia`-Laeufe mit `--volume` auf je eine Partition), aber
aktuell nicht gebaut.
- Downloads landen unter `/Applications` (Apples Standardverhalten von
`softwareupdate`), nicht im Projektordner — dieser Zweig ist bewusst
nicht auf Portabilitaet/externe Platte ausgelegt wie das Docker-Tool,
sondern auf den einfachsten Weg wenn gerade ein Mac da ist.
laeuft das Zielsystem, auf das installiert wird, kann trotzdem
jede von Apple unterstuetzte Version sein. Diese Einschraenkung gilt nur
fuer die Apple-Download-Quelle (`softwareupdate --fetch-full-installer`);
`installer`/`asr` funktionieren grundsaetzlich auch auf aelteren Hosts.
- Kein Multiboot-Support (anders als das Docker-Tool) —
jeder Lauf erstellt immer einen kompletten Single-Version-Stick.
- **Ungetestet auf echtem Mac.** Die Auswahl-/Verzweigungslogik (Quelle,
Modus-Erkennung ueber `meta.json`) wurde unter Linux mit einer
simulierten Bibliothek end-to-end durchgespielt (`bash -n` sauber,
beide Zweige laufen bis zum jeweils ersten macOS-only-Befehl korrekt
durch). Der eigentliche `installer`/`asr`/`createinstallmedia`-Lauf
selbst ist nur gegen offizielle Apple-Doku/Community-Quellen verifiziert,
nicht live auf einem Mac getestet.
## Quellen (fuer den asr-Weg, live nachgeschlagen)
- Apple Developer/Community — `asr restore` ist das Bordmittel fuer
Block-Level-Restores von Disk Images, seit jeher Teil von macOS.
- Cody Krieger — "Creating bootable macOS Sierra installation media on
macOS Catalina": beschreibt exakt den `diskutil eraseDisk` +
`asr restore --erase`-Ablauf fuer aeltere macOS-Installer.