Linux
III
Programy, które uruchamiają się i działają w tle (niewidoczne dla użytkowników) są nazywane demonami. Demony uruchamiają się w trakcie inicjowania systemu. Aby zobaczyć, jak się je uruchamia, zajrzyj do plików /etc/inittab oraz /etc/inetd.conf. Każda Linia tych plików wymienia program, który jest uruchamiany podczas inicjacji systemu.
/etc/inittab - program ten czeka na terminalu, aż zaloguje się jakiś użytkownik. To właśnie ten program wyświetla znak zgłoszenia login:.
/etc/inetd.conf - uruchamia tylko jednego demona inetd. Demon ten czeka na połączenia od klientów na innych maszynach, a kiedy połączenie zostanie nawiązane, uruchamia odpowiedni demon, który je obsłuży. Istnieją demony dla wszystkich usług oferowanych przez system innym systemom w sieci. Kilka demonów zajmuje się usługami nie związanymi z sieciami, np.: kerneld - odpowiada za automatyczne ładowanie modułów do jądra.
Procesy
Proces jest niezależnym programem, który posiada własny zestaw zasobów. W Uniksie (także w Linuksie) ograniczone zasoby systemu (pamięć, dyski) są zarządzane przez jeden wszechmocny program zwany jądrem. Wszystko inne działające w systemie jest procesem.
Zanim się zarejestrujesz, twój terminal jest monitorowany przez proces getty. Po dokonaniu logowania proces getty umiera i twój terminal jest powłokę, która jest kolejnym procesem. Następnie powłoka tworzy nowy proces za każdym razem, gdy wydasz jakieś polecenie. Tworzenie nowych procesów jest nazywane rozgałęzieniem, ponieważ jeden proces rozdziela się na dwa.
Jeśli używany jest X-window, każdy proces otwiera jedno lub kilka okien. Zatem okno, w którym wpisujesz polecenia, należy do procesu xterm. Ten proces odgałęzia powłokę, aby działała wewnątrz tego okna. A ta powłoka odgałęzia jeszcze więcej procesów, gdy wpisujesz polecenia.
Aby poznać te procesy, które właśnie działają wpisz polecenie ps.
Pierwsze pole wyniku polecenia ps, jest niepowtarzalnym numerem identyfikującym proces. Jeśli masz działający proces, którego nie możesz się pozbyć za pomocą naciśnięcia klawiszy Ctrl+C, możesz go unicestwić, przełączając się do innej konsoli wirtualnej lub okna X-ów i wpisując:
$ kill nr-procesu
Pole TTY mówi, na którym terminalu działa proces, jeśli w ogóle na terminalu(demony nie korzystają z terminala).
Pole STAT określa, w jakim stanie jest proces:
S - proces jest zawieszony
T - proces zawieszony poprzez naciśnięcie Ctrl+Z
R - procesdziałający
Pole TIME informuje ile czasu procesora wykorzystał proces.
Możesz oglądać nie tylko własne procesy. Użycie opcji a pokazuje wszystkie procesy, a opcja x dodaje te procesy, które nie są związane z żadnym terminalem.
Plik /etc/lilo.conf
Przykładowy plik lilo.conf:
boot = /dev/hda
compact
install = /boot/boot.p
map = /boot/map
image = /boot/vmlinuz
label = linux
root = /dev/hda2
vga = ask
Linia:
boot - określa nazwę urządzenia, na którym program LILO powinien się zainstalować w rekordzie inicjacji (jeśli podamy numer partycji zamiast dysku, LILO zostanie zainstalowany jako drugi program ładowania początkowego).
compact - program LILO ma wykonać optymalizację
install - wskazuje nazwę pliku zawierającego sektor inicjacji używany przez MBR,
map - plik mapowania, który LILO otwiera, gdy jest instalowane
image - określa nazwę obrazu jądra
label - etykieta wyświetlana podczas uruchomienia systemu
root - określa główną partycję Linuksa
vga - tryb tekstowy w czasie inicjacji (normal - 80x25, extended - 132x44 lub 132x60, ask - pyta o wykorzystywany tryb tekstowy)
Jeśli chcesz inicjować partycję MS-DOS lub Windows 95/98 zlokalizowaną na drugim dysku, powinieś dopisać linię:
loader = /boot/any_d.b
Gdy masz przygotowany plik /etc/lilo.conf, możesz jako root uruchomić polecenie:
/sbin/lilo
LILO jako drugi program ładowania początkowego, umieszczony tylko w rekordzie inicjacji głównej partycji Linuksa. Wydając polecenie boot = /dev/hda2 zainstaluje LILO w rekordzie inicjacji .dev.hda2, aby zainicjować tylko Linuksa. Działa to tylko w przypadku partycji podstawowych na dysku twardym.
Po znaku zachęty można wpisać inne parametry:
single - inicjuje system w trybie jednego użytkownika
ro - montuje główny system plików Linuksa jako przeznaczony tylko do odczytu
Usuwamy LILO
Jeśli masz program LILO zainstalowany w MBR, to najłatwiej będzie go usunąć za pomocą dosowego programu FDISK. Polecenie:
FDISK /MBR
Możesz użyć polecenia dd, żeby zastąpić rekord inicjacji dysku tą kopią zapasową. Np.
dd if=/ boot. 0300 of = /dev/hda bs=446 count=1
skopiuje pierwsze 446 bajtów pliku /boot/boot.0300 na /dev/hda. Chociaż pliki mają po 512 bajtów,to na MBR skopiować należy jedynie pierwsze 446 bajtów.
Bardzo ostrożnie używaj tego polecenia! Jest to jeden z tych przypadków, gdzie wykonanie polecenia bez zastanowienia może spowodować poważne kłopoty, jeśli dobrze nie wiesz, co masz robić. Stosuj tę metodę tylko w ostateczności i tylko wtedy, gdy jesteś pewien, że pliki /bot/bot..0300 i /boot/bot.0800 zawierają rekord inicjacji, który jest ci potrzebny.
Komunikaty z inicjowania jądra
Jako użytkownik root zawsze możesz sprawdzić plik /var/log/messages. Polecenie dmesg wpisuje ostatnie linie komunikatów jądra z bufora.
init, inittab i pliki rc
Kiedy sterowniki urządzeń zostaną już zainicjowane, jądro wykonuje program init, który znajduje się w katalogu /etc, /bin lub /sbin. init jest uniwersalnym programem, który rozpoczyna nowe procesy i ponownie uruchamia niektóre programy, gdy kończy działanie. Wszystko co robi program init, jest sterowane poprzez plik /ect/inittab. Każda linia tego pliku ma następujący format:
kod: poziomy: działanie: polecenie
kod - jest niepowtarzalną sekwencją złożoną z jednego lub dwóch znaków, używaną do identyfikowania tego wpisu w pliku. Wpisy muszą mieć oddzielne kody, aby fukcjonować poprawnie,
poziomy - są listą poziomów działania, na których ten wpis powinien być wykonywany. Poziom działania jest literą lub cyfrą określającą aktualny stan systemu, jeśli ma to dotyczyć programu init. Np. jeśli poziom działania systemu jest zmieniany na 3, zostaną wykonane wszystkie wpisy w pliku /etc/inittab zawierające 3 w polu poziomy
Kiedy system jest inicjowany, wchodzi na domyślny poziom działania ( określony w pliku /ect/inittab).
Obejrzyjmy przykładowy plik /etc/inittab:
.
.
.
Pola są oddzielone dwukropkami. Pierwsze pole jest arbitralnie przydzielonym identyfikatorem (nie ma znaczenia, co to jest, dopóki nie powtarza się w pliku). Drugie pole określa, na którym poziomie działania zostanie wywołane polecenie. Trzecie pole informuje program init, jak obsłużyć ten wpis, np. czy podane polecenie wykonać raz, czy też ponownie je zrealizować, gdy się zakończy.
Możesz zmienić domyślny poziom działania na taki, jeśli chcesz, uruchamiając init własnoręcznie i podając mu wybrany poziom działania w postaci argumentu.
tigger # init 5
Następny wpis mówi programowi init, że w czasie inicjacji systemu ma wykonać skrypt /ect/rc.d/rc.sysinit.
Ten plik jest po prostu skryptem powłoki zawierającym polecenia obsługujące podstawową inicjalizację systemu.
rc jest uniwersalnym skryptem startowym, który wykonuje inne skrypty odpowiednie dla danego poziomu działania.
Pliki rc
Linux przechowuje polecenia startowe w plikach mających w nazwie rc, zgodnie ze starą uniksową konwencją. Te pliki są wywoływane z /ect/initiab/.
W dystrybucji Red Hat skryptem rc najwyższego poziomu jest/ect/rc.d/rc.
Skrypty, których nazwy zaczynają się literą K (od ang.kill), są wykonywane jako pierwsze przez /ect/rc.d/rc, aby unicestwić wszystkie istniejące usługi. Następnie są wykonywane skrypty, których nazwy zaczynają się literą S (od ang. start), aby uruchomić nowe usługi.
Numery nn w nazwach służą do narzucenia porządku skryptów przy ich wykonywaniu - skrypty z mniejszymi numerami są wykonywane przed tymi o numerach wyższych. Nazwa xxxx ma ci ułatwić kojarzenie skryptu z usługą, której odpowiada. Ta konwencja nazewnicza może wydawać się dziwna, ale ułatwia ona dodawanie i usuwanie skryptów z tych katalogów i automatycznie wykonywanie ich w odpowiednim czasie przez plik /ect/rc.d/rc.
Zatem każdy plik S oraz K jest wiązaniem symbolicznym wskazującym centralny katalog, w którym są przechowywane skrypty uruchamiające i zatrzymujące wszystkie usługi. W Linuksie firmy Red Hat tym centralnym katalogiem jest / ect/rc.d/init.d.
Wiedza o lokalizacji skryptów uruchamiających i zatrzymujących usługi przydaje się wtedy, kiedy nie chcesz ponownie inicjować innego poziomu działania lub na niego wchodzić, a musisz jedynie uruchomić lub zatrzymać konkretną usługę. Należy wtedy znaleźć w katalogu init.d skrypt z odpowiednią i uruchomić go, przekazując mu jako paramert s t a r t lub s t o p.
# /sbin/init.d/ apache start
Bardzo ważnym skryptem konfigurującym system jest /ect/rc.d/rc.local, który jest wykonywany po uruchomieniu innych skryptów związanych z inicjalizacją systemu.
Zazwyczaj wiązanie symboliczne do rc.local jest wykonywane z każdego katalogu./ect/rc.d/rcN.d o nazwie S99local. Ponieważ 99 jest ostatnim numerem, jaki mogą mieć wszystkie skrypty S, jest wykonywany jako ostatni.
Pole działanie dla każdego wpisu agetty jest określone jako respawn.a to oznacza, że proces init powinien ponownie uruchomić polecenie podane w tym wpisie, gdy proces agetty umrze, co dzieje się przy każdym wyrejestrowaniu się użytkownika.