OPSI Windows Installation auf iMac als zweites Betriebssystem

Antworten
othiman
Beiträge: 126
Registriert: 09 Sep 2009, 14:15
Wohnort: Aachen, Germany

OPSI Windows Installation auf iMac als zweites Betriebssystem

Beitrag von othiman »

Hallo zusammen,

wir wollen eventuell eine größere Menge an Apple iMacs kaufen und ich evaluiere gerade, wie sich eine Triple-OS Installation auf dem iMac realisieren lässt. Da wir schon lange für OPSI für unsere Windows Rechner nutzen, würde ich gerne auf den iMacs das Windows via OPSI installieren. Der Netboot klappt mittlerweile mit nem per DHCP gepushtem Grub Efi Image und gepatchtem aftpd (siehe: https://github.com/opsi-org/opsi-atftpd/pull/1). Jetzt bin allerdings an einer Stelle angelangt an der ich etwas Hilfe gebrauchen könnte.

Mein aktuelles Problem ist, dass ich die vorhandene MacOS Partition nicht anfassen möchte. Die Partitionen sind bereits unter MacOS auf die gewünschten Größen gebracht und nun würde ich gerne das Windows Setup via OPSI starten. Im Zweifel würde ich die Partitionierung erstmal per Hand im Windows Setup machen, würde aber doch gerne den Rest automatisiert durchlaufen lassen. Leider scheitere ich im Moment schon im opsiboot Linux Image mit der Meldung

Code: Alles auswählen

Could not use the existing partition table on /dev/sda - but not allowed to delete it - stopping here
Wir hatten ein ähnliches Problem schon mal mit unseren Dualboot Clients bei denen wir es aber durch eine komplette Neuinstallation, zuerst Windows, dann Linux umgangen haben. Hat jemand eine Idee für einen Ansatzpunkt?

Viele Grüße
Thomas
Benutzeravatar
m.radtke
uib-Team
Beiträge: 1517
Registriert: 10 Jun 2015, 12:19

Re: OPSI Windows Installation auf iMac als zweites Betriebssystem

Beitrag von m.radtke »

Hi

danke für deinen Patch am opsi-atftpd
Wir werden wohl mit dem nächsten Release auf einen gepatchten tftp-hpa gehen, der unterstützt auch große Dateien ;)

Zu Deinem Problem:

Du müsstest aus der setup.py den Teil herausholen, der für die Partitioniereung vorhanden ist.
Die Platten sind ja schon vorpatitioniert. Du brauchst eine WinPE Partition und eine Windows Partition auf der Platte das iMacs.
Dann müsstest du die setup.py so umbiegen das Sie fest auf die WinPE Partition das PE kopiert.
Wie dann die Installation im PE selbst weiter geht, da müsstest du die unattend.xml anpassen, sodass deine OSX Partition nicht überschrieben wird.

Am besten installierst du ein Windows Produkt so

Code: Alles auswählen

opsi-package-manager -i win10-x64_4.0.7.1-6.opsi --new-product-id win10-osx-dualboot
In diesem Produkt kannst Du dann die Anpassungen für Deinen OSX Dualboot machen

Gruß
Mathias
Kein Support per DM!
_________________________
opsi support - http://www.uib.de/
For productive opsi installations we recommend support contracts.
othiman
Beiträge: 126
Registriert: 09 Sep 2009, 14:15
Wohnort: Aachen, Germany

Re: OPSI Windows Installation auf iMac als zweites Betriebssystem

Beitrag von othiman »

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()
Benutzeravatar
m.radtke
uib-Team
Beiträge: 1517
Registriert: 10 Jun 2015, 12:19

Re: OPSI Windows Installation auf iMac als zweites Betriebssystem

Beitrag von m.radtke »

othiman hat geschrieben: Leider war auch die Version von sfdisk im bootimage zu alt (keine GPT Unterstützung), so dass ich das auch noch neu bauen musste.
Habt ihr das Uefi Modul?
Denn ohne Uefi Modul kein EFI im Bootimage und ohne EFI im Bootimage kein GPT.
Bei unseren Installationen unter EFI läuft es mit gpt. Ich glaube aber nicht das es mit sfdisk läuft sondern gparted.
othiman hat geschrieben: 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 :-)
Das kommt mit Win10 (4.0.7.1-7) ;)

Vielen Dank für Deine Rückmeldung :)

Gruß
Mathias
Kein Support per DM!
_________________________
opsi support - http://www.uib.de/
For productive opsi installations we recommend support contracts.
othiman
Beiträge: 126
Registriert: 09 Sep 2009, 14:15
Wohnort: Aachen, Germany

Re: OPSI Windows Installation auf iMac als zweites Betriebssystem

Beitrag von othiman »

Hallo,
m.radtke hat geschrieben:
othiman hat geschrieben: Leider war auch die Version von sfdisk im bootimage zu alt (keine GPT Unterstützung), so dass ich das auch noch neu bauen musste.
Habt ihr das Uefi Modul?
Denn ohne Uefi Modul kein EFI im Bootimage und ohne EFI im Bootimage kein GPT.
Bei unseren Installationen unter EFI läuft es mit gpt. Ich glaube aber nicht das es mit sfdisk läuft sondern gparted.
Das Uefi Modul haben wir leider nicht. Irgendwie war mir dessen Existenz bei meinen Bemühungen auch gar nicht bewusst. Bis jetzt haben wir es auch nicht gebraucht und als Uni-Institut ist die Anschaffung auch immer etwas kompliziert.
Tatsächlich wird für die wichtigen Aktionen sgdisk statt sfdisk benutzt, nur zum Auslesen der eigentlichen Partitionstabelle nicht. Das war der einzige Grund für das sfdisk Update.
Ich vermute mal, dass die setup.py und opsisetup.py auch bei der UEFI Installation diegleichen sind!? Dann sind meine Patches eventuell doch interessant, da gerade im Zusammenspiel mit mehreren Partitionen einige Funktionen noch fehlten (z.B. Partitonsnummer ändern).

Viele Grüße
Thomas Schlien
Antworten