diff --git a/SPRAWOZDANIE.md b/SPRAWOZDANIE.md index cb84f2d..6eddc2f 100644 --- a/SPRAWOZDANIE.md +++ b/SPRAWOZDANIE.md @@ -1,14 +1,59 @@ # Robert Marciniak 149500 Grupa 61 ## Projekt 109. Serwer PXE + narzędzie generujące skrypt instalacyjny dla wybranej dystrybucji Linuxa -### Sprawozdanie: +## Sprawozdanie: #### Opis: -Główną częścią projektu jest skrypt ```pykickxe.py``` zgodny pythonem 2.7. Na podstawie opcji zawartych w ```pykickxe.conf``` i argumentów konsolowych +Główną częścią projektu jest skrypt ```pykickxe.py``` zgodny pythonem 2.7. Na podstawie opcji zawartych w ```pykickxe.conf``` i argumentów wiersza poleceń zastępuje znaczniki zaczynające się od znaku ```$``` (np. ```$KERNEL```) w pliku ```pxelinux.cfg/autoinstall.menu.source``` na określone zdefiniowane w -```pykickxe.conf``` po czym kopiuje pliki potrzebne do uruchomienia instalacji sieciowej do folderu podanego przez użytkownika - np. korzenia serwera ftp +```pykickxe.conf``` po czym kopiuje pliki potrzebne do uruchomienia instalacji sieciowej do folderu podanego przez użytkownika - korzenia serwera ftp. Drugą częścią projektu jest założenie, że istnieje poprawnie skonfigurowany serwer DHCP z którego będzie korzystać karta sieciowa komputera na którym ma -zostać zainstalowany system operacyjny oraz poprawnie skonfigurowany serwer FTP z którego instalator po załadowaniu do pamięci operacyjnej będzie pobierać -pliki pełnego systemu operacyjnego +zostać zainstalowany system operacyjny oraz poprawnie skonfigurowany serwer FTP z którego instalator sieciowy po załadowaniu do pamięci operacyjnej będzie pobierać +pliki pełnego systemu operacyjnego. + +[Cały projekt jest dostępny tutaj](https://github.com/Esgariot/PXE_Install) + +#### Wymagania: +* karta sieciowa wspierająca bootowanie sieciowe +* serwer DHCP widoczny dla karty sieciowej klienta +* serwer udostępniający potrzebne pliki widoczny dla karty sieciowej klienta +* potrzebne pliki: + * obraz pxelinux.0 + * pliki konfiguracji dla pxelinux.0 w drzewie folderu pxelinux.cfg + * poprawny wpis menu bootowania w pliku tekstowym pxelinux.cfg/default + * pliki binarne modułów wykorzystywanych przez konfigurację pxelinux.0 +* odpowiednie dla klienta uprawnienia dostępu do zawartości udostępnianej przez serwer +* pliki związane z instalacją dystrybucji + +#### Pykickxe: +```$ python pykickxe.py -h``` +``` +usage: Pykickxe [-h] [-l] [-d] [-v] [-t TFTP_ROOT] [--auto_cfg AUTO_CFG] + {debian,fedora,centos} + +a Python PXE and autoinstall tool + +positional arguments: + {debian,fedora,centos} + pick a linux distro to download, unpack and append the + PXE config to (Debian or Fedora for now) + +optional arguments: + -h, --help show this help message and exit + -l, --list list some default options + -d, --download Download (not really working) + -v, --verbose (also not really working) + print some of what this is doing at any moment + -t TFTP_ROOT, --tftp_root TFTP_ROOT + pass an absolute path to tftp root directory + --auto_cfg AUTO_CFG pass an absolute path to Kickstart file + +This program requires that the root from where pxe gets files has following +structure: /<~copied content of iso image~> for everything, especially +/images/pxeboot for kernel and ramdisk, kickstart file in +/ks.cfg or passed manually, (will get copied to util/ks.cfg) +``` + + #### Pliki: ``` ├── dnsmasqappend.conf # przykładowa konfiguracja - dodać do /etc/dnsmasq.conf @@ -35,28 +80,12 @@ pliki pełnego systemu operacyjnego └── reboot.c32 ``` -#### Przebieg: -1. Wstęp - żeby uruchomic sieciowo instalacje systemu potrzebne jest - * wsparcie dla PXE, - * serwer, który będzie udostępniał kernel i ramdisk, - * obraz kernela pxelinux.0 - * drzewo konfiguracje pxelinux.0 w drzewie katalogów pxelinux.cfg - * poprawne wpisy do pxelinux.cfg/default - ścieżki do plików na serwerze, parametry kernela po APPEND - - w folderze tftproot znajdują się powyższe, z wyjątkiem plików związanych z dystrybucjami. - -2. Po pobraniu uruchomieniu kernela i załadowaniu ramdisku z serwera tftp uruchomionego przez dnsmasq system szuka drzewa katalogów związanych z dystrybucją. - Znajduje wszystko, czego potrzebuje dzięki serwerowi vsftp (z jakiegoś powodu dnsmasqowy tftp nie udostępnia plików jako "normalny" ftp, tylko dla PXE). - W korzeniu serwera ftp jest katalog ```//``` z którego pobiera pliki host na którym jest uruchomiona instalacja. Można też przeprowadzić instalację przez Internet i nie udostępniać całej dystrybucji na serwerze, ale ma to bardzo małe szanse powodzenia przez duże opóźnienie, które nie jest brane pod uwagę przez dracut -3. Żeby to wszystko zautomatyzować do parametrów kernela RedHatowych dystrybucji dodaję ```ks= <ścieżka-do-pliku-kickstart>``` -4. Wszystko powyższe można zrobić manualnie, mój skrypt pykickxe.py dąży do zautomatyzowania tego ( z różną skutecznością ). Np. wybór pliku kickstart, kernela i parametrów - kernela odbywa się na zasadzie złożenia pliku kickstart, znalezieniu znaczników do zastąpienia zaczynających się od ```$``` w ```/pxelinux.cfg/autoinstall.menu``` i skopiowania pliku kickstart do ```/util/``` #### pykickxe.conf: Plik konfiguracji ```pykickxe.py``` zgodny z formatem .INI i dzięki temu parsowalny przez bibliotekę ConfigParser pythona 2.7. Format .INI pozwala na wykorzystanie makr w postaci ```%()``` co jest przydatne np. używając -```method=%(ftp_url)s/%(dir)s```, bo ConfigParser sam rozszerzy to do ```method=ftp://192.168.0.1/centos``` +```method=%(ftp_url)s/%(dir)s```, bo ConfigParser sam rozszerzy to do ```method=ftp://192.168.0.1/centos``` Podzielony jest na sekcje postaci ```[DEFAULT]``` i ```[]```. w ```[DEFAULT]``` znajdują się opcje główne, niezależne od dystrybucji: @@ -81,31 +110,50 @@ w ```[]``` znajdują się opcje zależne od konkretnej dystry * ```append = initrd\=%(dir)/initrd.gz``` - parametry kernela potrzebne do uruchomienia danej dystrybucji * ```url = ``` - adres pod którym można znaleźć aktualne co do ```last_updated``` pliki instalacji sieciowej danej dystrybucji (nie zaimplementowane) -#### parametry wywołania: -python pykickxe.py -h: + +### Przebieg: +[Posłużyłem się tym poradnikiem](http://www.tecmint.com/install-pxe-network-boot-server-in-centos-7/) +#### konfiguracja interfejsów sieciowych: +W ```/etc/network/interfaces``` dodałem wpis dla interfejsu sieciowego, na którym będzie udostępniany serwer dhcp i ftp ``` -usage: Pykickxe [-h] [-l] [-d] [-v] [-t TFTP_ROOT] [--auto_cfg AUTO_CFG] - {debian,fedora,centos} +auto eth1 +allow-hotplug eth1 +iface eth1 inet static + address 192.168.0.1 # ten sam adres co w ftp_url pliku pykickxe.conf + netmask 255.255.255.0 + broadcast 192.168.0.255 + gateway 10.0.2.15 +``` +#### konfiguracja dnsmasq: +[Źródło - Debian wiki](https://wiki.debian.org/PXEBootInstall#Another_Way_-_use_Dnsmasq) +``` +dhcp-range=192.168.0.3,192.168.0.253,255.255.255.0,1h +dhcp-boot=pxelinux.0,pxeserver,192.168.0.2 # adres z którego karta sieciowa klienta będzie pobierać obraz kernela i ramdisku, potem przełączy się na adres ftp +pxe-service=x86PC,"Install Linux",pxelinux +enable-tftp +tftp-root=/srv/tftp # ścieżka korzenia serwera ftp +``` -a Python PXE and autoinstall tool +#### konfiguracja vsftpd +``` +local_root=/srv/tftp +anon_root=/srv/tftp +listen_address=192.168.0.1 # ten sam co w ftp_url pliku pykickxe.conf + +listen_port=21 +``` + +#### uruchomienie: +1. Uruchomiłem usługi ```dnsmasq``` i ```vsftpd``` dla systemd poprzez polecenie ```# service enable dnsmasq && service enable vsftpd``` i zrestartowałem maszynę, żeby uwzględnione zostały zmiany w ```/etc/network/interfaces``` +2. Uruchomiłem maszynę wirtualną bez zainstalowanego systemu operacyjnego, mającą za to ustawioną kartę sieciową jako urządzenie startowe (Główne okno menedżera VirtualBox->nowa maszyna->system->kolejność bootowania->Karta sieciowa zaznaczone, na pierwszej pozycji) +3. Karta sieciowa klienta odnalazła serwer dhcp, znalazła ```pxelinux.0``` i rozpoczęła instalację. +4. Przesłany został obraz kernela i ramdisk i uruchomił się system operacyjny z podanymi wcześniej parametrami kernela +5. System znalazł serwer ftp pod adresem ```192.168.0.1``` po czym zaczął pobierać pliki pełnego systemu operacyjnego. Uruchomiony został instalator graficzny CentOSa i postępował automatycznie wg. skryptu kickstart + +#### problemy: +1. Nie udało mi się powtórzyć sukcesu powyżej z powodu złych uprawnień dla klienta łączącego się z serwerem ftp. Za każdym razem instalator dochodził do momentu uruchomienia systemu z kernela i ramdisku, wszystko stawało w momencie próby pobrania plików z ftp +2. Z jakiegoś powodu podczas wywołania funkcji ```writeToMenu``` w pliku ```pykickxe.py```, która nadpisuje znaczniki ```$``` ich odpowiednikami z ```pykickxe.conf``` występuje błąd, i część przepisywanego tekstu jest jeszcze raz dopisywana na sam koniec pliku ```autoinstall.menu``` +3. Nie wszystkie argumenty wiersza poleneń ani pliku konfiguracyjnego ```pykickxe.conf``` są zaimplementowane. Niektóre rzeczy (jeszcze) niczego nie robią -positional arguments: - {debian,fedora,centos} - pick a linux distro to download, unpack and append the - PXE config to (Debian or Fedora for now) -optional arguments: - -h, --help show this help message and exit - -l, --list list some default options - -d, --download Download (not really working) - -v, --verbose (also not really working) - print some of what this is doing at any moment - -t TFTP_ROOT, --tftp_root TFTP_ROOT - pass an absolute path to tftp root directory - --auto_cfg AUTO_CFG pass an absolute path to Kickstart file -This program requires that the root from where pxe gets files has following -structure: /<~copied content of iso image~> for everything, especially -/images/pxeboot for kernel and ramdisk, kickstart file in -/ks.cfg or passed manually, (will get copied to util/ks.cfg) -``` diff --git a/dnsmasqappend.conf b/dnsmasqappend.conf index 67e0a6e..f798a65 100644 --- a/dnsmasqappend.conf +++ b/dnsmasqappend.conf @@ -1,5 +1,3 @@ -#TODO replace with variables like $tftp-root and so - dhcp-range=192.168.0.3,192.168.0.253,255.255.255.0,1h dhcp-boot=pxelinux.0,pxeserver,192.168.0.2 pxe-service=x86PC,"Install Linux",pxelinux