WIP
This commit is contained in:
parent
c4a9a9531b
commit
3b42da7131
@ -289,3 +289,11 @@
|
||||
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}
|
||||
}
|
533
main.tex
533
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}
|
||||
<VirtualHost 192.168.1.25:80>
|
||||
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
|
||||
<Directory /ks>
|
||||
Options Indexes MultiViews
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
<Directory /images>
|
||||
Options Indexes MultiViews
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
</VirtualHost>
|
||||
\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}.
|
||||
|
||||
\begin{table}
|
||||
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{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}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user