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:
+80
-44
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user