Hi,
hab es noch vor Ostern hinbekommen, dann eine Antwort aber etwas aus den Augen verloren.
Für alle, die es interessiert hier meine Ergebnisse:
Tatsächlich musste ich die unattended.xml nicht anpassen, sondern nur in der setup.py und in der opsisetuplib.py ein paar Bugs ausbügeln und wenige Funktionen hinzufügen. Leider war auch die Version von sfdisk im bootimage zu alt (keine GPT Unterstützung), so dass ich das auch noch neu bauen musste.
Mein Ausgangspunkt war, dass ich nach der Installation von MacOS die Platte via Festplattendienstprogramm in 3 Partitionen umpartitioniert habe. Die erste MacOS Partition verkleinert, und dahinter zwei erstellt, eine für Windows, eine für Linux. Als Dateisystem habe ich dort jeweils erstmal FAT eingestellt (ohne Formatierung geht mit dem Programm nicht).
Danach habe ich, wie vorgeschlagen, ein neues Windows Produkt angelegt und dort die oben genannten Dateien angepasst (Patch siehe Ende). Bei den Properties des Win10 Netboot Produktes habe ich folgende Sachen geändert:
data_partition_preserve = always
data_partition_label = Linux (Name der Linux Partition von der Partitionierung oben)
windows_partition_size = 100GB (Größe der angelegten Windows Partition von oben abzgl. WinPE Size und etwas Bonusplatz. Eigentlich ist das nicht so relevant, da Windows nach der Installation den freien Platz wieder maximal ausnutzt. Muss nur klein genug angegeben werden.)
Habe direkt das Windows 10 Creator Update aufgespielt und musste dann aber noch Region, Tastatur von Hand einstellen (eventuell hat sich da was in der unattend.xml geändert?). Der Rest der Installation lief ohne mein Zutun durch. Fertig
Wenn jemand das selber mal gebrauchen kann, kann ich gerne noch die Schritte zum Erstellen der grub efi Images erklären.
Viele Grüße
Thomas
PS: Noch ein kleiner Tipp: Für die Treiberinstallation unter Windows auf Apple Computer bietet sich die Software brigadier (
https://github.com/timsutton/brigadier) an.
Code: Alles auswählen
diff -upr win10-base/CLIENT_DATA/opsisetuplib.py win10-osx-dualboot/CLIENT_DATA/opsisetuplib.py
--- win10-base/CLIENT_DATA/opsisetuplib.py 2017-02-16 13:46:51.000000000 +0100
+++ win10-osx-dualboot/CLIENT_DATA/opsisetuplib.py 2017-04-13 12:50:53.127034000 +0200
@@ -182,24 +182,24 @@ def createPartitionEx(partitionName = "u
if useGpt:
if gptAutoAppend:
if partitionSizeM == -1:
- gptSgdiskParam = "--new %d::" % (partitionNumber)
+ gptSgdiskParam = "-n %d::" % (partitionNumber)
else:
- gptSgdiskParam = "--new %d::+%dM" % (partitionNumber, partitionSizeM)
+ gptSgdiskParam = "-n %d::+%dM" % (partitionNumber, partitionSizeM)
else:
if partitionSizeM == -1:
- gptSgdiskParam = "--new %d:%dM:" % (partitionNumber, startM)
+ gptSgdiskParam = "-n %d:%dM:" % (partitionNumber, startM)
else:
- gptSgdiskParam = "--new %d:%dM:%dM" % (partitionNumber, startM, partitionSizeM)
+ gptSgdiskParam = "-n %d:%dM:%dM" % (partitionNumber, startM, partitionSizeM)
if partitionLabel != "unknown":
gptSgdiskParam = gptSgdiskParam + ' -c %d:\"%s\"' % (partitionNumber, partitionLabel)
if gptAttribute:
- gptSgdiskParam = gptSgdiskParam + ' --attributes %d:set:%s' % (partitionNumber, gptAttribute)
+ gptSgdiskParam = gptSgdiskParam + ' -A %d:set:%s' % (partitionNumber, gptAttribute)
if gptFileSystem != "0000":
gptSgdiskParam = gptSgdiskParam + ' -t %d:%s' % (partitionNumber, gptFileSystem)
execute('/usr/sbin/sgdisk %s -p %s' % (gptSgdiskParam, diskDevice))
execute('/bin/sleep 2')
execute('/usr/sbin/sgdisk -p %s' % (diskDevice))
- # --attributes %d:set:63 --> 63 means: 'no auto mount' and at windows: 'no drive letter'
+ # -A %d:set:63 --> 63 means: 'no auto mount' and at windows: 'no drive letter'
else:
if partitionSizeM == -1:
endstr = "100%"
@@ -402,7 +402,7 @@ def getGptPartitionSizesInMegabytes(devi
"""
if givenOutput is None:
givenOutput = execute(
- '{cmd} -i {device}'.format(
+ '{cmd} -p {device}'.format(
cmd=which('sgdisk'),
device=device,
)
@@ -429,6 +429,7 @@ def getGptPartitionSizesInMegabytes(devi
partitionEnd = int(match.group(3))
sectorsUsedByPartition = partitionEnd - partitionStart
sizes[int(match.group(1))] = sectorsUsedByPartition * sectorSize / (1024**2)
+ logger.notice(u"Partition number %d, size = %d" % (int(match.group(1)), sizes[int(match.group(1))]))
return sizes
diff -upr win10-base/CLIENT_DATA/setup.py win10-osx-dualboot/CLIENT_DATA/setup.py
--- win10-base/CLIENT_DATA/setup.py 2017-02-16 13:46:51.000000000 +0100
+++ win10-osx-dualboot/CLIENT_DATA/setup.py 2017-04-13 12:56:54.344368000 +0200
@@ -161,12 +161,12 @@ if not bootPartitionSize.startswith("0")
dataPartitionNumber += 1
if inUefi:
- systemPartitionNumber += 2
- winpePartitionNumber += 2
+ systemPartitionNumber += 3
+ winpePartitionNumber += 3
if (bootPartitionNumber > 0):
- bootPartitionNumber += 2
+ bootPartitionNumber += 3
if (dataPartitionNumber > 0):
- dataPartitionNumber += 2
+ dataPartitionNumber += 3
logger.notice("Partition numbers are now: , boot=%d, system=%d, winpe=%d, data=%s" % (bootPartitionNumber, systemPartitionNumber, winpePartitionNumber, dataPartitionNumber))
@@ -430,7 +430,7 @@ else:
logger.notice(u"No winpe partition found (as expected)")
# tolerance 5G
if (((SizeP + SizePe + freespaceM) - (systemPartitionSizeM)) < 0):
- logger.notice(u"Existing free space, windows (and PE) partition size %d does not match the required size %dM" % ((SizeP+SizePe+freespaceM), systemPartitionSizeM))
+ logger.notice(u"Existing free space, windows (and PE) partition size %dM does not match the required size %dM" % ((SizeP+SizePe+freespaceM), systemPartitionSizeM))
will_create_new_partition_table = True
else:
logger.notice(u"Existing free space windows (and PE) partition size %d match the required size %dM" % ((SizeP+SizePe+freespaceM), systemPartitionSizeM))
@@ -528,11 +528,11 @@ for diskcounter in range(maxDiskRange):
if useGpt:
if not bootPartitionSize.startswith("0"):
logger.notice(u"Delete Partitions ...")
- execute('/usr/sbin/sgdisk -g --delete=partnum %d -p %s' % (bootPartitionNumber, disk.device))
- execute('/usr/sbin/sgdisk -g --delete=partnum %d -p %s' % (systemPartitionNumber, disk.device))
+ execute('/usr/sbin/sgdisk -g --delete=%d -p %s' % (bootPartitionNumber, disk.device))
+ execute('/usr/sbin/sgdisk -g --delete=%d -p %s' % (systemPartitionNumber, disk.device))
else:
logger.notice(u"Delete Partitions ...")
- execute('/usr/sbin/sgdisk -g --delete=partnum %d -p %s' % (systemPartitionNumber, disk.device))
+ execute('/usr/sbin/sgdisk -g --delete=%d -p %s' % (systemPartitionNumber, disk.device))
else:
if not bootPartitionSize.startswith("0"):
# boot
@@ -610,7 +610,11 @@ for diskcounter in range(maxDiskRange):
if (partitionLabel == dataPartitionLabel):
create_new_datapartition = False
if useGpt:
- raise Exception(u"Moving data partition is not implemented for GPT. Could not create winpe partition on %s - stopping here" % (disk.device))
+ logger.notice(u"%s exists as expected for data partition - ok - moving partition %s one up and inserting new partition %s" % (getPartitionDevicePath(disk.device, winpePartitionNumber), winpePartitionNumber, winpePartitionNumber) )
+ cmd = u'%s -r:%d:%d -p %s' % (which('sgdisk'), winpePartitionNumber, winpePartitionNumber+1, disk.device)
+ execute(cmd)
+ createPartitionEx("winpe", winpePartitionNumber, winpePartitionLabel, peStartM, winpePartitionSizeM, gptAutoAppend = True, boot = True, gptAttribute = "" , useGpt = useGpt, diskDevice = disk.device, fileSystem = "fat32", gptFileSystem="0b00")
+ partitions = disk.getPartitions()
else:
logger.notice(u"%s exists as expected for data partition - ok - moving partition %s one up and inserting new partition %s" % (getPartitionDevicePath(disk.device, winpePartitionNumber), winpePartitionNumber, winpePartitionNumber) )
partitions = disk.getPartitions()