Od lamera do hakera/Linux
Sekcja wyjaśnia co się dzieje podczas startu i zamykania Linuxa. Jeżeli poprawne procedury nie są przestrzegane może dojść do zniszczenia systemu plików i utraty danych.
Akt włączania komputera i ładowania systemu operacyjnego[1] nazywany jest bootowaniem (ładowaniem).
Na początku komputer wykonuje program ładujący, którego zadaniem jest załadowanie i uruchomienie systemu operacyjnego. Kod ten zazwyczaj znajduje się w ściśle określonym miejscu i jest stosunkowo mały (kilkaset bajtów).
Różne komputery mają różne procedury startowania. PeCet (jego BIOS) odczytuje pierwszy sektor (zwany sektorem ładującym) dyskietki, lub dysku. Program ładujący znajdujący się w tymże sektorze ładuje system operacyjny z innej części dysku (lub z innego urządzenia).
Po załadowaniu Linuxa następuje inicjalizacja sprzętu i odpowiednich sterowników, po czym uruchomiony zostaje init. init uruchamia inne procesy, te z kolei umożliwiają zalogowanie się użytkowników i wiele innych rzeczy. Szczegóły zostaną omówione poniżej.
W celu wyłączenia systemu Linux należy wszystkim procesom powiedzieć, że mają się zakończyć (zamknąć wszystkie pliki i zrobić inne niezbędne rzeczy), następuje odmontowanie systemu plików i obszarów wymiany, po czym następuje wyświetlenie informacji o możliwości wyłączenia komputera. Jeżeli prawidłowa procedura nie jest przestrzegana dyski mogą nie zostać zaktualizowane (dane zostają stracone, możliwość uszkodzenia systemu plików).
Startowanie
[edytuj]Linuxa możesz uruchomić z kilku różnych urządzeń. Podręcznik "Installation and Getting Started" omawia sposoby startowania z różnych urządzeń.
Po włączeniu komputera BIOS przeprowadza różne testy zwane testami POST. Test POST jest przeprowadzany w kilku fazach. Faza pierwsza to sprawdzenie obecności i prawidłowości działania układów niezbędnych do działania komputera. Na tym etapie nie jest dostępna jeszcze żadna karta rozszerzenia i błędy są komunikowane przez miniaturowy głośnik (ang. PC speaker) umieszczony w obudowie jednostki systemowej. W pierwszej kolejności jest testowana poprawność pracy procesora, później pamięci RAM i następnie karty graficznej. Niepomyślny wynik POSTu skutkuje serią odgłosów wydanych przez głośnik. Odgłosy te, a dokładniej ich ilość i czas trwania są kodem błędu. Korzystając z instrukcji obsługi możemy ustalić, co jest przyczyną problemów. Nowoczesne płyty główne zamiast używania dość niewygodnego kodu dźwiękowego informują o rezultacie testu POST za pomocą kolorowych diod LED lub wyświetlacza siedmiosegmentowego umieszczonego na płycie głównej. Inne rozwiązanie to komunikaty głosowe (nagrane przez lektora i zapisane w specjalnym układzie scalonym na płycie głównej). Kolejny etap testu POST wykonywany już po zainicjowaniu większości podzespołów składa się z testu pamięci RAM oraz testu dysków twardych. Gdy test POST zostanie zakończony i nie zostaną znalezione żadne błędy komputer wyda pojedynczy pisk (ang. beep) (rzadziej dwa) i rozpocznie procedurę uruchamiania systemu operacyjnego i wreszcie wybiera odpowiedni dysk (wybór można skonfigurować) i odczytuje jego pierwszy sektor. (sektor ładujący; lub w przypadku dysków twardych główny rekord ładujący - każda z partycji zawiera swój sektor ładujący)
Sektor ładujący zawiera niewielki program (na tyle mały aby zmieścił się w jednym sektorze), którego zadaniem jest załadowanie systemu operacyjnego z dysku. Podczas startowania z dyskietki zadaniem tego kodu jest wczytanie kilku bloków (zależnie od rozmiaru jądra) pod odpowiedni adres w pamięci. Zazwyczaj na dyskietce znajduje się tylko jądro, bez żadnego systemu plików, co upraszcza proces startowania, jeżeli na dyskietce znajduje się systemem plików należy użyć LILO.
Kod zawarty w głównym rekordzie ładującym ma utrudnione zadanie - musi sprawdzić tablicę partycji i wybrać aktywną, odczytać jej sektor ładujący i przekazać mu sterowanie. Kod zawarty w sektorze ładujący robi to samo co odpowiednik z dyskietki. Jednak w szczegółach oba programy się różnią - zazwyczaj nie tworzy się osobnej partycji zawierającej tylko jądro, więc trzeba je znaleźć na systemie plików. Istnieje kilka sposobów aby to zrobić, najpopularniejszym jest użycie LILO. (Dokładne rozwiązanie problemu jest, w naszej dyskusji, niepotrzebne, gdybyś chciał poznać szczegóły sięgnij do dokumentacji LILO)
LILO najczęściej odczytuje domyślne jądro i uruchamia je, można program skonfigurować tak, aby umożliwić wybór jednego z kilku, lub nawet innego systemu operacyjnego. LILO można skonfigurować tak, aby reagowało na klawisze: alt, shift, lub ctrl podczas swego ładowania, co umożliwi wybór systemu, można je również skonfigurować aby domyślnie czekało na wybranie systemu, dodatkowo można ustalić okres oczekiwania, po którym zostanie użyte domyślne ustawienie.
Za pomocą LILO można przekazać jądru argumenty.
Startowanie z każdego z urządzeń ma swoje zalety, jak i wady, zasadniczo startowanie z dysku jest przyjemniejsze, ponieważ nie trzeba się bawić dyskietkami, a do tego jest szybsze. W przypadku kłopotów warto mieć jednak dyskietkę startową pod ręką - umożliwi ona uruchomienie systemu po zmianie MBR, lub innym wypadku.
Po wczytaniu jądra Linuxa do pamięci i uruchomieniu go dzieją się następujące rzeczy:
- Jądro dekompresuje się - najczęściej instalowane jest w postaci skompresowanej. Początek jądra zawiera mały dekompresor, który tego dokonuje.
- Jeżeli masz kartę super-VGA, którą Linux rozpoznaje i która ma możliwość zmiany trybu textowego Linux pyta się, który z nich wybrać. Podczas kompilacji jądra ustala się domyślny tryb, można go również ustawić za pomocą LILO, lub rdev.
- Jądro sprawdza zainstalowany sprzęt (dyski, napędy dyskietek, karty sieciowe, itd.) i odpowiednio go konfiguruje; w między czasie wyświetlane są odpowiednie informacje. Np.:
LILO boot: Loading linux. Console: colour EGA+ 80x25, 8 virtual consoles Serial driver version 3.94 with no serial options enabled tty00 at 0x03f8 (irq = 4) is a 16450 tty01 at 0x02f8 (irq = 3) is a 16450 lp_init: lp1 exists (0), using polling driver Memory: 7332k/8192k available (300k kernel code, 384k reserved, 176k data) Floppy drive(s): fd0 is 1.44M, fd1 is 1.2M Loopback device init Warning WD8013 board not found at i/o = 280. Math coprocessor using irq13 error reporting. Partition check: hda: hda1 hda2 hda3 VFS: Mounted root (ext filesystem). Linux version 0.99.pl9-1 (root@haven) 05/01/93 14:12:20
- Dokładne informacje zależą od jądra i jego ustawień.
- Jądro spróbuje zamontować główny system plików. Jego położenie jest konfigurowalne w czasie kompilacji; również za pomocą rdev, lub LILO. Jeżeli nie można tego dokonać jądro panikuje i zatrzymuje system (zbyt dużo w takiej sytuacji nie da się zrobić).
- Główny system plików jest zazwyczaj montowany wyłącznie-do-odczytu (można to zmienić tak samo jak jego położenie). Umożliwi to sprawdzenie systemu plików po jego zamontowaniu; nierozsądnie jest sprawdzać zamontowany system plików.
- Następnie jądro uruchamia proces init (domyślnie z katalogu /sbin/init) w tle (proces zawsze ma id = 1 ). init odpowiedzialny jest za wiele rzeczy, część z nich podlega kontroli administratora; zobacz Chapter 7.
- init odpowiedzialny jest za uruchamianie programów na poszczególnych poziomach pracy, w trybach wieloużytkownikowych uruchamia getty na terminalach wirtualnych. getty pozwala użytkownikom zalogować się do systemu. init zgodnie z konfiguracją może uruchomić inne programy.
- Proces startowania jest kompletny.
Zamykanie
[edytuj]Ważne jest aby poprawnie zamknąć system. Jeżeli tego nie zrobisz stracisz dane i uszkodzisz system plików. Dzieje się tak dlatego, że Linux nie zapisuje danych od razu, robi to co pewien okres. Taki sposób działania znacząco przyśpiesza działanie programów, jednak wymaga poprawnego zamknięcia systemu.
Poleceniem odpowiedzialny za prawidłowe wyłączenie Linuxa jest shutdown.
Programowi można podać czas oczekiwania przed zamknięciem, umożliwiając w ten sposób użytkownikom szansę zamknięcia programów i wylogowania się. Przykład:
- shutdown -h +10 'Zainstalujemy nowy dysk. System będzie
> dostępny w ciągu 3 godzin.' #
Wiadomość zostanie wysłana wszystkim użytkownikom, jeżeli nie zastosują się do niej mogą utracić dane. Oto jej przykładowa postać:
Broadcast message from root (ttyp0) Wed Aug 2 01:03:25 1995...
Zainstalujemy nowy dysk. System będzie dostępny w ciągu 3 godzin. The system is going DOWN for system halt in 10 minutes !!
Wiadomość będzie powtarzana coraz częściej w miarę upływu czasu.
Kiedy rozpoczyna się prawdziwe wyłączanie systemu wszelkie procesy dostają sygnał SIGTERM (po pewnym odstępie czasu SIGKILL), systemy plików zostają odmontowane (oprócz głównego). init wypisuje informacje o możliwości wyłączenia komputera. Wtedy i tylko wtedy możesz wyłączyć zasilanie.
Czasami, rzadko na systemach porządnie zarządzanych, dochodzi do sytuacji gdy coś nie zadziała. Dla przykładu: jądro panikuje i wywala się, wtedy możesz się jedynie modlić abyś nie stracił zbyt wiele i wyłączyć zasilanie. Jeżeli zdarzyło się coś mniej poważnego (np. ktoś ci siekierą klawiaturę rozwalił ;-) pomyśl jak możesz zmusić system do poprawnego zamknięcia (w tym przypadku logowanie przez sieć rozwiązuje problem), jeżeli taka możliwość nie istnieje spróbuj odłączyć wszelkie zewnętrzne bodźce (np. odłącz sieć, itp.), poczekaj aż update kilka razy zapisze dane na dysku (kilka minut) po czym wyłącz zasilanie.
Niektórzy lubią zamykać system wywołując sync [1] trzy razy, po czym czekają na zakończenie dyskowych operacji we/wy i wyłączają zasilanie. Jeżeli nie ma działających programów działa to, prawie, tak samo jak shutdown. Jednakże, nie następuje odmontowanie systemu plików co powoduje, że podczas następnego startowania dyski zostaną sprawdzone. Nie zaleca się takiego podejścia.
(Jeżeli się zastanawiasz: powodem trzykrotnego wywołania sync jest to, iż we wczesnych dniach Unixa osobne trzykrotne wpisywanie polecenia dawało dość czasu na zakończenie wszelkich operacji we/wy.)
Restart
[edytuj]Restartowanie oznacza uruchamianie systemu od nowa. Uzyskiwane jest poprzez poprawne zamknięcie systemu i zresetowanie komputera. Można je uzyskać za pomocą opcji -r shutdown
W większości systemów wywołanie shutdown -r now następuje po naciśnięciu ctrl-alt-del. Akcja wywoływana ctrl-alt-del jest konfigurowalna (zobacz inittab). W systemach publicznie dostępnych takie działanie powinno być zablokowane.