diff --git a/.DS_Store b/.DS_Store index c3427a3..34db3ad 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/biblio.bib b/biblio.bib index 9b8b535..550b20d 100644 --- a/biblio.bib +++ b/biblio.bib @@ -288,4 +288,12 @@ title = {Magic Packet Technology}, year = 1995, url = {https://www.amd.com/system/files/TechDocs/20213.pdf} +} + +@online{bib:joe-knock-git, + author = {Joe Knockenhauer}, + title = {Single GPU Passthrough on Linux}, + year = {04/05/2021}, + url = {https://github.com/joeknock90/Single-GPU-Passthrough}, + urldate = {2023-01-06} } \ No newline at end of file diff --git a/main.pdf b/main.pdf index 28ab09c..c3e16de 100644 Binary files a/main.pdf and b/main.pdf differ diff --git a/main.tex b/main.tex index a439115..3314d67 100644 --- a/main.tex +++ b/main.tex @@ -70,7 +70,7 @@ \newcommand{\Surname}{Janota} \newcommand{\Supervisor}{$\langle$dr inż. Błażej Adamczyk$\rangle$} % dane promotora (bez $\langle$ i $\rangle$) \newcommand{\Title}{System do obsługi pracowni informatycznych z wykorzystaniem maszyn wirtualnych} % tytuł pracy po polsku -\newcommand{\TitleAlt}{A system for upporting IT labs with the use of virtual machines} % thesis title in English +\newcommand{\TitleAlt}{A system for supporting IT labs with the use of virtual machines} % thesis title in English \newcommand{\Program}{$\langle$Informatyka$\rangle$} % kierunek studiów (bez $\langle$ i $\rangle$) \newcommand{\Specialisation}{$\langle$Bazy Danych i Inżynieria Systemów$\rangle$} % specjalność (bez $\langle$ i $\rangle$) \newcommand{\Id}{$\langle$290357$\rangle$} % numer albumu (bez $\langle$ i $\rangle$) @@ -847,7 +847,7 @@ Rozwiązanie powinno spełniać następujące wymagania niefunkcjonalne: \paragraph{} Aby osiągnąć pełną automatyzację procesu instalacji i konfiguracji systemu operacyjnego na urządzeniach wykorzystano -serwer PXE, stworzony z serwera TFTP (tftp-hpa), serwera DHCP (dhcp-isc-server) oraz serwera HTTP (apache2), a także narzędzie +serwer PXE, stworzony z serwera TFTP (tftp-hpa), serwera DHCP (dhcp-isc-server) oraz serwera HTTP (Apache2), a także narzędzie cloud-init do automatycznego przeprowadzenia procesu instalacji systemu operacyjnego nadzorcy oraz narzędzie Ansible, do pełnej konfiguracji systemu operacyjnego zarządcy. @@ -1049,7 +1049,7 @@ znów pojawia się ekran wyboru obrazu maszyny. \end{figure} \paragraph{Bezpieczeństwo - zarządzanie obrazami} -Każde zapytanie do serwera zarządcy obrazów musi być zautoryzowane. Odbywa sie to poprzez token JWT, który klient wysyła +Każde zapytanie do serwera zarządcy obrazów musi być zautoryzowane. Odbywa sie to poprzez token JWT (JSON Web Token), który klient wysyła z każdym zapytaniem do serwera. Proces instalacji systemu bazowego i konfiguracji nie jest jednak chroniony, jeżeli w sieci znajdują się maszyny, które uruchomią się poprzez PXE, mogą zainstalować podstawową konfigurację systemu. Nie posiada ona jednak aplikacji klienckiej, ani żadnej konfiguracji, jedynie klucz publiczny SSH, wymagany do wykonania @@ -1285,6 +1285,162 @@ class Server: \label{fig:requireauth:listings} \end{figure} +\paragraph{} +Serwer wystawia następujące punkty końcowe (ang. endpoints): + +\begin{itemize} + \item GET \texttt{/} - przedstawia podstawowe dane o serwerze: nazwę, wersję oraz nazwę hosta, przykład odpowiedzi podano w listingu \ref{fig:response-main} + \item POST \texttt{/login} - pozwala na zalogowanie się poprzez wysłanie nazwy użytkownika i hasła, zwraca token JWT służący do autoryzacji, id użytkownika oraz jego nazwę jako potwierdzenie, przykład ciała zapytania logowania pokazano w listingu \ref{fig:request-login}, przykłady możliwych odpowiedzi pokazano w listingu \ref{fig:response-login} + \item POST \texttt{/clients} - pozwala na rejestrację klienta, przykład wymaganego ciała zapytania pokazano w listingu \ref{fig:response-register} + \item PUT \texttt{/clients} - pozwala na modyfikację danych o już zarejestrowanym kliencie, zapytania i odpowiedzi są takie same, jak dla żądań rejestracji klientów + \item GET \texttt{/clients/adres\_mac} - pozwala na pobranie danych o zadanym kliencie z serwera, możliwe odpowiedzi pokazano w listingu \ref{fig:response-client-data-get} + \item GET \texttt{/clients/adres\_mac/vms} - pozwala na pobranie listy numerów id obrazów przypisanych do klienta o podanym adresie MAC, możliwe odpowiedzi ukazano w listingu \ref{fig:response-list-vms} + \item GET \texttt{/images/id\_obrazu} - pozwala na pobranie danych o obrazie o zadanym numerze id, możliwe odpowiedzi pokazano w listingu \ref{fig:response-get-image-data} + \item GET \texttt{/images/id\_obrazu/download} - pozwala na pobranie obrazu o zadanym numerze id +\end{itemize} + +\begin{figure}[hb] + \centering + \begin{lstlisting} +HTTP200: +{ + "server_name": "VALHALLA", + "server_version": "v0.0.1", + "host": "127.0.0.1" +} + \end{lstlisting} + \caption{Przykład możliwej odpowiedzi na zapytanie pod punkt końcowy /} + \label{fig:response-main} +\end{figure} + +\begin{figure}[hb] + \centering + \begin{lstlisting} + { + "username": "user", + "password": "sekret_password" + } + \end{lstlisting} + \caption{Przykład prawidłowego ciała żądania logowania} + \label{fig:request-login} +\end{figure} + + +\begin{figure}[hb] + \centering + \begin{lstlisting} +HTTP202 (poprawne dane): +{ + "token": "xxxxxxxxx", + "user_id": "1", + "username": "user" +} +HTTP401 (niepoprawne dane): +{ + "data": null, + "error": "Auth error", + "message": "Invalid login data" +} + \end{lstlisting} + \caption{Możliwe odpowiedzi na żądanie logowania od serwera} + \label{fig:response-login} +\end{figure} + +\begin{figure}[hb] + \centering + \begin{lstlisting} +Poprawne zapytanie: +{ + "mac_address": "00:00:00:00:00:00:00:62", + "ip_address": "192.168.1.12", + "hostname": "test", + "client_version": "v0.0.1alpha", + "vm_list_on_machine": [] +} +Odpowiedz: HTTP201 +{ + "success": true +} +Niepoprawne zapytanie: +{ + "mac_address": "00:00:00:00:00:00:00:62", + "ip_address": "192.168.1.12", + "client_version": "v0.0.1alpha", + "vm_list_on_machine": [] +} +Odpowiedz: HTTP400 +{ + "data": null, + "error": "'hostname'", + "message": "Internal server error" +} + \end{lstlisting} + \caption{Możliwe zapytania i odpowiedzi serwera na żądanie rejestracji klienta} + \label{fig:response-register} +\end{figure} + +\begin{figure}[hb] + \centering + \begin{lstlisting} +HTTP200 (istniejacy adres MAC): +{ + "client_version": "v0.0.1alpha", + "hostname": "test", + "ip_address": "192.168.1.12", + "mac_address": "00:00:00:00:00:00:00:62" +} +HTTP404 (nieistniejacy adres MAC): +{ + "data": null, + "error": null, + "message": "Client not found in database" +} + \end{lstlisting} + \caption{Możliwe odpowiedzi serwera na zapytanie o dane zadanego klienta} + \label{fig:response-client-data-get} +\end{figure} + +\begin{figure}[hb] + \centering + \begin{lstlisting} +HTTP200 (istniejacy adres MAC): +[ + 1 +] +HTTP404 (nieistniejacy adres MAC): +{ + "data": null, + "error": null, + "message": "Client not found in database" +} + \end{lstlisting} + \caption{Mozliwe odpowiedzi serwera na zapytanie o obrazy przypisane do zadanego hosta} + \label{fig:response-list-vms} +\end{figure} + +\begin{figure}[hb] + \centering + \begin{lstlisting} +HTTP200 (instniejacy obraz): +{ + "image_file": "ubuntu.qcow2", + "image_hash": "dbdc4d7f10511387ef89ffc503080b92", + "image_id": "1", + "image_name": "ubuntu22", + "image_name_version_combo": "ubuntu22@v1.0.0", + "image_version": "v1.0.0" +} +HTTP404 (nieistniejacy obraz): +{ + "data": null, + "error": null, + "message": "Image not found in database" +} + \end{lstlisting} + \caption{Możliwe odpowiedzi serwera na zapytanie o dane zadanego obrazu} + \label{fig:response-get-image-data} +\end{figure} + \paragraph{} Ostatnim ważnym komponentem aplikacji jest klasa \texttt{ServerConfig}. Odpowiada ona za odczyt i parsowanie plików konfiguracyjnych oraz odczytanie wartości ustawionych zmiennych środowiskowych i nadpisanie odpowiednich wartości w konfiguracji. @@ -1312,71 +1468,115 @@ Aplikacja klienta została podzielona na klika podstawowych modułów: \end{itemize} \paragraph{} +Sprawdzenie danych o maszynie odbywa się w kilku krokach: aby pobrać adres IP maszyny, program nawiązuje połączenie z serwerem +DNS Google (adres IP: \texttt{8.8.8.8}), a następnie sprawdza nazwę gniazda (ang. socket), które połączyło się z siecią. +Adres MAC jest sprawdzany przez bibliotekę \texttt{get\_mac\_address}, liczba rdzeni procesora przez bibliotekę \texttt{os}, a +ilość pamięci RAM poprzez bibliotekę \texttt{psutil} (bibiloteka zwraca liczbę bajtów pamięci, a reszta aplikacji wymaga liczby gigabajtów, stąd wymagana była konwersja). +Implementacja tych funkcjonalności, wraz z odczytem i parsowaniem plików konfiguracyjnych, znajduje się w klasie \texttt{MachineData} +\paragraph{} +Obsługa komunikacji z serwerem została umieszczona w klasie \texttt{ValhallaServer}. Za pomocą biblioteki \texttt{requests} +wysyłane są zapytania do serwera. Jeżeli wygaśnie token JWT, wysyłane jest zapytanie służące do zalogowania się do systemu, +a następnie ponawiane jest poprzednie zapytanie. Dane z serwera są przekazywane w formacie JSON. +Zaraz po uruchomieniu aplikacji klienckiej wysyłane jest żądanie rejestracji maszyny, lub, jeżeli maszyna już jest zarejestrowana, +następuje aktualizacja danych o maszynie. Następnie pobierana jest lista obrazów przypisanych do konkretnej maszyny, a same obrazy są pobierane. +Wszystkie te operacje są obsługiwane przez klasę \texttt{ValhallaServer}. -% Jeśli „Specyfikacja wewnętrzna”: -% \begin{itemize} -% \item przedstawienie idei -% \item architektura systemu -% \item opis struktur danych (i organizacji baz danych) -% \item komponenty, moduły, biblioteki, przegląd ważniejszych klas (jeśli występują) -% \item przegląd ważniejszych algorytmów (jeśli występują) -% \item szczegóły implementacji wybranych fragmentów, zastosowane wzorce projektowe -% \item diagramy UML -% \end{itemize} -% -% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % -% % Pakiet minted wymaga odkomentowania w pliku config/settings.tex % -% % importu pakietu minted: \usepackage{minted} % -% % i specjalnego kompilowania: % -% % pdflatex -shell-escape praca % -% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % -% -% -% Krótka wstawka kodu w linii tekstu jest możliwa, np. \lstinline|int a;| (biblioteka \texttt{listings})% lub \mintinline{C++}|int a;| (biblioteka \texttt{minted}) -% . -% Dłuższe fragmenty lepiej jest umieszczać jako rysunek, np. kod na rys \ref{fig:pseudokod:listings}% i rys. \ref{fig:pseudokod:minted} -% , a naprawdę długie fragmenty – w załączniku. -% -% -% \begin{figure} -% \centering -% \begin{lstlisting} -% class test : public basic -% { -% public: -% test (int a); -% friend std::ostream operator<<(std::ostream & s, -% const test & t); -% protected: -% int _a; -% -% }; -% \end{lstlisting} -% \caption{Pseudokod w \texttt{listings}.} -% \label{fig:pseudokod:listings} -% \end{figure} -% -% %\begin{figure} -% %\centering -% %\begin{minted}[linenos,frame=lines]{c++} -% %class test : public basic -% %{ -% % public: -% % test (int a); -% % friend std::ostream operator<<(std::ostream & s, -% % const test & t); -% % protected: -% % int _a; -% % -% %}; -% %\end{minted} -% %\caption{Pseudokod w \texttt{minted}.} -% %\label{fig:pseudokod:minted} -% %\end{figure} +\paragraph{} +Obsługa uruchamiania maszyn wirtualnych sprowadza się do skopiowania pliku-wzorca skryptu uruchamiającego maszynę wirtualną QEMU do odpowiedniego +katalogu, podmianie tymczasowych wartości liczby rdzeni, ilości pamięci RAM i ścieżki do obrazu dysku maszyny na prawidłowe wartości +wyznaczone przez program w klasie \texttt{MachineData} oraz na podstawie danych obrazów pobranych z serwera, +nadaniu odpowiednich uprawnień dla pliku skryptu (bit wykonywalności - execute) oraz na uruchomieniu skryptu i zablokowaniu wykonywania aplikacji. +Po wyjściu z maszyny wirtualnej, ekran wyboru znów się uruchamia i znów pozwala na wybór maszyny do uruchomienia. + +\paragraph{Pliki konfiguracyjne PXE} +Najważniejszy fragment pliku konfiguracyjnego serwera DHCP zawarto w listingu \ref{fig:config-dhcp}. Ustawia on wskaźnik na serwer TFTP serwujący +pliki wymagane do uruchomienia środowiska instalacyjnego. + +Z kolei w listingu \ref{fig:config-grub} zawarto plik \texttt{grub.cfg}, który konfiguruje ekran wyboru instalatora oraz obsługuje uruchomienie +minimalistycznego jądra systemu Linux, uruchamiającego pełny instalator systemu. + +W listingu \ref{fig:config-apache} ukazano konfigurację serwera Apache2, który serwuje obrazy \texttt{.iso} instalatorów. +\begin{figure}[hb] + \centering + \begin{lstlisting} +allow bootp; +allow booting; +# PXE/iPXE BOOT CONFIGURATION FOR VALHALLA SERVER +next-server 192.168.1.25; +filename "bootx64.efi"; + \end{lstlisting} + \caption{Fragment konfiguracji serwera DHCP} + \label{fig:config-dhcp} +\end{figure} + +\begin{figure}[hb] + \centering + \begin{lstlisting} +set default="0" +set timeout=-30 + +if loadfont unicode ; then + set gfxmode=auto + set locale_dir=\$prefix/locale + set lang=en_US +fi +terminal_output gfxterm + +set menu_color_normal=white/black +set menu_color_highlight=black/light-gray +if background_color 44,0,30; then + clear +fi + +function gfxmode { + set gfxpayload="\${1}" + if [ "\${1}" = "keep" ]; then + set vt_handoff=vt.handoff=7 + else + set vt_handoff= + fi +} + +set linux_gfx_mode=keep +export linux_gfx_mode +menuentry 'Install Ubuntu 22.04' { + gfxmode \$linux_gfx_mode + linux vmlinuz ip=dhcp url=http://192.168.1.25/images/ubuntu22/ubuntu.iso autoinstall ds=nocloud-net\;s=http://192.168.1.25/ks/ cloud-config-url=/dev/null fsck.mode=skip + initrd initrd +} + \end{lstlisting} + \caption{Plik konfiguracyjny \texttt{grub.cfg}} + \label{fig:config-grub} +\end{figure} + +\begin{figure}[hb] + \centering + \begin{lstlisting} + + ServerAdmin root@192.168.1.25 + DocumentRoot / + ServerName pxe-ks.nixenos.ovh + ErrorLog \${APACHE_LOG_DIR}/ks-server.example.com-error_log + CustomLog \${APACHE_LOG_DIR}/ks-server.example.com-access_log common + + Options Indexes MultiViews + AllowOverride All + Require all granted + + + Options Indexes MultiViews + AllowOverride All + Require all granted + + + \end{lstlisting} + \caption{Fragment konfiguracji serwera Apache2} + \label{fig:config-apache} +\end{figure} % TODO \chapter{Weryfikacja i walidacja} @@ -1394,54 +1594,133 @@ W ramach drugiej fazy testów ręcznie wymuszano proces synchronizacji zmian z s pracującej pod kontrolą systemu Ubuntu Linux w wersji 22.04 LTS wraz ze środowiskiem graficznym Gnome. Obraz dysku zajmował 12GB. Podczas tych testów sprawdzano czas potrzebny na pobranie przykladowego obrazu, korzystając z gigabitowej karty sieciowej, dostępnej w maszynie. +Do pomiaru czasu wykorzystano narzędzie \texttt{time}, dostępne w większości systemów wywodzących się z rodziny UNIX. + W ramach trzeciej fazy testów, poddano ocenie wydajność i odczucia płynące z używania maszyny wirtualnej. -\begin{itemize} -\item sposób testowania w ramach pracy (np. odniesienie do modelu V) -\item organizacja eksperymentów -\item przypadki testowe zakres testowania (pełny/niepełny) -\item wykryte i usunięte błędy -\item opcjonalnie wyniki badań eksperymentalnych -\end{itemize} +\paragraph{Pomiary czasu} +Pomiary czasu, w jakim urządzenie przeprowadzało instalację, powtórzono dziesięciokrotnie. Wyniki zostały przedstawione w tabeli \ref{id:tab:czas-konfiguracja}. + +Pomiary czasu pobierania obrazów także wykonano dziesięciokrotnie, a wyniki zamieszczono w tabeli \ref{id:tab:czas-pobieranie}. + +Zauważono, że najdłuższym procesem jest ładowanie obrazu do pamięci serwera, samo jego przesyłanie trwa od 15 do 20\% zmierzonego czasu. + +\paragraph{Wykryte błędy} +Podczas testów wykryto kilka błędów. Pierwszym z nich było błędne ustawianie uprawnień pliku skryptu uruchamiającego +maszynę wirtualną. Kolejny z nich dotyczył błędu w konfiguracji serwera PXE, który uniemożliwiał uruchomienie instalatora. +Po zmianie konfiguracji tak, by podstawowe środowisko uruchomieniowe korzystało z serwera HTTP do pobierania obrazów +\texttt{.iso}, uruchamianie instalatora działało prawidłowo. + +\paragraph{Wyniki badań użytkowych} +System uruchamiany poprzez maszynę wirtualną działa sprawnie i możliwe jest korzystanie z niego. +Oczywiście wydajność, szczególnie graficzna, pozostawia wiele do życzenia. Problemy związane z niewystarczającą mocą obliczeniową +do wirtualizacji karty graficznej były najbardziej widoczne podczas korzystania z przeglądarki internetowej Mozilla Firefox, gdzie +przeglądanie stron WWW było możliwe, lecz wydajność przy otwartych 5-6 kartach znacząco malała i system stawał się niezdatny do użycia. -\begin{table} +% \begin{itemize} +% \item sposób testowania w ramach pracy (np. odniesienie do modelu V) +% \item organizacja eksperymentów +% \item przypadki testowe zakres testowania (pełny/niepełny) +% \item wykryte i usunięte błędy +% \item opcjonalnie wyniki badań eksperymentalnych +% \end{itemize} + + + +\begin{table}[hb] \centering -\caption{Nagłówek tabeli jest nad tabelą.} -\label{id:tab:wyniki} -\begin{tabular}{rrrrrrrr} -\toprule - & \multicolumn{7}{c}{metoda} \\ - \cmidrule{2-8} - & & & \multicolumn{3}{c}{alg. 3} & \multicolumn{2}{c}{alg. 4, $\gamma = 2$} \\ - \cmidrule(r){4-6}\cmidrule(r){7-8} - $\zeta$ & alg. 1 & alg. 2 & $\alpha= 1.5$ & $\alpha= 2$ & $\alpha= 3$ & $\beta = 0.1$ & $\beta = -0.1$ \\ -\midrule - 0 & 8.3250 & 1.45305 & 7.5791 & 14.8517 & 20.0028 & 1.16396 & 1.1365 \\ - 5 & 0.6111 & 2.27126 & 6.9952 & 13.8560 & 18.6064 & 1.18659 & 1.1630 \\ - 10 & 11.6126 & 2.69218 & 6.2520 & 12.5202 & 16.8278 & 1.23180 & 1.2045 \\ - 15 & 0.5665 & 2.95046 & 5.7753 & 11.4588 & 15.4837 & 1.25131 & 1.2614 \\ - 20 & 15.8728 & 3.07225 & 5.3071 & 10.3935 & 13.8738 & 1.25307 & 1.2217 \\ - 25 & 0.9791 & 3.19034 & 5.4575 & 9.9533 & 13.0721 & 1.27104 & 1.2640 \\ - 30 & 2.0228 & 3.27474 & 5.7461 & 9.7164 & 12.2637 & 1.33404 & 1.3209 \\ - 35 & 13.4210 & 3.36086 & 6.6735 & 10.0442 & 12.0270 & 1.35385 & 1.3059 \\ - 40 & 13.2226 & 3.36420 & 7.7248 & 10.4495 & 12.0379 & 1.34919 & 1.2768 \\ - 45 & 12.8445 & 3.47436 & 8.5539 & 10.8552 & 12.2773 & 1.42303 & 1.4362 \\ - 50 & 12.9245 & 3.58228 & 9.2702 & 11.2183 & 12.3990 & 1.40922 & 1.3724 \\ -\bottomrule -\end{tabular} +\caption{Wyniki pomiaru czasu pobierania obrazu maszyny wirtualnej} +\label{id:tab:czas-pobieranie} +\begin{tabular}{|l|l|} + \hline + \textbf{Numer pomiaru} & \textbf{Zmierzony czas} \\ \hline + 1 & 4min 40.885s \\ \hline + 2 & 4min 59.926s \\ \hline + 3 & 5min 1.590s \\ \hline + 4 & 5min 11.377s \\ \hline + 5 & 5min 5.292s \\ \hline + 6 & 4min 59.955s \\ \hline + 7 & 5min 2.235s \\ \hline + 8 & 4min 58.982s \\ \hline + 9 & 5min 3.758s \\ \hline + 10 & 5min 1.214s \\ \hline + \end{tabular} \end{table} +\begin{table}[hb] +\centering +\caption{Wyniki pomiaru czasu konfiguracji systemu zarządcy klienta} +\label{id:tab:czas-konfiguracja} +\begin{tabular}{|l|l|} + \hline + \textbf{Numer pomiaru} & \textbf{Zmierzony czas} \\ \hline + 1 & 15min 48.290s \\ \hline + 2 & 13min 36.530s \\ \hline + 3 & 10min 40.210s \\ \hline + 4 & 10min 15.700s \\ \hline + 5 & 10min 46.600s \\ \hline + 6 & 9min 36.510s \\ \hline + 7 & 9min 06.420s \\ \hline + 8 & 9min 14.190s \\ \hline + 9 & 9min 15.530s \\ \hline + 10 & 10min 12.950s \\ \hline + \end{tabular} +\end{table} % TODO \chapter{Podsumowanie i wnioski} -\begin{itemize} -\item uzyskane wyniki w świetle postawionych celów i zdefiniowanych wyżej wymagań -\item kierunki ewentualnych danych prac (rozbudowa funkcjonalna …) -\item problemy napotkane w trakcie pracy -\end{itemize} +% \begin{itemize} +% \item uzyskane wyniki w świetle postawionych celów i zdefiniowanych wyżej wymagań +% \item kierunki ewentualnych danych prac (rozbudowa funkcjonalna …) +% \item problemy napotkane w trakcie pracy +% \end{itemize} + +\paragraph{} +Uzyskano prawie pełną automatyzację procesu instalacji systemu nadzorcy. Administrator musi wykonać jedynie 4 manualne kroki: +dodanie adresów MAC obsługiwanych maszyn do konfiguracji serwera DHCP i konfiguracji skryptów Ansible, wywołanie komendy wysyłającej ,,magic packet'' do +wyznaczonych urządzeń, potwierdzenie instalacji na każdym z urządzeń oraz wywołanie skryptu Ansible do konfiguracji urządzeń. + +Dzięki wykorzystaniu QEMU udało się zapewnić użycie maszyn wirtualnych oraz łatwość tworzenia własnych obrazów dla nich. Osiągnięto +także ,,bezstanowość'', maszyny wirtualne po restarcie wracają do swojego pierwotnego stanu sprzed wszsytkich zmian wprowadzonych +przez ostatniego użytkownika. + +Użycie PXE, cloud-init oraz Ansible jako systemu automatyzującego instalację systemu nadzorcy pozwoliło na zapewnienie +modularności i możliwości wbudowania rozwiązania w już istniejącą architekturę sieciową. + +\paragraph{} +Niestety wydajność systemu zarządzania obrazami maszyn nie jest satysfakcjonująca. Największym problemem obecnego rozwiązania jest +konieczność załadowania całego wysyłanego pliku do pamięci aplikacji, przez co wydajność jest mocno ograniczona. Dobrym rozwiązaniem tego +problemu byłoby zintegrowanie serwera aplikacji z serwerem Apache2, lub Nginx, gdzie to dedykowany serwer HTTP wysyłałby duże pliki, +a serwer zarządzający obsługiwałby tylko przechowywanie danych. Ciekawym rozwiązaniem tego problemu byłoby też użycie narzędzia rsync, +którego zaawansowane wykrywanie różnic w plikach i podmiana jedynie tych właśnie róznic na pewno znacząco przyspieszyłoby +działanie serwera obrazów. Kolejnym problemem jest kwestia bezpieczeństwa. Aby możliwe było pełne zautomatyzowanie procesu +zdecydowano się na użycie tylko jednego użytkownika dla wszystkich klientów. Jest to duże ryzyko ze względów bezpieczeństwa, +ponieważ potencjalny atakujący może wtedy odczytać adresy MAC wszystkich urządzeń i podszywać się pod nie. + +\paragraph{} +Podobnie jak w przypadku serwera, wydajność systemu w maszynach wirtualnych nie jest satysfakcjonująca. Największym problemem jest +wydajność graficzna. Rozwiązaniem tego problemu byłoby wprowadzenie mechanizmu przekazywania kontroli nad kartą graficzną +systemowi gościa maszyny wirtualnej. Aby takie podejście było możliwe w przypadku posiadania tylko jednej karty graficznej, +wymagane byłoby jej wcześniejsze odpięcie od systemu zarządcy. Istnieje kilka projektów\cite{bib:joe-knock-git}, które wykorzystują mechanizm +,,zaczepów'' (ang. hooks) do odłączania urządzeń PCI przy uruchamianiu maszyny wirtualnej i podpinania ich z powrotem do systemu +zarządcy po wyłączeniu maszyny wirtualnej. Jednak to rozwiązanie wymaga skomplikowanej konfiguracji na maszynach klienckich, +między innymi wybrania odpowiednich urządzeń PCI do przekazania do maszyny wirtualnej, gdzie adresy tych urządzeń będą różne +na każdej z maszyn, a także ta konfiguracja byłaby różna dla każdego typu urządzeń. Napisanie programu, który w dynamiczny sposób +tworzyłby odpowiednie pliki konfiguracyjne, byłoby na pewno skomplikowane, ale możliwe. +\paragraph{} +Potencjalnym kierunkiem rozwoju tej aplikacji byłoby przeprojektowanie metody synchronizacji obrazów. Optymalną opcją wydaje się +użycie narzędzia rsync, aby zapewnić inkrementalne aktualizacje obrazów, bez potrzeby pobierania całości. Sporym ułatwieniem +pracy dla administratora byłoby także przygotowanie graficznego interfejsu użytkownika do zarządzania serwerem. +Po stronie klienta +dobrym torem rozwoju byłoby opracowanie metody na przekazywanie kontroli nad kartą graficzną systemowi gościa w sposób w pełni +zautomatyzowany. Ważnym krokiem byłoby także dopracowanie interfejsu użytkownika. +\paragraph{} +Powyżej przedstawione propozycje rozwoju są tylko sugestią, ponieważ architektura aplikacji pozwala na łatwą integrację z innymi +rozwiązaniami automatyzującymi. Dzięki temu przedstawiony projekt jest silnie rozwojowy, a przez użycie rozwiązań na licencjach +Wolnego Oprogramowania możliwe jest wykorzystanie go w placówkach naukowych bardzo niskim kosztem. \backmatter @@ -1456,28 +1735,42 @@ W ramach trzeciej fazy testów, poddano ocenie wydajność i odczucia płynące \chapter{Spis skrótów i symboli} \begin{itemize} -\item[DNA] kwas deoksyrybonukleinowy (ang. \ang{deoxyribonucleic acid}) -\item[MVC] model -- widok -- kontroler (ang. \ang{model--view--controller}) -\item[$N$] liczebność zbioru danych -\item[$\mu$] stopnień przyleżności do zbioru -\item[$\mathbb{E}$] zbiór krawędzi grafu -\item[$\mathcal{L}$] transformata Laplace'a +\item[SFTP] Protokół Bezpiecznego Przesyłu Plików (ang. \ang{Secure File Transfer Protocol}) +\item[SSH] Bezpieczna Powłoka (ang. \ang{Secure SHell}) +\item[HTTP] Protokół Przesyłu HiperTekstu (ang. \ang{HyperText Transfer Protocol}) +\item[WWW] OgólnoŚwiatowa Sieć (ang. \ang{World Wide Web}) +\item[CERN] Europejska Organizacja Badań Jądrowych (fr. \ang{Organisation Européenne pour la Recherche Nucléaire}) +\item[TCP] Protokół Sterowania Transmisją (ang. \ang{Transmission Control Protocol}) +\item[KVM] Maszyna Wirtualna Jądra (ang. \ang{Kernel Virtual Machine}) +\item[MMU] Jednostka Zarządzająca Pamięcią (ang. \ang{Memory Management Unit}) +\item[IOMMU] Jednostka Zarządzająca Pamięcią Wejścia Wyjścia (ang. \ang{Input Output Memory Management Unit}) +\item[DHCP] Protokół Dynamicznego Konfigurowania Hostów (ang. \ang{Dynamic Host Configuration Protocol}) +\item[BOOTP] Protokół Bootstrap (ang. \ang{BOOTstrap Protocol}) +\item[TFTP] Trywialny Protokół Przesyłu Plików (ang. \ang{Trivial File Transfer Protocol}) +\item[PXE] Przeduruchomieniowe Środowisko Uruchomieniowe (ang. \ang{Preboot Execution Environment}) +\item[WOL] Uruchom Poprzez LAN (ang. \ang{Wake On LAN}) +\item[WISM] ang. \ang{Windows System Image Manager} +\item[DISM] ang. \ang{Deployment Image Servicing and Management} +\item[AD] ang. \ang{Active Directory} +\item[JWT] ang. \ang{JSON Web Token} +\item[JSON] Notacja Obiektów JavaScript (ang. \ang{JavaScript Object Notation}) +\item[ORM] Mapowanie obiektowo-relacyjne (ang. \ang{Object-Relational Mapping}) \end{itemize} % TODO -\chapter{Źródła} - -Jeżeli w pracy konieczne jest umieszczenie długich fragmentów kodu źródłowego, należy je przenieść w to miejsce. - -\begin{lstlisting} -if (_nClusters < 1) - throw std::string ("unknown number of clusters"); -if (_nIterations < 1 and _epsilon < 0) - throw std::string ("You should set a maximal number of iteration or minimal difference -- epsilon."); -if (_nIterations > 0 and _epsilon > 0) - throw std::string ("Both number of iterations and minimal epsilon set -- you should set either number of iterations or minimal epsilon."); -\end{lstlisting} +% \chapter{Źródła} +% +% Jeżeli w pracy konieczne jest umieszczenie długich fragmentów kodu źródłowego, należy je przenieść w to miejsce. +% +% \begin{lstlisting} +% if (_nClusters < 1) +% throw std::string ("unknown number of clusters"); +% if (_nIterations < 1 and _epsilon < 0) +% throw std::string ("You should set a maximal number of iteration or minimal difference -- epsilon."); +% if (_nIterations > 0 and _epsilon > 0) +% throw std::string ("Both number of iterations and minimal epsilon set -- you should set either number of iterations or minimal epsilon."); +% \end{lstlisting} % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % @@ -1503,10 +1796,8 @@ if (_nIterations > 0 and _epsilon > 0) W systemie do pracy dołączono dodatkowe pliki zawierające: \begin{itemize} -\item źródła programu, -\item dane testowe, -\item film pokazujący działanie opracowanego oprogramowania lub zaprojektowanego i~wykonanego urządzenia, -\item itp. +\item źródła programów oraz pliki konfiguracyjne i skrypty +\item film pokazujący działanie opracowanego oprogramowania \end{itemize}