Magic SysRq – bezpieczny reset Linux’a

Pomimo iż Linux uchodzi za stabilne środowisko to raz na jakiś czas trafi się ciężka zwiecha – z powodu przeciążenia, awarii sprzętu… nieistotne…

Załóżmy że licho wzięło za cel główny serwer plików lub bazę danych dla wielu, wielu stron internetowych. Dostać się po ssh nie możemy bo lecą timeout’y, a siedząc bezpośrednio przy klawiaturze konsola nie reaguje. Mimo to coś ostro daje po dyskach, więc ewentualny twardy reset to na bank utrata części plików… jeśli system po nim w ogóle wstanie… ;-/

Jeśli powyższa historyjka wygląda znajomo to zdecydowanie warto czytać dalej.

W wielu dystrybucjach kernel standardowo jest skompilowany z opcją CONFIG_MAGIC_SYSRQ – opcja opisana jest jako szczególnie przydatna dla developerów jądra ale i nam może się przysłużyć jako ostatnia deska ratunku przed twardym resetem.

Aby wywołać funkcję trzeba przytrzymać na klawiaturze: Lewy ALT + PrintScrn/SysRq i przycisk określający funkcję. Kilka z możliwych funkcji to:

  • r – przełącz klawiaturę z trybu RAW do XLATE (w wolnym tłumaczeniu: odzyskaj obsługę klawiatury od X’ów),
  • e – wyślij SIGTERM do wszystkich procesów z wyjątkiem init’a,
  • i – wyślij SIGKILL do wszystkich procesów z wyjątkiem init’a,
  • s – wywołaj sync dla wszystkich zamontowanych zasobów (czyli zapisz wszystkie niezapisane dotąd transakcje dyskowe),
  • u – przemontuj wszystkie zamontowane zasoby to trybu tylko do odczytu,
  • b – natychmiast uruchom ponownie system, bez odmontowania partycji i bez synchronizacji dysków.

To tylko część funkcji, ale wykonanie ich w kolejności w jakiej zostały tu wypisane (czyli reisub) powinno skutkować STOSUNKOWO bezpiecznym resetem, po którym nawet nie powinno być potrzebne skanowanie dysków fsck’iem. Każda z funkcji potrzebuje kilka/kilkanaście sekund na wykonanie (szczególnie warto zaczekać by po sync’u przestała migać kontrolka aktywności dysków twardych) – nie warto się spieszyć. Po ostatnim wywołaniu system powinien się zrestartować – zdarzyło mi się tylko kilka razy by procedura ta zawiodła.

Metodę można też wykorzystać dla serwerów zdalnych, które np. z jakiegoś powodu nie chcą się zrestartować w standardowy sposób. Można to zrobić wysyłając poszczególne polecenia do /proc/sysrq-trigger, np. tak:

echo b > /proc/sysrq-trigger

Na zdalnych maszynach i VPS’ach wygodniejsze może być skonfigurowanie demona sysrqd.

Dla zainteresowanych, więcej funkcji Magic SysRq (głównie diagnostycznych) i dokładniejszy opis można znaleźć na stronie wiki.

 

Wymuszenie zwolnienia pamięci buforów dyskowych na Linux’ie

Linux bardzo agresywnie wykorzystuje wolną pamięć RAM do buforowania danych odczytywanych z dysków (inode’ów, plików, itd…). Ma to niebagatelny wpływ na zwiększenie szybkości uruchamiania programów które już raz zostały uruchomione. Jednak nie zawsze jest to pożądane zachowanie, np. testując szybkość uruchomienia/wykonywania tworzonej przez nas aplikacji – buforowanie zmienia czas ładowania aplikacji przy kolejnych uruchomieniach. Dobrze byłoby móc wymusić zwolnienie buforów by każdy start programu miał porównywalne “warunki startowe”.

Na szczęście można to zrobić w prosty sposób:

sync && echo 3 > /proc/sys/vm/drop_caches

Polecenie to zwolni niewykorzystywany cache pliku stronicowania, katalogów i inodów. Wcześniejsze uruchomienie sync pozwala zwolnić większą ilość buforów przez wymuszenie zapisania otwartych plików.

Inne możliwe warianty to:

  • zwolnienie cache pliku stronicowania:
sync && echo 1 > /proc/sys/vm/drop_caches
  • zwolnienie cache cache katalogów i inodów:
sync && echo 2 > /proc/sys/vm/drop_caches

Opcja ta dostępna jest w jajkach od wersji 2.6.16.

Sprawdzenie który proces obciąża dyski

Na jednym z serwerów zauważyłem dziwny wzrost obciążenia. Tzw. LOAD od kilku dni po woli rósł. top pokazywał że dwa rdzenie CPU czekają na dane z dysku – tzw. io wait na poziomie 80~90% ale żaden proces w znaczącym stopniu nie obciążał CPU.

Jest kilka narzędzi (iostat, wmstat), które pozwalają monitorować obciążenie dysków ale ja nie szukałem informacji czy i w jakim stopniu dyski są obciążone – wiedziałem że są. Chciałem dowiedzieć się który proces generuje to obciążenie – by móc go ubić 🙂

Przydatny okazał się programik iotop – który działa jak top ale sortuje procesy w zależności od generowanego przez nie obciążenia dysków – właśnie tego szukałem:

iotop
Zrzut z programu iotop

Program jest w standardowych repozytoriach Debiana i można go zainstalować w ten sposób:

apt-get install iotop

Wysyłanie załączników poleceniem mail

Kiedyś potrzebowałem w ramach testu obciążeniowego wysłać dużo wiadomości z załącznikami. Chciałem to zrobić na szybko z shell’a i tutaj chwilę musiałem pogooglać aby znaleźć działające polecenie. To co znalazłem wygląda tak:

(echo "testowa wiadomosc"; uuencode test.zip test.zip) \
| mail -s "Test" testowy@mail.pl

Wiedząc już jak wysyłać maile z załącznikami, mały mail bombing mogłem zrobić tak:

for i in `seq 1 100`; do
   (cat tekst.txt; uuencode test.zip test.zip) \
   | mail -s "Test $i" testowy@mail.pl;
done

Włam na lokalne konto root’a

Jeżeli tu zaglądasz pewnie zdarzyło Ci się kiedyś, że przykładowo wygrzebujesz jakiś stary serwer i nie masz pojęcia co na nim było, ani do czego służyło, czy jeszcze działa… Albo jeszcze inaczej – serwer działał tak długo, że wszystkie osoby znające hasło na root’a przeszły na emeryturę lub zmarły… Nieistotne 🙂

Jest pewna prosta sztuczka, pozwalająca wbić się na konto root’a nie znając hasła – dając nam możliwość jego zmiany. Potrzebne dwa restarty ale za to nie trzeba korzystać z żadnychlive cd.

  1. Na początek zmuszamy serwer do restartu – mieć nadzieję, że maszyna obsługuje ACPI i delikatne wciśnięcie przycisku power subtelnie ją wyłączy. Jeśli to nie zadziała to kojarzą mi się tylko brzydkie rzeczy 🙂
  2. Gdy po restarcie załaduje się grub na domyślnej opcji bootowania wybieramy edycję wciskając “e“.
  3. Wybieramy linię zaczynającą się od kernel i znów wybieramy edycję wciskając “e“.
  4. Jeżeli znajduje się tam parametr ro to zastępujemy go rw i dopisujemy na końcu init=/bin/bash
  5. Wbijamy “enter” zapisując zmieniony wiersz.
  6. Bootujemy się z tak zmienionej konfiguracji wciskając “b“.
  7. Po chwili system zamiast wystartować init’a i uruchamiać usługi, ląduje w bash’u z uprawnieniami root’a. A skoro mamy root’a to możemy wpisać passwd i zmienić rootowi hasło 🙂
  8. Teraz już tylko reboot i startujemy system normalnie – hasło root’a powinno działać.

Niestety ta prosta sztuczka nie działa na wszystkich linux’ach – szczególnie tych wykorzystujących initramfs-tools. Na tych systemach trzeba ciut więcej pokombinować ale przynajmniej ma się jakiś punkt wyjścia.