Linux-сервер своими руками — страница 108 из 119

Компактное и нормальное ядра

В этом приложении вы найдете листинги файлов конфигурации компактного и нормального ядер. В гл. 18 я рекомендовал вам исключать из состава ядра не нужные вам функции. Например, если ваш сервер оборудован только IDE-дисками, то зачем ему поддержка SCSI? В большинстве случаев, при установке дистрибутива ядро настраивается таким образом, чтобы оно могло работать на большом числе компьютеров разных конфигураций. Для этого в состав ядра (или в загружаемые модули) включается поддержка всех чипсетов, файловых систем, сетевых плат и других устройств, что увеличивает размер ядра и делает его более громоздким. Уменьшив число ненужных вам функций, вы повысите производительность всей системы. Но будьте внимательны: отключение одной опции может повлиять на другие. Здесь точно такая же ситуация как и с пакетами RPM: есть зависимые друг от друга пакеты, а есть и несовместимые. Если вы отключите какую-нибудь опцию, которая нужна другим опциям ядра, во время компиляции вы получите сообщение в виде предупреждения (warning) и ядро при этом вообще может не собраться.

Существует и еще один вариант неудовлетворения зависимости опций, когда ядро нормально собирается, но при перезапуске компьютера невозможно запустить систему, используя это ядро. Во время выполнения программы make menuconfig (config или xconfig) вы не узнаете о подобной несовместимости. Все предупреждения и ошибки вы увидите во время компиляции ядра (make zImage). Запомните одно простое правило: ядро должно собираться. Если ядро не собирается, значит, вы допустили ошибку при работе с программой make menuconfig.

В листинге В.1 представлен пример компактного ядра. Я «заточил» его под свой домашний компьютер, поэтому не гарантирую, что оно у вас будет работать. В листинге В.1 вы можете увидеть основные принципы, по которым я собирал ядро. Во-первых, я отказался от загружаемых модулей и включил все необходимые мне драйверы непосредственно в ядро системы. Конечно, такой подход не уменьшит размер файла ядра, но тогда это ядро можно использовать при загрузке с дискеты. Во-вторых, я отключил поддержку всех чипсетов, кроме того, который установлен в моей системе. Я также отказался от поддержки PnP: я не собираюсь добавлять в систему новые устройства, поэтому держать лишний код в ядре для определения нового оборудования, которое никогда не будет установлено, глупо. Обо всех остальных опциях вы узнаете, просмотрев листинг В.1. Компактные ядра, подобные этому, можно использовать на сервере, выполняющем только определенные функции, например, маршрутизацию. Обычно такой сервер после установки и настройки запирают в какой-нибудь комнате и больше не подходят к нему. Естественно, при добавлении новых устройств, для которых необходим драйвер, которого нет в ядре, возникнут определенные неудобства при компилировании ядра. Но вы же не добавляете новые устройства каждый день?

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

Как использовать эти листинги? Очень просто: запускаете make menuconfig и сравниваете названия опций с параметрами конфигурационного файла: что и где вы должны догадаться по смыслу, а потом сравните значения параметров. Тем более, что файл конфигурации разбит на части, названия которых аналогичны названию разделов программы menuconfig. Можно также пойти по более простому пути (хотя он не очень удобен): запустите make с параметром config. Программа будет задавать вам вопросы, на которые вы должны ответить Y, N или М. Y — включить данную функцию в состав ядра, N — не включать в состав ядра, М — включить в виде модуля. Вопросы будут задаваться примерно так:

CONFIG_EXPERIMENTAL ?

На что вы должны ответить Y или N.

Листинг В.1. Пример файла конфигурации компактного ядра

#

# Automatically generated by make menuconfig: don't edit

#


#

# Code maturity level options

#

CONFIG_EXPERIMENTAL=N


#

#  Processor type and features

#

# CONFIG_M3 8 6 is not set

# CONFIG_M486 is not set

# CONFIG_M586 is not set

# CONFIG_M586TSC is not set

CONFIG_M686=y

CONFIG_X86_WP_WORKS_OK=y

CONFIG_X86_INVLPG=y

CONFIG_X86_BSWAP=y

CONFIG_X86_POPAD_OK=y

CONFIG_X86_TSC=y

CONFIG_X86_GOOD_APIC=y

CONFIG_1GB=y

# CONFIG_2GB is not set

# CONFIG_MATH_EMULATION is not set

CONFIG_MTRR=y

# CONFIG_SMP is not set


#

# Loadable module support

#

# CONFIGMODULES is not set


#

# General setup

#

# CONFIG_BIGMEM is not set

CONFIG_NET=y

CONFIG_PCI=y

# CONFIG_PCI_GOBIOS is not set

# CONFIG_PCI_GODIRECT is not set

CONFIG_PCI_GOANY=y

CONFIG_PCI_BIOS=y

CONFIG_PCI_DIRECT=y

# CONFIG_PCI_QUIRKS is not set

CONFIG_PCI_OLD_PROC=y

# CONFIG_MCA is not set

# CONFIG_VISWS is not set

CONFIG_SYSVIPC=y

CONFIG_BSD_PROCESS_ACCT=y

CONFIG_SYSCTL=y

CONFIG_BINFMT_AOUT=y

CONFIG_BINFMT_ELF=y

# CONFIG_BINFMT_MISC is not set

# CONFIG_BINFMT_JAVA is not set

CONFIG_PARPORT=y

# CONFIG_PARPORT_PC is not set

# CONFIG_APM is not set

# CONFIG_TOSHIBA is not set


#

#  Plug and Play support

#

#  CONFIG_PNP is not set


#

#  Block devices

#

CONFIG_BLK_DEV_FD=y

# CONFIG_BLK_DEV_IDE is not set

# CONFIG_BLK_DEV_HD_ONLY is not set

CONFIG_BLK_DEV_LOOP=y

CONFIG_BLK_DEV_NBD=y

CONFIG_BLK_DEV_MD=y

# CONFIG_AUTODETECT_RAID is not set

# CONFIG_MD_LINEAR is not set

# CONFIG_MD_STRIPED is not set

# CONFIG_MD_MIRRORING is not set

# CONFIG_MD_RAID5 is not set

# CONFIG_MD_TRANSLUCENT is not set

# CONFIG_MD_HSM is not set

CONFIG_BLK_DEV_RAM=y 

CONFIG_BLK_DEV_RAM_SIZE=4096

# CONFIG_BLK_DEV_INITRD is not set

# CONFIG_BLK_DEV_XD is not set

# CONFIG_BLK_DEV_DAC960 is not set

CONFIG_PARIDE_PARPORT=y

# CONFIG_PARIDE is not set

# CONFIG_BLK_DEV_IDE_MODES is not set

# CONFIG_BLK_CPQ_DA is not set

# CONFIG_BLK_CPQ_CISS_DA is not set

# CONFIG_BLK_DEV_HD is not set


#

# Networking options

#

CONFIG_PACKET=y 

CONFIG_NETLINK=y 

CONFIG_RTNETLINK=y 

CONFIG_NETLINK_DEV=y 

CONFIG_FIREWALL=y 

CONFIG_FILTER=y 

CONFIG_UNIX=y 

CONFIG_INET=y 

CONFIG_IP_MULTICAST=y 

CONFIG_IP_ADVANCED_ROUTER=y 

CONFIG_RTNETLINK=y 

CONFIG_NETLINK=y

# CONFIG_IP_MULTIPLE_TABLES is not set

# CONFIG_IP_ROUTE_MULTIPATH is not set

# CONFIG_IP_ROUTE_TOS is not set