Geek Deployment: Windows PE, příprava disku a aplikace image - bonus VHDX
Kdo si hraje, nezlobí 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ů