12.3 Shutting Down Properly

To bardzo ważne, byś wyłączał swój system właściwie. Zwykłe odłączenie zasilania za pomocą włącznika może poskutkować poważnym uszkodzeniem systemu plików. Gdy system jest włączony, wiele plików jest w użyciu, nawet gdy ty sam nic nie robisz. Pamiętasz z pewnością, że w tle uruchomionych jest wiele procesów. Zarządzają one systemem oraz posiadają wiele otwartych plików. Gdy nagle znika zasilanie, pliki te nie zostają poprawnie zamknięte i mogą zostać uszkodzone. W zależności od tego, które pliki uległy uszkodzeniu, system może stać się nawet całkowicie bezużyteczny! W każdym jednak wypadku uszkodzenia plików zmuszony będziesz przebrnąć przez długą procedurę sprawdzenia systemu plików przy ponownym uruchomieniu.

Note

Jeżeli postawiłeś swój system na partycji z journaling filesystem jak na przykład ext3 albo reiserfs, będziesz częściowo chroniony przed uszkodzeniami systemu plików, zaś sprawdzanie systemu plików przy ponownym uruchomieniu będzie krótsze niż gdybyś używał partycji bez journalingu (np. ext2). Jakkolwiek posiadanie takiego zabezpieczenia nie jest usprawiedliwieniem przy nieprawidłowym wyłączaniu systemu! System plików z journalingiem jest zaprojektowany, by chronić pliki przed wypadkami nie podlegającymi siłą rzeczy pod twoją kontrolę - ale do ochrony przed twoim lenistwem!.

Tak więc, gdy chcesz wyłączyć lub ponownie uruchomić komputer, musisz zrobić do właściwie. Jest na to kilka sposobów; wybierz ten, który uznasz za najbardziej zabawny/wymagający najmniej pracy. Jako, że zamykanie i ponowne uruchomienie są do siebie dosyć podobne, większość sposobów na wyłączenie może też zostać użyte przy restarcie.

Pierwsza i chyba najpopularniejsza metoda to użycie programu shutdown(8). shutdown może być użyty do wyłączenia bądź restartu komputera o określonej godzinie, może także wyświetlić zalogowanym użytkownikom odpowiednie do swych działań komunikaty.

Najbardziej podstawowe użycie programu shutdown do wyłączenia komputera to:

# shutdown -h now

W tym wypadku nie wyślemy użytkownikom żadnej wiadomości; zobaczą standardową wiadomość wysyłaną przez shutdown. “now” to czas, kiedy chcemy wyłączyć komputer, zaś “-h” oznacza że chcemy wyłączyć komputer (skrót od ang. halt 'zatrzymać'). Nie jest to zbyt przyjazny sposób działania w systemach z wieloma użytkownikami, za to sprawdzi się dobrze na twoim domowym komputerze. W większych systemach lepszą metodą jest danie wszystkim ostrzeżenia o mającym nastąpić wyłączeniu z pewnym wyprzedzeniem:

# shutdown -h +60

Powyższa komenda spowoduje wyłączenie komputera za godzinę (60 minut), a taki czas z pewnością będzie wystarczający w zwykłym systemie z wieloma użytkownikami. Ważniejsze systemy powinny mieć wyłączenie zaplanowane na długo przed samym faktem, zaś administrator powinien umieścić informację o planowanym zamknięciu systemu w odpowiednich na ogłaszanie tego typu informacji miejscach (e-mail, tablica ogłoszeń, /etc/motd, gdziekolwiek...).

Ponowne uruchomienie systemu następuje przy użyciu tej samej komendy, jednak zamiast “-h” użyj “-r”:

# shutdown -r now

Możesz użyć tego samego zapisu z komendą shutdown -r co przy użyciu shutdown -h. Jest jeszcze wiele innych rzeczy, które możesz zrobić za pomocą shutdown przy ustalaniu kiedy zatrzymać/zrestartować komputer; przejrzyj strony manuala w poszukiwaniu szczegółów.

Drugi sposób na wyłączenie/restart komputera to użycie poleceń halt(8) oraz reboot(8). Jak sama nazwa wskazuje, halt niezzwłocznie wyłączy komputer, zaś reboot uruchomi system ponownie. (reboot aktualnie to jedynie link symboliczny do halt). Są wywoływane w ten sposób:

# halt
# reboot

Niskopoziomowym sposobem na zamknięcie systemu jest "rozmowa" bezpośrednio z init'em. Wszystkie inne metody są po prostu wygodniejszą wersją tego sposobu, ale też jeżeli chcesz możesz sam bezpośrednio powiedzieć to, używając polecenia telinit(8) (zauważ, że w nazwie występuje tylko jedno “l”). Użyte telinit poinformuje init na który poziom (runlevel) przejść, co spowoduje uruchomienie odpowiedniego skryptu. Skrypt ten zabije bądź też stworzy procesy, zależnie od uruchamianego runlevelu. Działa to przy zamknięciu oraz resetowaniu systemu, gdyż oba posiadają odpowiednie runlevele.

# telinit 0

Poziom 0 oznacza zatrzymanie systemu. Powiedzenie init'owi by przeszedł na poziom 0 spowoduje zabicie wszystkich procesów, odmontowanie systemów plików oraz zatrzymanie komputera. Taki sposób zamykania systemu jest w pełni prawidłowy. W większości laptopów oraz nowszych komputerów spowoduje to też całkowite wyłączenie komputera.

# telinit 6

Przejście na poziom 6 oznacza zresetowanie maszyny. Wszystkie procesy zostaną zabite, systemy plików odmontowane, komputer uruchomi się ponownie. Podobnie jak powyższa, tak i ta metoda jest całkowicie akceptowalna i prawidłowa.

Dla ciekawskich: kiedy przełączasz system na poziom 0 lub 6, czy to przez wykonanie komendy shutdown, halt, bądź reboot, wykonywany jest skrypt /etc/rc.d/rc.6. (Skrypt /etc/rc.d/rc.0 to tylko link symboliczny do /etc/rc.d/rc.6.) Możesz dostosować plik do swoich własnych upodobań - ale bądź pewien, iż wprowadzone zmiany przetestowałeś szczególnie ostrożnie!

Jest jeszcze jeden sposób na ponowne uruchamianie komputera. Wszystkie poprzednie wymagają bycia zalogowanym jako root. Ale metoda, o której mowa, nie stawia tego wymogu. Ważne jest tylko, by mieć fizyczny dostęp do klawiatury. Jednoczesne wciśnięcie Control+Alt+Delete spowoduje natychmiastowe ponowne uruchomienie maszyny. (Tak nawiasem mówiąc, naciśnięcie Control+Alt+Delete uruchomi skrypt shutdown). Sposób ten nie zawsze zadziała, gdy używasz serwera graficznego X Window - być może przed jego użyciem będziesz musiał wcisnąć Control+Alt+F1 (bądź inny klawisz funkcyjny) by przełączyć się na konsolę "nie x-ową"l

I na koniec informacja o pliku, który całkowicie kontroluje każdy aspekt uruchomienia i wyłączenia systemu; jest to plik /etc/inittab(5). Ogólnie rzecz biorąc nie ma potrzeby modyfikacji tego pliku, ale wgląd w niego może dać ci wiedzę, dlaczego pewne rzeczy działają tak a nie inaczej. Jak zwykle polecam lekturę stron manuala.

Grenlandia 2012