Zmiana rozmiaru dysku VHD

W zeszłym tygodniu znalazłem wreszcie chwilę czasu na odświeżenie mojej podstawowej maszyny (Dell XPS12), na której pracuję przez 90% mojego czasu. Zainstalowałem na niej Windows 8.1 (w edycji Enterprise) oraz Windows Server 2012 R2 (w edycji Datacenter).

Dlaczego dwa systemy?

Lubię mieć dwa systemy na komputerze, bo pracuję normalnie na systemie klienckim, ale nigdy nie wiadomo kiedy będzie trzeba pokazać/przećwiczyć coś z serwera.

Owszem często korzystam z Azure IaaS, bo tam postawienie maszyny jest banalne oraz szybkie i można mieć do niej dostęp zdalny, ale ma też jedną dużą wadę - nie można pokazać na tym elementów z Hyper-V. Dodatkowo oczywiście do pokazu konieczne jest posiadanie Internetu w danej chwili.

Instalacja do VHD

Dlatego zawsze na podstawowym komputerze instaluję i system kliencki i system serwerowy. W 99% przypadków robiłem to tak, że system kliencki instalowałem klasycznie na fizycznym dysku. Natomiast system serwerowy instalowałem do pliku VHD.

Dlaczego do VHD?

Nie będę się bardzo rozpisywał o korzyściach instalacji do VHD, bo możecie znaleźć sporo artykułów na ten temat (np. u Scotta Hanselmana czy na TechNet). Dla mnie największe korzyści to brak konieczności dodatkowego partycjonowania dysku (muszę tylko znaleźć na jednej z partycji ok. 30 GB) oraz możliwość szybkiej wymiany takiego systemu (reinstalacji).

Do tego plusem na pewno jest szybkie wyrzucenie takiego systemu (usuwamy fizycznie jeden plik z dysku oraz jeden wpis w msconfig). No i jeszcze jedna rzecz, o której za chwilę.

Jak zainstalować do VHD?

Założenie jest takie, że system jest instalowany nie na fizycznym dysku tylko do pliku VHD (wirtualnego dysku), który leży sobie na tym fizycznym dysku. Generalnie - to naprawdę banalna sprawa i różni się od klasycznej instalacji o kilka poleceń w diskpart :) Podczas moich różnych warsztatów często pokazuję ten sposób i uczestnicy sami tak instalują system i są bardzo pozytywnie zaskoczeni jak proste i wygodne to jest.

I tu również nie będę dziś opisywał szczegółów, bo o instalacji znajdziecie również sporo poradników. Ja bym polecał przeczytać Wam artykuł Darka Rutkowskiego na WSS.pl oraz z TechNetu Creating Bootable Virtual Hard Disks.

Rodzaj dysków do instalacji

Jedną z ważnych korzyści również jest to, że instalując system do pliku VHD, który jest dynamiczny nie musicie z góry zajmować i alokować sobie miejsca na dysku fizycznym, bo system zainstalowany do VHD będzie widział tyle ile zdefiniowaliście jako rozmiar dysku dynamicznego (np. 50 GB), a na fizycznym dysku zajmie Wam on około 7-10 GB (mówię o Windows Server 2012 tuż po instalacji). Po prostu w miarę napływu czasu i danych tworzonych przez ten system - dysk wirtualny będzie się powiększał.

Aha gdyby ktoś pytał o wydajność tego rozwiązania to przy operacjach odczytu z dysku nie powinniście zauważyć praktycznie żadnej różnicy między dyskiem fizycznym, dyskiem VHD stałego rozmiaru (fixed size) oraz dyskiem VHD o zmiennym rozmiarze (dynamically expanding). Pewne różnice będziecie mogli zaobserwować przy operacjach zapisu, gdzie dysk fizyczny z dyskiem stałym nie różnią się za bardzo, ale już dysk dynamiczny może mieć 1-3% niższe wyniki (np. przy dysku SSD o maksymalnej wydajności 220 MB/s, instalacja na dysku fizycznym lub stałym będzie mogła zapisywać z prędkością ok. 217 MB/s, natomiast do dysku dynamicznego maksymalnie wyciągnięcie ok. 212 MB/s). Ale w codziennej pracy te różnice będą naprawdę nie zauważalne.

To co z tą zmianą rozmiaru dysku?

Tworzenie dysku VHDDocieramy wreszcie do sedna dzisiejszego posta - czyli mini problemu jaki sam sobie stworzyłem przy instalacji Windows Server 2012 R2 do pliku VHD.

Pomyślałem, że zawsze wszystko robiłem za pomocą diskpart, a przecież dysk mogę sobie spokojnie stworzyć wcześniej za pomocą narzędzi wbudowanych w system.

Od Windows 7 w opcji zarządzania dyskami (Disk Management) możecie stworzyć sobie w prostym kreatorze dysk VHD (menu Action > Create VHD). W Windows 8 do Disk Management dostaniecie się skrótem Win+X + K.

Przy tworzeniu dysku możecie wybrać gdzie ma leżeć, jaki ma mieć typ (stały lub rozszerzalny) oraz rozmiar, plus czy ma być VHD czy VHDX (sugeruję korzystać już tylko z VHDX).

Moim błędem było wpisanie wielkości dysku dynamicznego jako 127 GB (to domyślna wartość przy tworzeniu dysku w kreatorze Hyper-V Managera i jakoś tak automatycznie mi się wpisała ta wartość). Oczywiście dysk dynamiczny tej wielkości się stworzy bez żadnego problemu, bo fizycznie na dysku zajmie początkowo chyba około 4 MB.

Bez problemu też podepniecie go przy instalacji (za pomocą diskpart) i bez problemu zainstalujecie do niego system operacyjny.

BSOD: VHD_BOOT_HOST_VOLUME_NOT_ENOUGH_SPACEProblem pojawi się w momencie kiedy system ten będzie chciał się uruchomić po raz pierwszy (i kolejny) - wtedy system próbuje rozszerzyć plik VHD do wielkości maksymalnej (czyli u mnie do 127GB, na dysku fizycznym który miał wolnego 50GB).

I co się wtedy stanie? Komputer przywita Was Blue Screenem z napisem VHD_BOOT_HOST_VOLUME_NOT_ENOUGH_SPACE (plus BSOD od jakiegoś czasu jest taki, że podają całkiem rozsądne komunikaty). Po prostu komputer uznaje, że dysk nie ma tyle miejsca ile ma niby zadeklarowane...

Nie chciało mi się tworzyć nowego dysku z rozsądniejszym rozmiarem, instalować systemu na nowo... Więc pomyślałem, że po prostu spróbuję zmniejszyć sobie rozmiar tego wcześniej zdefiniowanego dysku z już zainstalowanym systemem. Niestety nie ma tu tak prostego kreatora...

Jak zmniejszyć rozmiar dysku VHD?

No to docieramy do sedna. W przypadku chęci pomniejszenia wielkości dysku dynamicznego trzeba (lub powinniśmy) zrobić dwie rzeczy:

  1. Zmniejszyć logiczną wielkość dysku wirtualnego (to co system operacyjny widzi i co skonfigurowałem jako 127 GB)
  2. Zmniejszyć fizyczną wielkość pliku VHD

Pierwsze jest ważniejsze - bo bez tego byłbym atakowany BSOD cały czas. Natomiast drugie pozwala nam zaoszczędzić fizyczne miejsce na fizycznym dysku.

Cała operację można zrobić logując się do tego systemu, tam zmniejszyć partycję systemową, później wylogować się i wyłączyć maszynę, później kreator zmniejszania dysku... Zresztą szczegóły możecie przeczytać u Bena Armstronga. Z drugiej strony ze straszącym BSOD nie jest to łatwe :)

Natomiast jest dużo szybszy sposób na to wszystko - a odpowiedzią jest PowerShell! Uruchamiajcie więc konsolę PowerShell i do dzieła:

  • mount-vhd <ścieżka do VHD> –passthru | get-disk | get-partition | get-volume
    Montujemy dysk VHD w naszym systemie i sprawdzamy sobie od razu przypisaną mu literę (potrzebne w kolejnym kroku)
  • resize-partition –driveletter <litera z poprzedniego kroku> –size <nowy rozmiar>
    Tutaj jedna komenda na zmianę wielkości partycji w systemie w pliku VHD
  • dismount-vhd <ścieżka do VHD>
    Odmontowujemy plik VHD po zmniejszeniu logicznej wielkości dysku
  • resize-vhd <ścieżka do VHD> –ToMinimumSize
    No i teraz zmniejszamy sobie fizyczny plik VHD do wielkości minimalnej

Cały proces zajmuje mniej niż minutę i nie wymaga logowania się do maszyny i innych operacji (poza tym, że trzeba mieć Hyper-V na tej maszynie, na której będziecie robili te operacje - może to być zarówno serwerowe Hyper-V jak i Client Hyper-V z Windows 8 czy Windows 8.1).

Po tym prostym rozwiązaniu mogłem już odpalić Windows Server 2012 R2 z pliku VHD i rozpocząć jego konfigurację :)