Дельта синхронизация без облака

Ранее мы показывали разные способы синхронизации криптодиска между ПК и Android-устройством.

Дельта-синхронизация крипто-дисков

Существуют разные способы зашифровать "облако". Один из них - поместить в облако крипто-диск. В предыдущей статье мы писали, почему это не всегда удобно.

Облачный хостинг VDS за 2 минуты

Настоящий облачный VDS-хостинг от UltraVDS: тестируем производительность

Смотрим плавность хода с помощью BMW Rheingold

Всем знакома ситуация, когда двигатель немного "троит", но пропусков зажигания нет...

Секреты горячего администрирования


Денис Колисниченко (dhsilabs@mail.ru, www.dkws.org)

Хакер, номер #111, стр. 111-146-1


Использование /proc для администрирования Linux-сервера

Довольно банальная ситуация: есть сервер, поддерживающий горячую замену дисков. Ты «налету» добавляешь накопитель, но как сделать, чтобы система его увидела без перезагрузки? О виртуальной файловой системе /proc, позволяющей изменять установки ядра Linux без перезагрузки системы, о способах противодействия сетевым атакам и о магических клавишах SysRq мы и поговорим в этой статье.

Кратко о /proc

Псевдофайловая система /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 – задает реакцию на нажатие комбинации <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-файлы, в загрузочные сценарии, чтобы они выполнялись каждый раз при запуске системы.

Что такое SysRq?

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> для синхронизации буферов ввода/вывода. И только после размонтировать файловые системы. Итак, при зависании сервера правильной будет последовательность:

  1. Нажать <Alt+SysRq+E> или <Alt+SysRq+K>. Если не помогло и система по-прежнему висит, тогда переходим к пункту 2.
  2. Нажать <Alt+SysRq+S>. Подождать 5-10 секунд.
  3. Нажать <Alt+SysRq+U>. Подождать 5-10 секунд (в зависимости от количества смонтированных файловых систем).
  4. Нажать Reset.

Нажатие <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. Оба инструмента существенно облегчают жизнь администратора во внештатных ситуациях. Надеюсь, что статья тебе поможет, хотя искренне желаю, чтобы таких ситуаций было гораздо меньше