Seite 1 von 1

[gelöst] C:-Partition auf x GByte vergrößern

Verfasst: 17 Sep 2015, 10:11
von holgerv
Hallo,

eigentlich eher ein Windows- als ein opsi-Problem, aber vielleicht hat eineR von euch das Problem schon einmal gehabt:

Wir wollen ein opsi-Paket bauen, das die C:-Partition von Windows-7-Systemen auf x GByte vergrößert. (Falls die Partition schon jetzt größer ist, soll sie _nicht_ verkleinert werden.) Im Moment tappe ich ein bisschen im Dunkeln, wie ich das tun soll ...

Unser erster Ansatz war "diskpart.exe", aber mit dem diskpart-Befehl "EXTEND SIZE=..." kann ich die Größe nur um x GBytes verändern, nicht auf x GBytes.

Der zweite Ansatz war der Powershell-Befehl "Resize-Partition". Aber der steht (auch bei installierter PowerShell 4) zwar unter Windows Server 2008R2 zur Verfügung, aber nicht unter Windows 7.

Vielleicht hat jemand von euch 'ne gute Idee ...?

Danke und schönen Gruß


Holger

Re: C:-Partition auf x GByte vergrößern

Verfasst: 17 Sep 2015, 10:33
von rat
Ganz klar ist es mir zumindest nicht ;)

Ich habe immer die ganze Platte in Verwendung, aber das willst Du nicht.

Folgende Fragen:
- Die C-Partition soll einen Mindestwert erhalten? So wie die Frage gestellt ist, bei bestehenden Systemen?
- Was ist hinter der C-Partition? Eine "D-Datenpartition"? Nix, also unpartitionierter Bereich?
- Im ersten Fall, also Daten, da müssen diese zuerst weg.
- Wie genau muß man die Größe treffen? Wenn es nicht so ganz genau ist, dann diskpart + 10GB, +20GB etc und nur auf die PC loslassen, die betroffen sind

Re: C:-Partition auf x GByte vergrößern

Verfasst: 17 Sep 2015, 11:30
von holgerv
rat hat geschrieben:Ganz klar ist es mir zumindest nicht ;)
Ich habe immer die ganze Platte in Verwendung, aber das willst Du nicht.
Stimmt. Bei uns ist die C:-Partition (anfangs) immer x GByte groß und soll nur bei Bedarf vergrößert werden. (Dafür gibt's verschiedene Gründe, die mit Backup-Mechanismen, virtuellen Maschinen usw. zu tun haben.)
rat hat geschrieben:- Die C-Partition soll einen Mindestwert erhalten? So wie die Frage gestellt ist, bei bestehenden Systemen?
Ja, bei bestehenden Systemen. Zum Beispiel: Wenn "softwareX" installiert wird, soll C: mindestens 150 GBytes groß sein. Dafür soll "softwareX" eine Abhängigkeit (requiredStatus: installed, requirementType: before) auf das opsi-Paket "expand-c-to-150gb" bekommen.
rat hat geschrieben:- Was ist hinter der C-Partition? Eine "D-Datenpartition"? Nix, also unpartitionierter Bereich?
Ja, unpartitionierter Bereich.
rat hat geschrieben:- Wie genau muß man die Größe treffen? Wenn es nicht so ganz genau ist, dann diskpart + 10GB, +20GB etc und nur auf die PC loslassen, die betroffen sind
Das hilft mir leider nicht. Die Mechanismen, über die wir den opsi-Server steuern, wissen nichts über Partitionsgrößen. Darum brauchen wir für Rechner, die größere C:-Partitionen benötigen, als wir normalerweise haben, Software-Pakete "expand-c-to-100gb", "expand-c-to-150gb", "expand-c-to-200gb".

Schönen Gruß


Holger

Re: C:-Partition auf x GByte vergrößern

Verfasst: 17 Sep 2015, 13:33
von rat
Die Gründe sind ja egal ;) es ist einfach so ;)

Also die Platten sind anfangs gleich groß und softwareabhängig sollen sie größer werden.

Ein Software X +20GB, Software Y +40GB und Software Z +25GB, also eine softwareabhängige Vergrößerung, ginge sowas?

Sonst (ich bin ein blutiger Anfänger bei den scripten ;) ) da gibt es doch die Abfrage nach dem freien Speicherplatz. Vielleicht da eine Schleife einbauen, freier Speicherplatz 20GB -> nein? +15GB -> noch immer nicht? -> nochmals +15 und so weiter.

Re: C:-Partition auf x GByte vergrößern

Verfasst: 17 Sep 2015, 17:43
von larsg
Warum eine feste Größe vorgeben? Und wie soll das überhaupt funktionieren?

Beispiel: deine Platte ist 500GB groß.
Deine C-Partition ist 50GB groß.

Du installierst eine Software mit Abhängigkeit zu extend-c-to-100gb.
Partition wird auf 100GB erweitert, soweit gut.
Du installierst mehr und mehr Software mit Abhängigkeit zu extend-c-to-100gb.
Partition bleibt bei 100GB, die läuft dann irgendwann voll, obwohl noch 400GB ungenutzt vor sich hingammeln.

OPSI muss doch nicht wissen wie groß die Partition ist, oder wieviel Platz noch auf der Platte verfügbar ist.
Ich würde einfach für jede Software den Wert festlegen, wieviel MB benötigt werden, und die Systempartionen bei jeder Installation dynamisch erweitern. Wenn das nicht klappt, weil nicht mehr genug Platz auf der Platte vorhanden ist, kommst du mit OPSI-Mitteln eh nicht mehr weiter.

Ins Skript der zu installierenden Software nimmst du einfach folgendes auf:

Code: Alles auswählen

[actions]
defVar $MinimumFreeSpace$
set $MinimumFreeSpace$ = "XXX"

if not ( hasMinimumSpace( "%SystemDrive%", $MinimumFreeSpace$ + " MB" ) )
	execwith_resize diskpart /s
endif

if not ( hasMinimumSpace( "%SystemDrive%", $MinimumFreeSpace$ + " MB" ) )
	logError "Resize of system partition failed"
	isFatalError
endif

Code: Alles auswählen

[execwith_resize]
SELECT volume %SystemDrive%
EXTEND size=$MinimumFreeSpace$
Das funktioniert - getestet unter Windows 7 Professional x86.

Vorraussetzung ist, das Software immer auf der Systempartition installiert wird. Andernfalls muss das noch skriptmäßig abgefangen werden.

Wichtig ist, $MinimumFreeSpace$ muss als rein numerischer Wert und in MB zugewiesen werden; 5 GB entspricht also 5120.

Schlägt die Erweiterung fehl, so kann man unter Logdateien/instlog die Rückmeldung von diskpart einsehen (mindestens loglevel 6)

Sollte auf einem PC diskpart nicht existieren oder in nicht kompatibler Version vorliegen, müsste man diese ggf. ins Paket mit aufnehmen und via Skript auf den Rechner kopieren - ich könnte mir vorstellen das man die Datei seperat bei Microsoft runterladen, bzw. aus einem Ressourcekit entnehmen kann.

Viel Glück!

Re: C:-Partition auf x GByte vergrößern

Verfasst: 17 Sep 2015, 18:30
von tobias
Unser erster Ansatz war "diskpart.exe", aber mit dem diskpart-Befehl "EXTEND SIZE=..." kann ich die Größe nur um x GBytes verändern, nicht auf x GBytes.
Dann lese die größe der Partition aus (IST-WERT) , ziehe den IST Wert vom SOLL-Wert ab und vergrößere die Partition um diesen Wert.
Oder denke ich grade zu einfach :mrgreen:

Re: C:-Partition auf x GByte vergrößern

Verfasst: 18 Sep 2015, 09:14
von larsg
tobias hat geschrieben:
Unser erster Ansatz war "diskpart.exe", aber mit dem diskpart-Befehl "EXTEND SIZE=..." kann ich die Größe nur um x GBytes verändern, nicht auf x GBytes.
Dann lese die größe der Partition aus (IST-WERT) , ziehe den IST Wert vom SOLL-Wert ab und vergrößere die Partition um diesen Wert.
Oder denke ich grade zu einfach :mrgreen:
Hab ich auch erst gedacht, bleiben nur die genannten Bedenken bzgl. der sinnhaftig-/nutzbarkeit.

extend-to-200gb:

Code: Alles auswählen

[Actions]
defVar $CurrentSize$
defVar $MissingSize$
defVar $RequiredSize$

set $MissingSize$ = "0"
set $RequiredSize$ = "204800"

set $CurrentSize$ = trim(getValueBySeparator('Volumekapazität        ',':',getOutStreamFromSection('execwith_getsize diskpart /s')))

if (takeString(1,splitString($CurrentSize$," "))="TB")
	set $CurrentSize$ = calculate(takeString(0,splitString($CurrentSize$," "))+"*1024*1024")
else
if (takeString(1,splitString($CurrentSize$," "))="GB")
	set $CurrentSize$ = calculate(takeString(0,splitString($CurrentSize$," "))+"*1024")
else
	set $CurrentSize$ = takeString(0,splitString($CurrentSize$," "))
endif
endif

if ($CurrentSize$ >= $RequiredSize$)
	comment "Volume already large enough, skipping resize"
	isSuccess
else
	comment "Volume not large enough, trying to extend"
	set $MissingSize$ = calculate($RequiredSize$+"-"+$CurrentSize$)
	execwith_resize diskpart /s
	
	set $CurrentSize$ = trim(getValueBySeparator('Volumekapazität        ',':',getOutStreamFromSection('execwith_getsize diskpart /s')))

	if (takeString(1,splitString($CurrentSize$," "))="TB")
		set $CurrentSize$ = calculate(takeString(0,splitString($CurrentSize$," "))+"*1024*1024")
	else
	if (takeString(1,splitString($CurrentSize$," "))="GB")
		set $CurrentSize$ = calculate(takeString(0,splitString($CurrentSize$," "))+"*1024")
	else
		set $CurrentSize$ = takeString(0,splitString($CurrentSize$," "))
	endif
	endif

	if ($CurrentSize$ >= $RequiredSize$)
		comment "Volume resize successful"
		isSuccess	
	else
		logError "Volume resize failed"
		isFatalError 
	endif

endif

[execwith_resize]
select volume %SystemDrive%
extend size=$MissingSize$

[execwith_getsize]
select volume %SystemDrive%
detail volume
sollte so in etwa funktionieren.
nicht getestet, ohne gewähr :mrgreen:

Re: C:-Partition auf x GByte vergrößern

Verfasst: 23 Sep 2015, 12:16
von holgerv
Hallo tobias,
hallo larsg,
larsg hat geschrieben:
tobias hat geschrieben:Dann lese die größe der Partition aus (IST-WERT) , ziehe den IST Wert vom SOLL-Wert ab und vergrößere die Partition um diesen Wert.
extend-to-200gb:

Code: Alles auswählen

[...]
sollte so in etwa funktionieren.
nicht getestet, ohne gewähr :mrgreen:
Danke für die Hilfen. Im Grunde machen wir das jetzt so, auch wenn der Kollege Teile der Logik nicht in opsi-Winst umgesetzt hat, sondern in PowerShell.
Aber vor allem die "trim(getValueBySeparator"-Zeile im Code merke ich mir, sowas hat mir schon mehr als einmal gefehlt :-)

Danke und
schöne Grüße


Holger

Re: C:-Partition auf x GByte vergrößern

Verfasst: 23 Sep 2015, 13:30
von larsg
holgerv hat geschrieben:auch wenn der Kollege Teile der Logik nicht in opsi-Winst umgesetzt hat, sondern in PowerShell.
why not, wenn's funktioniert ;)
holgerv hat geschrieben:Aber vor allem die "trim(getValueBySeparator"-Zeile im Code merke ich mir, sowas hat mir schon mehr als einmal gefehlt :-)
ließ dir mal in ruhe die winst-doku durch, jedes mal wenn ich das mache explodiert mein kopf vor neuen Ideen D:
hab mein Skript mal ins wiki hochgeladen, für den Fall das wer sonst das brauchen könnte.