Магическият клавиш
от Владимир Джувинов <[email protected]>
Материалът описва действието и начина за активиране на "магическите"
SysRq команди в Linux. Представени са и три аварийни сценария, при които
командите могат да бъдат използвани.
Магията
Ако разгърнем огромния (2.2MB) хакерски "Жаргонен Речник" поддържан от
Eric Raymond ще забележим, че
думата "magic" (магия или магически) е често срещана там. Но думата "магия"
в хакерския жаргон не се отнася до свръхестествени сили, а по-скоро до
програмни изпълнения, които поради своята сложност трудно биха били обяснени
или просто такива програми, които биха имали подобен "магически" ефект.
В речника са описани такива термини като автомагия, черна и дълбока
магия, магически бисквити (не стават за ядене), магическо число и магически
дим. Към тях може да прибавим и магическия клавиш на Linux.
Магическият клавиш SysRq
В Linux е въведена специална аварийна опция, която позволява директно извикване
на определени системни команди в случаи на необходимост - например при
спиране на X сървъра или при нужда от синхронизиране на дисковете.
Тази опция се задейства от конзолната клавиатура чрез "магическата"
комбинация от Alt+SysRq+<допълнителен клавиш>. На x86 архитектурата
за магически клавиш се използва SysRq (System Request Key), докато при
други архитектури като SPARC и PowerPC за магическата комбинация се използва
друг клавиш.
Системното извикване чрез магическия клавиш SysRq има висок приоритет
и ядрото реагира веднага и независимо каква друга функция изпълнява в този
момент. Изключение правят случаите когато се касае за пълно блокиране на
Linux. Това качество на SysRq дава шанс за сигурно спиране на системата
в такива критични ситуации, когато единствена друга алтернатива остава
хардуереният reset.
За написването на този материал е използвано описание на SysRq от Linux
документацията (виж /usr/src/linux-2.*.*/Documentation/sysrq.txt) както
и няколко newsgroup postings.
Изисквания и активиране на SysRq
Магическият клавиш е въведен за пръв път в Linux 2.1.*. За неговата поддръжка
е нужно ядрото да бъде компилирано с опцията CONFIG_MAGIC_SYSRQ. Тъй като
SysRq засяга пряко сигурността на системата, много често след стартирането
на Linux той трябва да бъде допълнително активиран чрез /proc интерфейса.
Файлът, който показва и променя статуса на SysRq е /proc/sys/kernel/sysrq.
Когато файлът съдържа '0' SysRq е деактивиран, а при '1' (или всяко друго
цяло число различно от '0') обратното.
Проверката на статуса на магическия клавиш и неговата активация могат
да бъде извършени от root по следния начин:
[root@steamboat]# cat /proc/sys/kernel/sysrq
0
[root@steamboat]# echo 1 > /proc/sys/kernel/sysrq
[root@steamboat]# cat /proc/sys/kernel/sysrq
1
Отново, активирането чрез /proc може да стане само тогава, когато в ядрото
има компилирана поддръжка на SysRq.
Работа с магическия клавиш
След активирането на SysRq всеки ползвател може да извика магическата кобинация
Alt+SysRq+<допълнителен
клавиш>. Извикването е възможно само от локална виртуална конзола и
по принцип не може да стане от отдалечен telnet клиент. Допълнителният
клавиш в комбинацията определя съответната команда. За да разберем кои
са възможните SysRq команди можем да използваме комбинацията Alt+SysRq+<интервал>
или всеки друг невалиден <допълнителен клавиш>:
[vd298@steamboat]$ SysRq: unRaw saK Boot Sync Unmount showPc
showTasks showMem loglevel0-8 tErm kIll killalL
Главните букви бележат допълнителния клавиш за съответната комбинация.
Гаранция за успешното изпълнение на SysRq команда се дава от Linux само
тогава, когато на конзолата се изпише съответното потвърждение. Например
съобщението
[vd298@steamboat]$ SysRq: Emergency Sync
дава потвърждение за извършено аварийно синхронизиране на дисковете.
Понякога след използване на SysRq комбинация се наблюдава засичане на
клавиатурата. В този случай се касае за положение, при което SysRq не връща
контрола обратно на shell програмата. За излизане от SysRq тогава може
да се използва натискане на двата Alt, Shift или Control клавиша и след
това
<Enter>. Повторно извикване на SysRq или превключване на виртуалните
конзоли също би помогнало. Очаква се в Linux 2.4 да бъде внесена корекция
срещу засичането на SysRq.
Команди
В следната таблица са описани възможните комбинации с Alt+SysRq+<допълнителен
клавиш> и какво е действието на съответните команди. Комбинациите се отнасят
до Linux 2.2.
SysRq команди
доп.
клавиш |
кратко
наименование |
описание |
R |
unraw |
Превключва клавиатурата в състояние XLATE. Може да се използва за отнемане
контрола на X сървъра върху клавиатурата и мишката. |
K |
sack |
Изпраща SIGKILL на всички процеси от същата конзола, включително и
login shell. |
B |
reboot |
Веднага рестартира компютъра. Действа като reset. |
S |
sync |
Синхронизира дисковете, т.е. записва съдържанието на дисковия кеш от
работната памет върху самите дискове. |
U |
umount |
Извършва read-only remount на всички монтирани дискове. |
P |
show regs |
Показва съдържанието на CPU регистрите. |
T |
show tasks |
Показва състоянието на всички текущи процеси. |
M |
show memory |
Показва състоянието на работната памет и DMA. |
0-8 |
change loglevel |
Филтрира kernel log съобщенията според техния приоритет. '0' най-висок
приоритет. |
E |
terminate |
Изпраща SIGTERM на всички текущи процеси с изключение на init. |
I |
kill |
Изпраща SIGKILL на всички текущи процеси с изключение на init. |
L |
kill all |
Изпраща SIGKILL на абсолютно всички процеси, включително и init. Системата
става нефункционална след това. |
Сценарии
Магическият SysRq клавиш би могъл да се окаже много полезен при някои от
следните критични ситуации:
[1] Увисване на X сървъра
Когато комбинацията Ctrl+Alt+<Backspace> за аварийно спиране на X
сървъра не бъде прихваната от него поради цялостно блокиране, потребителят
не е в състояние да превключи виртуалните конзоли поради това, че X все
още държи контрола над клавиатурата и мишката. Тогава с магическата SysRq
команда "unraw" (комбинация Alt+SysRq+R) клавиатурата може отново да бъде
"освободена" и след това да се превключи на друга конзола, откъдето да
бъде спрян X.
Не се препоръчва ползването на командата sack (комбинация Alt+SysRq+K),
защото "убивайки" всички програми на текущата виртуална конзола би довело
до "замръзване" на дисплейната графика на X и съответно възможност само
за писане на "сляпо".
[2] Нужда от аварийно спиране на системата
Следният сценарий може да бъде използван, когато ядрото на Linux е в
критично положение и се очаква цялостно блокиране, т.е. когато управлението
е извън контрол :-(
Командите са представени в тяхната последователност:
-
командата terminate (комбинация Alt+SysRq+E) изпраща сигнал TERM до всички
текущи процеси без init, давайки им шанс да запишат отворените от тян файлове
и да приключат по един сравнително обичаен начин
-
командата sync (комбинация Alt+SysRq+S) изчиства дисковия кеш, така че
всички файлове да бъдат правилно записани върху диска
-
командата unmount (комбинация Alt+SysRq+U) ре-монтира всички дискове в
read-only състояние, така че върху тях да не може да се записва повече
информация
-
командата kill (комбинация Alt+SysRq+I) изпраща SIGKILL на всички останали
процеси, които не са изпълнили предишната команда за затваряне
-
след това с командата reboot (комбинация Alt+SysRq+B) компютърът може да
бъде рестартиран
[3] Заливане на конзолата със системни съобщения
Наводнението със системни съобщения може да бъде много неприятно, защото
затруднава работата на конзолата. Ето как може да се достигне до такова
положение:
-
PANIC или Oops при зареждане на модул към ядрото
-
опит за четене или писане върху дефектен диск
-
прекъсване на кабела към дадено устройство (IDE диск или принтерен кабел)
или спиране на елетрическото захранване към част от системата
Тогава за филтриране на системните съобщения може да се използва
командата loglevel0-8 (комбинация Alt+SysRq+<1 до 8>). По-малките числа
означават предаване само на по-важните системни съобщения.
Сигурност
При активирането на магическия клавиш трябва да се има предвид, че той
може да представлява мощен способ за контрол над системата, и то от всеки,
който има достъп до конзолата. SysRq командите могат да бъдат изпълнени
дори при заключена с vlock конзола.
Затова, където е възможно, е добре да се потърсят алтернативи на SysRq.
Например при блокиране на X сървъра може да се отвори telnet сесия от съседен
компютър и оттам да се затвори X.
Владимир Джувинов
[email protected]
27.09.2000