Использование /proc для администрирования Linux-сервера
Денис Колисниченко (dhsilabs@mail.ru, )
Довольно банальная ситуация: есть сервер, поддерживающий горячую замену дисков. Ты «на лету» добавляешь накопитель, но как сделать, чтобы система его увидела без перезагрузки? Об этом, о виртуальной файловой системе /proc, позволяющей изменять установки ядра Linux без перезагрузки системы, о способах противодействия сетевым атакам и о магических клавишах SysRq мы поговорим в этой статье.
Содержание:
- Кратко о /proc
- Параметры ядра
- Параметры файловых систем
- Сетевые параметры
- Параметры виртуальной памяти
- Горячая замена дисков с помощью /proc
- Сохранение изменений
- Что такое SysRq?
- Заключение
Псевдофайловая система /proc — это специальный механизм, позволяющий посылать данные ядру, модулям и процессам (кстати, proc — это сокращение от process). С ее помощью можно получить инфу о процессах и изменять параметры ядра и его модулей «на лету». Может быть полезна для мониторинга производительности, проверки системной информации, конфигурирования системы и изменения конфигурации. Что интересно, /proc находится не на жестком диске, а в оперативной памяти, кроме того, она создает свои файлы и каталоги на основании информации, полученной от ядра. Так как вся работа идет на уровне VFS (Virtual File System layer), для пользователей /proc выглядит как обычная файловая система.
Вывести на экран текущее значение переменной можно с помощью команды cat:
# cat /proc/путь/файл [| less]
Изменить параметр системы можно путем записи нового значения параметра в соответствующий файл:
# echo "значение" > /proc/путь/файл
В /proc очень много информационных файлов, мы выделим лишь некоторые:
- /proc/version — версия ядра;
- /proc/cmdline — список параметров, переданных ядру при загрузке;
- /proc/cpuinfo — информация о процессоре;
- /proc/meminfo — информация об использовании оперативной памяти (почти то же, что и команда free);
- /proc/devices — список устройств;
- /proc/filesystems — файловые системы, которые поддерживаются твоей системой;
- /proc/mounts — список подмонтированных файловых систем;
- /proc/modules — список загруженных модулей;
- /proc/swaps — список используемых разделов и файлов подкачки.
В каталоге /proc/sys/kernel находятся файлы, позволяющие изменять важные параметры ядра. Перечислим самые интересные из них:
-
ctrl-alt-del — задает реакцию на нажатие комбинации
. Может содержать значение 0 («мягкая перезагрузка», при которой управление передается программе init) или 1 («жесткая» перезагрузка, практически равнозначная нажатию Reset, потому что никаких действий по деинициализации системы не производится). - domainname — содержит сетевое доменное имя.
- hostname — содержит имя хоста.
-
msgmax — максимальный размер сообщения (в байтах), которое может быть передано от одного процесса к другому при межпроцессном взаимодействии. Значение по умолчанию 8192. Если увеличить это значение, то увеличится размер оперативной памяти, занимаемый операционной системой.
-
panic — время в секундах, которое ядро будет ждать, прежде чем перезагрузить систему после вывода сообщения «kernel panic». По умолчанию — 0, то есть перезагрузка не производится.
-
printk — определяет, куда будут направлены сообщения в зависимости от их важности. В файле содержатся четыре значения, например, 6 4 1 7 (по умолчанию). Первое значение задает, сообщения с каким уровнем должны быть выведены на консоль (Console Log Level). Если уровень сообщения 6 и ниже (чем меньше число, тем больше приоритет), то это важные сообщения, и они будут выведены на консоль. Второе значение задает приоритет для сообщений, для которых не указано значение приоритета, то есть задает уровень приоритета по умолчанию. Третье значение задает номер самого высокого приоритета (это 1). Четвертое значение — это значение по умолчанию для первого. Более подробно обо всем этом можно почерпнуть в syslog(2).
-
shmall — максимальный размер (в байтах) разделяемой памяти, значение по умолчанию — 2097152.
-
shmax — максимальный размер сегмента памяти (в байтах), допускаемый ядром. По умолчанию — 33554432.
-
shmmni — максимальное число сегментов разделяемой памяти. По умолчанию — 4096.
- sysrq — активизирует SysRq (см. ниже), если не равно 0.
-
threads-max — максимальное число используемых ядром потоков. По умолчанию — 2048.
Для примера включим клавиши SysRq:
# echo "1" > /proc/sys/kernel/sysrq
В каталоге /proc/sys/fs ты найдешь файлы, влияющие на работу файловой системы:
-
file-max — максимальное число одновременно открытых файлов, по умолчанию 4096.
-
inode-max — максимальное число одновременно открытых инодов, по умолчанию 4096.
-
super-max — максимальное количество заголовков суперблоков. У каждой подмонтированной файловой системы есть суперблок, следовательно, максимальное количество суперблоков равно максимальному количеству одновременно смонтированных файловых систем. Значение по умолчанию — 256.
-
super-nr — текущее количество суперблоков (файл используется только для чтения, писать в него нельзя).
Каталог /proc/sys/net содержит файлы, влияющие на работу сети:
-
core/message_burst — можно использовать для предотвращения DoS-атаки, когда система заваливается сообщениями. Определяет время в десятых долях секунды, которое необходимо для записи нового сообщения, остальные сообщения, полученные за это время, будут проигнорированы. По умолчанию — 50 (5 секунд).
-
core/message_cost — значимость каждого сообщения, чем выше значение, тем больше сообщений будет проигнорировано. По умолчанию — 5.
-
core/netdev_max_backlog — максимальное число пакетов в очереди на обработку. Позволяет установить максимум, если сетевой интерфейс получает пакеты быстрее, чем ядро может их обработать. По умолчанию — 300.
-
core/optmem_max — максимальный размер буфера (в байтах) для одного сокета.
-
core/rmem_max — размер буфера для буфера получения информации (в байтах).
-
core/wmem_max — размер буфера для буфера отправки информации (в байтах).
-
ipv4/icmp_echo_ignore_all — если 1, игнорируются ICMP-пакеты типа ECHO REQUEST.
-
ipv4/icmp_echo_ignore_broadcasts — если 1, игнорируются широковещательные ping’и (хорошее решение против smurf-атак).
-
ipv4/conf/*/accept_source_route — разрешены ли пакеты с маршрутизацией, задаваемой источником. Желательно отключить (значение 0), чтобы атакующий не мог фальсифицировать IP-адрес источника.
-
conf/*/rp_filter — определяет, отбрасывать ли пакет в том случае, если пакет приходит на один интерфейс, а ответ исходит из другого. Для PPP и VPN соединений этот параметр лучше включить, так как они имеют свои собственные интерфейсы.
-
ipv4/conf/*/accept_redirects — определяет, можно ли принимать ICMP-перенаправления. Если этот параметр включен, существует вероятность того, что злоумышленник начнет посылать наши пакеты через машину, которую он контролирует.
-
ipv4/{icmp_ratelimit,icmp_ratemask} — ограничение частоты генерации ICMP-пакетов.
-
ipv4/conf/*/log_martians — определяет, должно ли ядро посылать в syslog сообщения о пакетах, полученных от недопустимых адресов.
-
ipv4/neigh/*/locktime — количество времени, в течение которого существует запись при изменении ARP адреса. Увеличение этого параметра может предотвратить засорение кэша ARP при атаке типа man-in-the-middle.
-
ipv4/conf/*/proxy_arp — отвечать или нет на ARP запрос, если известен путь к запрашиваемому хосту.
-
ipv4/tcp_syncookies — следует включить для противодействия SYN-флуду — сетевой атаке, когда очередь полуоткрытых запросов соединений быстро заполняется, что мешает установке нормальных соединений.
Каталог /proc/sys/vm содержит файлы, позволяющие изменять параметры виртуальной памяти:
-
buffermem — позволяет управлять количеством общей системной памяти, которая будет использоваться как буферная память. В данном файле указываются три значения (через пробел): минимальный, средний и максимальный размер памяти (в %), которая может быть использована для буфера. По умолчанию: 2 10 60.
-
freepages — содержит три значения, разделенные пробелами (512 768 1024 — по умолчанию). Если количество свободных страниц памяти достигнет первого значения, доступ к любому дополнительному количеству памяти будет иметь только ядро (а не другие процессы). Если количество свободных страниц будет меньше второго значения (768), ядро будет более активно освобождать память путем свопинга. То же самое и для третьего значения, только ядро в этом случае будет еще активнее.
-
kswapd — управляет свопингом. Как и в предыдущем случае, в этом файле ты найдешь три значения, разделенные пробелами (512 32 8). Первое значение — это максимальное количество страниц, которые ядро будет пытаться освободить за один раз. Второе — это минимальное количество попыток освобождения страницы во время свопинга. Третье — количество страниц, которое можно записать в своп. Чем больше это значение, тем больше данных будет записано на диск и меньше времени будет потрачено на поиск на диске. Но тут важно не перестараться, так как слишком большое значение окажет обратный эффект, поскольку увеличится очередь запросов.
-
swappiness — содержит значение коэффициента подкачки. Минимальное значение коэффициента — 0, максимальное — 100. Значение по умолчанию 70.
Горячая замена дисков с помощью /proc
Допустим, имеются диски горячей замены, но как добавить дисковое пространство без перезагрузки системы? Даже если вставить диск горячей замены без выключения питания, то тебе все равно придется перезагрузить систему, чтобы она распознала новый диск. Однако, используя файл /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+SysRq+K>, можно «убить» все зависшие процессы (точнее «убиваются» все процессы, запущенные на текущей виртуальной консоли), которые не отвечают на <Ctrl+C>, и их нельзя завершить обычным образом. Эта же комбинация клавиш помогает и в тех случаях, когда завис X.Org и не реагирует даже на нажатие
Данная комбинация клавиш полезна не только для снятия зависших процессов. Ее полезно использовать, если на твоем сервере злоумышленником установлена программа, эмулирующая работу процесса login — она выводит стандартное приглашение (ты его не отличишь от приглашения стандартного login), получает от тебя пароль, записывает его в специальный файл, а потом выводит сообщение, что ты ввел некорректный пароль и передает управление оригинальной программе login. Ты даже ничего и не заподозришь — подумаешь, может, на самом деле ввел неправильный пароль. После нажатия этой комбинации клавиш происходит завершение всех процессов, кроме оригинального login — все программы, которые маскируются под login, будут также завершены. Данную комбинацию клавиш также называют SAK (Secure Access Key). О SAK можно прочитать в файле /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) заставляет ядро выполнить синхронизацию буферов ввода/вывода, то есть сбросить содержимое дисковых буферов на диск. Очень полезная комбинация клавиш, способная сохранить данные — ведь все мы знаем, что если мы сохранили данные в своей программе, это еще не значит, что они были физически записаны на диск. Синхронизация буферов — процедура не мгновенная. После нажатия этой комбинации клавиш, нужно подождать, пока на консоли не появится сообщение:
Emergency Sync.... OK
Если же вывод на консоль невозможен, просто подожди 5-10 секунд. Будем надеяться, что система выполнила синхронизацию буферов (хотя, повторюсь, все зависит от «степени зависания»).
Комбинация
Emergency Umounting… OK
Но если оно так и не появилось, то возможны два варианта: файловые системы все-таки размонтированы, просто вывод на консоль не возможен, или файловые системы не размонтированы, поскольку система вообще ни на что не реагирует.
Перед нажатием этой комбинации клавиш нужно нажать
-
Нажать <Alt+SysRq+E> или <Alt+SysRq+K>. Если ничего не помогло, и система по-прежнему висит, тогда переходим к п.2.
- Нажать <Alt+SysRq+S>. Подождать 5-10 секунд.
-
Нажать <Alt+SysRq+U>. Подождать 5-10 секунд (в зависимости от количества смонтированных файловых систем).
- Нажать Reset.
<Alt+SysRq+B> (reBoot) используется для мгновенной перезагрузки. До нажатия этой комбинации желательно нажать
<Alt+SysRq+O> (pOweroff) мгновенно выключает питание, не размонтируя файловые системы. Ясно, что до этого нужно воспользоваться комбинациями
В данной статье были рассмотрены два инструмента для «горячего» администрирования сервера — файловая система /proc и клавиши SysRq. Оба инструмента существенно облегчают жизни администратора в нештатных ситуациях. Надеюсь, что тебе данная статья поможет, хотя искренне желаю, чтобы таких ситуаций было гораздо меньше!
Статья опубликована в мартовском номере журнала «Xakep» за 2008 год.





