Právě dělám na Hyper-V base disku imidže Windows 2012 R2, nainstaloval jsem si to rovnou z ISO s "Update", tedy April 2014 Rollup - což je mimochodem ve skutečnosti SP1, dokonce se to download URL tak jmenuje, nechápu, proč to rovnou nepojmenují Service Pack :-). No dobrá, čístá instalace cca 8 GB. Aplikuju November 2014 Rollup Update a December 2014 Cummulative Update (to není rollup, je to jenom cummulative, takže se musí jenom přidat k poslednímu rollupu z listopadu) a ještě nějaké ADFS aktualizace a objem VHD vyleze na 14 GB. Takže to chtělo vyčistit a odstranit ty přebytečné aktualizace, které už nikdy nebudu odinstalovávat.
Pro zajímavost jsem se podíval na tabulku gwmi Win32_QuickFixEngineering, která zachycuje aktualizace, které mám nainstalované. Zdá se, že to odpovídá. Tři kousky z té listopadové aktualizace a jedna prosincová.

Adresář C:\Windows\SoftwareDistribution měl před čištěním 857 MB a adresář C:\Windows\WinSxS měl 9.09 GB. Uvidíme jak to dopadne. Budu muset vyčistit WinSxS adresář, keš Windows Update klienta (wuauclt, wuauserv) v adresáři SoftwareDistribution a potom ještě zmenšit ten VHD soubor z venku.
Čištění WinSxS adresáře
Na čištění WinSxS jsem použil tedy následující metodu - http://blogs.technet.com/b/askpfeplat/archive/2015/02/09/how-to-reduce-the-size-of-the-winsxs-directory-and-free-up-disk-space-on-windows-server-2012-r2-and-windows-8-1-or-do-we-even-need-to.aspx
Dism.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase
Podstatný je ten parametr ResetBase, který to čištění provede okamžitě a bez diskuze. Výsledkem bylo zmenšení WinSxS adresáře z původních 9.09 GB na 5.97 GB. Paráda. Adresář SoftwareDistribution to samo nevyčistilo, takže jsem pokračoval s ním. Taky by mě zajímalo, co vlastně odstranil, protože z výpisu Win32_QuickFixEngineering zmizela jenom jedna starší aktualizace.

Čištění keše Windows Update adresáře SoftwareDistribution\Download
Dále jsem podle článku https://support.microsoft.com/en-us/kb/2795190 vymazal obsah SoftwareDistribution\Download, tedy po restartu jsem provedl toto:
Stop-Service WUAUSERV
Get-ChildItem $env:systemroot\SoftwareDistribution\Download | Remove-Item -Recurse -Force
Start-Service WUAUSERV
Tady jsem ušetřil prakticky celý jeho původní obsah, takže velikost klesla na 27 MB z původních 857 MB.
Sysprep a zmenšení VHD pomocí sdelete/compact/shrink bez defragmentace moc nefunguje
Uvnitř virtuálního počítače se systémový disk C: už teď tvářil že má obsazených 8.90 GB. No následoval SYSPREP a vypnutí virtuálního počítače. VHD soubor se samozřejmě sám nezmenší, takže měl pořád svých 14 GB.
Zkusil jsem ho pro zajímavost nejprve zmenšit pomocí Hyper-V operace shrink neboli compact. Musíte to dělat pomocí PowerShell cmdlet Optimize-VHD, protože GUI operace přes Edit Disk používá pro VHDX pouze Quick metodu, která to nevyčistí dokonale. Navíc je potřeba to ručně připojit jako read only. Jako u blbejch na dvorku.
Mount-VHD b:\base2k12r2.vhdx -ReadOnly
Optimize-VHD -Path b:\base2k12r2.vhdx -Mode Full
Nečekal jsem, že to moc pomůže. Shrink/compact může odstranit pouze bloky, které jsou totálně prázdné (nulové) uvnitř virtuálního disku. Jenže samotné odmazání dat jejich sektory ve skutečnosti nenuluje, jak jistě ví každý bezpečák. Takže compact/shrink jenom tak nasucho vám moc nepomůže. Výsledkem bylo zmenšení z 13.90 GB na 12.5 GB.
Jako druhý pokus jsem použil metodu sdelete (stáhe se to z microsoftu). VHD disk jsem si offline připojil (mount) a pustil na něho sdelete s parametrem Z, který vyčistí (vynuluje) volné místo, takže následný compact/shrink bude mnohem účinnější (a taky bude mnohem déle trvat).
Nezapomeňte na parametr -R, který to provede rekurzivně. Bez něho by se to opět neprojevilo jako příliš účinné. Ono se to nakonec ukázalo stejně ale nedostatečné. Disk byl zmenšen z původních 13.9 GB jen na 12.0 GB při tom faktu, že disk vevnitř obsahuje jen 8.90 GB. Nějak málo, ne?
Bude to zřejmě souviset s faktem, že VHDX soubory mají výchozí vnitřní velikost blocku (BlockSize) 32 MB, zatímco starší VHD soubory mají BlockSize jen 2 MB. To znamená, že se do dynamicky rostoucího (dynamically expanding) VHD(x) souboru musí vždy umístit celých 2/32 MB, i když je z tohoto obsazen ve skutečnosti jen jeden sektor. Taky to docela ukazuje na nekvalitu distribuce souborů - což jsem ověřil pomoci defragmentátoru, který píše, že mám jen 69% space efficiency. Ověřil jsem to ještě i jednoduchým zkonvertováním VHDX do VHD a ušetřil další 2 GB, tedy velikost souboru klesla na 9.78 GB při vnitřní faktické obsazenosti 8.90 GB. Pořád sice 1 GB pryč, ale to už není taková tragédie.
Defragmentace v GUI proběhla v řádu milisekund. Něco je divně. Zkusil jsem tedy defragmentaci pomocí PowerShellu a opětovný SDELETE a samozřejmě i následující shrink.
# First mount read/write to defragment completelly
Mount-VHD b:\base2k12r2.vhdx
Optimize-Volume -Drive M -Defrag -Verbose
sdelete M:\ -Z -R
Dismount-VHD b:\base2k12r2.vhdx
# Then mount read/only to optimize/compact/shrink
Mount-VHD b:\base2k12r2.vhdx -ReadOnly
Optimize-VHD -Path b:\base2k12r2.vhdx -Mode Full
Dismount-VHD b:\base2k12r2.vhdx
Defragmentace a následná shrink/compact/Optimize-VHD zmenšila velikost na finálních 8.9 GB. Následná konverze z VHDX na VHD mi ještě ušetřila 300 MB ale to už je jenom třešnička na závěr. Ultra super!
Shrnutí na závěr
Smazání WinSxS je potřeba - nezapomeňte na parameter ResetBase.
Smazání SoftwareDistribution\Download je potřeba, ideálně to předtím ale restartujte.
Defragmentace je potřeba - musíte dělat z PowerShellu, protože z GUI to nedělá nic.
SDELETE je potřeba - nezapomeňte na parametr -R a uvědomte si, že ho musíte dělat až po defragmentaci.
Compact operaci na VHD musíte také dělat z PowerShellu, abyste mohli použít explicitně parametr -Mode Full a také ten disk nejprve připojili v režimu read-only.