Ein Stick, mehrere macOS-Versionen, frei mischbar aus Apple-Server- und Bibliotheks-Quelle. Partitioniert den Stick per diskutil partitionDisk in eine eigene HFS+-Partition je Version (eindeutige Labels), schreibt danach pro Partition gezielt per createinstallmedia --volume bzw. asr restore --target -- analog zur bereits vorhandenen Multiboot-Technik im Docker/Linux-Tool. Inkl. Groessen-Check mit Sicherheitspuffer vor jeder Aenderung am Stick, robustem Fehlerpfad je Partition (Weiter/Abbruch statt Stillschweigen) und End-to-End-Test der kompletten Ablauflogik unter Linux mit gestubbten macOS-Bordmitteln (Einzel-Modus + Multiboot, reine Apple-Quelle + gemischte Apple/Bibliotheks-Quelle).
151 lines
7.6 KiB
Markdown
151 lines
7.6 KiB
Markdown
# Nativer macOS-Weg (createinstallmedia / asr)
|
|
|
|
Alternative zum Docker/Linux-Tool im Projekt-Root — **nur nutzbar, wenn
|
|
gerade ein echter Mac zur Verfuegung steht**. Zwei Modi (Einzel-Stick /
|
|
Multiboot-Stick) und zwei Quellen fuer den Installer-Payload stehen zur
|
|
Auswahl, direkt im Script:
|
|
|
|
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**.
|
|
|
|
## Warum ein eigenes Script, warum nicht einfach dd wie das Docker-Tool?
|
|
|
|
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.
|
|
|
|
## 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
|
|
|
|
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
|
|
|
|
```bash
|
|
cd native-macos
|
|
chmod +x create-stick.sh # falls das Ausfuehr-Bit beim Kopieren verloren ging
|
|
./create-stick.sh
|
|
```
|
|
|
|
Fragt zuerst den **Modus** ab (Einzel-Stick oder Multiboot-Stick), dann
|
|
fuehrt es durch die passenden Schritte (reines Terminal-Menue, keine
|
|
externen Abhaengigkeiten — nur `softwareupdate`, `diskutil`,
|
|
`PlistBuddy`, `installer`, `asr`, `createinstallmedia`, alles Bordmittel).
|
|
|
|
### Modus 1: Einzelner Stick (4 Schritte)
|
|
|
|
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. **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.
|
|
|
|
### Modus 2: Multiboot-Stick (5 Schritte)
|
|
|
|
Ein Stick, **mehrere** macOS-Versionen gleichzeitig — frei mischbar aus
|
|
Apple-Server und lokaler Bibliothek (z.B. eine Version per Download, zwei
|
|
weitere aus der Offline-Bibliothek, in einem Lauf).
|
|
|
|
1. **Versionen auswaehlen** — kombinierte Liste aus Apple-Server +
|
|
Bibliothek, Mehrfachauswahl per Komma (`1,3,4`), 2 bis 8 Versionen.
|
|
2. **Payloads besorgen** — pro gewaehlter Version wie in Modus 1, Schritt
|
|
2 (Download/Entpacken/direktes Image), nacheinander.
|
|
3. **USB-Stick auswaehlen** — wie Modus 1, plus **Groessen-Check**: die
|
|
Summe aus geschaetztem Platzbedarf je Version (inkl. Sicherheitspuffer:
|
|
+33% bei `createinstallmedia`-Versionen, +5% bei reinen Image-Restores,
|
|
jeweils mit Mindestgroesse) wird gegen die Stick-Kapazitaet geprueft.
|
|
Reicht der Platz nicht, bricht das Script **vor** jeder Aenderung am
|
|
Stick mit klarer Meldung ab.
|
|
4. **Partitionieren** — `diskutil partitionDisk` legt fuer jede gewaehlte
|
|
Version eine eigene HFS+-Partition mit eindeutigem Label an (GPT-Schema
|
|
mit automatischer EFI-Partition). Die letzte Partition bekommt den
|
|
restlichen Platz (`R`), um Rundungsverluste zu vermeiden.
|
|
5. **Partitionen beschreiben** — pro Partition laeuft `createinstallmedia
|
|
--volume ...` bzw. `asr restore --target ...` genau wie im Einzel-Modus,
|
|
nur gezielt gegen die jeweils eigene Partition statt gegen die ganze
|
|
Platte. Beide Tools reformatieren dabei ausschliesslich ihr eigenes
|
|
Zielvolume — die anderen Partitionen bleiben unberuehrt. Schlaegt eine
|
|
Version fehl, fragt das Script ob mit den restlichen weitergemacht
|
|
werden soll, statt den ganzen Lauf stillschweigend abzubrechen.
|
|
|
|
Am Ziel-Mac zeigt der Boot-Picker (Option/Alt beim Start) danach jede
|
|
erfolgreich geschriebene Version als eigenen Eintrag — das ist dieselbe,
|
|
in der Community etablierte Partitionierungstechnik, die auch das
|
|
Docker/Linux-Tool dieses Projekts fuer seinen `dd`-basierten Multiboot-Weg
|
|
nutzt.
|
|
|
|
## 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. Diese Einschraenkung gilt nur
|
|
fuer die Apple-Download-Quelle (`softwareupdate --fetch-full-installer`);
|
|
`installer`/`asr` funktionieren grundsaetzlich auch auf aelteren Hosts.
|
|
- Multiboot-Groessenschaetzung ist ein **Puffer, keine Garantie** — bei
|
|
sehr knapp bemessenen Sticks im Zweifel weniger Versionen waehlen oder
|
|
einen groesseren Stick nehmen.
|
|
- **Ungetestet auf echtem Mac.** Die komplette Ablauflogik (Modus- und
|
|
Quellenwahl, Mehrfachauswahl-Parsing, Groessen-/Puffer-Berechnung,
|
|
Label-Vergabe, Partitionierung, sequentielles Schreiben inkl.
|
|
Fehlerpfade) wurde unter Linux mit gestubbten `softwareupdate` /
|
|
`diskutil` / `PlistBuddy` / `installer` / `asr` /
|
|
`createinstallmedia`-Bordmitteln end-to-end durchgespielt — Einzel-Modus
|
|
(Apple- und Bibliotheks-Quelle), Multiboot mit reinen Apple-Downloads
|
|
und Multiboot mit gemischten Apple+Bibliotheks-Quellen liefen dabei
|
|
jeweils fehlerfrei bis zum Abschluss durch, inklusive Sicherheitsabbruch
|
|
bei falscher Bestaetigung. 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.
|