В номере редактор английской версии


Запускаем команду make depend



Pdf просмотр
страница3/7
Дата19.11.2016
Размер4.58 Mb.
Просмотров1231
Скачиваний0
1   2   3   4   5   6   7
Запускаем команду make depend
После того, как config отработала, вам необходимо будет зайти в директорию компиляции нового ядра
(cd ../../compile/EXAMPLE) и запустить команду ls.
Вы увидите множество и множество файлов. Не беспокойтесь об их содержимом — команда config знает, что именно создавать.
Теперь запускайте команду make depend из этой директории. Она проинициализирует файловые зависимости, которые затем потребуются команде make. Не пугайтесь, что на экран будет выведено множество сообщений.
Сборка ядра
В компиляционной директории запускайте команду make. Внимательно следите за сообщениями во время компиляции. Обычно команда находит ошибки и автоматически останавливает процесс, но всегда желательно быть настороже. Для особого контроля воспользуйтесь командой tee. Она позволит сохранить все сообщения, что показываются на экране, в файл.
# make |& tee ERRS.LOG
Знак & за вертикальной черточкой означает, что как сообщения об ошибках, так и обычные сообщения будут перенаправлены в один файл. Пользователи с оболочкой bash должны использовать следующую конструкцию
# make 2>&1 | tee ERRS.LOG
Если появляется ошибка во время компиляции, то первым надо подозревать конфигурационный файл.
В случае, когда видите сообщения, что отсутствуют какие-то файлы или какие-либо процедуры, то скорее всего вы что-то забыли внести в конфигурацию. Если же появляются синтаксические ошибки, то виноват либо конфигурационный файл, либо система. Хотя систему подозревать нужно в самую последнюю очередь.
Устанавливаем новое ядро
Перед загрузкой с новым ядром убедитесь, что вы можете вернуться в систему, если ядро не сработает.
Никогда не перезаписывайте старое ядро новым, т.к. в фатальном случае вам не с чего будет загружаться.
Обычно, ядра хранятся как /vmunix, но каждая операционная система в наши времена старается называть их по-своему. В частности, для FreeBSD характерно именование ядра как /kernel.
Вам следует сохранить старое ядро путем переименовывания /kernel в, например, /kernel.works.
Все системы предоставляют ту или иную возможность загрузить старое ядро при тестировании нового. Это можно сделать с помощью загрузчика, однако это уже тема для другой статьи.
Файл /kernel может быть жесткой ссылкой на другой файл, поэтому вы можете просто сделать ссылку на ваше новое ядро заместо копирования. Если же ядро не называется как /kernel, и вы не сделали ссылку, то вполне вероятно, что системный загрузчик будет испытывать определенную трудность, пытаясь найти его.
Тестируем новое ядро
Система с новым ядром стартует успешно, поэтому, скорее всего, вас можно поздравить. Однако, несколько проверок не помешает. Запустите команду ls по крайней мере в одной директории каждого примонтированного раздела. Успешный запуск будет

12/2011 20
HOW-TO
означать, что файловая система работает нормально.
Попробуйте также запустить команду ping на другую машину, чтобы убедиться, что вы видите вашу сеть и сетевая карта работает без нареканий.
Документирование
Прежде, чем вы умоете руки после этого долгого процесса с ядром, вернитесь к файлу
SYS/i386/conf/KERNEL_NAME и расставьте комментарии так, чтобы вернувшись к нему через шесть месяцев или даже год, вы смогли вспомнить, что именно вы делали.
У вас достаточно свободного места? Тогда сохраните директорию SYS/compile/KERNEL_NAME на будущее.
Она вам может потребоваться для ускорения следующего процесса пересборки. В противном случае, просто удалите ее; всё, что там есть, может быть сгенерировано заново командой config.
Создаем файл конфигурации
Создание конфигурационного файла (в каталоге
SYS/i386/conf) является самой сложной частью при сборке ядра. Остальная часть процесса — просто механические действия.
Конфигурационный файл — это список контрольных фраз, по одной на строку. Любая строка, начинающаяся с символа табуляции будет считаться продолжением предыдущей. Подстрока между символом # и концом строки считается комментарием. Пустые строки
— игнорируются. Ключевые слова должны быть разделены пробелами, в любых других ситуациях
(кроме этой и уже описанной выше с табуляцией как продолжением предыдущей строки) они и табуляция будут проигнорированы.
Целые значения чисел могут быть приведены в шестнадцатиричной, восьмиричной и десятичной формах.
Восьмиричные числа обозначаются начальным нулем, а шестнадцатиричные — символами 0x в начале. Подстрока должна быть заковычена, если она содержит числа, используемые в качестве текстового значения.
Контрольная фраза начинается с ключевого слова, которое будет означать, как интерпретировать всю последующую строку. После этого слова идут параметры. Для некоторых ключевых слов можно задавать несколько параметров, разделенных пробелом или запятой. Но хорошим тоном является использование только одного параметра в каждой строке. В таком случае, применимо использовать столько строк, сколько используется параметров.
Порядок, в котором идут контрольные фразы, обычно не важен. В таблице 1 отображен обычный порядок следования:
Таблица 1. Ключевые слова, используемые в конфигурационных файлах BSD
Ключевое слово
Назначение machine
Выставляет тип машины cpu
Выставляет тип процессора ident
Устанавливает имя ядра maxusers
Устанавливается размер таблицы ядра options
Выставляет различные опции для встроенных модулей config
Назначает области для корня и файла подкачки controller
Определяется дисковый или ленточному контроллеру disk
Определеяется диск, подключенный к контроллеру tape
Определяется ленточное устройство, подключенное к контроллеру device
Определяются устройства, без контроллеров pseudo-device
Определяются псевдо- устройства
Параметр maxusers
С помощью ключевого слова maxusers выставляются размеры нескольких важных системных таблиц. Как намекает само имя параметра, аргументом к нему является максимальное количество пользователей, которых система одновременно может обслужить
(хотя многие версии UNIX не слишком-то строго и соблюдают такое ограничение). Если вы хотите осуществлять сами заданный контроль, то значение для количества N одновременных пользователей должно быть N+1. В случае, когда настраиваете сервер для NFS-подключений, то значение также должно быть N+1 для N клиентских машин. Для каждого фрейм-буферного подключения (где будет запускаться оконное окружение) следует добавлять цифру 8.

Подготавливаем свое собственное ядро FreeBSD
www.bsdmag.org
21
Число в maxusers влияет и на ряд других параметров ядра, таких как максимальное число процессов, количество в таблице файлового размещения, количество буферов на каждый терминал ввода/
вывода. Самый важный из них — это максимальное количество процессов в системе. Вот формула, что используется для такого подсчета:
Максимальное кол-во процессов = 20 + 16 * maxusers
Это количество включает в себя те 18 (или около того) процессов, которые запускаются в самом начале системы.
Параметр options
С помощью директивы options выставляются переменные для C-препроцессора во время компиляции ядра. Существует два различных способа использования данной директивы.
В первом случае токены определяются, но значения им не назначаются. В таком случае, токен просто включает или не включает конструкции препроцессора
#ifdef и #ifndef. Если же директиве назначен параметр, то соответствующий символ препроцессора будет определен и сама опция включена. Например, для включения в ядро поддержки NFS используется следующая строка options NFS
Заметьте, что во FreeBSD любая строка, содержащая как буквы, так и числа, должна быть в двойных кавычках. Так, файловая система ISO-9660 включается в ядро с помощью строки options “CD9660”
Во втором случае, директива options не только определяет какую-либо переменную, но и выставляет ей определенное значение. Код ядра рассматривает эту переменную в качестве константы, а C-препроцессор подставляет нужное значение во все вхождения по ходу кода. Такие переменные задаются как:
options symbol=“value”
Например, для изменения опции MAXDSIZ (она оределяет максимальное количество виртуальной памяти, которое может быть выделено сегменту данных на каждый единичный процесс), вам нужно будет записать строку как:
options MAXDSIZ=“(64*1024*1024)”
В этом примере выставляется значение в 64 мегабайта.
Самые часто применяемые опции приведены ниже.
Значения назначить им нельзя. Для полного списка всех опций, смотрите документацию на продукт.
• INET – эта опция включает поддержку сети.
Распространие сетевых технологий настолько широкое сейчас, что не включив эту опцию, вы сделаете неработоспособным и массу зависимых от сети приложений. Будучи включенной она также потребует и включения псевдо-устройство закольцовывания (pseudo-device loop). Опция
INET включает только программную поддержку сети. Аппаратная поддержка для сети также включается в конфигурационном файле, но чуть ниже.
• FFS – эта опция позволяет монтировать локальные диски к машине. Обычно по умолчанию она должна быть включена, кроме случаев, когда ядро проектируется с минимальным размером.
Например, для бездискового клиента или встраиваемой системы поддержка FFS обычно исключается, чтобы максимально уменьшить размер.
• NFS – эта опция включает в ядре поддержку
NFS. Нужна как для клиента, так и для серверной части.
• GATEWAY – пригодится для машин, где используется несколько сетевых интерфейсов и которые предназначены для маршрутизации трафика. Эта опция не слишком сильно вляет на использование памяти — просто увеличивает размер некоторых буферов в ядре для работы с сетевым трафиком и управления им, когда один из интерфейсов перестает функционировать.
Параметр config
Ключевое слово config определяет местоположение корневого раздела на системных дисках.
Корневой раздел — это самый важный компонент файловой системы. Он содержит корневой каталог (/) и несколько дургих важных файлов и поддиректорий.
Информация о том, какие файловые системы можно и нужно монтировать, хранится в файле /etc/fstab,

12/2011 22
HOW-TO
но ядро не знает о существовании этого файла, пока корневой раздел не будет примонтирован.
Для старта всей файловой системы, нужна информация о дисковом разделе, на котором хранится корень. Такая информация может быть либо вкомпилирована в ядро, либо передана системным загрузчиком непосредственно ядру перед стартом.
Ситуация с разделом подкачки несколько иная, т.к. она врядли будет активизирована, прежде чем необходимые скрипты /etc/rc* отработают и запустят команду swapon.
Конфигурационная строка будет выглядеть в виде config kernel_name root on partition
Параметр kernel_name выставляет имя, под которым ядро будет именоваться. Ядра во FreeBSD обычно называются как kernel, иногда они именуются так, чтобы можно было понять на каком дисковом разделе они будут потом хранится (например, название может быть таким — dakernel).
Параметр partition определяет на каком разделе будет размещена корневая файловая система.
Обычно для IDE-дисков это значение wd0, а для SCSI
— da0.
Вот конкретный пример:
config kernel root on wd0
Возможность создать несколько различных вариантов ядер крайне полезна в случае планирования разного рода отказов. Так, наличие альтернативного корневого раздела со своим собственным ядром может послужить спасительным средством для восстановления главного раздела. Если же этот альтернативный раздел находится на том же самом диске и/или контроллере, что и разрушенный, то прежде чем перезагрузить систему, убедитесь — это не проблема в аппаратном обеспечении. Иначе можете разрушить и это альтернативное решение.
На некоторых системах существует возможность загружаться с CD/DVD или с USB-дисков. Ядро, помещенное на эти носители, может автоматически загружаться и управлять дальнейшим процессом запуска. Если у вас есть альтернативная корневая файловая система, то стоит подготовить новый загрузочный CD/DVD/USB диск, который будет знать о ней и при своей загрузке использовать ее.
Аппаратные устройства
Синтаксис для определения различных устройство достаточно запутан, а сами необходимые параметры, от которых зависит работа машины, разнятся от одной машины к другой. В разделе 4 man-страниц
BSD рассматривается работа устройств. Поэтому там можно поискать и пример части конфигурационного файла.
Будем следовать следующей инструкции — я привожу общий синтаксис, а так как вы, как я полагаю, составляете свою собственную конфигурацию на основе стандартной, то мне не придется рассказывать во всех деталях все нюансы какого-либо нестандартного устройства.
Основная форма объявления устройства выглядит так:
device-type device-name at connection-info port address
[device-class] irq interrupt
Параметры в квадратных скобках применимы не ко всем устройствам.
Тип устройства, что вы объявляете, фигурирует под ключевым словом device-type. Некоторые типы устройств, такие как controller и disk имеют свои специальные обозначения. Остальные же объявляются ключевым словом device.
Стандартное имя для устройства (или точнее, имя драйвера устройства) — это device-name, за которым следует его логический номер. Например, имя первого IDE-контроллера wdc0. По мере вашего продвижения по файлу конфигурации, вы можете консультироваться с секцией 4 справки, чтобы узнать более точно значение конкретного параметра.
Заметьте, что логический номер устройства не имеет никакого отношения к аппаратной нумерации этого устройства.
С помощью параметра connection-info ядру передается информация, где искать это устройство и что это за тип устройства. Для дискового и ленточного накопителя эта информация является именем контроллера. Для самих контроллеров и устройств это обычно название шины или название контроллера шины. Например, следующие строки определяют

Подготавливаем свое собственное ядро FreeBSD
www.bsdmag.org
23
системную ISA-шину, IDE-контроллер, который присодинен к шине, а затем IDE-диск, что присодинен уже к IDE-контроллеру:
controller isa0
controller wdc0 at isa? port “IO_WD1” bio irq 14
controller wd0 at wdc0 drive 0
Обычно бывает достаточно вставить информацию, что устройство присоединено к определенноиу типу контроллера, без уточнения, к какому именно.
Например, расположение IDE-контроллера wdc0, упомянутое выше, не конкретизируется (isa0 или isa1), т.к. мы вставляем шаблон
isa?.
Параметр address, который является аргументом для ключевого слова port, раскрывает расположение регистров команд и статуса данного устройства в адресном пространстве шины или платы, к которой оно (устройство) подключено. Для контроллеров и устройств, подключенных непосредственно к шине, обычно заполняют этот параметр. Каждый тип устройств имеет свое определенное количество адресов, что участвуют в адресном пространстве шины. Значения нужны только для устройств ISA и
EISA. Драйверы для PCI-устройств могут определять нужный адрес динамически.
Параметр interrupt нужен для назначения IRQ конкретному устройству. Опять же, этот параметр больше нужен ISA- и EISA-устройствам, т.к. PCI- устройства получают автоматически нужное прерывание с помощью своего драйвера.
Для некоторых устройств нужно выставлять ключевое слово device-class. Этот параметр, в основном, применяется в сетевых устройствах и некоторых контроллерах. Чтобы узнать, нужен ли какому-либо устройству этот параметр или нет, посмотрите в документацию.
Вот как могут выглядеть строки конфигурации для сетевой ISA-карты NE2000:
device ed0 at isa? port 0x360 net irq 10
Эта строка размещает устройство ed0 на шине ISA с адресом ввода-вывода 0x360. Оно будет использовать
10-е прерывание. Обычным явлением бывает пропуск некоторых аргументов. Вот, например, как выглядит объявление для другой сетевой карты, на этот раз для
PCI-шины:
device de0
Спасибо концепции PCI — нам не нужно перечислять многочисленные детали.
Самый лучший способо организовать ваши объявления устройств — это увязать их с соответствующими устройствами. Если у вас есть контроллер, то расположите привязанные к нему устройства рядом. Например, у вас есть IDE- контроллер. Внесите строки с объявлением вашего
IDE-диска и привода CDROM прямо за объявлением контроллера. Таким образом, будет проще визуально отслеживать зависимости.
Клавиатура в качестве pseudo-device
В теории, драйверы для псевдо-устройств работают как обычные драйверы устройств. С единственным только отличием — у них нет реальной аппаратуры, с которой они взаимодействуют. Я говорю «в теории», т.к. некоторые опции ядра, которые как хамелеоны
«прикидываются» псевдо-устройствами, на самом деле вообще не являются драйверами. По крайней мере с точки зрения пользователя. Синтаксис строки для псевдо-устройства выглядит так pseudo-device device-name number-of-instances device-name — это имя псевдо-устройства, а number-of-instances
— произвольное число, показывающее сколько таких воображаемых устройств должно быть организовано драйвером. Как правило, многие не используют этот числовой параметр.
Существует ограниченное количество псевдо- устройств. Однако большая часть из них обязательно должна быть активирована для правильного функционирования операционной системы. Так, на некоторых машинах должны быть активированы несколько псевдо-устройств, что обеспечивают работу: оконной системы, дополнительного клавиатурного ввода или дополнительных мониторов. Советую обратиться к документации по операционной системе, чтобы определить, какие из них вам действительно нужны. Либо просто включите все псевдо-устройства в базовую конфигурацию ядра.

12/2011 24
HOW-TO
Некоторые общепринятые псевдо-устройства:
• pty – псевдо-терминалы (PTY). В своей работе они похожи на обычные аппаратные терминалы, но подключаются не к серверу, как последние, а присоединены к UNIX-процессу.
PTY используются такими программами как ssh, xterm, telnet и rlogin. Также могут быть использованы некоторыми стандартными утилитами (например, шелл-скриптами) для обработки информации ввода.
• loop – драйвер закольцовывания симулирует поведение сетевого интерфейса для локального хоста. Позволяет задействовать сетевое программное обеспечение на машинах, не подключенных в сеть. Также предоставляет возможность отсылать сетевые пакеты себе же на машину. Подразумевается, что опцию INET вы уже включили.
Пример конфигурационного файла
Давайте рассмотрим пример конфигурационного файла для ядра, который мы назовем как EXAMPLE:
machine “i386”
cpu “I386_CPU”
cpu “I486_CPU”
cpu “I586_CPU”
cpu “I686_CPU”
ident EXAMPLE
maxusers 32
Первые несколько строк определяют, что мы создаем ядро для машин на базе Intel-процессоров. И это ядро также должно поддерживать перечисленные семейства линейки x86. В этой же секции также назначается имя для ядра — EXAMPLE. Строка max- users выставляет внутренние таблицы таким образом, чтобы была обеспечена одновременная работа 32 пользователям и 532 одновременно-работающим процессам. options INET # Internet: TCP/IP
options “CD9660” # ISO 9660 CD-ROM filesystem options FFS # (FFS) Local filesystem options NFS # Network filesystem
Это только небольшой отрывок из секции конфигурационного файла. В частности, в ядре включена поддержка для сетевых служб — протокола
TCP/IP, поддержка файловой системы ISO-9660
(используемой на CD-носителях), а также файловой системы FFS и сетевой файловой системы 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
# splash screen/screen saver pseudo-device splash
# syscons is the default console driver, resembling a
SCO console device sc0 at isa? tty
А в этой секции перечисляются те опции, которые необходимы для организации работы консоли на вашей машине. Определяются драйверы: клавиатуры, её контроллера, мыши, видео-карты и самой консоли.
# Floppy devices controller fdc0 at isa? port “IO_FD1” bio irq 6 drq 2
disk fd0 at fdc0 drive 0
disk fd1 at fdc0 drive 1
# IDE controller and disks controller wdc0 at isa? port “IO_WD1” bio irq 14
disk wd0 at wdc0 drive 0
disk wd1 at wdc0 drive 1
controller wdc1 at isa? port “IO_WD2” bio irq 15
disk wd2 at wdc1 drive 0
disk wd3 at wdc1 drive 1
В этой же секции я задаю контроллеры и диски для моей тестовой системы: контроллер флоппи- дисковода, два привода флоппи-дисков (несмотря на то, что только один используется, резервирование их

Подготавливаем свое собственное ядро FreeBSD
www.bsdmag.org
25
двоих не помешает) и два IDE-контроллера со своими соответствующими дисками.
options ATAPI # Enable ATAPI support for
IDE bus options ATAPI_STATIC # Don’t do it as an LKM
device acd0 # IDE CD-ROM
Во FreeBSD мне нужно включать эти специальные параметры, чтобы IDE-устройства могли работать.
Хотя поддержку для этого режима можно оформить и в виде подгружаемых модулей ядра (Loadable Ker- nel Module или LKM далее по тексту), но в случае использования IDE-диска в качестве корневого раздела, поддержка должна присутствовать в ядре в виде статического кода. Иначе система не сможет распознать корневой диск во время процесса загрузки. pseudo-device loop # Network loopback pseudo-device ether # Ethernet support pseudo-device bpf 4 # Berkeley packet filter
Из этих псевдо-устройств только look обязательно.
Вообще-то, следует включать все псевдо-устройства в конфигурации GENERIC. Очевидно, что псевдо- устройство ether необходимо для Ethernet-карт. А bpf требуется для работы tcpdump и для DHCP-клиентов, поэтому включаем оба параметра.
Вполне возможно, что вы захотите исключить параметр bpf — чтобы люди не занимались сканированием сети (с локальной машины). Однако без него, вы сами останетесь с носом и не сможете выявить сетевые проблемы, когда это понадобится.
Настраиваем FreeBSD ядро
Стандартное ядро GENERIC не оптимизировано для быстродействия, которое вам, скорее всего, может потребоваться при работе высоконагруженного веб- сервера. Приведу ряд предложений для построения ядра к такому серверу.
До определенной степени, вы сами можете динамически управлять ядром FreeBSD с помощью команды sysctl, которая предоставляет интерфейс доступа ко многим внутренним структурам ядра. Эта команда очень мощная, но и достаточно опасная.
Запустив её как
sysctl -a вы сможете получить список переменных, которые, в идеале, вы также можете поменять. Почти все параметры из таблицы
2 могут быть динамически изменены. Документация обычно очень скудно описывает, за что и как именно конкретная переменная отвечает, но из её названия вполне можно понять. Будьте осторожны с настройкой ядра через команду sysctl — можете нарушить работоспособность системы.
Те изменения, что вносятся в систему с помощью sysctl, не запоминаются и действуют до ближайшей перезагрузки. Хороший стиль — сначала протестировать работу ядра с помощью этой команды, а затем поменять нужны параметры в конфигурационном файле и перекомпилировать ядро. Такой вариант самый безопасный, т.к. если вы напортачили, то всегда можете перезагрузиться и начать эксперимент заново.
В таблице 2 приведены самые распространенные переменные sysctl, их значения по умолчанию, а также их расшифровка.
Таблица 2. Интересные переменные ядра FreeBSD, которые можно поменять через вызов sysctl
Имя переменной
Значение по умолчанию
Расшифровка kern.maxfiles
3912
Максимальное кол-во открытых файлов kern.maxproc
1956
Максимальное кол- во процессов kern.maxfilesperproc
3520
Максимальное кол-во открытых файлов на процесс kern.maxprocperuid
1760
Максимальное кол-во процессов на uid kern.ipc.nmbclusters
8768
Максимальное кол-во сетевых буферов kern.ipc.maxsockets
8768
Максимальное кол-во доступных сокетов kern.ipc.somaxconn
128
Максимальное кол- во одновременно открытых сокетов
Заметьте, что в стандартной конфигурации, один единственный пользователь может занять все системные ресурсы. Даже если предполагается, что на этой машине никто не будет больше работать, такая ситуация негативно может отразиться на самой системе, т.к. сами внутрисистемные процессы не
1   2   3   4   5   6   7


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал