Wednesday, November 26, 2008 4:01 PM
plitpro@microsoft.com
*.vhd
Pliki VHD spotkał chyba każdy. Poza kopiami zapasowymi (o których jeszcze kiedyś napiszę więcej) znane są głównie z wirtualnych środowisk VirtualPC, Virtual Server oraz Hyper-V. Postanowiłem z ciekawości podłubać w zawartości takich plików i sprawdzić co też w nich w środku siedzi. Okazuje się, że zawartość zależy (jest to w sumie oczywiste) od tego czy dysk ma stały rozmiar czy też rozrasta się w miarę potrzeby oraz od tego czy to samodzielny dysk, czy dysk różnicowy.
W środku w pliku VHD spotkać można:
- identyfikator aplikacji (równy conectix dla wszystkich rozwiązań włącznie z Hyper-V)
- wersję formatu (1.0)
- nazwę aplikacji (vpc dla Virtual PC, wsv dla Hyper-V)
- wersję aplikacji (na przykład 5.3 dla Virtual PC 2005, 1.0 dla Hyper-V z Windows 2008)
- znacznik czasu (z dokładnością do 1s)
- wersję systemu hosta (zawsze Wi2k w systemach Windows)
- rozmiar w bajtach
- typ dysku (stały, dynamiczny, przyrostowy)
- geometrię (ilość cylindrów, głowic i sektorów)
- sumę kontrolna
- UUID czyli 128 bitowy unikalny identyfikator
- informację czy maszyna ma zapisany stan (jeżeli tak, to nie można utworzyć dysku różnicowego)
Te pola są wspólne dla każdego typu dysku i mimo, że istnieje jeszcze kilka innych – te są najciekawsze.

Jeżeli dysk jest dynamicznie rozszerzalny, to jego dane uzupełnione są dodatkowo o:
- identyfikator aplikacji (równy dla odmiany cxsparse)
- wersja nagłówka (cały czas 1.0)
- ilość wpisów w tabeli BAT
- rozmiar bloku
Ostatnie dwie pozycje dotyczą sytuacji, w której dysk musi się rozszerzyć. Skoro się rozszerza, to przyrasta o pewną ilość bloków o określonym rozmiarze. Bloki te zapisywane są w specjalnej tablicy zwanej BAT. Iloczyn ilości wpisów i rozmiaru bloku powinien być z oczywistych powodów równy rozmiarowi dysku. Microsoft używa bloków 2MB (w Virtual PC) oraz 512KB (w Hyper-V). Inne rozmiary są dopuszczalne ale nie sprawdzone i nie wspierane. Ciekawostką jest zmniejszenie rozmiaru bloku w Hyper-V, ale w ogóle poza zastosowaniami typowo domowymi, dyski o dynamicznym rozmiarze nie powinny być stosowane, więc nie warto się tym nadmiernie przejmować.
Dyski różnicowe są dyskami, które występują wyłącznie w parze z rodzicem czyli dyskiem bazowym. Ich zawartość zawiera wyłącznie różnice pomiędzy dyskiem bazowym a dyskiem widzianym jako efekt końcowy. Dyski różnicowe można tworzyć świadomie i samodzielnie lub poprzez włączenie „Undo disk” w Virtual PC. W pierwszym przypadku mają standardowe rozszerzenie *.vhd, w drugim - *.vud. Format jednak pozostaje w obu przypadkach taki sam. W dyskach różnicowych zapisane są pewne dodatkowe informacje na temat dysku-rodzica:
- nazwę pliku dysku-rodzica
- UUID pliku rodzica
- znacznik czasu pliku rodzica
Wszystkie te pola muszą być takie same w pliku dysku-rodzica i w pliku dysku różnicowego. Oznacza to, że jeżeli stworzymy dysk różnicowy, a następnie zmodyfikujemy coś w dysku bazowym, w efekcie zmieni się znacznik czasu rodzica i plik różnicowy przestanie działać!

Poza tym, dysk różnicowy zawiera informacje na temat położenia dysku-rodzica. Żeby ułatwić jego znajdowanie, informacje te zapisywane są w kilku różnych standardach. Teoretycznie format przewiduje 8 slotów na takie dane, jednak w praktyce, w świecie Windows wykorzystywane są 4. Ścieżka do rodzica zapisywana jest w unicode oraz w ASCII, a w każdym z tych formatów w postaci względnej i bezwzględnej. Dzięki temu możliwe jest odnalezienie rodzica nawet, gdy plik różnicowy przeniesiony zostanie do innego katalogu lub w sytuacji, gdy plik wraz z rodzicem zostanie przeniesiony w zupełnie inne miejsce.

Same informacje z plików VHD są tylko niewielkim kawałkiem zabawy z możliwościami. Naprawdę ciekawie robi się w sytuacji, gdy niezależnie od możliwości środowisk wirtualnych próbujemy modyfikować zawartość plików. Rozmiar bloku danych, możliwość resynchronizacji plików różnicowych, zmiana położenia pliku-rodzica i tym podobne edycje zostaną opisane w miarę mojego wolnego czasu.
Autor: Grzegorz Tworek