Uniwersytet w Białymstoku Wydział Matematyki i Informatyki Instytut Informatyki Materiały bazowe do zajęć z przedmiotu: Systemy operacyjne Laboratorium nr 12 Temat: Pobieranie i zarządzanie pakietami. Kompilacja źródeł. Programowanie z wykorzystaniem funkcji systemowych mgr Adam Bonda Białystok 2008 Cel laboratorium: Nabycie umiejętności wprowadzania/usuwania pakietów do/z systemu Linux, kompilacja programów źródłowych. Użycie funkcji systemowych w programowaniu zadań w języku c/c++. wget program narzędziowy do pobierania plików z World Wide Web. Obsługuje protokoły HTTP, HTTPS i FTP, a także pobieranie poprzez serwery proxy HTTP. Wget potrafi podążać za odnośnikami zawartymi w stronach HMTL i tworzyć lokalne wersje zdalnych witryn WWW, w pełni odtwarzając strukturę katalogów oryginalnego ośrodka. Jest to czasami nazywane "pobieraniem rekurencyjnym". Podczas takiego działania wget respektuje ustalenia Standardu Robot Exclusion (/robots.txt). Możliwe jest poinstruowanie programu, by w pobieranych plikach HTML przekształcał odnośniki tak, aby wskazywały na lokalne kopie, do przeglądania bez połączenia. I. System pakietów System pakietów Slackware opiera się na prostych pakietach tgz, które nie zawierają informacji o zależnościach. Przyjmuje się, że użytkownik sam będzie troszczył się o to, aby instalowany pakiet miał dostęp do odpowiednich bibliotek i niezbędnych programów. Brak zarządzania zależnościami jest często wymieniany jako jedna z głównych wad systemu, niemniej jednak pozwala uwolnić się od tzw. piekła zależności (ang. dependency hell), co cenione jest przez zaawansowanych użytkowników, wśród których dystrybucja jest niezwykle popularna. Należy pamiętać, że systemy zarządzania pakietami (takie jak: rpm czy deb) nie są doskonałe i potrafią przysporzyć wiele problemów, takich jak błędne zależności, niespełnione zależności, pętle (cykle) w zależnościach, konflikty pakietów, ... Do zarządzania pakietami służą następujące narzędzia działające w powłoce: ✔ installpkg (instalacja pakietu), ✔ removepkg (usunięcie pakietu), ✔ upgradepkg (aktualizacja pakietu), ✔ makepkg (utworzenie pakietu tgz z zawartości bieżącego katalogu), ✔ explodepkg (rozpakowanie zawartości pakietu do bieżącego katalogu). W skład oficjalnych pakietów Slackware wchodzi również menadżer rpm (slackware/ap). Należy pamiętać, że o zależności będziemy musieli zadbać sami i użyć następującej składni rpm -ivh --nodeps --force pakiet.rpm. Dzięki temu można zainstalować m.in. komunikator Skype, posługując się pakietem rpm dla openSUSE. Za pomocą programu rpm2tgz można konwertować pakiety rpm do formatu tgz. Uzupełnieniem jest tekstowy menadżer pkgtool, służący do instalacji i usuwania pakietów (również nie sprawdza on zależności). slackpkg menadżer pakietów Slackware Manualna instalacja pakietów wiąże się z koniecznością zadbania o wprowadzenie do systemów również pakietów od których nasze oprogramowanie jest uzależnione. Różne dystrybucje oferują różne narzędzia apt-get (Debian), emergo (Gentoo), poldek (PLD) etc. Zadaniem tych programów jest automatyczne pobranie instalowanego programu i wszystkich zależności, a następnie ich instalacja. Slackware również posiada narzędzia tego typu, choć zależności dla żadnych z tych programów nie działają poprawnie. Są to: SWareT, slapt-get, czy slackpkg. Instalacja pakietu slackpkg: płyta instalacyjna CD3: $ installpkg /mnt/cdrom/slackware/extra/slackpkg/slackpkg-*.tgz lub sieć: $ wget -c ftp://ftp.slackware.com/pub/slackware/slackware-current/extra/slackpkg/slackpkg-*.tgz # installpkg slackpkg-*.tgz Konfiguracja: Głowny plik konfiguracyjny: /etc/slackpkg/slackpkg.conf lokalizacja pakietów, tryb pobierania Wybór serwerów lustrzanych (mirror): /etc/slackpkg/mirrors Blokada pakietów: /etc/slackpkg/blacklist Użytkowanie: slackpkg update - aktualizacja bazy slackpkg install pakiet - instalacja pakietu slackpkg reinstall pakiet - reinstalacja pakietu slackpkg upgrade pakiet - aktualizacja pakietu slackpkg upgrade slackware - aktualizacja systemu slackpkg search plik - szukanie pliku w pakietach Kompilacja ze źródłem ./configure (z opcją --help wyświetla wszystkie możliwe parametry) make clean (czyści źródła) make (buduje program) make install (instaluje program) Narzędzie make służy do zarządzania kompilacją projektów składających się z wielu plików źródłowych. Aby używać make należy napisać skrypt o nazwie Makefile lub makefile, w którym opisane są:  zależności pomiędzy plikami źródłowymi i plikami wynikowymi,  sposób tworzenia plików wynikowych z plików źródłowych. Następnie przy pomocy polecenia make kompilujemy projekt. Make usprawnia kompilację, gdyż samodzielnie decyduje, które z plików źródłowych mają być przekompilowane (sprawdzając daty ostatniej modyfikacji). Budowa pliku Makefile Plik Makefile składa się głównie z reguł. Reguła ma następującą budowę: CEL: SKŁADNIKI KOMENDA Gdzie CEL to nazwa pliku docelowego, który jest tworzony z plików wymienionych jako SKŁADNIKI, zaś KOMENDA podaje komendę, która tworzy plik docelowy CEL z plików składowych SKŁADNIKI Przykład reguły: hello: hello.c aux.c gcc hello.c aux.c -o hello Programowanie systemowe: ✔ Procesy: #include #include int main(void) { printf("hello ID %d\n", getpid()); } ✔ Sygnały: /* ursig1.c */ #include #include #include static int count = 0; void handler(int signo) { signal(SIGINT,handler); /* Re-instate handler */ ++count; /* Increment count */ write(1,"Got SIGINT\n",11); /* Write message */ } int main(int argc,char **argv) { signal(SIGINT,handler); /* Register function */ while ( count < 2 ) { puts("Waiting for SIGINT.."); sleep(4); /* Snooze */ } puts("End."); return 0; } ✔ Katalogi: tworzenie, usuwanie, zmiana: Tworzenie nowego katalogu #include #include int mkdir(const char *path, mode_t mode); Przykład: int z; z = mkdir("/tmp/my_dir",S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH); /* 0775 */ if ( z == -1 ) /* report error */ Usuwanie katalogu #include int rmdir(const char *path); Przykład: int z; z = rmdir("/tmp/my_dir"); if ( z == -1 ) /* Report error */ Zmiana katalogu #include int chdir(const char *path); Przykład: if ( chdir("/home/student1") == -1 { fprintf(stderr,"%s: chdir(2)\n",strerrir(errno)); exit(13); } Zmiana uprawnień: #include int chmod(const char *path, mode_t mode); int fchmod(int fd, mode_t mode); int lchmod(const char *path, mode_t mode); Przykład: if ( chmod("./my_script",0550) == -1 ) /* Report error */ else /* Successful */ Przykład: if ( chmod("./my_script",S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP) == -1 ) /* Report error */ else /* Successful */ Zmiana właściciela: #include #include int chown(const char *path, uid_t owner, gid_t group); int fchown(int fd, uid_t owner, gid_t group); int lchown(const char *path, uid_t owner, gid_t group); Przykład: if ( chown("/etc/hosts",0,-1) == -1 ) /* Report error */ else /* Successful */ Zadanie 1. Sprawdzić dostępność pakietu slackpkg w systemie. Jeśli jest on niedostępny pobrać pakiet z slackpkg.org i zainstalować go manualnie. Zaktualizować bazy pakietów slackpkg dla posiadanej! wersji Slackware'a (sprawdzić numer posiadanej wersji, dokonać odpowiedniej modyfikacji pliku serwerów lustrzanych) Zadanie 2. Sprawdzić dostępność polecenia installpkg w systemie. Jeśli jest ono niedostępne zlokalizować je w pakiecie i zainstalować go. Zadanie 3. Sprawdzić numer zainstalowanej wersji programu xmms i dostępnej w repozytoriach Slackware. Używając menadżera pakietów odinstalować pakiet xmms. Przeanalizować, gdzie w drzewie katalogów znajdują się poszczególne części pakietu: manuala, dokumenty, program (binarka), pliki konfiguracyjne. Używając programu slackpkg zainstalować najnowszą wersje programu xmms. Zadanie 4. Jak lepiej rozwiązać problem z zadania 3? Zadanie 5. Pobrać i skompilować najnowsze źródło pakietu wget. Najpierw sprawdzić posiadaną w systemie wersje. Zadanie 6. Korzystając z funkcji systemowych, napisać program c/c++ wyświetlający numer PID bieżącego procesu. Zadanie 7. Korzystając z funkcji systemowych, napisać program c/c++ przechwytujący sygnał SIGINT i reagujący zwróceniem komunikatu tekstowego i numeru bieżącego procesu. Zadanie 8. Korzystając z funkcji systemowych, napisać program w c/c++ a) tworzący katalog wg. zdefiniowanej konstrukcji w źródle b) tworzący katalog podany jako argument programu. Program powinien właściwie reagować, jeśli użytkownik nie ma prawa dostępu, lub wystąpił inny błąd. Zadanie 9. Korzystając z funkcji systemowych, napisać program w c/c++ a) usuwający katalog wg. zdefiniowanej konstrukcji w źródle b) usuwający katalog podany jako argument programu. Program powinien właściwie reagować, jeśli użytkownik nie ma prawa dostępu, katalog nie istnieje, lub wystąpił inny błąd. Zadanie 10. Korzystając z funkcji systemowych, napisać program w c/c++ dokonujący zmiany uprawnień a) pliku/katalogu zdefiniowanego w źródle , oraz praw również tam zdefiniowanych b) pliku/katalogu podanego jako argument wywołania i praw (drugi argument). Program powinien właściwie reagować, jeśli użytkownik nie ma prawa dostępu, katalog nie istnieje, lub wystąpił inny błąd. Zadanie 11. Korzystając z funkcji systemowych, napisać program w c/c++ dokonujący zmiany właściciela a) pliku/katalogu zdefiniowanego w źródle , na właściciela również tam zdefiniowanego b) pliku/katalogu podanego jako argument wywołania i właściciela (drugi argument). Program powinien właściwie reagować, jeśli użytkownik nie ma prawa dostępu, katalog nie istnieje, lub wystąpił inny błąd. W.Richard Stevens, "Advanced UNIX Programming" W.Richard Stevens, "Advanced Programming in the UNIX Environment" http://wazniak.mimuw.edu.pl/index.php?title=SOP_lab_nr_6 http://wazniak.mimuw.edu.pl/index.php?title=SOP_lab_nr_7 http://wazniak.mimuw.edu.pl/index.php?title=SOP_lab_nr_8 http://wazniak.mimuw.edu.pl/index.php?title=SOP_lab_nr_9 http://jakilinux.org/linux/slackware/