Kiedyś programowałem bez wykorzystania wirtualizacji. Teraz programuję z wykorzystaniem wirtualizacji. Nigdy nie będę już programował bez wykorzystania wirtualizacji. Dlaczego?
Zalety wirtualizacji
- dedykowana maszyna dla każdego projektu
- cały czas uruchomione Visual Studio – nie trzeba czekać na załadowanie projektów
- cały czas uruchomione niezbędne aplikacje, dokumenty, strony www
- zainstalowane (tylko) niezbędne narzędzia
- przenaszalność środowiska pracy
- backup całego środowiska pracy
Wady wirtualizacji
- wymagania sprzętowe… ale dzisiaj to żaden problem (2+ rdzenie, 3-4GB RAMu, kilka dodatkowych GB na HDD…?)
Virtual PC – step by step for dev
Swego czasu straciłem naprawdę dużo czasu na poprawną konfigurację komputera tak, aby całe wirtualne środowisko działało jak sobie zaplanowałem. Poniżej prezentuję instrukcję “krok po kroku” – jeżeli nie korzystasz z zalet wirtualizacji, to najpierw zapytaj sam siebie “dlaczego?”, a potem… cóż, po prostu spróbuj. Ja też podchodziłem do tego sceptycznie.
Kilka ostatnich “niekonfiguracyjnych” punktów to moje “autorskie” podejście do tematu. Może nie będzie to nic odkrywczego, ale nigdzie nie natknąłem się na takie rekomendacje, a wg mnie sprawdza się to w praniu znakomicie.
Instrukcja ta ma służyć także mi samemu – w niedalekiej przyszłości planuję całkowite przeczyszczenie komputera i nie uśmiecha mi się spędzanie X czasu nad zastanawianiem się “a jak ja to zrobiłem że wcześniej działało…?” :). Do dzieła.
0) Uwaga!
Poniższy opis stworzyłem mając Windows XP SP 3 jako gospodarza i Windows 2003 Server jako gościa.
1) Instalacja Virtual PC 2007
Wchodzimy na stronę udostępniającą Virtual PC 2007, ściągamy i instalujemy. Dlaczego akurat VPC? Nie jest idealne (ale o tym pewnie kiedy indziej…), ale jest darmowe i sprawdza się całkiem nieźle. Do tego akurat to narzędzie sobie wybrałem do używania, więc przy nim zostańmy (w przyszłości być może skrobnę coś o Hyper-V czy VMWare). Po instlacji – konfiguracja, która na tym etapie jest naprawdę banalna. U mnie wygląda tak jak poniżej, a jedyne naprawdę ważne ustawienie zaznaczyłem na czerwono (niestety nie każdy sprzęt to wspiera):
2) Utworzenie dysku dla bazowego systemu
W tym kroku utworzymy pliki dla maszyny, na której będziemy budować całą swoją “wirtualną infrastrukturę”. Jej głównym celem będzie udostępnienie odpowiednio skonfigurowanego systemu operacyjnego, więc sugeruję nazwać ją w taki sposób, abyśmy mogli łatwo zidentyfikować zainstalowany tam OS.
Z menu konsoli VPC wybieramy “New Virtual Machine Wizard”, podajemy docelowy folder, nazwę maszyny (u mnie Win2003) i ilość RAMu dla niej dedykowanego (na tym etapie sugeruję min. 512 MB). Na koniec, zapytani o wirtualny dysk, zaznaczmy opcję “A new virtual hard disk”, dla którego również podajemy nazwę i katalog.
Pliki maszyny (.vmc) i dysku (.vhd) zostały utworzone. W konsoli VPC wybieramy maszynę i klikamy Settings. U mnie, po lekkich modyfikacjach, wygląda to tak:
3) Instalacja bazowego systemu i Virtual Machine Additions
Dwukrotnie klikamy na maszynę w konsoli VPC aby ją uruchomić. W okienku maszyny korzystamy z menu “CD” w celu podłączenia dysku instalacyjnego systemu operacyjnego, może to być płyta w fizycznym napędzie bądź obraz dysku ISO. Instalujemy…
Po zakończonej instalacji w menu Action korzystamy z “Install or Update Virtual Machine Additions”. Ten klik podłączy nam specjalnie przygotowany dysk ISO i zainstaluje oprogramowanie bardzo uprzyjemniające pracę z daną maszyną (dzięki temu możliwe będzie między innymi przesyłanie plików pomiędzy hostem i gościem za pomocą przeciągania ich myszką).
Teraz należy skupić się na konfiguracji systemu. Chcemy, aby służył on nam jako punkt wyjścia dla wszystkich naszych zadań. Musi nadawać się do rozbudowy nie tylko w kierunku programowania w Visual Studio, ale również jako serwer baz danych. Dlatego też instalujemy wszystkie aplikacje, bez których czujemy się jak Jaś bez Małgosi. W moim przypadku należą do takich na przykład Total Commander, SlickRun czy Opera. NIE INSTALUJEMY z kolei Visual Studio, Management Studio czy SQL Server. Ściągamy najnowsze aktualizacje, łatki itd. No właśnie, ściągamy…
4) Konfiguracja sieci – host
Przyznam bez bicia, że ta część zajęła mi najwięcej czasu. Moje wymagania:
- gość i host muszą się nawzajem “widzieć”
- jeżeli mam kilka wirtualnych maszyn – muszą się ze sobą komunikować
- goście muszą mieć dostęp do internetu
- żadnego DHCP, chcę ręcznie kontrolować adresy IP wirtualnych maszyn
Po (wstyd przyznać) wielu dniach prób i błędów doszedłem do następującej procedury, spełniającej te oczekiwania:
Najpierw instalujemy Microsoft Loopback Adapter (dodatkowa “software’owa” karta sieciowa) zgodnie z instrukcjami zawartymi na stronach Microsoftu (wersja dla XP: tutaj). Ta karta będzie “oknem na świat” dla naszych maszyn wirtualnych, więc otwórzmy im to okno szerzej, udostępniając jej internet! W tym celu w oknie zarządzania połączeniami sieciowymi wchodzimy we właściwości naszej głównej, “fizycznej” karty, łączącej nas z siecią. W zakładce opcji zaawansowanych zaznaczamy Internet Connection Sharing i z listy wybieramy świeżo zainstalowaną kartę Loopback (uwaga – po tej operacji konieczny może być reset fizycznej karty):
Następnie konfigurujemy kartę tak, aby posiadała statyczny adres IP oraz była dostępna dla całej infrastruktury VPC. Pierwszy cel osiągamy w standardowym oknie właściwości protokołu TCP/IP (serwery DNS kopiujemy z naszego głównego połączenia z internetem), a drugi – zaznaczając checkbox przy opcji “Virtual Machine Network Services” na liście protokołów:
5) Konfiguracja sieci – gość
W tak przygotowanym środowisku podłączenie z poziomu wirtualnej maszyny to pestka. Na początek udostępniamy maszynie kartę Loopback (uwaga – maszyna powinna być całkiem wyłączona):
Potem, już z poziomu systemu gościa, konfigurujemy jedyne dostępne połączenie nadając dowolny adres IP (z tej samej podsieci co wybrany wcześniej adres karty Loopback), a w polu “Default gateway” podając adres IP karty Loopback. Adresy serwerów DNS kopiujemy z tej samej konfiguracji co wcześniej.
Na tym etapie system gościa i hosta powinny się nawzajem widzieć, i dodatkowo gość powinien mieć dostęp do internetu.
Pierwsze koty za płoty. Możemy wrócić do konfiguracji systemu – z bezpośrednim dostępem do internetu z pewnością jest to prostsze.
UWAGA NA FIREWALLE! Ja musiałem całkowicie zrezygnować z firewalla, inaczej NIC mi nie działało, wszystkie możliwe konfiguracje zawodziły, i to w bardzo dziwny sposób. Zdarzało się, że przez kilka godzin wszystko było ok, a nagle traciłem dostęp do internetu na systemie głównym – i wcale nie musiała wówczas działać żadna wirtualka! Zidentyfikowanie firewalla jako źródła całego zamieszania zajęło baaardzo dużo czasu. Próbowałem najróżniejszych “sztuczek”, ale jedynie wyłączenie firewalla wyeliminowało problemy. W moim przypadku to akurat nic strasznego: pomiędzy mną a dostawcą internetu mam jeszcze router… ale czasami to rozwiązanie może nie być akceptowalne.
6) Zapieczętowanie stanu dysku bazowego
Mając gotowy system uśmiechamy się z satysfakcją od ucha do ucha, a następnie przygotowujemy tak pięknie stworzony dysk do “bycia bezpiecznie reużywalnym”. Po pierwsze – uruchamiamy defragmentację dysku (na systemie gościa). Po drugie – wykorzystujemy narzędzie “Virtual Disk Precompactor” (ten groźnie brzmiący gość, nadający się jak nic na tytuł informatycznego pornola, znajduje się w postaci pliku ISO w katalogu “<vpc_install_dir>/Virtual Machine Additions”) montując je w maszynie. Po trzecie – uprzednio wyłączywszy maszynę, zmniejszamy rozmiar dysku VHD, ucinając zbędną końcówkę pliku z wykorzystaniem narzędzia Virtual Disk Wizard (konsola VPC –> File –> Virtual Disk Wizard –> Next –> Edit an existing virtual disk –> wybór vhd –> Next –> Compact it –> Next –> Replacing the original file –> Next –> Finish). Teraz plik ten jest dla nas Mona Lisa: możemy nań patrzeć, możemy zeń czerpać, nie możemy “oń” tykać! W tym celu po czwarte – nadajemy plikowi .vhd atrybut read-only oraz usuwamy plik .vmc, abyśmy przypadkiem niechcący maszyny nie odpalili, co zawsze modyfikuje stan dysku.
Aha – takie pliki doskonale się kompresują, więc radzę na wszelki wypadek przejechać go RARem i nagrać na płytkę.
7) Utworzenie dysku dziedziczącego
Pora na skorzystanie z dobrodziejstw tzw. “differencing disks”. Cała sztuczka polega na tym, że tworzymy nową maszynę z nowym dyskiem, jednak czerpiemy pełnymi garściami z wcześniej zainstalowanego systemu! Dla przykładu, z omówionego Win2003 chcę stworzyć środowisko developerskie. Proszę bardzo, wystarczy doinstalować do niego Visual Studio, R#, Reflectora i co tam jeszcze sobie zażyczymy. W dwóch krokach. Na początek tworzymy dysk-dziecko (VPC Console –> File –> Virtual Disk Wizard –> Next –> Create a new virtual disk –> Next –> A virtual hard disk –> Next –> nazwa [VS 2008] + folder –> Next –> Differencing –> Next –> wybór Win2003.vhd –> Next –> Finish). Następnie dodajemy do niego plik maszyny (VPC Console –> File –> New Virtual Machine Wizard –> Next –> Create… –> nazwa [VS 2008] + folder –> … –> An existing virtual hard disk –> Next –> wybór VS2008.vhd –> Next –> Finish). Tak przygotowaną maszynę uruchamiamy, i instalujemy na niej wszelkie niezbędne dodatki.
Z jednego dysku bazowego możemy utworzyć wiele dysków – dzieci! Zatem oprócz maszyny z VS możemy teraz utworzyć na przykład serwer SQL.
UWAGA!!! Jakakolwiek modyfikacja dysku-rodzica automatycznie powoduje niezdatność dysków-dzieci do dalszego użytku! Dlatego te wszystkie zabawy z read-only, kasowaniem vmc, nagrywaniem na płytkę są tak ważne!
8) Zapieczętowanie stanu dysku dziedziczącego
Ten dysk-dziecko ma nam słuzyć również jako baza do docelowych maszyn per projekt, więc postępujemy z nim podobnie jak z rodzicem: dodajemy atrybut read-only, kasujemy vmc, pakujemy, nagrywamy na płytkę.
9) Utworzenie maszyny dla projektu
Tutaj mamy dwa podejścia do wyboru. Pierwsze – standardowe – robimy kolejny dysk “differencing”, dziedziczący z VS2008.vhd, i normalnie z niego korzystamy. Ja jednak robię to trochę inaczej, co wymaga mniej klikania i zajmuje mniej miejsca na dysku. Oto jak:
Za pomocą kreatora tworzę nową maszynę, jednak wybieram wykorzystanie istniejącego dysku zamiast generowanie nowego. W kroku wyboru dysku wybieram bezpośrednio dysk-bazę, w naszym przykładowym przypadku VS2008.vhd. Zaznaczam opcję “Enable undo disks”. Klikam Next (żadna maszyna korzystająca z tego dysku nie może być aktualnie włączona). Pojawia się komunikat, że dany dysk jest tylko do odczytu i pytanie, czy chcę to zmienić. Klikam NIE, Don’t Change!. W ten sposób w kilku klikach mam nowy, świeży system, a wszelkie moje zmiany pamiętane są w pliku tymczasowym VirtualPCUndo_costamcostam_vud. Aby tych zmian nie utracić, przy wyłączaniu tak stworzonej maszyny wybieram opcję “Save state and save changes”, jednak odznaczam “Commit changes to the virtual hard disk”, dzięki czemu po kolejnym odpaleniu maszyny zmiany z pliku .vud zostaną wczytane, nie psując jednocześnie dysku-rodzica.
10) Zapewnienie unikalności maszyny
Korzystamy z tej samej bazy, więc wszystkie nasze systemy mają tą samą nazwę, a wszystkie karty ten sam adres MAC. Jeżeli chcemy korzystać z więcej niż jednej maszyny naraz, tak to działać nie będzie. Rozwiązanie problemu jest bardzo proste – ręcznie zmieniamy nazwę komputera, ręcznie ustawiamy adres MAC, robimy restart maszyny i… tyle!
To jest moja przykładowa propozycja wykorzystania funkcjonalności oferowanej nam za darmo przez Virtual PC. Moim zdaniem grzechem jest z tego nie skorzystać.
Ważne!
Należy zdawać sobie sprawę z tego, że wykorzystywanie wirtualek nie zwalnia nas z innych “dobrych praktyk”! Dlatego też kod powinniśmy trzymać w repozytorium NIEZALEŻNYM od maszyny wirtualnej, owo repozytorium regularnie backupować itd. Scenariusz utracenia maszyny wirtualnej powinien nie być dla nas straszny, projekt nie powinien wówczas ucierpieć. Jedyna niedogodność, jakiej powinnyśmy wówczas doświadczyć, to utworzenie kolejnej maszyny (15 sekund), ściągnięcie kodu i instalacja wymaganych, specyficznych dla projektu, narzędzi.
Wszelkie sugestie, wytykanie błędów, propozycje lepszych rozwiązań oczywiście mile widziane.
The Golden Age of Virtualization… approaches!
Świetny tekst! W wolnej chwili muszę spróbować Twojego podejścia.
Bardzo przystępny przewodnik a jako nie-programista dodam, że nie tylko do programowania dokładnie tak przygotowane maszyny można wykorzystywać. Z dyskiem różnicowym jest ciekawie gdy się go przenosi w inne miejsce. Warto wiedzieć, że dysk-dziecko ma zaszytą ścieżkę do rodzica zarówno w postaci względnej jak i bezwzględnej i poszukuje go w obu lokalizacjach. Co do nienaruszalności rodzica, to oczywiście podstawa, sam też używam atrybutu ReadOnly :)
O samych VHD dodałbym jeszcze http://blogs.technet.com/3159887.aspx
Bardzo fajny tekst:) zastanawia mnie jedna sprawa jak to wygląda od strony licencji na systemy… czy np. jeśli na system rodzica i dziecka chciałbym użyć windowsa xp, to chyba ten sam klucz licencyjny nie zadziała przy aktywacji systemu…
Trochę o ustawieniach sieciowych maszyn wirtualnych (również VMware) było już na zinie ;-) tutaj http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2008/01/27/http-w-asny-serwer-komunikacji-cz-2-rodowisko-programistyczne.aspx
Jeśli chodzi o Virtual PC i dysk różnicowy to polecam również znakomity artykuł Roberta Stuczynskiego i Jacka Doktóra na http://wss.pl/Articles/10116.aspx
Jedyny powazny problem, z ktorym walczylem bodajze ze 2 lata temu, to dyski roznicowe i ich kompresja. Niestety standardowa metoda, o ktorej wspomniales, nie dziala na dyski roznicowe i tu pojawiaja sie narzedzia firm trzecich.
Darmowy jest vOptimizer firmy Vizioncore, ale on nie daje sobie rady ze wszystkimi systemami :( W moim przypadku dzialal poprawnie tylko dla windows 2000.
Niestety, to byla jedna z przyczyn dla ktorych darowalem sobie zabawy z maszynami wirtualnymi i trzymanie 5-6 rownoleglych konfiguracji (2003 serwer z AD, bez AD, z SQL2005, z VS), etc.
Ja do tego trzymalem jeszcze jeden dysk wylacznie na ‘toole’, gdzie wrzucalem co mi myszka na jezyk przyniosla i montowalem go do kazdej maszyny.
Udzielenie odpowiedzi na tytułowe pytanie "czy programowanie może być zabawą" nie jest wcale
Super tekst :). Postawiłem sobie od razu dwie wirtualki i śmiga pięknie :D. Od jakiegoś czasu zbierałem się, żeby to zrobić.
Wielkie dzięki za tę publikację.
Być może nikt nie bedzie mi w stanie pomóc ,ale spytam czy to prawda ,że wirtualizacja jest obslugiwana przez procesory Core 2 Duo i lepsze a przez Dual Core nie ,bo za słabe ??
Pytam ,bo zamierzam kupic laptopa z Dual Core ,ale skoro to wirtualizacja ,to przyszlosc to moze doplace do Core2Duo.
@Michal:
DualCore nie posiadaja technologii Intel Virtualization Technology (http://pl.wikipedia.org/wiki/Intel_Virtualization_Technology). Prawdopodobnie rozpoznasz ten brak po niemoznosci zaznaczenia punktu “Hardware Virtualization – Enabled” z punktu 1). Na ile ten brak wplywa na faktyczna wydajnosc maszyn z punktu widzenia programisty – nie mam niestety poojecia.
Wszystkie Core Duo poza T2300E/T2050/T2150/T2250 obsługują wirtualizacje ;)
Mam proble z tym programem mianowicie nie moge zainstalowac na na niej systemu a jak klikam 2 razy albo daje start to komputer sie wylacza co robic prosze o sugestie
Należy koniecznie instalować oddzielny system dla gościa? Nie może korzystać z systemu hosta?
@Ryszard:
Nie wiem czy dobrze rozumiem, ale na tym polega całe piękno wirtualizacji – uruchomić kilka niezależnych od siebie systemów jednocześnie. Nie potrafię sobie wyobrazić czemu miałaby służyć wirtualizacja… systemu gospodarza?
Ja ostatnio zacząłem przygodę z VirtualBox (www.virtualbox.org) bo zależało mi na wykorzystywaniu USB w maszynie wirtualnej. W trybie full screen pracuje w rozdzielczościach wyższych niż 1600×1200. Produkt Open Source, cały czas rozwijany. Posiada własny format plików .vdi dla dysków wirtualnych, ale radzi sobie też z .vhd i .ovf.
Witam, mam problem.
Po zainstalowaniu Virtual Machine Additions głębia kolorów spada do 256 kolorów i nie można go zmienić, a kiedy zostaną odinstalowane ustawienie wraca do 16 bit. Czy można jakoś zrobić aby po zainstalowaniu VMA głębia kolorów pozostała na wysokim poziomie? W wirtualnym komputerze zainstalowałem system Windows XP.
@Admc,
Niestety nie potrafię ci pomóc, maszyny tworzyłem wielowielokrotnie, ale nigdy nie miałem takiego problemu. Zdarzały się momentami różne zmiany w rozdzielczości i kolorach, ale wszystko można było przywrócić do odpowiednich ustawień…
Udało mi się znaleźć rozwiązanie.
Po prostu zaktualizowałem SP1 do SP2.
Teraz pyka aż miło.
A ja mam takie pytanie, jak sobie radzisz z aktualizacją systemów (np. SP do VS.NET), bo jeśli dobrze zrozumiałem, to aktualizować możesz tylko systemy – "liście".
@PiotrB:
Tak, i to okazało się zbyt dużym problemem. Skończyło się na tym, że docelowo miałem jedną wirtualkę-matkę, którą po prostu kopiowałem dla każdego większego projektu. Aktualizowałem tylko ową matkę, więc nowe projekty miały już nowy soft. Stare – to zależy od tego jak pilna była aktualizacja, zwykle działałem na pierwotnej wersji aż do końca projektu (bądź dłuższej przerwy w nim – wtedy kasuję wirtualkę i przy wznawianiu prac biorę kolejną kopię z matki).
Ta "matka" służyła też jako rodzic dla bardzo krótkich zadań korzystających z diff-disków. Ich utracenie w razie aktualizacji matki nie było problemem, bo odtowrzenia ich stanu to zwykle kwestia kilku minut.
Czas przeszły, bo na dzień dzisiejszy korzystam z VirtualBox a w kwietniu będę testował VMWare. VPC jest fajny, ale jego ograniczenie "tylko 1 rdzeń" jest po prostu śmieszne. Jednak w VirtualBoxie brakuje mi właśnie elastyczności w żonglowaniu wirtualkami w porównaniu do VPC.