Создание файла конфигурации в BSD-системе
Категория: Драйверы и ядро | Автор: admin | 10-01-2010, 23:41 | Просмотров: 2727

Создание файла конфигурации в каталоге SYS/i386/conf — самый трудный этап построения BSD-ядра; весь остальной процесс выполняется чисто механически.

Файл конфигурации — это перечень управляющих фраз, каждая из которых занимает не менее одной строки. Строка, начинающаяся со знака табуляции, считается продолжением предыдущей. Все, что находится между знаком решетки (#) и концом строки, является комментарием, причем пустые строки игнорируются. От аргументов ключевые слова отделяются пробелами. Во всех остальных случаях пробелы и знаки табуляции игнорируются.

Целые числа в файле конфигурации могут быть представлены в шестнадцатеричном, восьмеричном или десятичном формате. Восьмеричные числа идентифицируются начальным нулем, а шестнадцатеричные — префиксом . Если символьная строка содержит числа, которые необходимо трактовать как текст, ее нужно заключить в двойные кавычки.

Управляющая фраза начинается с ключевого слова, которое определяет, как нужно интерпретировать остальную часть строки. Далее следуют аргументы. Для некоторых ключевых слов можно указывать список аргументов, разделенных пробелами или запятыми, но удобнее задавать только по одному аргументу в строке. Если для ключевого слова задается много аргументов, допускается указание нескольких идущих подряд фраз с данным ключевым словом и разными аргументами.

Порядок управляющих фраз обычно не имеет значения. Традиционно используется порядок, показанный в табл. 12.6.

 

Таблица 12.6. Ключевые слова, используемые в файлах конфигурации BSD-систем

Ключевое слово

Функция

machine

Задает тип машины

cpu

Задает тип центрального процессора

ident

Задает имя ядра

maxusers

Задает размеры таблиц ядра

options

Задает различные опции компиляции

config

Назначает корневую область и область подкачки

controller

Объявляет контроллер диска или ленты

disk

Объявляет диск, подключенный к контроллеру

tape

Объявляет ленту, подключенную к контроллеру

device

Объявляет устройства без контроллеров

pseudo-device

Объявляет псевдоустройства

 

Ключевое слово maxusers

 

Ключевое слово maxusers задает размеры нескольких важных системных таблиц. Как следует из названия, аргументом здесь является максимальное число пользователей, которые могут одновременно работать в системе (хотя в большинстве версий UNIX предел как таковой не устанавливается). В общем случае следует увеличивать этот параметр на единицу для каждого из пользователей, которые предположительно будут одновременно работать в системе. Если конфигурируется ядро для сервера NFS, параметр maxusers соответствует количеству машин-клиентов. Для каждого буфера кадров, с которым может работать графическая многооконная система, нужно добавить число восемь.

Параметр maxusers влияет на значения нескольких других параметров ядра, в частности на максимальное число процессов, число записей в таблице дескрипторов файлов и число буферов для терминальной подсистемы ввода-вывода. Самую важную роль играет первый из перечисленных параметров. Вот формула, по которой он вычисляется:

Максимальное число процессов = 20 + 16*maxusers

Здесь учтено, что около 18 процессов запускаются при загрузке ядра.

 

Ключевое слово options

 

Директива optiors предназначена для объявления переменных, интерпретируемых препроцессором в ходе компиляции ядра. Существуют две формы этой директивы. В первой из них определяются имена переменных, но им не присваиваются конкретные значения. Эти имена используются для того, чтобы указать, включена опция или нет (директивы препроцессора #ifdef и #ifndef). Когда аргументом директивы options является имя, то определяется соответствующая макроконстанта препроцессора. Вот, к примеру, фраза, включающая в ядро поддержку NFS:

options NFS

 

Обратите внимание на то, что во FreeBSD любая строка конфигурационного файла, содержащая буквы и цифры, должна быть заключена в кавычки. Например, поддержка файловой системы ISO-9660, используемой при работе с компакт-дисками, активизируется следующим образом:

options "CD9660"

 

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

options символ="значение"

 

Например, для изменения значения переменной MAXDSIZ (максимальный объем виртуальной памяти, которую можно выделить сегменту данных одного процесса) используется такая строка:

options MAXDSIZ="(64*1024*1024)"

 

В этом примере для переменной MAXDSIZ задано значение 64 Мбайт.

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

INET       Эта опция включает поддержку сетевых протоколов. При ее отсутствии многие программы будут работать неправильно, так что опцией она является лишь номинально.

              Необходимо также включить псевдоустройство loop (см. ниже). Опция INET активизирует сетевую поддержку только со стороны программного обеспечения. Объявление

              сетевых устройств дается в кон­фигурационном файле позже.

FFS        Данная опция позволяет подключать к машине локальные диски. Она устанавливается всегда, кроме случая, когда формируется исключительно "тонкое" ядро для

              бездискового клиента.

NFS                    Эта опция включает поддержку NFS. Она требуется как для клиентов, так и для серверов NFS.

GATEWAY         Такую опцию следует устанавливать на машинах, которые содержат более одного сетевого интерфейса и предназначены для выполнения функции маршрутизации и

                          пересылки сообщений в сети Internet. В настоящее время эффект от этой опции незначителен: она задает увеличение размеров некоторых структур ядра, чтобы оно

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

 

Ключевое слово config

 

Директива config используется для задания местоположения корневого раздела на дисках системы. Корневой раздел — самый верхний элемент иерархии файловой системы. Он содержит каталог / и несколько других важных файлов и подкаталогов. Информация о том, как монтировать файловые системы, обычно хранится в файле /etc/fstab, но операционная система может добраться до него только после монтирования корневого раздела.

 

 

Для начальной загрузки файловой системы информацию о разделе, включающем корневой каталог, нужно либо интегрировать в ядро путем компиляции последнего, либо (в некоторых системах) передать ядру посредством загрузчика. Что касается раздела подкачки, то ситуация немного проще, потому что подкачка вряд ли будет иметь место до того момента, как стартовые сценарии (/etc/rc*) запустят команду swapon.

Синтаксис директивы config таков:

config имя_ядра root on раздел

 

Параметр имя_ядра задает файл, в котором будет храниться скомпилированный образ ядра. Ядра FreeBSD называются kernel; имена альтернативных ядер должны идентифицировать диск, который они используют для хранения корневого раздела (например, dakemel).

Параметр раздел сообщает о том, в каком разделе находится корневая файловая система. Для IDE-дисков это обычно раздел wd0, а для SCSI-дисков — da0.

Полностью директива config выглядит примерно так:

config kernel root on wd0

 

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

В некоторых системах процедура начальной загрузки производится с дискеты или компакт-диска. Загрузчик, расположенный на дискете, знает местонахождение ядра и может управлять его вызовом. Если имеется запасной корневой раздел, то придется создать еще одну загрузочную дискету, которая будет его использовать.

 

Аппаратные устройства

 

Синтаксис объявлений устройств довольно путаный, и основные элементы, необходимые для того, чтобы заставить систему работать, изменяются от машины к машине. Информацию об устройствах можно получить в разделе 4 документации по BSD-системам. В большинстве man-страниц, посвященных драйверам устройств, приводится пример конфигурационной строки, которую следует добавить к ядру.

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

Вот исходная форма объявления:

тип_устройства имя_устройства at соединение port адрес {класс_устройства} irq прерывание

 

Не все предложения этой инструкции применимы ко всем устройствам. Параметр тип устройства, как следует из его названия, задает тип объявляемого устройства. С некоторыми устройствами связаны свои ключевые слова, в частности controller и disk. Все остальные устройства идентифицируются общим словом device.

Параметр имя_устройства — это стандартное имя устройства (точнее, имя драйвера устройства) плюс его логический номер. Например, имя первого IDE-контроллера — wdc0. Анализируя базовую конфигурацию, можно поискать информацию о каждом устройстве в разделе 4 документации и выяснить, какое устройство скрывается за тем или иным именем. Отметим, что логический номер устройства не имеет никакой связи с номером устройства, заданным аппаратно.

Параметр соединение сообщает ядру, где необходимо искать данное устройство. Для дисковых и ленточных накопителей, как правило, указывается имя контроллера. Для контроллеров и прочих внешних устройств задается имя шины или контроллера шины. Например, в следующих строках объявляются системная шина ISA, подключенный к ней IDE-контроллер и IDE-диск, соединенный с контроллером:

controller     isa0

controller     wdc0     at isa? port "IO_WDl" bio irq 14

disk           wdc0     at wdc0 drive 0

 

В большинстве случаев достаточно констатировать, что устройство подключено к контроллеру конкретного типа, не указывая, к какому именно. Например, место подключения IDE-контроллера wdc0 обозначено выше не как isa0 или isa1, а как isa?.

Параметр адрес, аргумент ключевого слова port, обозначает местонахождение регистров устройства в адресном пространстве шины или объединительной панели, к которой оно подключено. Для контроллеров и устройств, подключенных непосредственно к шине, этот параметр чаще всего задан. С устройством каждого типа связано определенное число адресных ячеек, которые оно занимает в адресном пространстве шины. Задавать значения нужно только для устройств ISA и EISA. PCI-драйверы динамически определяют диапазон адресов, с которыми работает устройство.

В параметре прерывание задается вектор прерываний (IRQ), используемых устройством. Как и в предыдущем случае, он требуется только для устройств ISA и EISA, а PCI-драйверы сами определяют нужные прерывания.

С некоторыми устройствами нужно связывать параметр класс_устройства. В основном это относится к сетевым устройствам и отдельным контроллерам. Получить соответствующую информацию можно на man-странице по конкретному устройству.

Вот строка конфигурации сетевой ISA-платы NE200, в которой используются все перечисленные выше параметры:

device ed0 at isa? port ox360 net irq 10

 

В этой строке сообщается о том, что устройство ed0 нужно искать т шине ISA по адресу 0x360. Устройство использует прерывание 10.

Гораздо чаще те или иные ключевые слова не включаются в директиву.. Ниже показана строка конфигурации Ethernet-платы, на этот раз подключенной к шине PCI:

device de0

 

Благодаря достоинствам интерфейса PCI мы избавляемся от необходимости знать все детали функционирования устройства.

Самый эффективный способ построения вышеупомянутых объявлений — группировать связанные устройства. Если в системе есть какой-то контроллер разместите рядом с его строкой строку подключенного к нему устройства. Например, сразу после строки для контроллера IDE следует расположить конфигурационные строки подключенного к нему IDE-диска или дисковода CD-ROM. Так гораздо легче проследить связи между устройствами.

 

Ключевое слово pseudo-device

 

Теоретически драйверы псевдоустройств — это программы, которые ведут себя как драйверы устройств, но при этом не поддерживают никаких реальных аппаратных средств. Мы говорим "теоретически", потому что некоторые компоненты ядра, маскирующиеся под псевдоустройства, вообще не работают как драйверы устройств, по крайней мере с точки зрения пользователя Синтаксис директивы pseudo-device таков:

pseudo-device имя_устройства число_экземпляров

 

Аргумент имя_устройства — это имя псевдоустройства, а необязательный аргумент число_экземпляров — целое число, показывающее, сколько подобных воображаемых устройств якобы имеется. Во многих драйверах счетчик экземпляров не используется.

Обычно применяется лишь несколько псевдоустройств, но большинство из них необходимо для нормальной работы системы. В некоторых системах предусмотрен ряд нестандартных псевдоустройств, которые поддерживают оконные подсистемы, дополнительные клавиатуры и вспомогательные дисплеи. Прочтите в документации о том, как обращаться с такими устройствами, или просто активизируйте в базовом файле конфигурации все псевдоустройства, чтобы не возникало случайных конфликтов.

Ниже приведен перечень некоторых распространенных псевдоустройств:

pty               Устройства РТУ — это псевдотерминалы. Они имитируют настоящие терминалы, но вместо реального терминала к каждому из них подключен какой-нибудь

                     UNIX-процесс. Псевдотерминалы активно используются сетевыми программами, такими как ssh, xterm, telnet и rlogin. Кроме того, с ними взаимодействуют некоторые

                     стандартные утилиты (например, script), обрабатывающие посредством них входную информацию.

loop             Драйвер loop имитирует устройство сопряжения с сетью, в которую входит только локальный компьютер (так называемый интерфейс обратной связи). Этот драйвер

                     позволяет автономным машинам использовать сетевое программное обеспечение и, кроме того, предоставляет машине стандартный метод направления сетевых пакетов

                     самой себе. Он необходим, если установлена опция INET.

 

 

Пример файла конфигурации

 

Давайте рассмотрим образец файла конфигурации какого-нибудь простого ядра, которое назовем EXAMPLE:

machine           "i386"

cpu               "I386_CPU"

cpu               "I486_CPU"

cpu               "I586_CPU"

cpu               "I686_CPU"

ident             EXAMPLE

maxusers          32

 

Первые несколько строк говорят о том, что мы создаем ядро для платформы Intel PC и оно должно поддерживать все указанные типы процессоров. Имя конфигурации — EXAMPLE. Ядро конфигурируется в расчете на одновременную работу максимум 32 пользователей и 532 процессов.

 

...

options         INET              # Internet:  TCP/IP

options         "CD9660"          # файловая система ISO 9660 (CD-ROM)

options         FFS               # локальная файловая система  (FFS)

options         NFS               # сетевая файловая система  (NFS)

...

 

Это лишь небольшой фрагмент секции опций из конфигурационного файла. Наше ядро конфигурируется в расчете на поддержку работы в Internet, локальных файловых систем, файловой системы ISO-9660 (используется компакт-дисками) и NFS.

config kernel root on wd0

 

Основной корневой раздел будет расположен на первом жестком диске IDE.

controller isa0

controller pnp0

controller eisa0

controller pci0

 

Приведенные выше строки объявляют различные шинные интерфейсы, поддерживаемые в системе: ISA, EISA и PCI. Во второй строке включается поддержка технологии Plug and Play для ISA-устройств (pnp0).

controller     atkbdc0  at   isa? port IO_KBD tty

device          atkbd0  at   isa? tty irq 1

device            psm0  at   isa? tty irq 12

device            vga0  at   isa? port ? conflicts

# хранитель экрана

pseudo-device   splash

# syscons — это стандартный драйвер консоли, напоминающей консоль SC:

device    sc0  at isa? tty

 

 

В этих строках объявляются все элементы, необходимые для работы консоли: клавиатура и ее контроллер, мышь, видеоплата и сама консоль.

# Гибкие диски

controller     fdc0     at isa? port "IO_FDl" bio irq 6 drq 2

disk           fd0      at fdcO drive 0

disk           fdl      at fdcO drive 1


# Контроллеры и жесткие диски IDE

controller     wdc0 at isa? port "IO_WDl" bio irq 14

disk           wd0  at wdc0 drive 0

disk           wdl  at wdc0 drive 1

controller     wdcl at isa? port "IO_WD2" bio irq 15

disk           wd2  at wdc0 drive 0

disk           wd3  at wdc0 drive 1

 

Здесь объявляются различные контроллеры и диски: контроллер гибких дисков, два дисковода гибких дисков (используется только один из них, но объявить второй не помешает) и два контроллера IDE с соответствующими дисками.

options   ATAPI          # поддержка ATAPI для шины IDE

options   ATAPI_STATIC   # не делать загружаемым модулем

device    acdO           # IDE-дисковод CD-ROM

 

Во FreeBSD нужно включать показанные выше специальные опции для поддержки IDE-устройств. Драйвер IDE можно сконфигурировать как загружаемый модуль ядра, но если IDE-диск содержит корневой раздел, драйвер должен подключаться статически. В противном случае система не сможет обнаружить корневой раздел на этапе начальной загрузки.

pseudo-device loop               # сетевой интерфейс обратной связи

pseudo-device ether              # поддержка Ethernet

pseudo-device bpfilter 4         # фильтр пакетов Беркли

 

Из этих псевдоустройств только первое (loop) является обязательным, но в общем случае все псевдоустройства следует включать в конфигурацию GENERIC. Псевдоустройство ether необходимо для поддержки Ethernet оборудования. Псевдоустройство bpfilter требуется для запуска утилиты tcpdump и DHCP-клиентов. Его можно удалить, чтобы запретить пользователям выполнять анализ сетевых пакетов. Но в этом случае сам администратор лишится возможности производить диагностику сети.

 

Настройка ядра

 

Ядро KERNEL не настроено на максимальную производительность, что будет особенно заметно, если инсталлировать в системе крупный Web-сервер. Приведем несколько указаний по улучшению работы ядра FreeBSD.

Частично динамическую настройку ядра FreeBSD можно выполнять с помощью команды sysctl, которая реализует пользовательский интерфейс доступа к некоторым внутренним структурам и параметрам ядра. Это очень мощная (и опасная) команда.

Команда sysctl -а выводит список переменных ядра. Почти все параметры, перечисленные в табл. 12.7, доступны для динамического изменения. В документации очень мало говорится о том, что означает каждая переменная; подсказкой служат только имена переменных.

Изменения, вносимые командой sysctl, теряются при перезагрузке системы. Как правило, команда sysctl применяется для тестирования; если же изменения требуется сделать постоянными, нужно отредактировать конфигурационный файл и перекомпилировать ядро. Преимущество такого подхода заключается в том, что в любой момент можно перезагрузиться, и система вернется в исходное состояние.

В табл. 12.7 перечислены переменные, наиболее часто меняемые с помощью команды sysctl.

Таблица 12.7. Важные переменные ядра FreeBSD, доступные для изменения командой sysctl

 

Переменная

По

умолчанию

Описание

kern.maxfiles

1064

Максимальное число открытых файлов

kern.maxproc

532

Максимальное число процессов

kern.maxfilesperproc

1064

Максимальное число открытых файлов в одном процессе

kern.maxprccperuid

531

Максимальное число процессов для одного пользователя

kern .ipc.nmbclusters

1024

Максимальное число сетевых буферов

kern.ipc.maxsockets

1064

Максимальное число доступных сокетов

 

Обратите внимание на то, что в стандартной конфигурации отдельный пользователь может занять все позиции в таблице процессов, кроме одной. Это таит в себе потенциальную угрозу, так как, даже если в системе действительно работает всего один пользователь, не резервируется место для запуска системных процессов. Желательно делать больший интервал между значениями переменных maxproc и maxprocperuid.

Ниже мы опишем процесс модификации некоторых самых простых параметров ядра GENERIC. Обычно это имеет смысл делать на Web-сервере, хотя рассматриваемые изменения позволяют повысить производительность большинства сетевых серверов.

maxusers 256

 

Параметр maxusers влияет на ряд других характеристик ядра, в частности на максимальное число процессов в системе и для одного пользователя, максимальное число открытых файлов в системе и в отдельно процессе, а также максимальное число сетевых буферов. При конфигурировании сервера желательно устанавливать достаточно высокие лимиты.

options NMBCLUSTERS=4096

 

Здесь задается разумное число сетевых буферов. По умолчанию их всего 256, что недопустимо мало даже в серверах среднего размера.

options CHILD_MAX=1024

 

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

options OPEN_MAX=1024

 

Здесь устанавливается максимальное число дескрипторов файлов в системе. Обычно это значение должно быть равно параметру CHILD_MAX, так как с каждым запросом на подключение связывается свой дескриптор.



 (голосов: 0)
Версия для печати | Комментариев: 0
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.


 
Логин
Пароль
 

 
Locations of visitors to this page