[gelöst] C:-Partition auf x GByte vergrößern
[gelöst] C:-Partition auf x GByte vergrößern
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
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
Zuletzt geändert von holgerv am 23 Sep 2015, 12:17, insgesamt 1-mal geändert.
Re: C:-Partition auf x GByte vergrößern
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

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
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:Ganz klar ist es mir zumindest nicht![]()
Ich habe immer die ganze Platte in Verwendung, aber das willst Du nicht.
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:- Die C-Partition soll einen Mindestwert erhalten? So wie die Frage gestellt ist, bei bestehenden Systemen?
Ja, unpartitionierter Bereich.rat hat geschrieben:- Was ist hinter der C-Partition? Eine "D-Datenpartition"? Nix, also unpartitionierter Bereich?
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".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
Schönen Gruß
Holger
Re: C:-Partition auf x GByte vergrößern
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.


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

Re: C:-Partition auf x GByte vergrößern
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:
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!
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$
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
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.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.
Oder denke ich grade zu einfach

Re: C:-Partition auf x GByte vergrößern
Hab ich auch erst gedacht, bleiben nur die genannten Bedenken bzgl. der sinnhaftig-/nutzbarkeit.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.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.
Oder denke ich grade zu einfach
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
nicht getestet, ohne gewähr

Re: C:-Partition auf x GByte vergrößern
Hallo tobias,
hallo larsg,
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
hallo larsg,
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.larsg hat geschrieben:extend-to-200gb: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.sollte so in etwa funktionieren.Code: Alles auswählen
[...]
nicht getestet, ohne gewähr
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
why not, wenn's funktioniertholgerv hat geschrieben:auch wenn der Kollege Teile der Logik nicht in opsi-Winst umgesetzt hat, sondern in PowerShell.

ließ dir mal in ruhe die winst-doku durch, jedes mal wenn ich das mache explodiert mein kopf vor neuen Ideen D:holgerv hat geschrieben:Aber vor allem die "trim(getValueBySeparator"-Zeile im Code merke ich mir, sowas hat mir schon mehr als einmal gefehlt![]()
hab mein Skript mal ins wiki hochgeladen, für den Fall das wer sonst das brauchen könnte.