From 332c321c18c48e006fb0f080ab3ea2527a5c4cf0 Mon Sep 17 00:00:00 2001 From: xf0r3m Date: Thu, 2 May 2024 16:23:10 +0200 Subject: [PATCH] =?utf8?q?Rozpocz=C4=99cie=20tworzenia=2016=20rozdzia?= =?utf8?q?=C5=82u.=20Podrozdzia=C5=82=2016.2.3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- articles/terminallog/Linux.Podstawy.html | 378 +++++++++++++++++++++++ 1 file changed, 378 insertions(+) diff --git a/articles/terminallog/Linux.Podstawy.html b/articles/terminallog/Linux.Podstawy.html index 20231b9..e32adcf 100644 --- a/articles/terminallog/Linux.Podstawy.html +++ b/articles/terminallog/Linux.Podstawy.html @@ -12848,6 +12848,384 @@ $ patch -p0 < plik_poprawki
 $ patch -p1 < plik_poprawki;
 
+

16. Wirtualizacja

+

+ Same pojęcie tego, że coś jest wirtualne odności się do + translacji warstwy bazowej do postaci uproszczonego interfejsu, z + którego może korzystać wielu odbiorców. Z pojęciem wirtualizacji + zapoznaliśmy się pośrednio przy poznawaniu zagadnienia + pamięci wirtualnej, oferującej procesom duży odizolowany obszar + pamięci operacyjnej. W tym przpadku skupimy się nieco szerszym + aspekcie możliwości wirtualizacyjnych pozwalających na tworzenie + izolowanych środowisk umożliwiających uruchomienie wielu systemów + operacyjnych bez powstawania konfliktu miedzy nimi. +

+

16.1. Maszyny wirtualne

+

+ Maszyny wirtualne obejmują całość sprzętu komputerowego, za pomocą + oprogramowania, wydzielane są zasoby fizycznego hosta oraz + tworzone nowe urządzenia aby powstała zupełnie nowa maszyna. Z + terminu maszyna wirtualna, korzysta się od wielu lat, + dlatego też w celach rozróżnienia (przecież spotkaliśmy się z + maszyną wirtualną Javy) dla maszyn tworzących izolowane środowiska + zdolne do uruchamiania systemów operacyjnych, które podwzględem + programowym nie różnią się niczym od fizycznych komputerów używa + się sformuowania systemowa maszyna wirtualna. +

+

+ Żeby tego było mało, to możemy wróżnić jeszcze maszyny oparte + całkowicie na oprogramowania, czyli emulatory. Przy + użyciu tego rozwiązania możemy uruchamiać np. programy nieprzeznaczone + domyślnie na wykorzystywaną przez nas architetkurę. Dla przykładu + mamy obecnie dostępne emulatory konsol do gier czy smartfonów. +

+

16.1.1 Hipernadzorcy

+

+ Programy pozwalające nam na kontrolowanie maszyn wirtualnych i + wchodzenie w interakcje z nimi (chociażby po to, aby zainstalować + system operacyjny) nazywane jest hipernadzorcą. + Istnieją dwa typy oprogramowania hipernadzorcy. + Z typem 2, każdy + mógł mieć styczność są to takie środowiska virtualizacji jak + Oracle VirtualBox czy VMware Player lub Workstation. Hipernadzorcami + drugiego typu jest najczęściej oprogramowanie instalowane + zawierające pełen pakiet wirtualizacji. Inaczej jest + w przypadku typu 1, gdzie instalujemy na fizycznym + komputerze + specjalny system operacyjny pełniący rolę hipernadzorcy. Pozostają + również rozwiązania zawieszone pomiędzy pierwszym a drugim typem, + np. rozwiązanie KVM z dystrybucji Linuksa. Pozwala ono zamienić + normalną dystrybucję w hipernadzorcę typu 1. +

+

+ Po omówieniu roli hipernadzorcy, możemy wprowadzić odpowiednią + nomenklaturę dla zagadnienia maszyn wirtualnych. Mianowicie komputer, + który udostępnia maszyny wirtualne lub ma możliwość ich tworzenia + nazywany jest hostem, natomiast maszyna wirtualna + gościem. +

+

16.1.2. Sprzęt maszyny wirtualnej

+

+ Istnieje wiel różnic między sprzętem fizycznym a tym z którego + korzystają maszyny - wirtualny. Wynikają one najczęściej z + umożliwienia gościom bardziej bezpośredniego dostępu do zasobów + hosta. Wykorzystywany jest mechnizm parawirtualizacji, + który pozwala na pomięcie sprzetu wirtualnego między składnikami + wirtualizacji (hostem a gościem). Tego typu rozwiązanie najczęściej + stosowane jest w przypadku urządzeń blokowych (pamięci masowych) + oraz interfejsów sieciowych. +

+

+ Niezależnie od wykorzystywanych mechanizmów, celem wirtualizacji + zawsze będzie takie dostosowanie zasobów, a żeby gośćie mogli + trakotować te urządzenia jak swóje własne. Zapewni to stabilność + działania uruchmianego na maszynach oprogramowanie, to dzięki tego + typu rozwiązaniom możemy np. normalnie alokować przestrzeń pamięci + masowych, czy formatować partycje. +

+

+ Innym ważnym zagadnieniem związanym z maszynami wirtualnymi jest + dostęp do procesora. Jak pamiętamy w systemie operacyjnym mamy dwa + trybu dystępu do procesora. Tryb jądra - pozwalający na + wykonanie dowolnych czynności oraz tryb użytkownika - + najprościej rzecz ujmując - ograniczony. Jeśli mamy uruchmiać na + maszynach systemy operacyjne, to hipernadzorcy powinni być + uruchamiani w trybie jądra. I tu jest mały problem, tryb jądra jest + zarezerwowany tylko dla jądra. Hipernadzorca + działa w trybie użytkownika (jak każdy inny proces, po za procesami + jądra). Jedną z koncepcji, która działa przez jakiś czas było + wychwytywanie przez hipernadzorcę wszystkich ograniczonych instrukcji + i emulowanie ich działania. To rozwiązanie zostało wyparte przez + rozszerzenia procesorów VT-x (Intel) oraz + AMD-V (AMD), które udostępniają odpowiednie zestawy + instrukcji, które zapewniają gościom bardziej swobodny dostęp do + procesora. +

+

16.1.3. Użycie maszyn wirtualnych

+

+ Jak wielkrotnie było wspomniane w tym rozdziale maszyny wirtualne + tworzą odizolowanie środowisko, zatem ich zastosowaniami mogą być + wszelkiego rodzaju testy. Np. jeśli korzystamy z dystrybucji Linuksa + na naszych komputerach codziennego użytku, to mogliśmy wykorzystać + maszyny wirtualne to testowania przykładów z tego materiału, lub + np. dostosowania konfiguracji systemowych do własnych potrzeb. Wiele + systemów wirtualizacji posiada mechnizm migawek, + które umożliwiają zapisanie stanu maszyny i poźniej ewentualnego + cofnięcia się do tego zapisu w razie ewentualnych problemów. +

+

+ Drugim zastosowaniem maszyn może byc sztywne wydzielenie zasobów dla + konkretnych środowisk. Przydzielenie takiej a takiej ilośći pamięci + operacyjnej, tyle i tyle rdzeni procesora oraz takiej wielkości + dysk twardy znajdujący się np. na macierzy. +

+

16.2. Kontenery

+

+ Kontenery w przeciwieństwie do maszyn wirtualnych nie są tak + odizolowane systemu hosta. Często swoą wykorzystywane jako prostsza + alternatywa. Kontenery korzystają z rozwiązań dostępnych już + w systemie, aby zapewnić swój rodzaj wirtualizacji. Najczęściej + korzystają zmożliwości zmiany katalogu głównego (chroot) + oraz określenia limitów jądra (rlimit). + Kontener można określić jako ograniczone środowisko + uruchomieniowe przeznaczone dla zbioru procesów. Oznacza to, że mogą + one nie mieć dostępu do niczego poza obrębem swojego środowiska. + Tego typu wirtualizację określa się mianem + wirtualizacji na poziomie systemu operacyjnego. +

+

+ Warto dodać, że nie ważna jest liczba kontenerów dalej host będzie + dysponowować tylko własnym bazowym jądrem. Natomiast procesy + użytkownika mogą pochodzić z innych dystrybucji niż bazowa. +

+

+ Kontenery są ograniczne za pomocą kilku opcji jądra, przez co one: +

+ +

+ Mimo iż jest to możliwe, rzadko kto zadaje sobie tyle trudu aby + poustawiać te wszystkie aspekty ręcznie. Dlatego też korzysta się + z uproszczonych systemów konteneryzacji takich jak + Docker. Nie mniej jednak za pomocą takie systemu + LXC mamy możliwość własnoręcznego skonfigurowania tych + zagadanień. W tym rozdziale nacisk położono na Docker, ale system + LXC również po krótce omowiono. +

+

16.2.1. Docker i Podman

+

+ Docker jest jednym z podstawowych narzędzi kontenerowych, jest on + bardzo łatwy do instalacji z strony projektu. Wymaga do korzystania + z kontenerów procesu serwera oraz przywilejów superużytkownika aby + uzyskać dostęp do opcji jądra. +

+

+ Alternatywą dla dockera jest Podman. Nie wymaga on + do swojego działania procesu serwera. Podman może zostać uruchomiony + z uprawnieniami zwykłego użytkownika (ang. rootless), + wówczas stosowane są inne mechanizmy do uzyskania izolacji. Jeśli + uruchomimy Podman z uprawnieniami administratora to użyje on + rozwiązań stosowanych przez Docker. Podman jest kompatybilny pod + względem wiersza polecenia z Dockerem. Oczywiście występują różnice + w implementacji, szczególnie gdy Podman działa z uprawnieniami + zwykłego użytkownika. Jeśli gdzieś zajdzie taka potrzeba rożnice + między tymi systemami zostaną wyraźnie zaznaczone. +

+

+ W tym materiale skupie się na Docker-ze. Podmana z resztą już omawiałem + w tym rozdziale materiału o RHCSA: https://morketsmerke.github.io/articles/terminallog/RedHat_-_RHCSA.html#23.containers +

+

16.2.2. Użycie Dockera

+

+ Zamieszczony w tym podrozdziale przykład użycia Docker-a + przestawia + podstawowe elementy ukazujące działanie kontenerów. Na początku + niezbędne może być utworzenie obrazu składającego się z systemu + plików oraz innych elementów definiujących kontener. Obraz ten będzie + bazować na obrazie pobranym z repozytorium. Jest to standardowe + zachowanie. Przez sam obraz można rozumieć jako + system plików kontenera. Obraz naszego kontenera przygotujemy do + uruchomienia za pomocą + pliku Dockerfile. Oczywiście nie zawsze takie działanie + jest wymagane, ponieważ moglibyśmy utworzyć kontener ręcznie, + zalogować się do jego powłoki i zainstalować powłokę BASH. Za pomocą + pliku Dockerfile utworzymy obraz, z którego będziemy mogli + uruchamiać wiele kontenerów. +

+
+xf0r3m@debian:~/lp_test$ cat Dockerfile 
+FROM alpine:latest
+RUN apk add bash
+CMD ["/bin/bash"]
+
+

+ Po zapisaniu zmian w pliku Docker-a, wydajemy poniższe + polecenie. + Opcja -t lp_test wskazuje na + identyfikator obrazu. Później łatwiej będzie go lokalizować, + ewentualnie wykorzystać do utworzenia nowego kontenera. +

+
+xf0r3m@debian:~/lp_test$ docker build -t lp_test .
+Sending build context to Docker daemon  2.048kB
+Step 1/3 : FROM alpine:latest
+latest: Pulling from library/alpine
+4abcf2066143: Pull complete 
+Digest: sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e1ad6b
+Status: Downloaded newer image for alpine:latest
+ ---> 05455a08881e
+Step 2/3 : RUN apk add bash
+ ---> Running in ad8a95239176
+fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/main/x86_64/APKINDEX.tar.gz
+fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/community/x86_64/APKINDEX.tar.gz
+(1/4) Installing ncurses-terminfo-base (6.4_p20231125-r0)
+(2/4) Installing libncursesw (6.4_p20231125-r0)
+(3/4) Installing readline (8.2.1-r2)
+(4/4) Installing bash (5.2.21-r0)
+Executing bash-5.2.21-r0.post-install
+Executing busybox-1.36.1-r15.trigger
+OK: 10 MiB in 19 packages
+Removing intermediate container ad8a95239176
+ ---> 72784ac891aa
+Step 3/3 : CMD ["/bin/bash"]
+ ---> Running in 5571f05ede12
+Removing intermediate container 5571f05ede12
+ ---> 9abc76076917
+Successfully built 9abc76076917
+Successfully tagged lp_test:latest
+
+

+ Zwróćmy uwagę na informacje zwracane przez Docker podczas przetwarzania + pliku Dockerfile. Na początku pobierany jest oficjalny + obraz kontenera dystrybucji Alpine Linux + (id: 05455a08881e) na jego podstawie + tworzony jest kontener + (id: ad8a95239176) w którym to + uruchamiany jest proces menedżera pakietów, które zdaniem jest + zainstalowanie powłoki BASH + (RUN apk add bash), jest to druga + linia pliku Dockerfile. Na podstawie tego kontenera + tworzony jest obraz (id: 72784ac891aa). + Następnie z tego obrazu tworzony jest kontener, który uruchamia proces + powłoki (id: 5571f05ede12). Ten + kontener finalnie posłuży nam za wzorzec dla naszego obrazu - wyniku + pliku Dockerfile. Po między kolejnymi czynnościamy odczytanymi + z pliku, pośrednie kontenery są usuwane. Wynik działania polecenia + możemy również zobaczyć na liście dostępnych obrazów. Dostęp do niej + możemy uzyskać za pomocą polecenia: + docker images. +

+
+xf0r3m@debian:~/lp_test$ docker images
+REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
+lp_test       latest    9abc76076917   5 minutes ago   11.6MB
+alpine        latest    05455a08881e   3 months ago    7.38MB
+
+

+ Na uruchomienie naszego kontenera mamy dwa sposoby: + nieinteraktywny, który dobry byłby gdybyśmy mieli + uruchomić jakiś skrypt powłoki. Próba uruchomienia naszego kontenera + w tym trybie wygląda w następujący sposób: +

+
+xf0r3m@debian:~/lp_test$ docker run lp_test
+xf0r3m@debian:~/lp_test$
+
+

+ Ze względu na to, że nie było żadnego polecenia dla powłoki, proces + zamknął się natychmiastowo. Na potwierdzenie możemy wyświetlić listę + wszystkich procesów (kontenerów), nawet wykonanych za pomocą + polecenia docker ps -a, polecenie + bez opcji -a spowoduje wyświetlenie + działających kontenerów. +

+
+xf0r3m@debian:~/lp_test$ docker ps -a
+CONTAINER ID   IMAGE         COMMAND       CREATED              STATUS                          PORTS     NAMES
+d4e8739ee569   lp_test       "/bin/bash"   2 seconds ago        Exited (0) 2 seconds ago                  modest_ardinghelli
+6f5067c97eb9   lp_test       "/bin/bash"   About a minute ago   Exited (0) About a minute ago             great_tharp
+
+

+ Jak możemy wywnioskować po pierwszym wpisie, to coś się działo. + Jednak nie wiele z tego użyliśmy. Jeśli chcelibyśmy uruchomić + kontener w drugim trybie interaktywnym to wówczas + musimy do podpolecenia run opcje + -it, czyli -i - praca interaktywna oraz -t + - podłączenien terminala. +

+
+xf0r3m@debian:~/lp_test$ docker run -it lp_test
+1d87aa6e43e7:/#
+
+

+ Dopóki pozostawimy tę sesje powłoki uruchomioną, doputy kontener + pozostanie uruchiomy. A w ten sposób prezentuje się lista procesów, + które są uruchomione na kontenerze: +

+
+1d87aa6e43e7:/# ps
+PID   USER     TIME  COMMAND
+    1 root      0:00 /bin/bash
+  203 root      0:00 ps
+
+

+ Proces uruchomionej powłoki (a co za tym idzie, kontenera) możemy + rownież zobaczyć wyświetlając listę procesów hosta: +

+
+root        2369  0.0  0.1   2612  2360 pts/0    Ss+  14:42   0:00 /bin/bash
+
+

+ Za tego typu zachowanie odpowiedzialna jest jedna z opcji jądra + wykorzystywana na potrzeby kontenerów - przestrzenie nazw + Dzięki tej funkcji proces może utworzy zupełnie nowy zestaw + identyfikatorów dla siebie oraz swoich procesów potomnych zaczynająć + do PID-u 1. Procesy te będą wówczas miały dostęp tylko do tego + identyfikatora. +

+

+ Jeśli mamy na to ochotę to po skończonej zabawie możemy usunąć + nieaktywne już kontenery za pomocą polecenia + docker rm identyfikator: +

+
+xf0r3m@debian:~/lp_test$ docker ps -a
+CONTAINER ID   IMAGE         COMMAND       CREATED       STATUS                      PORTS     NAMES
+1d87aa6e43e7   lp_test       "/bin/bash"   2 hours ago   Exited (0) 19 minutes ago             mystifying_gauss
+31808ed62e2a   hello-world   "/hello"      3 hours ago   Exited (0) 3 hours ago                elegant_davinci
+xf0r3m@debian:~/lp_test$ docker rm 1d87aa6e43e7
+1d87aa6e43e7
+xf0r3m@debian:~/lp_test$ docker ps -a
+CONTAINER ID   IMAGE         COMMAND    CREATED       STATUS                   PORTS     NAMES
+31808ed62e2a   hello-world   "/hello"   3 hours ago   Exited (0) 3 hours ago             elegant_davinci
+
+

Nakładkowy system plików

+

+ Inną funkcją jądra wykorzystywaną przez kontenery jest + nakładkowy system plików. Opcja ta pozwala na + utworzenie systemu plików po przez połącznie istniejących katalogów + jako warstw, wówczas zmiany przechowywane są w jednym miejscu. + Ten mechanizm składa się z trzech warstw: +

+ +

+ W przypadku Podmana bez uprawnień, wykorzystywany nakładkowy system + plików w wersji FUSE. +

+

Obsługa sieci

+

+ W przypadku Docker-a istnieje kilka metod na zapewnienie + łączności kontenerom. Najczęściej stosowanym rozwiązaniem jest + sieć z mostem wykorzystującym siecią przestrzeń nazw (netns). + Serwer Docker-a tworzy w systemie hosta interfejs sieciowy + zazwyczaj o nazwie docker0 przypisanym pierwszym adresie + z podsieci prywatnej 172.17.0.0/16 - 172.17.0.1/16. Ten interfejs + wykorzystywany do komunikacji miedzy hostem a kontenerami. + Docker wykorzystuje dodatkowe interfejsy w sieciowej + przestrzeni nazw oraz mechnizm NAT aby zapewnić kontenerom dostęp do + sieci zewnętrznych (w tym sieci lokalnej) hosta, w tym do Internetu. +

+

+ Podman bez uprawnień wykorzystuje natomiast interfejsy TAP oraz + mechanizmy przekazujące w postacji daemon slirp4netns, aby + uzyskać dostęp do sieci zewnętrznych. To rozwiązanie ma jeden + minus, kontenery niestety nie mogą łączyć się ze sobą. +

2024; COPYLEFT; ALL RIGHTS REVERSED; -- 2.39.5