Postanowiłem zrobić coś dla zupełnych
nowicjuszy, czyli artykuł o tym jak działa komputer i osadzony w
nim system operacyjny Linux. Czasami celowo ominąłem zaawansowane
zagadnienia (np. rolę chipsetu na płycie głównej), gdyż chciałem przede wszystkim zachować prostotę i
przejrzystość tekstu.
Komputer, to taka prostokątna skrzynka, monitor,
klawiatura, myszka i urządzenia typu skaner, drukarka. We
wspomnianej skrzynce znajduje się procesor połączony
kabelkami z dyskiem twardym, kartą grafiki,
kostkami pamięci RAM. Oczywiście z przyczyn czysto
praktycznych kabelki zastąpiono specjalnymi cienkimi paskami miedzi
umieszczonej na płycie głównej, ale to tylko kwestia
celności rozwiązań technicznych. Procesor jest rodzajem
układu scalonego, który w rytm swojego zegara przeadresowuje
pakiety bitów, czyli zer i jedynek otrzymywanych z różnych
urządzeń. Zero to brak impulsu elektrycznego w określonym przedziale czasowym (lub w kości pamięci, na dysku), a jeden to impuls elektryczny. Tak naprawdę, to procesor całe swoje życie tylko
przyjmuje impulsy (słowa bitów), przeadresowuje je i wysyła nowe
zapytania, umieszczając wyniki na monitorze lub w postaci plików na
dysku twardym ;) . Aby zwiększyć szybkość pracy procesora
wymyślono, że często powtarzające się pakiety będą przechowywane w
pamięci podręcznej RAM, a nie na dysku twardym. Co to
jest dysk twardy i pamięć podręczna? Dysk, to inaczej
magnetofon, który zapisuje na taśmie o kształcie krążka zestaw zer
i jedynek. Oczywiście ze względu na konieczność użycia silniczka
jest to urządzenie stosunkowo powolne. Znacznie szybciej zapisuje
się i odczytuje dane z kości pamięci. Pamięć RAM to w
uproszczeniu miliony tranzystorków w jednym łebku. Ich jedynym
zadaniem jest podtrzymywanie małego prądu w każdym tranzystorku
(coś jakby minikondensator). Brak prądu oznacza zero, obecność
ładunku elektrycznego oznacza jeden. W zależności od ułożenia
ładunków mamy różne "dane". Ponieważ RAM nie umie długo
utrzymywać wspomnianych ładunków w sobie, potrzebuje od czasu do
czasu pobrać energię elektryczną w celu odświeżenia. Dane w pamięci
RAM znikną, gdy odłączymy napięcie zasilające np. wciskając
reset komputera.
W chwili włączenia prądu następuje działanie, w swoim schemacie
przypominające labirynt, po którym biegnie prąd. Labirynt, gdzie
niektóre ścianki można przesuwać (zgodnie z parametrami BIOSu)
narzucając naszemu prądowi odpowiedni kierunek. No, ale do
rzeczy... Włączając komputer, pozwalamy napięciu odwiedzić
transformator, który zamieni 230V na kilka mniejszych np. ok 2V,
12V itd. Teraz nastapi najciekawsze: zgodnie z ustawieniami BIOSu
prądy popłyną tam, gdzie im BIOS pozwolił, czyli między innymi do
procesora. Procesor zacznie odbierać ładunki elektryczne
zawierające bity informacji i automatycznie będzie je
przekierowywać do różnych urządzeń w celu odczytu danych
startowych. Zostanie wykonany: TEST PAMIĘCI, TEST URZĄDZEŃ WEWNĘTRZNYCH,
SKANOWANIE SPRZĘTU W POSZUKIWANIU URZĄDZEŃ PCI, SKANOWANIE URZĄDZEŃ GOTOWYCH DO ROZRUCHU.
Jeżeli w BIOSie ustawiłeś opcję bootowania z dysku
twardego, to zgodnie z tym procesor zostanie zmuszony do wysłania
impulsów szukających danych w MBR dysku twardego
(ewentualnie stacji dyskietek 1,44 lub w czytniku CD-ROM).
Co to jest MBR? Master BootRecord to obszar
pierwszych 512 bajtów dysku twardego (cylinder 0, głowica 0, sektor 1). Zawiera bootstrap, czyli program utworzony podczas zakładania partycji, który w trakcie startu komputera (współpracując z BIOSem) uruchamia dane z aktywnej partycji.
W MBR są ponadto: tablica partycji dysku (informacje o lokalizacji i typie partycji), informacje dotyczące rozmiaru klastrów i wielkości sektorów systemowych (np. tablicy FAT32) w obszarze fizycznym danych.
W MBR Linux
umieszcza LILO (ewentualnie GRUB), czyli swój program
startowy (Boot Loader). Więcej na ten MBR w magazynie CHIP 8/2005 (str. 86-89) oraz Komputer Świat EXPERT 2/2007 (str. 36-38).
Po odczytaniu danych z
MBR procesor wysyła odpowiednie (zgodne z parametrami
LILO) zapytania do innych obszarów dysku twardego i
uruchamia system operacyjny Linux.
Słowo o BIOSie.
BIOS czyli Basic Input Output
System (podstawowy system wejścia-wyjścia) to pierwszy
program uruchamiany jeszcze przed startem systemu
operacyjnego. Zadaniem BIOSu jest inicjowanie (uaktywnianie)
urządzeń wejścia (np. klawiatury) i wyjścia (np. karty grafiki),
ustalenie parametrów pracy płyty głównej (taktowanie szyny
systemowej, ustawianie mnożnika zegara dla procesora, parametrów
pracy pamięci RAM) oraz aktywacja wybranych przez użytkownika
funkcji (np. zarządzania energią). Fizycznie BIOS jest
zapisem danych w postaci tzw. "bramek" (mikrourządzeń
przepuszczających lub blokujących przejście ładunków elektrycznych)
w pamięci ROM (czyli rodzajem pamięci stałej, nie
wymagającej odświeżania dodatkowym napięciem). Uwaga: niedomyślne
parametry BIOSu (np. data, godzina, hasło itp.) są zapisane w
sąsiedniej, specjalnie podłączonej do BIOSu pamięci CMOS. Utrzymuje ona swoje dane dzięki okrągłej,
błyszczącej bateryjce umieszczonej w płycie głównej. Jeżeli
wyjmiesz wspomnianą bateryjkę, to BIOS uruchomi się w wg
fabrycznych parametrów ROMu (bez hasła, właściwej daty
itd.).
Linux to Kernel (jądro systemu) plus
ZBIÓR
oprogramowania. Nie ma jednego systemu Linux, a tylko Kernel jest
ustandaryzowany. W przeciwieństwie do znanego powszechnie Windows ,
Linux działa bez okienek. Wynika to zreszta z historii systemu,
który pierwotnie był dostępny tylko w wersji tekstowej i wymagał
znajomości
komend unixowych.
Okienka (np. KDE,
Gnome) są są więc dodatkowym oprogramowaniem, tzw. "nakładką" na
powłokę tekstową (
shella).
Kolejność czynności podczas startu systemu:
- Pierwszy uruchamiany jest program LILO (ew. GRUB) Dane
tam zawarte pozwalają procesorowi na ustawienie ekranu,
uruchomienie właściwego Kernela itp.
- Zostaje odpalony pierwszy proces
Kernela, czyli init. Zawsze ma on identyfikator procesu
PID o wartości 1. Większość dystrybucji Linuksa (w tym
opisywany tutaj Mandrake/Mandriva) używa init w oparciu o parametry
zapisane w pliku /etc/inittab. Proces init odpala proces getty
- Proces init montuje systemy plików (np. dysk twardy) zgodnie z danymi w pliku /etc/fstab, a to co zamontował odnotowuje w pliku /etc/mtab
- Następnie są czytane skrypty startowe w katalogach
/etc/rc.d/rc?.d/ (będą wówczas włączone demony w ramach
osobnych procesów) oraz plik /etc/rc.d/sysinit .
- W zależności od widzimisie admina niektóre programy mogą być
uruchomione za pomocą skryptów w katalogu /etc/xinetd/ . Mamy wówczas do czynienia z
pracą programu nie w osobnym procesie (te zostały włączone podczas
startu systemu za pośrednictwem w/w skryptów
/etc/rc.d/rc?.d/*), a pod kontrolą nadserwera inetd
(lub xinetd)
- Uruchamiany jest skrypt /etc/rc.d/rc.local .
W nim możemy (na końcu!) umieszczać odwołania do własnych,
autorskich skryptów (np. uruchomienie połączenia SDI - patrz
ostatnie wiersze pliku).
- Gdy system zakończy ładowanie np. w 3 levelu
(w powłoce tekstowej), to automatycznie zostanie włączony program
login umożliwiający zalogowanie do systemu. Po zalogowaniu
zostaną uruchomione skrypty
konfigurujące shella.
- Jeżeli system odpalił w 3 levelu (w powłoce tekstowej), a użytkownik zechce
pracować w okienkach np. KDE, to wielki finał wykona skrypt
/usr/bin/X11/startx (uruchamiany poprzez wpisanie zlecenia
startx i wciśnięcie klawisza ENTER).
Oczywiście ładowanie systemu nie odbywa się w sposób
schematycznie liniowy. Kilka elementów jest inicjowanych na samym
początku startu systemu, ale zakńczenie odbywa się na końcu - na
przykład schemat uruchamiania shella danego
usera:
- W pierwszej kolejności proces init zgodnie z danymi w
pliku /etc/inittab uruchamia proces getty. Proces
getty może mieć różne numery, ale domyślnie ma ich od 1 do 6
(zgodnie z wpisem do pliku /etc/initab). Efekty działania
procesu getty1 widzimy na konsoli nr 1 widzianej po
wciśnięciu klawiszy CTRL ALT F1.
- Proces getty wykonuje podstawowe czynności inicjujące, a
następnie pod koniec ładowania systemu uruchamia program
login.
- Po zalogowaniu system odczytuje rodzaj shella
przypisanego dla danego usera. Uruchamiane są skrypty konfigurujące
shella. Dopiero teraz mamy powłokę tekstową przygotowaną do
odbierania poleceń.
- Jako ciekawostkę podam, że po wylogowaniu np. z konsoli 1
następuje wyłączenie procesu getty1, następnie ponownie w oparciu o plik
/etc/initab program init uruchamia na nowo program
getty i powtarzają się etapy konfiguracji konsoli, a na jej bazie
shella.
Teraz po kolei opiszę w/w etapy startu systemu.
Acha... zapamiętaj na razie jedną rzecz: usługi internetowe mogą
być uruchamiane za pomocą programu init
(/etc/rc.d/init.d/ oraz /etc/rc.d/) lub nadserwera
inetd (xinetd). Wyjaśnienia poniżej.
1) LILO
LILO to program (bootloader) uruchamiający system
Linux. Innym, choć na razie mniej popularnym bootloaderem jest GRUB. LILO jest umieszczane standardowo na dyskietce 1,44
lub w MBR dysku twardego, zaś konfig LILO czyli plik
lilo.conf na dysku twardym, w katalogu /etc.
Więcej na ten temat na sąsiedniej stronie.
2) INIT
Gdy program LILO ustawi parametry startowe, nastąpi
uaktywnienie pierwszego procesu Kernela pod nazwą init,
którego opcje są zapisane w pliku /etc/inittab . Oto
przykład tego pliku (patrz tekst zaznaczony na niebiesko):
#(Tu decydujemy, czy
załadują się okienka 5 lub czy system zatrzyma ładowanie na powłoce tekstowej 3. Więcej
informacji umieściłem poniżej. W naszym
przykładzie system wystartuje w okienkach (5)
id:5:initdefault:
#(wskazanie miejsca
położenia pliku rc.sysinit - jest to skrypt konfigurujący
niektóre parametry startowe systemu)
si::sysinit:/etc/rc.d/rc.sysinit
#(Co ma zrobić system,
gdy user wciśnie klawisze CTRL ALT DELETE - przeczytaj artykuł na
sąsiedniej
stronie. W naszym przykładzie nastąpi restart systemu. Uwaga: w
okienkach pierw zabijamy okienka klawiszami CTRL ALT BACKSPACE, a
potem dopiero restartujemy system CTRL ALT
DELETE)
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
#(czas podtrzymywania
napięcia przez UPS po zaniku prądu - tu 2 minuty, potem zostanie
zatrzymany system)
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System
Shutting Down"
#(anulowanie powyższego przygotowania do
zatrzymania systemu, o ile pojawi się napięcie w wyznaczonym czasie
tu 2 minut)
pr:12345:powerokwait:/sbin/shutdown -c "Power
Restored; Shutdown Cancelled"
# Uruchamianie gettys w standardowych
poziomach startowych (runlevels).
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
# Wyjaśnienie: respawn oznacza wywołanie procesu lub demona.
Proces getty 1 daje efekt w postaci powłoki tekstowej widzianej jako
tty1 (CTRL ALT F1).
Jak zauważyłeś głównym zadaniem pliku /etc/
inittab jest
wskazanie poziomu startowego
runlevel w wierszu
id:5:initdefault: . Oczywiście możemy
narzucić inny niż 5 poziom. Oto ich lista:
0 - halt, czyli zatrzymaj system (nie ustawiaj tego
jako domyślny poziom ;)
1 - system jednoużytkownikowy (będzie działać tylko pod jednym
userem), bez funkcji sieciowych
2 - wieloużytkownikowy system (tak jak poziom 3), ale z wyłączoną
funkcją sieciową
3 - wieloużytkownikowy system z funkcjami sieciowymi
4 - unused (nieużywane )
5 - tak jak poziom 3, ale w okienkach (serwer X11)
6 - reboot czyli restart systemu (nie ustawiaj tego jako domyślny
poziom ;)
Poziom 0 i 6 jest używany przez system do zwykłego
restartu lub zatrzymania, więc nie powinno się go wpisywać do pliku
/etc/inittab w wierszu id:?:initdefault: . Zobaczysz ten
runlevel, gdy wydasz zwykłe zlecenie halt,
reboot lub np. init 6, telinit 6.
Informację o aktualnym numerze poziomu uzyskasz też za pomocą
zlecenia
runlevel.
3) Skrypty startowe /etc/rc.d/rc?.d/*
Już wiesz jaki
runlevel wybrałeś podczas startu systemu.
Przyjmijmy dla własnej wygody, że jest to
poziom 3, czyli
powłoka tekstowa. Będziesz pracował w czystym
shellu, a okienka
uruchomisz zleceniem
startx.
Należy wiedzieć, że w zależności od tego czy system załaduje się w
powłoce tekstowej, czy w okienkach (np. KDE) - są wykorzystywane
inne pliki autostartu. Jeżeli wybraliśmy domyślny poziom
działania nr
3, to automatycznie zmusiliśmy system, by w
czasie startu odczytał zawartość katalogu /etc/rc.d/
rc3.d/
(który działa podobnie jak autostart w windowsowm menu START-
PROGRAMY- AUTOSTART). W przypadku startu systemu w okienkach (czyli
poziomie
5), system odczyta zawartość katalogu
/etc/rc.d/
rc5.d/ . Znajdują się w nim linki do plików
startowych demonów. Mają one w nazwie literkę
S (czyli plik
startowy) lub
K (kill - koniec, zabity), nr oznaczający
kolejność uruchomienia i nazwę
demona. Skróty te można śmiało
ręcznie kasować (zamiast usuwania można zmienić nazwę, dopisując na
początku dolną kreskę "_") lub dodawać w zależności od potrzeb.
Skąd się tam biorą? Ano, podczas instalacji programu np
sshd, w katalogu /etc/rc.d/
init.d/ zostanie utworzony
plik
sshd umożliwiający uruchomienie danego
demona. To
właśnie do niego jest dowiązany skrót w
/etc/rc.d/
rc3.d/.
Więcej o autostarcie napisałem na sąsiedniej
stronie.
USŁUGI
(czyli serwisy systemowe) są to
programy uruchamiane w celu dostarczenia pewnych usług.
Programy uruchamiane w celu dostarczenia pewnych
usług za pośrednictwem
inetd (
xinetd) nazywamy
usługami lub
serwisami systemowymi, natomiast
programy działające samodzielnie (
standalone) nazywamy
demonami. Listę usług zamieściłem na stronie pt.
ZARZĄDZANIE. Uwaga: demon to program, który nie jest dołączony do żadnego terminala (działa w tle).
4) Superserwer inetd (xinetd)
Superserwer
inetd (
xinetd) to narzędzie bardzo
przydatne w systemie Linux. Jego zaletą jest umiejętność
nasłuchiwania na wybranych portach i uruchamiania danej usługi w
razie potrzeby. Weźmy przykład:
sshd. Można go odpalić jako
osobny proces
standalone - wówczas
sshd będzie pracował jako demon i zostanie aktywny CAŁY
CZAS, nawet gdy nie będzie prób nawiązania połączenia. Z punktu
widzenia oszczędności zasobami komputera, to rozrzutne choć
umożliwiające natychmiastową reakcję rozwiązanie. Można też
uruchomić
sshd pod
inetd (
xinetd) i wówczas
nasz superserwer będzie się czaił na porcie
22, a gdy
usłyszy nawoływanie do połączenia - samoczynnie uruchomi
nieaktywnego dotychczas
demona sshd. Niestety, wydłuża się
wówczas czas oczekiwania na uruchomienie i reakcję. Serwer
inetd (
xinetd) ustala nr portu pobierając dane z pliku /etc/
services. Plik ten zawiera listę wszystkich usług sieciowych wraz z odpowiadającymi im portami.
Podczas instalowania demonów (np. proftpd, sshd itd.) tworzone są w
katalogu /etc/
xinetd.d pliki konfiguracyjne o tytułach
zawierających nazwę
demona. Po wyedytowaniu dowolnego pliku,
znajdziesz parametr
disable (wyłączone). Decyduje on, czy
demon będzie podporządkowany
xinetd (opcja
no) lub
czy włączy się jako jako samodzielny proces (opcja
yes).
Demona np.
sshd pracującego pod
xinetd uruchomimy (po
dokonaniu zmian w katalogu /etc/
xinetd.d) resetując
superserwer zleceniem:
kilall -HUP xinetd
lub
/etc/rc.d/xinetd restart
Acha... w innych
Linuksach niż Mandrake możesz spotkać
inetd z plikiem
konfiguracyjnym /etc/
inetd.conf .
Aby zobaczyć jakie usługi są obecnie uruchamiane przez inetd wydajemy komendę:
grep -v '^#' /etc/inetd.conf
Aby inetd nie był uruchamiany przy starce systemu należy usunąć atrybut wykonywalny pliku /etc/rc.d/rc.inetd.
chmod 660 /etc/rc.d/rc.inetd
Przypominam, że programy uruchamiane w celu dostarczenia pewnych
usług za pośrednictwem inetd (xinetd) nazywamy
usługami lub serwisami systemowymi, natomiast
programy działające samodzielnie (standalone) nazywamy demonami. Uwaga: demon to program, który nie jest dołączony do żadnego terminala (działa w tle). Listę usług zamieściłem na stronie pt. ZARZĄDZANIE.
Znalazłem pod adresem ftp://ftp.helion.pl/online/libezp/libezp-3.pdf fragment książki wydawnictwa Helion w formacie pdf zawierający ciekawe informacje o xinetd.
5) Skrypt /etc/rc.d/rc.local
Mamy włączony system. Działają demony, interfejsy. Został ostatni
główny skrypt startowy
rc.local,
w którym informatycy opiekujący się daną dystrybucją Linuksa (tu
Mandrake/Mandriva) umieszczają ostatnie szlifujące konfigurację zlecenia.
Ponieważ z każdą nową wersją Mandrake mamy inną zawartość pliku
rc.local nie będę opisywał jego zawartości. Jeżeli masz
swoje autorskie skrypty i chcesz je automatycznie uruchamiać
podczas startu systemu, to na końcu pliku dopisz prosty wiersz
będący ścieżką dostępu np.
/etc/rc.d/rc.his
Pamiętaj, ze takie autorskie skrypty muszą mieć
prawo do
wykonania.
6) Skrypty konfigurujące shella
Proces uruchamiania
shella dla danego usera jest skomplikowany. Wspomniałem o tym na
początku strony. Nas interesuje co się dzieje od chwili, gdy program
getty zaczyna proces przygotowania
konsoli do użycia uruchamiając odpowiednie programy. Program
login pozwolił wpisać nazwę usera i sprawdził hasło.
Z pliku /etc/
passwd oraz
passwd- jest pobierany rodzaj shella przypisany danemu userowi (plik
/etc/shells zawiera listę wszystkich, dostępnych, systemowych shelli).
Po ustaleniu rodzaju shella (w naszym przypadku
bash)
jest czytany plik
/etc/
profile
Następnie ustalana jest zmienna PATH zgodnie z zawartością pliku
~/
.bash_profile
lub jeżeli go nie ma, to w pliku
~/bash_login
lub jeżeli ich nie ma to w pliku
~/.profile
Pozostaje jeszcze plik ~/
bashrc , który współpracuje z plikiem /etc/
bashrc
Wyjanienie: znaczek ~/ ozancza katalog domowy np. /home/antek/