Linux Botki

Jak się okazuje, proces rozruchu nie jest zbyt skomplikowany:

1. Program ładujący znajduje obraz jądra na disk, ładuje go do pamięci i uruchamia.
2. Kernel zainicjować urządzenia i STI sterowniki.
3. Jądro montuje plik głównysystem.
4. Jądro uruchamia init Called zaplanować.
5. startowych ustawia resztę procesów w ruchu.
6. Ostatnie procesy, które init wykonuje w ramach sekwencji rozruchowej umożliwiają zalogowanie.

Identyfikacja każdego etapu procesu rozruchu jest nieoceniona w rozwiązywaniu problemów z rozruchem i zrozumieniu system jako całość. Aby rozpocząć, skup się na programie ładującym, który jest ekranem początkowym lub monitem wyświetlanym po wykonaniu przez komputer autotestu po włączeniu zasilania, pytając, która operacja system biegać. Po dokonaniu wyboru program ładujący uruchamia Linux kernel, przekazanie kontroli nad system do jądra.

Jest Szczegółowe omówienie jądra gdzie indziej w tej książce, z której Artykuł pochodzi. Ten artykuł obejmuje faza inicjalizacji jądra, etap, na którym jądro wypisuje zestaw komunikatów o sprzęcie obecnym na system. Jądro uruchamia init zaraz po wyświetleniu komunikatu informującego, że jądro zamontowało plik plik głównysystem:

VFS: Mounted root (pliki ext2system) tylko czytać.

Niedługo potem zobaczysz komunikat o uruchomieniu init, a po nim system komunikaty o uruchomieniu usługi, a na końcu pojawia się monit logowania.

UWAGA Na Red Hat Linux, notatka początkowa jest szczególnie oczywista, ponieważ „wita” Cię w Red Hat Linux”. Wszystkie późniejsze komunikaty pokazują sukces lub niepowodzenie w nawiasach po prawej stronie ekranu.

Większość z tego rozdziału zajmuje init, Bo to jest część uruchamiania komputera, gdzie masz największą kontrolę.
startowych

Nie ma w nim nic specjalnego. Jest to program jak każdy inny na Linux system, a znajdziesz go w / sbin wraz z innymi system pliki binarne. Głównym celem init jest uruchamianie i zatrzymywanie innych programów w określonej kolejności. Wszystko, co musisz wiedzieć, to jak działa ta sekwencja.

Istnieje kilka różnych odmian, ale większość Linux dystrybucje używają System Styl V. omówiony tutaj. Niektóre dystrybucje używają prostszej wersji, która przypomina init BSD, ale raczej nie napotkasz tego.

Tryby pracy

W dowolnym momencie na Linux systemdziała pewien podstawowy zestaw procesów. Ten stan machine nazywa się jego poziomem działania i jest oznaczane liczbą od 0 do 6. system spędza większość czasu na jednym poziomie pracy. Jednak po zamknięciu machine down, init przełącza się na inny poziom działania, aby zakończyć działanie system usługi w uporządkowany sposób i powiedzieć jądru, aby się zatrzymało. Jeszcze inny poziom pracy jest przeznaczony dla jednego użytkownika mode, omówione później.

Najłatwiejszym sposobem uzyskania informacji o poziomach pracy jest sprawdzenie pliku konfiguracyjnego init, /etc/inittab. Poszukaj linii takiej jak ta:

ID: 5: initdefault:

Ta linia oznacza, że default poziom pracy na system wynosi 5. Wszystkie linie w pliku inittab mają taką postać, z czterema polami oddzielonymi dwukropkami występującymi w następującej kolejności:
# Unikalny identyfikator (krótki ciąg znaków, takie jak identyfikator w poprzednim przykładzie)
# Stosowana liczba runlevel (s)
# Akcja, którą powinien wykonać init (w poprzednim przykładzie akcją jest ustawienie default poziom pracy do 5)
# Polecenie do wykonania (opcja)

W poprzednim init nie ma polecenia do wykonaniadefault przykład, ponieważ polecenie nie ma sensu w kontekście ustawiania default poziom pracy. Spójrz nieco dalej w inittab, aż zobaczysz następującą linię:

l5: 5: wait :/ etc / rc.d / rc 5

Ta linia wyzwala większość plików system konfigurację i usługi poprzez katalogi rc * .d i init.d. Możesz zobaczyć, że init jest ustawiony na wykonanie polecenia o nazwie /etc/rc.d/rc 5 na poziomie pracy 5. Akcja wait mówi, kiedy i jak init uruchamia polecenie: uruchom rc 5 raz, kiedy enterw runlevel 5, a następnie poczekaj na zakończenie tego polecenia, zanim zrobisz cokolwiek innego.

Istnieje kilka różnych działań w addcja do inicjacjidefault i czekaj, szczególnie jeśli chodzi o zarządzanie energią, a strona podręcznika inittab (5) mówi o nich wszystko. Te, które najprawdopodobniej napotkasz, zostały wyjaśnione w kolejnych sekcjach.

respawn

Akcja respawn powoduje, że init uruchamia następne polecenie, a jeśli polecenie zakończy wykonywanie, uruchamia je ponownie. Prawdopodobnie zobaczysz coś podobnego do tej linii w swoim pliku inittab:

1: 2345: respawn :/ sbin / mingetty tty1

Programy getty Przekaż logowanie monity. Powyższy wiersz jest dla pierwszej wirtualnej konsoli (/ dev / tty1), jeden widzisz Gdy naciśniesz Alt lub Control-Alt-F1 F1. Akcja respawn przynosi zalugujesz powrotem po wylogowaniu się.

ctrlAltdel

Połączenia ctrlaltdel kontroluje, co system działa po naciśnięciu CONTROL-ALT-DELETE na konsoli wirtualnej. W większości systems, jest to jakieś polecenie ponownego uruchomienia za pomocą polecenia shutdown.

sysinit

Akcja sysinit jest pierwszą rzeczą, którą powinien uruchomić init przy starcie enterna dowolnych poziomach pracy.

Jak Procesy w runlevels rozpocząć

Jesteś teraz gotowy, aby dowiedzieć się, jak zainicjować system usług, tuż przed zalogowaniem się. Przypomnij sobie tę linię inittab z wcześniejszych czasów:

l5: 5: wait :/ etc / rc.d / rc 5

Ta mała linia wyzwala wiele innych programów. rc stoi na polecenia Uruchom, a usłyszysz ludzie odnoszą się do poleceń, jak skrypty, programów lub usług. Więc gdzie są te komendy, tak?

W tym przykładzie dla poziomu pracy 5 polecenia prawdopodobnie znajdują się w /etc/rc.d/rc5.d lub /etc/rc5.d. Runlevel 1 używa rc1.d, runlevel 2 używa rc2.d i tak dalej. Możesz znaleźć następujące items w katalogu rc5.d:

S10sysklogd S20ppp S99gpm
S12kerneld S25netstd_nfs S99httpd
S15netstd_init S30netstd_misc S99rmnologin
S18netbase S45pcmcia S99sshd
S20acct S89atd
S20logoutd S89cron

Rc 5 polecenie uruchamia programy w tym katalogu poziomu uruchamiając następujące komendy:

S10sysklogd domu
S12kerneld domu
S15netstd_init domu
S18netbase domu
...
S99sshd domu

Zwróć uwagę na argument start w każdym poleceniu. Litera S w nazwie polecenia oznacza, że ​​polecenie powinno działać na początku mode, a liczba (od 00 do 99) określa, gdzie w sekwencji rc rozpoczyna polecenie.

* Rc. Polecenia D jest programów, które zwykle zaczynają skrypty powłoki w / sbin lub / usr / sbin. Normalnie, można dowiedzieć się, co się z poleceń faktycznie nie patrząc na skrypcie z mniejszym lub pager innego programu.

Możesz uruchomić jedną z tych usług ręcznie. Na przykład, jeśli chcesz ręcznie uruchomić program serwera sieci Web httpd, uruchom S99httpd start. Podobnie, jeśli kiedykolwiek będziesz musiał zabić jedną z usług, gdy plik machine jest włączone, możesz uruchomić polecenie w katalogu rc * .d z argumentem stop (na przykład S99httpd stop).

Niektóre katalogi rc*.d zawierają polecenia zaczynające się na literę K (od „kill” lub stop mode). W tym przypadku rc uruchamia polecenie z argumentem stop zamiast start. Najprawdopodobniej napotkasz polecenia K na poziomach pracy, które zamykają system w dół.

Adding i usuwanie usług

Jeśli chcesz addusunąć lub zmodyfikować usługi znajdujące się w katalogach rc*.d, należy przyjrzeć się znajdującym się w nich plikom. Długa lista ujawnia taką strukturę:

lrwxrwxrwx. . . S10sysklogd -> .. / init.d / sysklogd
lrwxrwxrwx. . . S12kerneld -> .. / init.d / kerneld
lrwxrwxrwx. . . S15netstd_init -> .. / init.d / netstd_init
lrwxrwxrwx. . . S18netbase -> .. / init.d / netbase
...

Polecenia w katalogu rc*.d są właściwie dowiązaniami symbolicznymi do plików w katalogu init.d, zwykle w /etc lub /etc/rc.d. Linux dystrybucje zawierają te linki, dzięki czemu mogą używać tych samych skryptów startowych dla wszystkich poziomów działania. Ta konwencja nie jest w żadnym wypadku wymogiem, ale często ułatwia organizację.

Aby zapobiec uruchomieniu jednego z poleceń w katalogu init.d na określonym poziomie działania, możesz pomyśleć o usunięciu dowiązania symbolicznego w odpowiednim katalogu rc * .d. To działa, ale jeśli popełnisz błąd i kiedykolwiek będziesz musiał umieścić link z powrotem, możesz mieć problemy z zapamiętaniem dokładnej nazwy linku. Dlatego nie należy usuwać linków w katalogach rc * .d, ale raczej add podkreślenie (_) na początku nazwy linku w ten sposób:

_S99httpd S99httpd mv

Podczas rozruchu rc ignoruje _S99httpd, ponieważ nie zaczyna się od S ani K. Ponadto oryginalna nazwa jest nadal oczywista i masz szybki dostęp do polecenia, jeśli masz problem i musisz uruchomić je ręcznie.

Do add usługi, musisz utworzyć skrypt taki jak inne w katalogu init.d, a następnie utworzyć dowiązanie symboliczne we właściwym katalogu rc * .d. Najłatwiejszym sposobem napisania skryptu jest sprawdzenie skryptów znajdujących się już w init.d, zrobienie kopii tego, który rozumiesz, i zmodyfikowanie kopii.

Kiedy addPodczas korzystania z usługi upewnij się, że wybrałeś odpowiednie miejsce w sekwencji rozruchowej do uruchomienia usługi. Jeśli usługa uruchomi się zbyt wcześnie, może nie działać z powodu zależności od innej usługi. W przypadku usług nieistotnych większość systems administrators preferują liczby w latach 90., po większości usług dostarczanych wraz z system.

Linux dystrybucje zwykle zawierają polecenie włączania i wyłączania usług w katalogach rc * .d. Na przykład w Debianie polecenie to update-rc.d oraz w Red Hat Linux, polecenie to chkconfig. Dostępne są również graficzne interfejsy użytkownika. Korzystanie z tych programów pomaga zachować spójność katalogów startowych i pomaga w aktualizacjach.

PODPOWIEDŹ: Jeden z najczęstszych Linux installProblemy ation to niewłaściwie skonfigurowany serwer XFree86, który włącza się i wyłącza, co powoduje system nieużyteczne na konsolach. Aby zatrzymać to zachowanie, uruchom system dla jednego użytkownika mode i zmień swój poziom pracy lub usługi poziomu pracy. Poszukaj czegoś zawierającego xdm, gdm lub kdm w swoich katalogach rc*.d lub w pliku /etc/inittab.

Kontrolowanie init,

Od czasu do czasu trzeba trochę dać initowi kopa, aby nakazał mu zmianę poziomów pracy, ponowne odczytanie pliku inittab lub po prostu shut down dotychczasowy system. Ponieważ init jest zawsze pierwszym procesem w pliku system, jego identyfikator procesu to zawsze 1.

Możesz kontrolować init, z selera. Na przykład, jeśli chcesz, aby przełączyć poziom uruchamiania 3, użyj polecenia:

telinit 3

Podczas przełączania poziomów pracy init próbuje zabić wszystkie procesy, których nie ma w pliku inittab dla nowego poziomu pracy. Dlatego należy zachować ostrożność przy zmianie poziomów pracy.

Kiedy trzeba add lub usunąć zadania odradzania się lub dokonać jakiejkolwiek innej zmiany w pliku inittab, musisz poinformować init o zmianie i spowodować ponowne odczytanie pliku. Niektórzy ludzie używają kill -HUP 1, aby nakazać initowi zrobienie tego. Ta tradycyjna metoda działa w większości wersji systemu Unix, o ile wpiszesz ją poprawnie. Możesz jednak również uruchomić to polecenie telinit:

telinit q

Możesz także użyć telinit s, aby przełączyć się na tryb pojedynczego użytkownika mode.

Zamykanie

init kontroluje również sposób, w jaki system wyłącza się i uruchamia ponownie. Właściwy sposób shut down a Linux machine polega na użyciu polecenia shutdown.

Istnieją dwa podstawowe sposoby używania zamykania. Jeśli zatrzymasz system, zamyka machine down i powstrzymuje go. Zrobić machine stop natychmiast, użyj tego polecenia:

shutdown-h now

W większości modern machines z dość niedawnymi wersjami Linux, zatrzymanie odcina zasilanie machine. Możesz także zrestartować machine. Przy ponownym uruchomieniu użyj -r zamiast -h.

Proces zamykania trwa kilka sekund. Nigdy nie należy resetować ani wyłączać machine na tym etapie.

W poprzednim przykładzie nadszedł czas shut down. Argument ten jest obowiązkowy, ale można go określić na wiele sposobów. Jeśli chcesz macAby przejść w dół kiedyś w przyszłości, jednym ze sposobów jest użycie + n, gdzie n to liczba minut, przez które należy odczekać zamknięcie przed wykonaniem swojej pracy. Dla innych options, spójrz na stronę podręcznika zamykania (8).

Aby system uruchom ponownie za 10 minut, uruchom to polecenie:

shutdown-r + 10

On Linux, zamknięcie powiadamia wszystkich zalogowanych, że machine schodzi, ale niewiele to daje. Jeśli określisz czas inny niż teraz, shutdown utworzy plik o nazwie /etc/nologin. Gdy ten plik jest obecny, plik system zabrania logowania przez kogokolwiek z wyjątkiem superużytkownika.

Kiedy system czas zamykania w końcu nadejdzie, shutdown mówi initowi, aby przełączył się na poziom pracy 0 w celu zatrzymania i poziom pracy 6 w celu ponownego uruchomienia. Kiedy init enters runlevel 0 lub 6, mają miejsce wszystkie poniższe czynności, które można zweryfikować, patrząc na skrypty wewnątrz rc0.d i rc6.d:

1. startowych zabija wszystkie procesy, że może (tak jak przy przejściu na inny runlevel).

# Początkowe polecenia rc0.d / rc6.d uruchamiają się, blokując system pliki na miejsce i inne przygotowania do zamknięcia.
# Kolejne polecenia rc0.d/rc6.d odmontowują wszystkie plikisysteminne niż root.
# Dalsze polecenia rc0.d/rc6.d ponownie montują plik głównysystem tylko czytać.
# Jeszcze więcej poleceń rc0.d/rc6.d zapisuje wszystkie buforowane dane do plikusystem z programem do synchronizacji.
# Ostateczne rc0.d / rc6.d komendy mówią jądru, aby ponownie uruchomić lub zatrzymać przy restarcie, halt, lub program wyłącza zasilania.

Programy do ponownego uruchomienia i zatrzymania zachowują się inaczej dla każdego poziomu działania, potencjalnie powodując zamieszanie. przez default, te programy wywołują zamknięcie z opcją -r lub -h options, ale jeśli system jest już na poziomie zatrzymania lub ponownego uruchomienia, programy informują jądro, aby natychmiast się wyłączyło. Jeśli naprawdę chcesz zamknąć swój plik machine down w pośpiechu (pomijając wszelkie możliwe szkody spowodowane nieuporządkowanym zamknięciem), użyj opcji -f.

Pasjonat technologii, z przyjemnością piszę dalej StealthSettings.com od 2006 roku. Mam duże doświadczenie w systemach operacyjnych: macOS, Windows şi Linux, ale także w językach programowania i platformach blogowych (WordPress) oraz dla sklepów internetowych (WooCommerce, Magento, PrestaShop).

Zostaw komentarz