sysctl


http://www.remontnik.ru/ отзывы о фирмах по ремонту квартир.

Программа sysctl(8) позволяет взглянуть на параметры ядра и в некоторых случаях установить их значения. Запутаем дело: иногда эти параметры тоже называются sysctls. Sysctl — это мощный инструмент, поскольку во многих случаях он позволяет увеличивать производительность без повторной сборки ядра или переконфигурирования приложения. К сожалению, это палка о двух концах — таким образом можно нарушить работу программ и сделать пользователей очень несчастными.

Все операции над параметрами настройки ядра (sysctls) выполняются с помощью команды sysctl(8). По ходу изложения материала я буду обращать внимание на ту или иную операцию sysctl, которая изменяет поведение системы, но сначала эти операции необходимо понять. Прежде чем взяться за sysctls, выясним, какие из них доступны в системе. Следующая команда сохранит список операций в файле, который можно легко изучить:

# sysctl -A > sysctl.out

После выполнения этой команды файл sysctl.out будет содержать сотни параметров настройки ядра и их значений. Большая их часть пока неясна, но некоторые понять нетрудно:

kern.hostname: humvee.blackhelicopters.org

Этот параметр sysctl, называемый kern.hostname, имеет значение humvee.blackhelicopters.org. Система, на которой я запустил эту команду, называется humvee.blackhelicopters.org. По названию этого параметра ядра нетрудно догадаться, что он хранит имя компьютера. Если бы все было так просто…

kern.ipc.msqids: Format: Length:3520
Dump:0xe903e903e903e903c0010100168f7542...

Я понятия не имею, какую роль играет переменная kern.ipc.msqids, и еще меньше понимаю смысл ее значения. Все же, если у меня возникают трудности, я могу получить нужную информацию, обратившись за помощью к поставщику системы или в почтовую рассылку.

Организация sysctl

Параметры настройки ядра организованы по древовидной схеме, которая называется базой управляющей информации (Management Information Base, MIB). В ней есть несколько основных категорий, таких как net (network — сеть), vm (virtual memory — виртуальная память) и kern (kernel — ядро). В табл. 5.1 перечислены корневые элементы дерева MIB sysctl, присутствующие в системе, работающей на базе ядра GENERIC.

Таблица 5.1. Корни дерева sysctl MIB

Sysctl Назначение
kern Основные функции ядра
vm Подсистема виртуальной памяти
vfs Файловые системы
net Сетевые функции
debug Отладочная информация
hw Информация об аппаратных средствах
user Информация об интерфейсах пространства пользователя
p1003_1b Параметры, управляющие характеристиками POSIX*
compat Совместимость ядра с программным обеспечением других операционных систем (глава 12)
security Параметры обеспечения безопасности
dev Информация драйверов устройств

Каждая категория, в свою очередь, подразделяется на подгруппы; например, категория net, охватывающая все сетевые sysctls, разделена на категории IP, ICMP, TCP и UDP. Термины sysctl MIB и sysctl часто употребляются попеременно. Концепция, лежащая в основе базы управляющей информации (MIB), используется и в других частях операционной системы, в чем вы сможете убедиться в главе 20 и на протяжении всей своей карьеры. Термины sysctl MIB и sysctl часто употребляются попеременно. Уникальные имена переменных создаются из комбинации названия родительской категории и всех вложенных подкатегорий, например:

...
kern.maxfilesperproc: 11095
kern.maxprocperuid: 5547
kern.ipc.maxsockbuf: 262144
kern.ipc.sockbuf_waste_factor: 8
kern.ipc.somaxconn: 128
...

Здесь представлены пять параметров sysctl, извлеченные из категории kern. Первые два входят непосредственно в категорию kern, и с другими значениями их связывает лишь тот факт, что все они имеют отношение к ядру. Имена остальных трех параметров начинаются с kern.ipc — они являются частью раздела IPC (inter-process communication — взаимодействие между процессами). Если продолжить рассмотрение сохраненного ранее файла со списком параметров sysctl, можно заметить, что ветвление дерева sysctls может продолжаться на нескольких уровнях.

Значения параметров sysctl

Каждый MIB имеет значение, которое связано с неким буфером, настройками или особенностями, используемыми ядром. Изменение этого значения повлечет за собой изменение в характере работы ядра. Например, некоторые параметры настройки ядра управляют выделением памяти для каждого сетевого соединения. Если сетевая производительность низка, можно увеличить объем системных ресурсов, резервируемых для сетевых соединений.

Каждый параметр sysctl может представлять собой строку (string), целое число (integer), двоичное значение (binary value) либо неясный код (opaque). String — это текст свободного формата с произвольной длиной; integer — обыкновенное целое число; binary value — либо 0 (off), либо 1 (on); значение opaque представлено в машинном коде, который могут интерпретировать только специальные программы. Многие параметры настройки ядра недостаточно документированы. Нет отдельного документа, в котором перечислены все имеющиеся базы управляющей информации (sysctl MIB) и их назначение. Но описание каждого параметра присутствует на странице руководства к соответствующей функции, а иногда — только в исходных текстах. Например, исходная документация для MIB kern.securelevel (более подробно рассматривается в главе 7) представлена в init(8). Хотя за последние несколько лет объем документации по sysctl существенно вырос, тем не менее многие параметры по-прежнему вообще не имеют документации. В приложении А приведен список распространенных параметров настройки ядра и описано их назначение.

К счастью, некоторые параметры очевидны. Например, как будет говориться ниже, в этой же главе, следующий параметр имеет большое значение для тех, кто часто загружает систему с различными ядрами:

kern.bootfile: /boot/kernel/kernel

Если проводится отладка и последовательная загрузка с различных ядер, можно легко забыть, какое ядро было загружено (в действительности это происходит даже со мной), поэтому дополнительное напоминание будет совсем нелишним.

Просмотр параметров sysctl

Чтобы увидеть поддерево MIB, доступных в отдельном поддереве MIB, можно воспользоваться командой sysctl, передав имя поддерева, которое следует вывести. Например, чтобы увидеть все параметры в дереве, таком как kern, введите такую команду:

# sysctl kern
kern.ostype: FreeBSD
kern.osrelease: 7.0-CURRENT-SNAP010
kern.osrevision: 199506
...

Этот список может быть длинным. Он может пригодиться, когда необходимо выяснить, какие параметры sysctl представлены в ядре. Чтобы получить только значение отдельного параметра настройки ядра, задайте имя MIB как аргумент:

# sysctl kern.securelevel
kern.securelevel: -1

В этом случае kern.securelevel имеет целочисленное значение -1. Смысл этого значения обсуждается в главе 7.

Чтобы получить хоть какое-то представление о назначении того или иного параметра sysctl, можно использовать ключ -d вместе с полным именем MIB. В результате будет выведено краткое описание параметра:

# sysctl -d kern.maxfilesperproc
kern.maxfilesperproc: Maximum files allowed open per process

Это краткое описание сообщает, что данный параметр sysctl управляет именно тем, о чем можно было бы догадаться из его имени. Но это самый простой случай, в других, более сложных случаях, бывает сложно строить какие-либо предположения только на основе имени параметра.

Изменение параметров sysctl

Некоторые параметры sysctl предназначены только для чтения. Рассмотрим MIB-дерево hw:

hw.model: AMD Athlon(tm) 64 X2 Dual Core Processor 4200+

Разработчики FreeBSD еще не до конца разработали технологию переноса системы с AMD на аппаратные средства sparc64 с помощью программных настроек, поэтому данный параметр доступен только для чтения и его изменение может привести лишь к неработоспособности системы. Вот почему во FreeBSD такие параметры MIB доступны только для чтения. Попытки изменить их ничего не нарушат, однако будет выдано предупреждение о том, что сделать это нельзя. Но есть MIB, значения которых изменять можно. Рассмотрим следующий MIB:

vfs.usernount: 0

Его значение определяет, могут ли пользователи монтировать сменные носители, такие как CD или дискету. Изменение этого параметра не требует внесения обширных изменений в ядро или в аппаратное окружение, он всего лишь разрешает или запрещает функцию в ядре. Чтобы изменить значение параметра, следует вызвать команду sysctl(8), передать ей имя параметра, знак «равно» (=) и желаемое значение:

# sysctl vfs.usermount=1
vfs.usernount: 0 -> 1

Команда sysctl(8) возвращает сообщение, в котором показаны предыдущее и новое значения. После этого параметр sysctl будет изменен. Параметры sysctl, которые подстраиваются «на лету», называются sysctl, настраиваемые на этапе выполнения (run-time tunable sysctl).

Автоматическая настройка параметров sysctl

Когда будут выполнены все необходимые настройки параметров ядра, было бы желательно, чтобы они автоматически устанавливались после перезагрузки. Для этих целей используется файл /etc/sysctl.conf. Просто перечислите в этом файле все желаемые параметры с необходимыми значениями. Например, чтобы установить тот же самый параметр vfs.usermount на этапе загрузки, достаточно добавить в /etc/sysctl.conf следующую строку:

vfs.usermount=1

Параметры sysctl, устанавливаемые на этапе загрузки

Некоторые этапы конфигурирования ядра должны предшествовать загрузке системы. Можно найти множество примеров параметров, значения которых должны определяться на этапе загрузки. Часто эти параметры связаны с низкоуровневой настройкой аппаратных устройств. Например, во время первоначального опроса ядром жесткого диска IDE драйвер устройства определяет, следует ли использовать DMA, PIO, кэширование записи или какие-либо другие особенности, характерные для жестких дисков. Это решение должно приниматься при обнаружении устройства, на этапе начальной загрузки, после чего решение изменить нельзя. Эти значения можно установить с помощью системного загрузчика (system loader), определив необходимые настройки в файле /boot/loader.conf’, как уже говорилось в главе 3.

Настройки в loader.conf, как и в sysctl.conf, при неумелом использовании могут доставить компьютеру неприятности. Но нет причин для расстройства, потому что эти значения легко можно сбросить.

Слишком много настроек?

Не путайте между собой параметры sysctl, значения которых могут устанавливаться только на этапе загрузки, параметры, которые могут изменяться в процессе работы системы, и параметры, которые могут изменяться в процессе работы, но настроены для автоматической установки на этапе загрузки. Запомните, что настройки, выполняемые только на этапе загрузки, связаны с низкоуровневыми функциями ядра, тогда как настройки, позволяющие изменять свои значения «на лету», — с высокоуровневыми. Автоматическая настройка параметров sysctl во время загрузки — это просто пример экономии вашего времени; принадлежность параметров к той или иной категории не изменяется.

Выдача указаний драйверам устройств

Многие драйверы устройств требуют, чтобы флаги sysctl были установлены во время начальной загрузки. Узнать о них можно из страниц руководства, из этой книги и из другой документации. Несмотря на то, что эти параметры отсутствуют в файле по умолчанию loader.conf‘, тем не менее их можно добавлять в локальный loader.conf, чтобы автоматически задавать необходимые значения во время начальной загрузки. Например, чтобы отключить DMA для устройств AT API (которые будут рассматриваться в главе 8), достаточно просто поместить требуемое значение параметра sysctl в файл loader.conf:

hw.ata.atapi_dma="0"

Ядро установит этот флаг во время загрузки, и тем самым будет обеспечено желаемое поведение драйвера устройства.

Дополнительно многие устаревшие аппаратные устройства требуют, чтобы ядро обращалось к ним по сигналу прерывания, с четко определенным номером IRQ и по определенным адресам памяти. Если вам достаточно лет, вы должны помнить дискеты для «настройки устройств» и специальные разъемы для подключения плат расширения шин, вы знаете, о чем я говорю, и, возможно, одна из таких систем даже сейчас валяется у вас на заднем дворе. (Если же вы слишком молоды, купите выпить для одного из нас, старикашек, и слушайте* наши рассказы, наполненные ужасами.) Можно указать системе FreeBSD на необходимость опробовать все номера IRQ или указанные адреса памяти для работы с этими устройствами, что очень удобно, если имеется карта с известными параметрами настройки, но дискета с ними давно уже превратилась в прах. Загляните в файл /boot/device.hints, где можно увидеть массу записей, таких как показано ниже:

Данные записи — это указания для драйвера ed (1). Запись предназначена для драйвера ed с номером 0 (2). Ключевое слово disabled (3) означает, что FreeBSD не будет выполнять проверку этого устройств автоматически, во время загрузки. Если будет найдена другая карта ed, ей может быть присвоен номер устройства 0. Если это устройство будет активировано, FreeBSD попробует обратиться к нему через порт с номером 0×280 (4), по номеру IRQ 10 (5) и по адресу памяти 0xd8000 (6), и если карта будет обнаружена по указанным адресам, она получит имя устройства ed0. Конечно, если карта не поддерживается драйвером сетевых карт ed(4), у вас появятся другие проблемы!

Команда sysctl(8) дает вам власть выполнять настройку ядра, но настройка — это только начало пути. Следующий шаг — управление модулями ядра.

Тестирование настроек, выполняемых во время загрузки

Все эти указания драйверам и настройки, выполняемые во время загрузки, можно производить в интерактивном режиме, в командной строке загрузчика, о которой рассказывалось в главе 3. Вы можете протестировать настройки без редактирования файла loader.conf’, отыскать правильное значение и только после этого сохранить его в файле.

Комментарии запрещены.