Geek Deployment: Windows PE, příprava disku a aplikace image - bonus VHDX

Ondřej Výšek
13 minuty, 39 sekundy
4

Kdo si hraje, nezlobí Veselý obličej v prvním díle “Geek deploymentu” představím možnosti přípravy pevného disku a aplikaci image.

Příprava disku v dnešní době není zcela jednoznačná, v porovnání s Windows 7. Windows 8, 8.1, 10 podporují možnosti tzv. UEFI bootu, kde je rozložení diskových oddílů rozlišné, ve srovnání s tradičním BIOS boot. Pro konfiguraci diskových oddílů a práci s images je možné využít buď standardní nástroje, kterými jsou DISKPART, DISM nebo je možné pro drtivou většinu akcí využít PowerShell, který je k dispozici i ve Windows Preinstallation Environment (od verze pro Windows 8). Pro většinu akcí popisovaných v tomto článku není potřeba instalace Windows AIK / ADK.

Windows Preinstallation Environment

Prvním krokem, pokud hovoříme o nasazení OS na nový počítač je příprava Windows PE. Windows PE jsou součástí Windows AIK/ADK, je tedy nutné stáhnout a instalovat. Windows PE připravíme spuštěním z “Windows Deployment Command Prompt” příkazu copype.cmd, zvolíme odpovídající bitovou architekturu.

[span class=alert]Pokud budete nasazovat počítače se standardním BIOS boot, doporučuji použít Windows PE x86 - je možné použít i pro nasazení amd64 OS. V případě nasazení UEFI boot, musí bitová architektura Windows PE a cílového OS odpovídat (x86>x86 a amd64>amd64)

copype amd64 c:\winpe

Jakmile jsou soubory zkopírované, je možné připojit Windows PE image a upravovat

Dism /Mount-Image /ImageFile:"C:\WinPE\media\sources\boot.wim" /index:1 /MountDir:"C:\WinPE\mount" 

nyní je možné přidávat jednotlivé balíčky do Windows PE, pro práci s images a deploymentem jsou nutné minimálně tyto balíčky:

Dism /Add-Package /Image:"C:\WinPE\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-NetFx.cab" 
Dism /Add-Package /Image:"C:\WinPE\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-WMI.cab" 
Dism /Add-Package /Image:"C:\WinPE\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-Scripting.cab" 
Dism /Add-Package /Image:"C:\WinPE\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-PowerShell.cab" 
Dism /Add-Package /Image:"C:\WinPE\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-StorageWMI.cab" 
Dism /Add-Package /Image:"C:\WinPE\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\WinPE-DismCmdlets.cab"

I pokud pracujeme s anglickou verzí, je nutné přidat jazykové definice pro angličtinu, neboť by některé PowerSell příkazy končily chybou resp. příkaz není proveden a není zobrazena chyba. Použitím výše uvedených  balíčků jsou přidány pouze “Language Neutral” komponenty a některé příkazy jsou spuštěny a následně zrušeny bez chybové hlášky.

Dism /Add-Package /Image:"C:\WinPE\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\en-us\WinPE-NetFx_en-us.cab" 
Dism /Add-Package /Image:"C:\WinPE\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\en-us\WinPE-WMI_en-us.cab" 
Dism /Add-Package /Image:"C:\WinPE\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\en-us\WinPE-Scripting_en-us.cab" 
Dism /Add-Package /Image:"C:\WinPE\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\en-us\WinPE-PowerShell_en-us.cab" 
Dism /Add-Package /Image:"C:\WinPE\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\en-us\WinPE-StorageWMI_en-us.cab" 
Dism /Add-Package /Image:"C:\WinPE\mount" /PackagePath:"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\WinPE_OCs\en-us\WinPE-DismCmdlets_en-us.cab"

Jakmile máte připravený image Windows PE, je nutné odpojit připojený image a uložit změny do tohoto image:

Dism /Unmount-WIM /MountDir:c:\winpe\mount /Commit

Po odpojení image je možné vytvořit např. ISO soubor pomocí příkazu:

MakeWinPEMedia /ISO C:\WinPE C:\WinPE\WinPE_a64.iso

tímto je příprava Windows PE dokončena, je možné použít pro startování ve virtualizaci, vypálit na CD, rozbalit na USB.

BIOS Boot

Po nastartování Windows PE je možné přistoupit k přípravě disku pro nasazení. Tradiční rozložení disku pro Windows 7 - nejméně 1 partition, v případě využití BitLocker pak 2 partition.

Jednoduché rozložení disku pomocí DISKPART:

select disk 0 
clean 
create partition primary 
format quick fs=ntfs label="Windows" 
active 
assign letter=C 
exit

Tato sada příkazů vybere disk 0, který je celý smazán!! Je možné uložit do .txt souboru a použít jako script pomocí DISKPART /s.

Rozšířená konfigurace partitions, kdy je plánované využití BitLocker, tedy je nutná boot partition:

select disk 0 
clean 
create partition primary size=100 
format quick fs=ntfs label="System" 
active 
assign letter=S 
create partition primary 
format quick fs=ntfs label="Windows" 
assign letter=W 
exit

V tomto případě je vytvořena 100MB partition, následně využívaná jako boot a zbytek disku je využit pro Operační systém.

Identické konfigurace docílíme pomocí PowerShell následovně:

Get-Disk 0 | Clear-Disk -RemoveData -RemoveOEM -Confirm:$False 
Initialize-Disk 0 -PartitionStyle MBR -Confirm:$false 
New-Partition -DiskNumber 0 -Size 100MB -DriveLetter S | Format-Volume -FileSystem NTFS -NewFileSystemLabel System 
New-Partition -DiskNumber 0 -UseMaximum -DriveLetter W | Format-Volume -FileSystem NTFS -NewFileSystemLabel Windows

Jakmile je připravený disk, je možné přejít na aplikaci image.

UEFI Boot

UEFI boot přináší možnosti SecureBoot a rychlejšího startu počítače, podporu GPT partitions, nicméně konfigurace disku je o něco složitější.

Je možné využít minimální konfiguraci za využití Systémové, MSR a partition pro operační systém. Typické rozložení pak vypadá následovně:

Systémová Partition - velikost 100MB, pokud vlastníte disky, typicky SSD, s podporou Advanced Format, tak použít velikost 260MB

MSR partition - bootovací partition, obvykle 128MB (kvůli zarovnání disku)

OS partition - zbytek disku

Plná konfigurace pro UEFI boot pak přidává 2 další partition - WindowsRE a Image pro obnovu systému. V tomto případě pak rozložení vypadá následovně:

Pojďme tedy konfigurovat disky:

[span class=alert]Všechny uváděné příklady jsou DESTRUKTIVNÍ aniž by se dotazovaly na potvrzení!

UEFI minimal - DISKPART

select disk 0 
clean 
convert gpt 
create partition efi size=100 
format quick fs=fat32 label="System" 
assign letter="S" 
create partition msr size=128 
create partition primary 
format quick fs=ntfs label="Windows" 
assign letter="W"

V tomto případě je disk vymazán, konvertován na GPT a vytvořeny 3 diskové oddíly. Pouze dvěma je přiřazeno písmenko.

UEFI minimal - WSIM

Diskové oddíly je také možné konfigurovat v rámci odpovědního souboru .xml. Odpovídající část XML vypadá následovně:

<DiskConfiguration> 
  <Disk wcm:action="add"> 
    <DiskID>0</DiskID> 
    <WillWipeDisk>true</WillWipeDisk> 
    <CreatePartitions> 
      <!-- EFI system partition (ESP) --> 
      <CreatePartition wcm:action="add"> 
        <Order>1</Order> 
        <Type>EFI</Type> 
        <Size>100</Size> 
      </CreatePartition> 
      <!-- Microsoft reserved partition (MSR) --> 
      <CreatePartition wcm:action="add"> 
        <Order>2</Order> 
        <Type>MSR</Type> 
        <Size>128</Size> 
      </CreatePartition> 
      <!-- Windows partition --> 
      <CreatePartition wcm:action="add"> 
        <Order>3</Order> 
        <Type>Primary</Type> 
        <Extend>true</Extend> 
      </CreatePartition> 
    </CreatePartitions> 
</Disk> 
<WillShowUI>OnError</WillShowUI> 
</DiskConfiguration>

I v tomto případě je disk inicializován - pomocí části WillWipeDisk=true

UEFI minimal - PowerShell

Konfigurovat je možné také pomocí PowerShell, zde sada příkazů bude vypadat následovně:

Get-Disk 0 | Clear-Disk -RemoveData -RemoveOEM -Confirm:$False 
Initialize-Disk 0 -PartitionStyle GPT -Confirm:$false 
$sysPart = New-Partition -DiskNumber 0 -GptType '{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}' -Size 100MB -DriveLetter S 
"@ 
select disk 0 
select partition $sysPart.PartitionNumber 
format quick fs=fat32 label=System 
exit 
@" | diskpart 
New-Partition -DiskNumber 0 -GptType '{e3c9e316-0b5c-4db8-817d-f92df00215ae}' -Size 128MB 
New-Partition -DiskNumber 0 -UseMaximum -DriveLetter W | Format-Volume -FileSystem NTFS -NewFileSystemLabel Windows -ShortFileNameSupport $False -Confirm:$false

I v tomto případě je disk smazán a inicializován. Všimněte si části diskpart - PowerShell commandlety nepodporují formátování partitions označených jako systémových. Výsledek všech tří předchozích možností je naprosto identický.

UEFI full - DISKPART

Diskpart je možné využít i pro plnou konfiguraci UEFI boot, zde je možné si všimnout konfigurací atributů, které zajistí skrytí partitions ze správce disků a tím se stanou pro uživatele neviditelné - nastavení atributu 0x8000000000000001.

select disk 0 
clean 
convert gpt 
rem == 1. Windows RE tools partition =============== 
create partition primary size=300 
format quick fs=ntfs label="Windows RE tools" 
assign letter="T" 
set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac" 
gpt attributes=0x8000000000000001 
rem == 2. System partition ========================= 
create partition efi size=100 
rem  NOTE: For Advanced Format 4K drives, change this value to size = 260 
format quick fs=fat32 label="System" 
assign letter="S" 
rem == 3. Microsoft Reserved (MSR) partition ======= 
create partition msr size=128 
rem == 4. Windows partition ======================== 
rem ==    a. Create the Windows partition ========== 
create partition primary 
rem ==    b. Create space for the recovery image === 
shrink minimum=15000 
rem      ** NOTE: Update this size to match the size of the recovery image 
rem ==    c. Prepare the Windows partition ========= 
format quick fs=ntfs label="Windows" 
assign letter="W" 
rem === 5. Recovery image partition ================ 
create partition primary 
format quick fs=ntfs label="Recovery image" 
assign letter="R" 
set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac" 
gpt attributes=0x8000000000000001 
exit

UEFI full - WSIM

Při využití odpovědního souboru .xml bude odpovídající část pro plnou konfiguraci diskových oddílů takto:

<DiskConfiguration> 
  <Disk wcm:action="add"> 
    <DiskID>0</DiskID> 
    <WillWipeDisk>true</WillWipeDisk> 
    <CreatePartitions> 
      <!-- WinRE tools partition --> 
      <CreatePartition wcm:action="add"> 
        <Order>1</Order> 
        <Type>Primary</Type> 
        <Size>300</Size> 
      </CreatePartition> 
      <!-- EFI system partition (ESP) --> 
      <CreatePartition wcm:action="add"> 
        <Order>2</Order> 
        <Type>EFI</Type> 
        <Size>100</Size> 
      </CreatePartition> 
      <!-- Microsoft reserved partition (MSR) --> 
      <CreatePartition wcm:action="add"> 
        <Order>3</Order> 
        <Type>MSR</Type> 
        <Size>128</Size> 
      </CreatePartition> 
      <!-- Windows partition --> 
      <CreatePartition wcm:action="add"> 
        <Order>4</Order> 
        <Type>Primary</Type> 
        <Size>75000</Size> 
      </CreatePartition> 
      <!-- Recovery image partition --> 
      <CreatePartition wcm:action="add"> 
        <Order>5</Order> 
        <Type>Primary</Type> 
        <Size>15000</Size> 
      </CreatePartition> 
    </CreatePartitions> 
  </Disk> 
  <WillShowUI>OnError</WillShowUI> 
</DiskConfiguration>

UEFI full - PowerShell

Sada příkazů pro vytvoření plné konfigurace oddílů pro UEFI

$disk = Get-Disk 0 
$disk | Clear-Disk -RemoveData -RemoveOEM -Confirm:$False | out-null 
$WinPartition = $disk.Size-300MB-260MB-128MB-4GB 
Initialize-Disk 0 -PartitionStyle GPT  -Confirm:$false 
New-Partition -DiskNumber 0 -GptType '{de94bba4-06d1-4d40-a16a-bfd50179d6ac}' -Size 300MB -DriveLetter T | Format-Volume -FileSystem NTFS -NewFileSystemLabel WindowsRE -ShortFileNameSupport $False -Confirm:$false  | Out-Null 
$sysPart = New-Partition -DiskNumber 0 -GptType '{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}' -Size 260MB -DriveLetter S 
$partNumber = $sysPart.PartitionNumber 
"@ 
select disk 0 
select partition $partNumber 
format quick fs=fat32 label=System 
exit 
@" | diskpart 
New-Partition -DiskNumber 0 -GptType '{e3c9e316-0b5c-4db8-817d-f92df00215ae}' -Size 128MB  | Out-Null 
New-Partition -DiskNumber 0 -GptType '{ebd0a0a2-b9e5-4433-87c0-68b6b72699c7}' -Size $WinPartition -DriveLetter C | Format-Volume -FileSystem NTFS -NewFileSystemLabel Windows -ShortFileNameSupport $False -Confirm:$false | Out-Null 
$RecoveryPartition = New-Partition -DiskNumber 0 -GptType '{de94bba4-06d1-4d40-a16a-bfd50179d6ac}' -UseMaximumSize 
$RecoveryPartition | Format-Volume -FileSystem NTFS -NewFileSystemLabel "WinRecovery" -confirm:$false 
$partNumber = $RecoveryPartition.PartitionNumber 
@" 
select disk 0 
select partition $partNumber 
gpt attributes=0x8000000000000001 
exit 
"@ | diskpart

Zde si můžete všimnout dalšího využití diskpart v PowerShell a to konfigurace partition jako skryté - nastavení atributu 0x8000000000000001.

Aplikace image

Aplikace image - můžeme říci i rozbalení image - je to fáze, kterou při běžné instalaci zařizuje setup.exe. Pokud chcete proces urychlit, je možné image rozbalit ručně. Pro tyto činnosti použijte buď DISM (dříve i IMAGEX) nebo PowerShell.

Při aplikaci image je image rozbalován vždy na partition určenou pro operační systém - ve všech předchozích příkladech W:. Také vycházejme z předpokladu, že instalační DVD,… je dostupné na písmenku D:

Příkaz pro DISM:

Dism /Apply-Image /imagefile:D:\sources\install.wim /index:1 /applydir:w:

Příkaz pro PowerShell:

Expand-WindowsImage -ImagePath "D:\sources\install.wim" -ApplyPath W: -Index 1

Nastavení boot operačního systému

Po rozbalení image operačního systému je nutné zajistit, aby OS startoval na námi vytvořených diskových oddílech - zde se příkazy liší dle použitého rozložení disků a BIOS/UEFI boot. Pro nastavení bootu je využíván příkaz BCDBOOT:

BIOS - jedna partition:

bcdboot w:\windows

BIOS - se systémovou partition:

bcdboot w:\windows /s s: /f BIOS

UEFI minimal a full:

bcdboot w:\windows /s s: /f uefi

nyní, pokud se nacházíme v prostředí Windows PE stačí restartovat počítač, bude spuštěna instalace OS. Restart provedete pomocí nástroje WPEUTIL, díky tomu jsou korektně vyprázdněny všechny souborové cache.

wpeutil reboot

Příprava VHDX souboru

to co jsme se naučili ve výše uvedených příkladech můžeme například použít pro přípravu nového VHDX souboru, který následně využijeme v Hyper-V. Krátký PowerShell kód:

#Vythořit nový VHDX soubor o velikosti 25GB 
New-VHD -Path D:\Hyper-V\demo.vhdx -Dynamic -SizeBytes 25GB 
#Připojit VHDX soubor 
Mount-DiskImage -ImagePath D:\Hyper-V\demo.vhdx 
$vhd = (Get-DiskImage -ImagePath D:\Hyper-V\demo.vhdx).Number 
#Inicializovat VHDX soubor jako GPT 
Initialize-Disk -Number $vhd -PartitionStyle GPT 
#Vytvoření systémové partition, formát pomocí DISKPART 
$sysPart = New-Partition -DiskNumber $vhd -GptType '{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}' -Size 260MB 
$PartNumber = $sysPart.PartitionNumber 
"@ 
select disk $vhd 
select partition $PartNumber 
format quick fs=fat32 label=System 
assign letter=S 
exit 
@" | diskpart 
#Vytvoření MSR partition 
New-Partition -DiskNumber $vhd -GptType '{e3c9e316-0b5c-4db8-817d-f92df00215ae}' -Size 128MB 
#Vytvoření partition pro OS 
New-Partition -DiskNumber $vhd -UseMaximum -DriveLetter W | Format-Volume -FileSystem NTFS -NewFileSystemLabel Windows -ShortFileNameSupport $False -Confirm:$false 
#Připojení ISO souboru s instalací OS 
$isoImage = Mount-DiskImage -ImagePath D:\Download\W10-9926.ISO -PassThru 
$ImageLetter = ($isoImage | Get-Volume).DriveLetter 
#Aplikuj Windows Image 
Expand-WindowsImage -ImagePath "$($ImageLetter):\sources\install.wim" -ApplyPath W: -Index 1 
#Nastavení boot 
invoke-expression ("w:\windows\system32\bcdboot.exe w:\windows /s s: /f ALL /l en-us /v") 
#Odpojení ISO a VHDX 
Dismount-DiskImage -ImagePath D:\Download\W10-9926.ISO 
Dismount-DiskImage -ImagePath D:\Hyper-V\demo.vhdx

Tím je vytvořený VHDX soubor, který je možné připojit do Generation 2 VM. Po startu je započata instalace OS.

Reference: GUID diskových oddílů

New-Partition commandlet - Použití GUID při vytváření oddílů

Autor: Ondřej Výšek

Ondřej je Microsoft MVP od roku 2004, v roce 2008 založil komunitní web optimalizovane-it.cz. Za svou IT karieru, jenž započala v roce 1993 prošel celou řadou pozic, od konzultanta, přes architekt, až po vytváření vizí a strategií zákazníků. V prostředích, ve kterých pomáhal byly desítky, ale i stovky tisíc uživatelů a systémů. V posledních letech se zabývá především cloudovými technologiemi Microsoft 365 a Azure ve společnosti KPCS CZ.

Následující článek Předchozí článek