===== Podstawy administrowania 2: zarządzanie usługami i monitorowanie systemu ===== ==== Przygotuj się do laboratorium ==== * ''man systemd(1)'' * ''man systemctl(1)'' * ''man crontab(5)'' * {{gjn-cron.pdf|Konfigurowanie i zastosowanie systemu Cron}} * {{gjn-syslog.pdf|Monitorowanie systemu GNU/Linux przy pomocy Syslog}} (duet syslogd+klogd został już zastąpiony przez rsyslogd, ale ogólna idea działania pozostała bez zmian, dlatego warto się zapoznać) ==== Wiedza ==== === 1. Uruchamianie i zatrzymywanie systemu === Uruchamianie systemu można podzielić na pewne ogólne etapy: * start programu ładującego jądro (bootstrapu), np. //grub//, * ładowanie i dekompresja jądra, * inicjalizacja podstawowych urządzeń, których obsługa jest wkompilowana w jądro, * sprawdzenie i podmontowanie głównego systemu plików, * stworzenie pierwszego procesu przez jądro (z PID=1): //init// (w System V; większość dystrybucji od niego odchodzi) albo //systemd// (w nowszych systemach, w tym Ubuntu), * proces o PID=1 uruchamia wszystkie inne procesy, działając z uprawnieniami administratora, zmienia poziomy pracy systemu (runlevels), w tym uruchamia i zatrzymuje system, * zezwolenie na logowanie się użytkowników. Zatrzymanie systemu składa się z etapów: * wydanie polecenia **shutdown**, * system powiadamia użytkowników o zatrzymaniu, * wszystkie procesy użytkowników są zatrzymywane, * system przechodzi na poziom 0 lub 6 (zob. niżej), * zatrzymanie odpowiednich usług, * odmontowanie systemów plików, * zatrzymanie lub restart systemu. === 2. Poziomy pracy systemu i systemd === Koncepcja poziomów pracy pochodzi z System V i oznacza różne tryby pracy systemu: * poziom 0 oznacza zatrzymanie (halt), * poziom 1 jest trybem dla jednego użytkownika (single) - administratora, * poziomy 2 - 5 są różnymi trybami pracy dla wielu użytkowników, * 6 - oznacza zatrzymanie i restart (reboot). Z każdym poziomem pracy związane były odpowiednie katalogi: ///etc/rcN.d//, w których znajdowały się skrypty uruchamiające/zatrzymujące usługi odpowiednio dla zadanego poziomu pracy. Nazwa usługi (skryptu) w tych katalogach ma postać: //K##nazwa// lub //S##nazwa// (gdzie ## to numer wyznaczający kolejność uruchamiania skryptów). Te katalogi ciągle są dostępne, ale jest to związane tylko z kompatybilnością wsteczną z System V -> systemd z nich nie korzysta. Aktualnie większość dystrybucji Linuxa (w tym Ubuntu) przeszła na systemd, który jest bardziej elastyczny, umożliwia wykonywanie zadań równolegle i zarządza większą ilością aspektów systemu niż init z System V: * usługi nie są grupowane w runlevels ale w targets; każdy target może wymagać uruchomienia wybranych usług + może wymagać uruchomienia innych targets * poziomy pracy systemu z System V są 'symulowane' przez odpowiednie targety: restart.target / halt.target / graphical.target (zob. ''man runlevel'') * domyślny poziom pracy systemu jest zdefiniowany przez łącze symboliczne ''default.target''. Aktualny domyślny poziom można sprawdzić za pomocą ''systemctl get-default''. Zmiana następuje za pomocą ''systemctl set-default'' (albo ręczną zmianę odpowiedniego łącza symbolicznego) * jeżeli chcemy uruchomić jakiś skrypt przy wchodzeniu na określony ''runlevel'' to nie definiujemy go w ///etc/rcN.d// (tzn. możemy i to zadziała, ale tylko przez kompatybilność wsteczną z System V). Aby zrobić to zgodnie z systemd, definiujemy stosowny plik ''moj_skrypt.service'', w którym w sekcji ''[Install]'' zaznaczamy ''WantedBy='' i wskazujemy target przy którym powinien uruchomić się skrypt * zarządzanie usługami odbywa się poprzez ''systemctl [start|stop|status|reload|restart] usluga'' === 3. Korzystanie z Cron === Automatyzacja niektórych prac systemu jest niezwykle pomocna, używa się do niej programów: * **at** umożliwia jednorazowe uruchomienie programu o zadanym czasie, * **cron** umożliwia cykliczne uruchamianie programów, * obydwa systemy mogą być używane przez wszystkich użytkowników, * składają się z części serwera (demona) i klienta - uruchamianego przez użytkownika, * serwer **atd** kolejkuje zadania każdego użytkownika, * w przypadku cron każdy użytkownik ma jeden plik //crontab//, w którym zapisuje wszystkie zadania, * cron udostępnia dodatkową funkcjonalność administratorowi, * cron jest jednym z podstawowych narzędzi automatyzujących pracę administratora. Do komunikacji z demonem crond służy polecenie **crontab**: * **crontab** umożliwia edycję i pokazywanie pliku //crontab//, * każdy użytkownik ma jeden taki plik, * w pliku może się znajdować wiele zadań, każde w osobnej linii, * polecenie **crontab** korzysta z zewnętrznego edytora do edycji pliku. Składnia pliku //crontab//: * linia składa się z sześciu pól, ostatnie to nazwa polecenia do wykonania, * pola w każdej linii oznaczają kolejno: minutę, godzinę, dz. mies., miesiąc, dz. tyg., * gwiazdka w miejscu wartości oznacza: "dla każdej wartości pola", np.: co godzinę, * kilka wartości rozdziela się przecinkami, * znak "-" pozwala na podanie zakresu wartości, * połączenie go ze znakiem "/" umożliwia podanie kroku w obrębie zakresu. Zamiast pierwszych 5 pól specyfikujących termin wykonania, można użyć również jednego ze specjalnych ciągów znaków, jak ''@daily'', ''@reboot'', ... (szczegóły w manualu do ''crontab(5)''). Plik ///etc/crontab// zawiera centralną konfigurację demona cron, ma możliwość podania przed poleceniem nazwy użytkownika z prawami którego będzie wykonywane polecenie. //Cron// jest m.in. przydatny w cyklicznym archiwizowaniu i analizowaniu plików //Sysloga//. === 4. Monitorowanie pracy === Linux (podobnie jak systemy Unix) ma mechanizmy rejestrujące każde zdarzenie w systemie. * rejestrowanie (logowanie; log - dziennik) oznacza systematyczne zapisywanie odpowiednich informacji do plików, * pliki rejestrów określa się po ang. //log files//, * logowanie jest wykonywane przez pracujący bez przerwy system //rsyslogd// (obsługujący funkcjonalność demonów //klogd// i //syslogd// z poprzednich wersji systemu). Rsyslog: * system zapisuje (loguje) informacje do plików rejestrów/"logów" systemowych, w katalogu ///var/log// * pliki rejestrów są plikami tekstowymi o jednolitej składni, * pliki rejestrów są cyklicznie porządkowane przy pomocy specjalnych programów wywoływanych przez //Cron//. * rsyslogd jest jednym z najważniejszych demonów systemowych, * rsyslogd rejestruje wszystkie informacje o pracy systemu, * jest uruchamiany jako jeden z pierwszych procesów i zamykany jako jeden z ostatnich, * konfiguracja rsyslogd znajduje się w pliku ///etc/rsyslog.conf// oraz w plikach w folderze ///etc/rsyslog.d// Konfiguracja rsyslogd: * plik //rsyslog.conf(5)// zawiera reguły według których rsyslogd sortuje informacje i zapisuje je do różnych plików rejestrowych, * reguła to dwa pola: ''selector action'', * ''selector'' ma 2 części ''facility.priority'', * ''facility'' określa system z którego pochodzi wiadomość np.: ''auth, kern, mail, rsyslog'', * ''priority'' mówi o stopniu ważności wiadomości, np.: ''debug, warn, err, emerg''. * w polu action może być wpisany plik, urządzenie sterujące terminalem, urządzenie drukarki. Pliki rejestrowe systemu: * nazwy i zawartość zależą od konfiguracji syslogd, * pliki rejestrów są plikami tekstowymi, * składają się z linii o określonym formacie, przeważnie jest to:data godzina hostname proces: komunikat * umieszczane są w katalogu ///var/log//, * niektóre duże programy jak nginx czy Apache mogą zakładać w ///var/log// własne katalogi z logami. === 5. Konfigurowanie interfejsów sieciowych === Konfigurowanie interfejsu sieciowego można podzielić na kilka etapów. * określenie parametrów (IP, maska, itp.), * konfigurownie przy pomocy ifconfig, * testowanie przy pomocy ping, * zapis konfiguracji w plikach dystrybucji systemu. Przed przystąpieniem do konfigurowania interfejsu trzeba ustalić jego podstawowe parametry. Są to: * adres IP, * maska sieci IP, * broadcast IP, * adres MAC, jeżli wykorzystuje się DHCP. **ifconfig** służy do konfigurowanie interfejsu sieciowego. * Podstawowy sposób wywołania to: ifconfig if address adres netmask maska * Włączanie, wyłącznie interfejsu: ifconfig if up,down * Wyświetlanie informacji o interfejsie: ifconfig if **ping** jest uniwersalnym programem będącym częścią narzędzi dla sieci TCP/IP. Program służy do testowania połączeń w sieci IP, wykorzystuje protokół ICMP (pakiety echo replay/requst). Interfejs loopback jest to wewnętrzny interfejs sieciowy, pełni rolę interfejsu zwrotnego, ma zawsze adres 127.0.0.1 i jest niezbędny do poprawnego działania aplikacji opartych o sieć TCP/IP. Dystrybucje mogą dostarczać: * programów typu **ifup**, **ifdown**, * plików opisujących konfigurację interfejsów ///etc/network//, ///etc/sysconfig/network//, * dodatkowych narzędzi konfiguracyjnych typu NetworkManager. Systemd posiada własny daemon ''systemd-networkd.service'', który wykorzystuje pliki konfiguracyjne zapisane w ///etc/systemd/network/// Przed przystąpieniem do konfigurowania tablicy routingu należy określić podstawowe parametry sieci do której włącza się interfejsy. Są to: * adresy interfejsów, * adresy sieci IP, * ewentualnie inne sieci do których określa się bezpośrednio dostęp, * adres routera przekazującego pakiety poza sieć, default route. Podstawowym programem do konfigurowania routingu jest program **route**. Program służy do: * zarządzania tablicą routingu, * tablica określa sposób przekazywania pakietów przez stos TCP/IP, * sposób użycia to:route -v -n {add|del} {-host|-net} adres gw adres netmask maska interfejs Do testowania routingu można użyć programu **traceroute**. Program służy do testowania routingu w sieci IP, wykorzystuje pole TTL pakietów IP i protokół UDP lub protokół ICMP. Resolver jest biblioteką będącą częścią biblioteki systemowej. Zajmuje się odnajdywaniem nazw maszyn pracujących w sieci. Jego konfiguracja składa się z kilku plików. Nazwę maszyny w sieci IP ustawia się przy pomocy polecenia hostname. Nazwę najczęściej zapisuje się na stałę w pliku ///etc/hostname// czytanym w trakcie startu systemu. Plik //host.conf// jest jednym z podstawowych elementów konfiguracji: zawiera część konfiguracji resolvera, opcje to: * ''order {hosts,bind,nis}'' - porządek odwoływania się do DNS i hosts, * ''trim on/off'' - usuwanie nazw domen * ''multi on/off'' - wielokrotne nazwy * ''nospoof,spoofalert,reorder on/off'' W pliku //resolv.conf// zapisuje się: * adresy serwerów DNS: nameserver addr, * nazwę lokalnej domeny: domain, * sposób przeszukiwania domen: search. Plik ///etc/hosts// zawiera istotne dla funkcjonowania resolvera informacje. Znajdują się w nim między innymi: * adresy IP lokalnych interfejsów (w tym musi być loopback), * nazwa FQDN maszyny, * adresy sieci podłączonych do interfejsów lokalnych, * adresy innych maszyn i sieci. Do testowania resolvera można użyć: * ping wraz z nazwą symboliczną (domenową), * narzędzi do pracy z DNS: **host**, **nslookup**, * powyższe dwa programy działają tylko w przypadku połączenia z serwerem DNS. ==== Ćwiczenia ==== UWAGA! W poniższych ćwiczeniach należy zwracać baczną uwagę na to, które z nich wymagają dostępu administratora. Warto sprawdzić które czynności mogą być wykonane z poziomu użytkownika! __Przed rozpoczęciem realizacji zadań, zainstaluj w systemie **nginx**, **at** i **mailutils**__: - ''apt-get update ; apt-get install -y at nginx mailutils'' - Podczas instalacji Postfix (serwera poczty) pojawi się ekran wyboru "General type of mail configuration" -- zostaw domyślną opcję "Internet Site"; w następnym ekranie możesz zostawić domyślną opcję (jako nazwę serwera) - Jeżeli pojawi się błąd podczas instalacji (''newaliases: fatal: file /etc/postfix/main.cf: parameter myhostname: bad parameter value: osboxes..'') trzeba usunąć dwie kropki z końca tej linii (aby myhostname miało wartość osboxes): \\ ''sed -e "s/osboxes../osboxes/g" /etc/postfix/main.cf > /etc/postfix/main.cf'' \\ i dokończyć instalację: \\ ''apt-get install -f'' === I. Zamykanie === - Zamknąć system przy pomocy **shutdown**. - Zamknąć system przy pomocy **shutdown** z opóźnieniem 3 minutowym, wysyłając przy tym stosowną informację do użytkowników. Sprawdzić jak wygląda ta informacja w konsoli innego użytkownika. === II. Start systemu === Zwrócić uwagę jak przebiega start systemu. \\ Po zalogowaniu jako root sprawdzić działanie plecenia **dmesg**. === III. Systemd === * Na początku zajęć zainstalowaliśmy **nginx** -- jest to popularny serwer www, ale co ważniejsze dla aktualnych zajęć - bardzo przyjazny do ćwiczeń z usługami i sygnałami (w kolejnej sekcji) - Sprawdzić jaki jest aktualny poziom pracy systemu za pomocą ''runlevel''. - Sprawdzić jaki jest domyślny tryb pracy systemu. - Przeczytać manual do ''runlevel''. Zmienić domyślny tryb pracy systemu (po każdej zmianie zrestartować system, aby sprawdzić wynik modyfikacji): * ''multi-user.target'' * ''rescue.target'' * ''reboot.target'' * ''graphical.target'' (to jako ostatnie, aby przywrócić do domyślnego trybu działania) * W przypadku problemów: w //GRUB// (przed załadowaniem systemu) do wyboru są Ubuntu i "Advanced options for Ubuntu" -> po wybraniu drugiej opcji można wybrać pozycję "... (recovery mode)" -> a później z listy można wybrać "root", aby dostać się do shella i naprawić system. - Sprawdź wszystkie usługi dostępne w systemie (''systemctl list-units --type=service'') - Wybierz jedną z dostępnych usług (punkt poprzedni; np. ''nginx.service'' albo ''cron.service'') -- jakie argumenty można przekazać do ''systemctl'', aby modyfikować jej stan? (uruchomić, zatrzymać, wymusić przeczytanie plików konfiguracyjnych, uruchomić ponownie, pokazać aktualny stan) - Przygotuj własną usługę. Aby to uczynić przygotuj odpowiedni plik ''*.service'', np. ''moj_skrypt.service'' w folderze ''/lib/systemd/system/'' * przejrzyj inne pliki *.service znajdujące się w folderze - jaką mają strukturę? * zawartość pliku może wyglądać np. tak: [Unit] Description=Moj wlasny skrypt [Service] ExecStart=/root/skrypt.sh KillMode=process [Install] WantedBy=multi-user.target * Przygotuj odpowiedni skrypt (wskazany w ExecStart), który robi coś (np. wypisuje coś na ekran) * Aktywuj usługę ''systemctl enable moj_skrypt.service'' (bez tego nie będzie brana pod uwagę) * Uruchom ponownie system * Sprawdź status ''moj_skrypt.service'' * Uruchom usługę ręcznie * Sprawdź jej status * Najczęściej w linii ''WantedBy='' pojawia się ''multi-user.target'' - dlaczego? - Obsługa klawiszy jest zależna od celu ''/lib/systemd/system/ctrl-alt-del.target'' -- domyślnie jest to ''reboot.target'', ale można to zmienić (np. na ''poweroff.target'' albo na brak reakcji) -- pobaw się tym chwilę. === IV. Procesy i sygnały === //W tej sekcji rozwiniemy wiedzę z [[lab_processes|Procesy i zadania]] -- tam pierwszy raz korzystaliśmy z ps, kill, nice// - Jakich opcji ps należy użyć, aby obejrzeć: - proces ''init'' [czy to naprawdę jest proces init z System V czy może systemd? jak to sprawdzić?], - PID procesów, - PPID procesów, - środowisko procesów, - informacje o zużyciu pamięci przez procesy. - Jak przy pomocy **ps** i innego polecenia można obejrzeć procesy wybranego użytkownika? - Jako zwykły użytkownik uruchomić proces **find** (albo dowolny inny proces, który długo trwa - np. **nano**, **vim**). Jako root odnaleźć jego PID i usunąć proces. Czy da się tak zrobić w drugą stronę (zwykły użytkownik usuwa proces roota)? - Powtórzyć kilkakrotnie wcześniejsze ćwiczenie, za każdym razem usuwając proces innym sygnałem. Jakie pojawiają się komunikaty? - Jak można przy pomocy jednokrotnego użycia kill usunąć **wszystkie** procesy w danej sesji? Przetestuj ;-) - Jaki sygnał należy wysłać do demona systemowego by przeczytał swoją konfigurację? * Możesz przetestować na nginx.service ([[http://nginx.org/en/docs/control.html|przydatna ściągawka obsługiwanych sygnałów]]). * Uwaga: w przypadku nginx przeczytanie konfiguracji jest równoznaczne z zakończeniem działania "worker processes" i uruchomieniem nowych "workerów", więc oczekiwany efekt to zmiana PIDów procesów w sekcji ''CGroup'' po wykonaniu ''systemctl status nginx'' (master process się nie zmienia, ale powinny zmienić się worker processes) * Jaka komenda ''systemctl'' pozwala osiągnąć taki sam efekt? - Przy pomocy **ps** wyświetlić wartości nice procesów. - Uruchomić proces **find** z nice 10. Jak zmienić wartość nice tego procesu? Czy root ma większe uprawnienia? Sprawdź. - Zmienić wartość nice dla powłoki w której się pracuje. - Uruchomić w tle 3 procesy find, z nice odpowiednio -5, 0 i 19. Który z nich zakończy się pierwszy? Zmierzyć czas ich działania przy pomocy **time**. === V. Polecenia at i cron === - Sprawdź czy w systemie działa daemon **atd** (sprawdzić!) - Przy pomocy polecenia **at** proszę zlecić uruchomienie: - **who** za godzinę, - **ps** w najbliższą niedzielę, - **df** jutro o tej samej porze. - Proszę oglądnąć kolejkę zleceń (jakim poleceniem?) i zawartość skryptów zleceń. - Powtórzyć ćwiczenie 1. dla poleceń, które nie wypisują informacji na wyjściu. Czy został wysłany list z raportem (sprawdzić przez **mail**)? Jeżeli nie, to jak wymusić wysłanie raportu pocztą elektroniczną? - W sesji administratora zabronić dostępu do **at** wybranemu użytkownikowi. Sprawdzić jak działa kontrola dostępu. - Uruchamiać przy pomocy **cron** wybrane polecenie: - co godzinę, - co pół godziny, - w każdy poniedziałek o 6:00, - codziennie, o 6:20, 8:20, 12:20, 18:20, - co 4 godziny, ale tylko od poniedziałku do piątku, - o 12:00, 13:00, 14:00, 15:00; w 1., 13., 20. dzień każdego miesiąca. - Jak uruchamiać program codziennie korzystając z cron, ale bez modyfikacji pliku crontab? - Założyć katalog ///etc/cron.new// i tak skonfigurować demon cron, by pliki wykonywalne w tym katalogu były uruchamiane 3 razy dziennie. === VI. Konfiguracja rsyslogd === Do testowania rsyslogd można użyć polecenia **logger**, które wysyła wiadomości do **rsyslogd**: * Wywołanie polecenia jest następujące: logger [-p facility.priority] wiadomosc * //Użycie parametru ''-p'' jest opcjonalne.// * Dodatkowo można etykietować wpisy przez ''-t''. - Skonfigurować rsyslogd tak, aby odpowiednie komunikaty były kierowane do podanych plików. źródło priorytet plik ------- ---------- ----- user wszystkie user.log user warning user_warn.log daemon wszystkie daemon.log local7 info local.log local7 niższe od err local_err.log mail i uucp wszystkie mail.log security i auth wszystkie security.log wszystkie emerg emerg.log wszystkie wszystkie all_messages.log Co należy zrobić, aby zmiany w konfiguracji odniosły skutek? Proszę przetestować wprowadzone zmiany przy pomocy polecenia **logger**. === VII. Rotacja plików rejestrowych === - Skonfigurować system Cron w ten sposób by programy **logrotate** lub **savelog** były uruchamiane: - w każdą niedzielę o 23:00, - 30. dnia miesiąca o 5:00, - codziennie o 2:00. - Proszę skonfigurować logrotate aby dokonywał rotacji plików: - ///var/log/messages// codziennie, kompresował je i zachowywał 8 poprzednich fragmentów, - ///var/log/security// codziennie, bez kompresji i datę każdej rotacji zapisywał w pliku ///var/log/rotate.log//, - ///var/log/debug// co tydzień, bez kompresji. === VIII. Podstawy konfigurowania interfejsów sieciowych === - Sprawdzić bieżącą konfigurację interfejsu i zapisać ją. - Sprawdzić łączność z innymi maszynami przez **ping**. - Przeglądnąć bieżącą konfigurację routingu przez **route**. - Przetestować łączność z wybranym odległym serwerem (np. uj.edu.pl, google.com) przez **traceroute**. - Oglądnąć ///etc/resolv.conf// sprawdzić działanie DNS przez **host**, **dig**, **nslookup**. - Sprawdzić pola MX dla różnych domen, wskazują one na Mail eXchangery domeny (serwery poczty), np.: ''dig uj.edu.pl mx''