16 January 2021
Денис Колисниченко (dhsilabs@mail.ru, www.dkws.org)
Хакер, номер #111, стр. 111-146-1
Довольно банальная ситуация: есть сервер, поддерживающий горячую замену дисков. Ты «налету» добавляешь накопитель, но как сделать, чтобы система его увидела без перезагрузки? О виртуальной файловой системе /proc, позволяющей изменять установки ядра Linux без перезагрузки системы, о способах противодействия сетевым атакам и о магических клавишах SysRq мы и поговорим в этой статье.
Псевдофайловая система /proc – это специальный механизм, позволяющий посылать данные ядру, модулям и процессам (кстати, «proc» – сокращение от «process»). С ее помощью можно получить инфу о процессах и изменять параметры ядра и его модулей «на ходу». Также она может быть полезна для мониторинга производительности, проверки системной информации, конфигурирования системы и изменения конфигурации. Что интересно, /proc находится не на жестком диске, а в оперативной памяти, кроме того, она создает свои файлы и каталоги на основании информации, полученной от ядра. Так как вся работа идет на уровне VFS (Virtual File System layer), для пользователей /proc выглядит как обычная файловая система.
Вывести на экран текущее значение переменной можно с помощью команды cat:
# cat /proc/путь/файл [| less]
Изменить параметр системы можно путем записи нового значения параметра в соответствующий файл:
# echo «значение» < /proc/путь/файл
В /proc много информационных файлов, мы выделим лишь некоторые:
В каталоге /proc/sys/kernel находятся файлы, позволяющие изменять важные параметры ядра. Перечислим самые интересные из них:
Для примера включим клавиши SysRq:
# echo «1» < /proc/sys/kernel/sysrq
Параметры файловых систем
В каталоге /proc/sys/fs ты найдешь файлы, влияющие на работу файловой системы:
Каталог /proc/sys/net содержит файлы, влияющие на работу сети:
Каталог /proc/sys/vm содержит файлы, позволяющие изменять параметры виртуальной памяти:
Допустим, под рукой есть диски горячей замены, но как добавить дисковое пространство без перезагрузки системы? Даже если вставить диск без выключения питания, то все равно придется перезагрузить систему, чтобы она распознала новый диск. Однако, используя файл /proc/scsi/scsi, можно заставить систему распознать новый диск «на лету»!
Общий формат команды таков:
# echo «scsi add-single-device a b c d» < /proc/scsi/scsi
Где «a» – это ID хост адаптера (номер первого адаптера – 0), «b» – канал SCSI на хост адаптере (нумерация с 0), «c» – ID SCSI-устройства, «d» – номер LUN.
Сразу после этого ты сможешь монтировать файловые системы, находящиеся на только что подключенном диске.
Для отключения SCSI-диска набери команду:
# echo «scsi remove-single-device a b c d» < /proc/scsi/scsi
Перед вводом команды нужно размонтировать файловые системы, находящиеся на этом диске.
Понятно, что произведенные изменения будут действовать до перезагрузки компьютера. Сохранить изменения можно с помощью программы sysctl, точнее с помощью конфигурационного файла /etc/sysctl.conf. Формат этого файла несколько отличается от тех команд, которые мы вводили. Предположим, мы ввели команду:
# echo «50» < /proc/sys/vm/swappiness
Понравилось, как система работает с таким значением коэффициента подкачки, и теперь ты хочешь сохранить изменения? Открой файл /etc/sysctl.conf и добавь в него строку:
vm.swappiness = 50
Как видишь, мы отбросили /proc/sys/ в начале имени файла, а все слэши заменили точками.
Кстати, далеко не все дистрибутивы используют sysctl. Если в твоем дистрибутиве нет файла /etc/sysctl.conf, придется пойти другим путем. А именно: добавь команды, изменяющие /proc-файлы, в загрузочные сценарии, чтобы они выполнялись каждый раз при запуске системы.
Linux считается одной из самых надежных операционных систем, но иногда зависает и она. Все мы знаем две волшебные комбинации клавиш – <Ctrl+Alt+Del> и <Ctrl+Alt+Backspace>. Первая используется для перезагрузки системы, а вторая – для перезапуска X.Org, если последняя зависла.
Что же делать, если система зависла? Сразу нужно оговориться, что все зависит от «степени зависания»: может зависнуть так, что система вообще не будет реагировать на внешние сигналы (в том числе, нажатие клавиш), тогда ничем, кроме Reset, не поможешь. Но попытаться сохранить данные в случае сбоя все же возможно.
Нажав <Alt+PrnScr< и одну из буквенных клавиш, ты можешь произвести действия, которые очень помогают в аварийных ситуациях. Все возможные SysRq-комбинации перечислены в текстовом файле sysrq.txt (обычно он находится в каталоге /usr/src/linux/Documentation/systq.txt). Мы рассмотрим лишь самые полезные из них.
Сочетанием клавиш <Alt+SysRq+K> можно «убить» все зависшие процессы (точнее, «убиваются» процессы, запущенные на текущей виртуальной консоли), которые не отвечают на <Ctrl+C> и которые нельзя завершить обычным образом. Эта же комбинация клавиш помогает в тех случаях, когда завис X.Org и не реагирует даже на отчаянное нажатие <Ctrl+Alt+Backspace>. Конечно, можно прибегнуть к <Ctrl+Alt+Del>, но не хочется перезагружать систему.
Эта комбинация клавиш полезна не только для снятия зависших процессов. Она будет кстати, если на твоем сервере злоумышленником установлена программа, эмулирующая работу процесса login. Подлая прога выводит фальшивое приглашение (от оригинала не отличить!), получает от тебя пароль, записывает его в специальный файл, а потом сообщает, что ты ввел некорректный пароль и передает управление оригинальной программе login. Ты даже ничего не заподозришь – подумаешь, может, на самом деле ошибся при вводе пароля. Так вот, сочетание <Alt+SysRq+K> способно бороться с диверсантами. После нажатия происходит завершение всех процессов, кроме настоящего login. Замечу, что эту славную комбинацию клавиш также называют SAK (Secure Access Key). Дополнительно о ней можно прочитать в файле /usr/src/linux/Documentation/SAK.txt.
Нажатие <Alt+SysRq+E> (tErm) посылает всем процессам в системе (кроме init) сигнал SIGTERM. В системе остаются только ядро, init и текущая консоль. После этого можно запустить все сервисы заново (init 3 или init 5).
Комбинация <Alt+SysRq+I> (kIll) аналогична <Alt+SysRq+E>, но посылает всем процессам (кроме init) сигнал SIGKILL. Сигналы SIGTERM и SIGKILL отличаются тем, что, получив SIGTERM, программа должна сохранить данные (если, конечно, программист предусмотрел реакцию на этот сигнал) и завершить работу; а сигнал SIGKILL моментально «убивает» программу – сохранить данные она уже не сможет.
<Alt+SysRq+S> (Sync) заставляет ядро выполнить синхронизацию буферов ввода/вывода, то есть сбросить содержимое дисковых буферов на диск. Очень полезная вещь, способная сохранить данные – ведь, как известно, если мы сохранили данные в своей программе, это еще не значит, что они были физически записаны на диск. Синхронизация буферов – процедура не мгновенная. После нажатия <Alt+SysRq+S< нужно подождать, пока на консоли не появится сообщение:
Emergency Sync.... OK
Если же вывод на консоль невозможен, просто жди 5-10 секунд. Будем надеяться, что система выполнила синхронизацию буферов (хотя, повторюсь, все зависит от «степени зависания»).
Комбинация <Alt+SysRq+U< (Umount) используется для размонтирования всех смонтированных файловых систем. Для размонтирования времени нужно больше, чем для синхронизации, поэтому нужно ждать, минимум, 5 секунд (а то и больше) – до появления сообщения:
Emergency Umounting… OK
Но если оно так и не появилось, тому есть два объяснения: или файловые системы все-таки размонтированы, просто вывод на консоль невозможен, или файловые системы не размонтированы, поскольку система вообще ни на что не реагирует.
Перед тем, как начать давить <Alt+SysRq+Us>, нужно воспользоваться <Alt+SysRq+S> для синхронизации буферов ввода/вывода. И только после размонтировать файловые системы. Итак, при зависании сервера правильной будет последовательность:
Нажатие <Alt+SysRq+B> (reBoot) используется для мгновенной перезагрузки и практически эквивалентно нажатию Reset. До этой комбинации желательно применить <Alt+SysRq+S> и <Alt+SysRq+U> (соответственно, подождать 2-5 и 5-10 секунд).
<Alt+SysRq+O> (pOweroff) мгновенно выключает питание, не размонтируя файловые системы. Ясное дело, до этого нужно воспользоваться комбинациями <Alt+SysRq+S> и <Alt+SysRq+U>.
В статье были рассмотрены два инструмента для «горячего» администрирования сервера – файловая система /proc и клавиши SysRq. Оба инструмента существенно облегчают жизнь администратора во внештатных ситуациях. Надеюсь, что статья тебе поможет, хотя искренне желаю, чтобы таких ситуаций было гораздо меньше