Блог

Новини, акції та корисні статті для розробників.

Перезавантаження сервера за REISUB

"М'яке" нижньорівневе перезавантаження *nix-cистем за допомогою поєднання "R-E-I-S-U-B"

У багатьох *nix-cистемах для "м'якого" перезавантаження можна одночасно натиснути кнопки (утримуючи Alt та SysRq), потім послідовно, з короткими паузами, кнопки R E I S U B…

(кнопку SysRq/PrintScreen може бути підписано як просто PrintScreen)

_

Після цієї процедури комп'ютер піде в м'яке перезавантаження з відмонтуванням жорстких дисків та завершенням усіх процесів без помилок.

Чому це відбувається? Та чому саме ця комбінація кнопок? Тут все достатньо просто — кожна з кнопок при натисненні відправляє ядру системи такі команди:

unRaw — наказує повернути управління системою клавіатурі;

tErminate — направляє сигнал SIGTERM усім процесам, чим проводиться спроба безпечного завершення усіх процесів зі збереженням даних, виключення складає лише процес init;

kIll — направляє сигнал SIGKILL усім процесам, які не змогли бути закриті раніше, також за виключенням процесу init — усі інші процеси будуть знищені, а незбережені дані буде втрачено;

Sync — переписує все з кешу на жорсткий диск, відбувається синхронізація, що зменшує можливість пошкодження даних;

Unmount — перемонтовує усі файлові системи в режимі "тільки для читання" — після використання цього ключа ви зможете перезавантажувати систему натисненням Alt + SysRq + B без шкоди для системи;

reBoot — власне команда перезавантаження системи. (До речі, якщо скористатися цим ключем без використання попередніх, система перезавантажиться в жорсткому режимі!)
_

Зауваження:
1) Працює тільки на клавіатурі, безпоседньо підключеній до серверу;
2) Використовуйте PS/2 клавіатуру, якщо зависла USB і якщо є роз'єм;
3) На усіх Windows-системах перезавантаження по R-E-I-S-U-B не підтримується;
4) Можете перевірити на своїй робочій машині в СТП (можна й за Ctrl+Alt+F1 в консоль для наочності, назад - Ctrl+Alt+F7);
5) Таке перезавантаження достатньо корисне на серверах-файлосховищах з великою кількостю HDD, т.я. після цього не потрібна FSCK;
6) На деяких системах відключено можливість низькорівневого перезавантаження за REISUB в ядрі або опціях:

не будь-який дистрибутив Лінукса підтримує SysRq. Це залежить від значення змінної ядра CONFIG_MAGIC_SYSRQ. На щастя, ядро більшості лінуксних дистрибутивів вже скомпільовано з дозволяючим значенням цієї змінної. У всякому разі, в Ubuntu це саме так. Це можна перевірити командою

cat /proc/sys/kernel/sysrq
Якщо відповіддю буде одиниця, то все нормально. Додаємо вмикання/вимикання цієї можливості. За допомогою емулятора консолі запускаємо консольний редактор файла управління системним конфігом:
sudo nano /etc/sysctl.conf

Та вставляємо (або розкоментовуємо, прибравши символ решітки) рядок

kernel.sysrq = 1
Щоб ознайомитись з хелпом до SysRq, треба переключитись у віртуальну консоль (віконий емулятор консолі тут не діє), натиснувши поєднання Ctrl+Alt+F2, ввести свій логін та пароль. До речі: цифри

пароля набирайте не в правій цифровій клавіатурі, а над алфавітною клавіатурою. Ось тепер, коли ви не в графічному середовищі, поєднання можна набирати і не натискаючи Ctrl, тобто Alt+SysRq+символ. Натискаємо Alt+SysRq+H. На екран повинен надійти хелп англійською мовою:

SysRq : HELP : loglevel(0-9) reBoot Crash

terminate-all-tasks(E) memory-full-oom-kill(F) kill-all-tasks(I)

thaw-filesystems( J) saK show-backtrace-all-active-cpus(L)

show-memory-usage(M) nice-all-RT-tasks(N) powerOff show-registers(P)

show-all-timers(Q) unRaw Sync show-task-states(T) Unmount force-fb(V)

show-blocked-tasks(W) dump-ftrace-buffer(Z)

Українською значення доданого символу виглядало б наступним чином:

0-9 – рівень детальності виводу системних повідомлень. 9 – максимальна детальність.

C – запускає краш-тест вашої системи. Якщо в результаті цього запита ядро вашої системи не впало в паніку, у вас досить надійна система. За цим запитом відбувається перезавантаження ядра.

F – вбиває процеси, які займають, «як вважає ядро», досить багато пам'яті. Наприклад, система постійно вбиває Firefox, якщо відкрито більше 10-и вкладок. Запит може буть корисним, якщо машина «свопить» та пригальмовує.

J – розморожує (розблокування) усіх заблокованих файлових систем. Наприклад, вы «замонтили» розділ, розпочали з ним працювати, скажімо, архівувати, й тут система підвисла. Запит домопоже позбутися недоступності розділу.

K – кнопка безпечного доступу (secure access key). Вбиває усі процеси на поточній консолі. Якщо у вашій машині працює троян, який може вкрасти або підмінити ваш пароль, то шкідника одразу буде вбито, і системний процес init запустить справжній логін.

L – виводить трасування стека для усіх активних процесорів. Це буде цікаво тим, хто займається відладкою ПЗ.

M – виводить обсяг завантаженої пам'яті. В Ubuntu працює, якщо ви попередньо встановлюєте високий рівень детальності виводу.

N – виводить список завдань реального часу. Також працює, якщо ви попередньо встановили високий рівень виводу.

E – аварийно закриває роботу усіх процесів, крім init.

I – вбиває усі процеси, включаючи init.

T – виводить список задач до консолі.

S – cинхронізує усі файлові системи, записуючи усі буферизовані дані на жорсткий диск.

R – примусово повертає клавіатуру в робочий стан. При цьому ядро починає працювати з клавіатурою напряму, повз X-сервер, і тільки в кодах ASCII.

T – виводить список процесів. Знову ж працює тільки при високому рівні детальності виводу.

P – дамп регістрів процесора. Запит може бути цікавим тим, хто займається відладкою ПЗ.

Q – виводить події хард-таймерів. Працює, коли встановлено високий рівень детальності виводу.

O – терміново вимикає комп'ютер.

B – перезавантажує комп'ютер. Одначе, є повідомлення, що при ядрі 3.8.0-25 відбувається не перезавантаження, а вимкнення (не перевірялось).

U – перемонтовує усі файлові системи в режим «тільки читання».

V – відновлює фреймбуфер консолі. Допустимо, ви переглядаєте в віртуальній консолі якийсь відеоролік (так-так, Лінукс, на відміну від Windows, дозволяє і це), а вам терміново потрібно згадати, що ви робили в консолі до запуску роліка. Команда відновить фреймбуфер консолі.

W – показує усі задачі, які зависли, якщо такі є.

Z – виводить зміст буфера трасування роботи ядра.