Do przeprowadzenia eksperymentu potrzebne jest przygotowanie odpowiedniego środowiska, które zapewni eksperymentatorom np. możliwość wielokrotnego powtarzania prób. Dzięki temu, że środowisko jest specjalnie spreparowane, obserwatorzy mogą skupić się na konkretnych elementach doświadczenia i z większą pewnością wyciągać wnioski.

Każde uruchomienie programu powoduje, że system operacyjny tworzy specjalne środowisko, w którym uruchamia aplikację. To środowisko dla programu (który podczas wykonywania się jest nazywany procesem) jest za każdym razem takie samo, dzięki temu możemy cieszyć się powtarzalnością każdego uruchomienia.

Klasycznie i intuicyjnie, z powyższego wynika, że najwyżej w hierarchii jest System Operacyjny, który uruchamia wszystkie programy. Co jeśli chcielibyśmy testować i przeprowadzać eksperymenty na systemie operacyjnym? W końcu, gdzieś na samym dole, jest to także jakiś program z tym, że jest uruchamiany w specjalny sposób.

Komputerowa incepcja

Otóż jest możliwe napisanie takiego programu, który umożliwia uruchomienie wewnątrz niego systemu operacyjnego. Ten program nosi nazwę Wirtualnego Środowiska.

Włączamy na komputerze system operacyjny. Na tym systemie uruchamiamy wirtualne środowisko (aplikację) a w tym procesie uruchamiamy... kolejny system operacyjny, który jest tzw. wirtualizowany. Środowisko udostępnia takich danych wejściowych i wyjściowych, że symulowany system "nie wie", że jest wewnątrz symulacji. W takim systemie istnieje możliwość uruchomienia kolejnego wirtualnego środowiska a w nim kolejnego systemu operacyjnego.

Czy jest tego granica? Oczywiście. Każdego programistę jak i użytkownika komputera ograniczają dwie rzeczy- prędkość procesora i pojemność pamięci. Ponieważ system operacyjny wymaga sporych ilości pamięci aby mógł pracować, na laptopie raczej nie zaszalejemy z cyfrową incepcją. Istnieje też kwestia sensowności takiego zagłębiania się. Ograniczenia są takie same jak w przypadku ograniczeń rekurencji.

virtualbox-inception.pngZagnieżdżenie 3 systemów

Praktyczne zastosowanie

Korzyści z takiego rozwiązania nie kończą się jednak na samym uruchomieniu Systemu, aby go badać/testować. Zastosowania są dalej posunięte i trochę przypominają sci-fi. Rysuje się to tak: obecnie aplikacja może być systemem operacyjnym, który wykorzystuje wiele narzędzi w środku a użytkownik, niczym widz seansu filmowego, widzi złudzenie normalnej aplikacji. Takie rozwiązanie wymaga odpowiedniej konfiguracji środowiska, w którym jest uruchamiane oraz spełnienia odpowiednich wymogów w stosunku do swoich zależności, z których korzysta.

Konfiguracja zajmuje trochę czasu, ktoś to musi przeprowadzić, nadzorować przetestować i ostatecznie wdrożyć. Nawet jeśli posłużymy się narzędziem automatyzującym to nadal zajmuje jakąś porcję czasu. Tutaj z pomocą przychodzą "wirtualki". Wystarczy, że zainstalujemy raz system operacyjny ze wszystkimi zależnościami, skonfigurujemy wszystko co potrzeba i... już. System wirtualny to zazwyczaj jeden plik, który łatwo powielić (skopiować). Tworzymy jedną wersję takiego środowiska i możemy w chwilę uruchomić je tak, jakby to był komputer specjalnie przystosowany do konkretnego zadania.

Przykłady zastosowań

Rozwiązania oparte na na wirtualizacji są powszechne w branży hostingowej. W serwerowni montowany jest potężny serwer, maszyna z wieloma procesorami i olbrzymimi pokładami pamięci. Jak zapewnić każdemu użytkownikowi granice intymności (prywatności, bezpieczeństwa) i dostęp do określonej ilości zasobów? Wygląda to tak, że na takim serwerze instalowany jest system operacyjny, który wirtualizuje wiele systemów wirtualnych. W momencie, gdy chcemy stworzyć nowy serwer spełniający określone parametry administrator po prostu "wyklikuje" taki serwer. To pozwala na lepsze zarządzanie i monitorowanie całego ekosystemu.

Przydaje się to również podczas tworzenia oprogramowania, to podejście powoduje, że praca nad oprogramowaniem jest na zupełnie innym poziomie abstrakcji. Taka analogia: cieśla pracuje na lądzie nad, powiedzmy, masztem łodzi. Może go wystawić na działanie wiatru przy swoim warsztacie ale nigdy nie zbada jak się zachowuje jego dzieło dopóki nie zamontuje go na statku i wypłynie w morze (środowisko produkcyjne).

Wirtualizacja systemów umożliwia programiście tworzyć i uruchamiać swój kod w takich warunkach, jakie panują w środowisku produkcyjnym, czyli takim, jakie ostatecznie będzie uruchamiać jego kod. To zmniejsza (ale nie eliminuje!) ilość przypadków "u mnie działa".

Kiedyś, aby móc korzystać z dwóch różnych systemów (przeważnie Windows i Linux) należało zainstalować te systemy "obok siebie", aby móc skorzystać z jednego trzeba było zresetować komputer i przy uruchamianiu wybrać inny system operacyjny. Teraz można uruchomić drugi system operacyjny wewnątrz głównego systemu (główny system, który uruchamia wirtualne systemy nazywany jest Host’em) bez konieczności przełączania a co najważniejsze- z możliwością współdzielenia zasobów.

Narzędzia

Oprogramowanie, które oferuje środowisko wirtualne jest dostępne, w większości przypadków za darmo i każdy może z niego skorzystać. Darmowym i popularnym jest VirtualBox. Należy pamiętać, że środowisko wirtualne to tylko środowisko, nie dostarcza samego systemu operacyjnego- należy go zainstalować, żeby to zrobić potrzebny jest program instalacyjny. Dodatkowo kwestie licencji na system są takie same jak w przypadku instalowania go na komputerze- nie jesteśmy zwolnieni z obowiązku zakupu licencji.

Dla programistów, został stworzony Docker. To odchudzona wersja wirtualnego środowiska z przeznaczeniem do tworzenia spójnych aplikacji i wdrażaniu ich na systemy produkcyjne ale dla amatorskich zastosowań też jest dobry. Np. jeżeli współpracujemy w małym zespole, za pomocą takiego Dockera możemy stworzyć obraz systemu, który udostępniony każdemu członkowi pozwala na uruchamianie tzw. Pojemników. Każdy z tych pojemników jest kolejną instancją systemu. Jeżeli coś się zepsuje w środku taki pojemnik można usunąć i stworzyć nowy. Jest to bardzo wygodne i praktyczne.

W pracy korzystam z takiego rozwiązania przy każdym projekcie, w którym biorę udział. Jestem jego zwolennikiem, ponieważ dzięki temu mam pewność, że ja i inni programiści tworzymy kod pod konkretne środowisko, testerzy testują na tym samym środowisku i po wdrożeniu, na serwerach naszych czy naszych klientów jest również identyczne środowisko. To pozwala mi przestać się martwić, czy wszyscy korzystają z tych samych wersji zależności i czy środowisko wszędzie jest tak samo skonfigurowane. Naturalnie odbywa się to nakładem pracy na przystosowanie i wdrożenie takich procedur, jednak w ostatecznym rozrachunku jest to warte wysiłku.

Powiązane tematy

URL

URL

"W internecie jest wszystko." Do każdego zasobu jest tak samo daleko, wystarczy znać jego adres. Adres zasobu to ścieżka, która prowadzi dokładnie do tej rzeczy. W niej samej zakodowane jest sporo interesujących informacji. Czytaj całość

Aplikacje hybrydowe

Aplikacje hybrydowe

Problem pojawia się, gdy programista zaznajomiony z konkretną platformą staje przed zadaniem napisania "tego samego" na inną platformę. Wtedy jego wiedza może się okazać co najmniej niewystarczająca, a niekiedy nawet może przeszkadzać w poznawaniu nowego. Czytaj całość

Enkapsulacja

Enkapsulacja

Gdy przychodzi potrzeba opakowania warstwy danych w inną warstwę danych, to mamy do czynienia z enkapsulacją, o której słów kilka w poniższym artykule. Czytaj całość


Piotr Poźniak

Piotr Poźniak

Programuję od ponad 15 lat. Prowadzę software house. Angażuję i zachęcam wszystkich do programowania w ramach inicjatywy Programowanie jest łatwe.

Bądź pierwszy, podziel się swoją opinią!

Obrazek przedstawiający nadgryzione ciasteczko