Уменьшение ядра


Когда-то, давным-давно, память стоила очень дорого и карты памяти имели небольшую емкость. Когда в системе имелось 128 Мбайт, приходилось экономить каждый бит, поэтому было важно получить ядро как можно меньшего объема. В наши дни даже ноутбуки имеют по 2 Гбайта ОЗУ, и размер ядра перестал играть такую важную роль. Удаление ненужных драйверов из ядра перестало быть насущной необходимостью, но мы не будем замалчивать эту тему и будем учиться собирать ядро так, чтобы потом, когда появится такая необходимость, вам не пришлось бы изучать все сначала. В качестве учебного примера мы пройдем процесс уменьшения размеров ядра, но не считайте это жизненно важным или необходимым этапом.

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

Типы CPU

Для большинства архитектур FreeBSD поддерживает всего два типа микропроцессоров (CPU). В архитектуре i386 — три. Удаление ненужных типов CPU из конфигурации приведет к созданию ядра, которое полностью использует преимущества, предлагаемые имеющимся микропроцессором. Например, рассмотрим процессоры Pentium и Pentium II с поддержкой инструкций ММХ. Если эти инструкции поддерживаются микропроцессором, было бы желательно воспользоваться их преимуществами. С другой стороны, удаление из конфигурации упоминания о неиспользуемых типах CPU приведет к созданию ядра, которое будет способно работать только с одним типом CPU.

Вам необходимо оставить только тот тип CPU, который имеется в системе. Если тип CPU неизвестен, узнать его можно из файла dmesg.boot. Файл dmesg.boot на моем ноутбуке содержит следующие строки:

CPU: AMD Athlon(tm) 64 Х2 Dual Core Processor 4200+ (2200.10-MHz 686-class CPU)   Origin = "AuthenticAMD" Id = 0x20fb1 Stepping = 1
Features=0x178bfbff<FPU,VME,DE,PSE,TSC,MSR,РАЕ,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,С MOV,PAT,PSE36,CLFLUSH,MMX,FXSR,SSE,SSE2,HTT>
...

Жирным шрифтом выделена часть строки, которая сообщает, что в системе присутствует микропроцессор 686-class CPU. Это означает, что я могу удалить инструкцию cpu, описывающую микропроцессор I486_CPU, что сделает мое ядро меньше и быстрее. В результате при компиляции ядра, вместо медленного универсального кода, будут реализованы оптимизации, характерные для процессора 686-class. (Кроме того, это 64-битовый 1386-совместимый процессор, который позволяет запускать версии FreeBSD для архитектур i386 и amd64, как обсуждалось в главе 1. Однако в примерах мы остановимся на архитектуре i386, которой наверняка обладает большинство читателей.)

Основные параметры

Вслед за записями, определяющими выбор типа CPU, имеется целый список параметров основных служб FreeBSD, таких как TCP/IP и файловые системы. Для средней системы необязательно присутствие всех этих особенностей, но их наличие увеличивает гибкость системы. Также можно обнаружить редко используемые параметры, которые можно удалить. Здесь не обсуждаются все возможные параметры ядра, а представлены только наиболее общие из них и специфичные примеры для их различных типов. Особым образом будут отмечены те, что имеют отношение к серверу Интернета. Рассмотрим следующие «опции»:

#options      SCHED_ULE       # ULE scheduler
options       SCHED_4BSD      # 4BSD scheduler
options       PREEMPTION      # Enable kernel thread preemption

Эти параметры управляют внутренним алгоритмом планирования FreeBSD. Планирование будет обсуждаться в главе 12. Возможность вытеснения (preemption) повышает эффективность FreeBSD в многозадачном режиме.

options       INET            # InterNETworking
options       INET6           # IPv6 communications protocols

Эти параметры обеспечивают поддержку сетевых протоколов. Параметр INET обеспечивает поддержку старомодного стека протоколов TCP/IP, тогда как параметр INET6 — поддержку IPv6. Программное обеспечение UNIX-подобных систем зависит от наличия поддержки TCP/IP, поэтому параметр INET следует оставить. Версия IPv6 пока не получила широкого распространения — рано или поздно вы придете к пониманию, что ее время еще не наступило, поэтому при желании этот параметр можно удалить.

options       FFS             # Berkeley Fast Filesystem
options       SOFTUPDATES     # Enable FFS soft updates support
options       UFS_ACL         # Support for access control lists
options       UFS_DIRHASH     # Improve performance on big directories

FFS — это стандартная файловая система для FreeBSD, а остальные параметры связаны с ней. Параметр SOFTUPDATES — это метод обеспечения целостности диска даже в случае некорректного завершения системы. Списки управления доступом UFS позволяют определять весьма подробные права доступа к файлам, а параметр UFS_DIRHASH обеспечивает поддержку индексирования каталогов, что повышает скорость работы с каталогами, содержащими тысячи файлов. Более подробно параметры FFS будут рассматриваться в главе 8.

options       MD_R00T         # MD is a potential root device

Этот параметр (и все остальные параметры, оканчивающиеся на _ROOT) позволяет использовать в качестве дискового устройства для корневого раздела другие файловые системы, отличные от FFS. Инсталлятор использует в качестве корневой файловой системы устройство памяти (MD). Если вы используете бездисковые системы (глава 20), вам потребуется поддержка NFS в качестве корневого раздела. Если вы устанавливаете FreeBSD на стандартный компьютер — с жестким диском и клавиатурой, то все эти параметры вам не потребуются.

options       NFSCLIENT       # Network Filesystem Client
options       NFSSERVER       # Network Filesystem Server

Эти два параметра обеспечивают поддержку сетевой файловой системы (Network File System, NFS) (глава 8). Параметр NFSCLIENT позволит монтировать разделы, которые обслуживаются другим компьютером в сети, а параметр NFSSERVER позволит обеспечить доступ к своим разделам для других компьютеров.

options       MSD0SFS         # MSDOS filesystem
options       CD9660          # ISO 9660 filesysten
options       PROOFS          # Process filesysten (requires PSEUDOFS)
options       PSEUDOFS        # Pseudo-filesystem framework

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

options       COMPAT_43TTY    # BSD 4.3 TTY compat [KEEP THIS!]
options       COMPAT_FREEBSD4 # Compatible with FreeBSD4
options       COMPAT_FREEBSD5 # Compatible with FreeBSD5
options       COMPAT_FREEBSD6 # Compatible with FreeBSD6

Эти параметры совместимости позволяют запускать программное обеспечение, скомпилированное для устаревших версий FreeBSD, а также программное обеспечение, которое требует определенной версии ядра, что было необходимо в более ранних версиях FreeBSD. Если вы устанавливали систему с самого начала, тогда вам, возможно, не требуется совместимость с FreeBSD 4, 5 или 6, однако существует достаточно большое число программных продуктов, ориентированных на работу вереде 4.3 BSD. Оставьте параметр COMPAT_43TTY, иначе ваша система может оказаться неработоспособной.

options       SCSI_DELAY=5000 # Delay (in ms) before probing SCSI

Параметр SCSI_DELAY задает количество миллисекунд, в течение которых после обнаружения контроллеров SCSI система FreeBSD ожидает перед опрашиванием устройств SCSI, давая им время «раскрутиться» и идентифицировать себя на шине SCSI. Если в системе нет устройств SCSI, данную строку можно удалить. Если установлены древние аппаратные устройства SCSI, которые поднимаются медленно, как больной слон, то паузу можно увеличить до 15 000 (15 секунд).

options       SYSVSHM         # SYSV-style shared memory
options       SYSVMSG         # SYSV-style message queues
options       SYSVSEM         # SYSV-style semaphores

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

options       AHC_REG_PRETTY_PRINT # Print register bitfields in debug                                    # output. Adds ~128k to driver.
options       AHD_REG_PRETTY_PRINT # Print register bitfields in debug                                    # output. Adds ~215k to driver.

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

Более одного процессора

Следующие две записи активируют симметричную многопроцессорную обработку (Symmetric Multiprocessing, SMP) в ядрах, предназначенных для работы в архитектуре i386:

options       SMP             # Symmetric MultiProcessor Kernel
device        apic            # I/O APIC

Параметр SMP предписывает ядру производить планирование работы процессов на нескольких CPU, а параметр apic обеспечивает поддержку ввода/вывода для ядер SMP. Реализация i386 SMP в системе FreeBSD поддерживает только те многопроцессорные системы, которые отвечают спецификации SMP компании Intel и куда не входят 386 или 486 SMP-системы. (Для других платформ, таких как sparc64, имеются свои собственные стандарты, поэтому для них реализация SMP выполнена на очень высоком уровне.) Система FreeBSD поддерживает многопроцессорные системы, построенные только на базе процессоров Pentium и выше. В более старых версиях FreeBSD ядра с поддержкой SMP плохо или вообще не загружались на однопроцессорных системах — непроизводительные затраты на управление данными для нескольких процессоров создавали дополнительные задержки в системе. С течением времени эта проблема была ликвидирована и теперь FreeBSD распространяется с поддержкой SMP, включенной по умолчанию.

Драйверы устройств

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

Первые записи — это шины, например device pci и device eisa. Убирать их следует лишь в том случае, если в системе действительно нет таких шин. Велико количество систем «без поддержки традиционных устройств» (legacy-free), в которых шина ISA скрыта где-то внутри.

Далее следует то, что большинством рассматриваются как драйверы устройств, — записи для накопителей на гибких магнитных дисках, контроллеров SCSI, контроллеров RAID и т. д. Если ваша цель уменьшить размер ядра, то данный раздел — хорошее место для решительного сокращения. Удалите все драйверы устройств, которые отсутствуют в компьютере. Здесь вы также найдете раздел драйверов устройств для клавиатур, видеокарт, портов PS/2 и т. д. Эти записи едва ли стоит удалять.

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

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

Псевдоустройства

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

device        loop            # Network loopback

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

device        random          # Entropy device

Это устройство обеспечивает генерацию псевдослучайных чисел, необходимых в операциях шифрования и таких важных программах, как игры. FreeBSD обеспечивает поддержку разнообразных источников случайных чисел, и все они объединяются в виде устройств псевдослучайных чисел /dev/random и /dev/urandom.

device        ether           # Ethernet support

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

device        sl              # Kernel SLIP
device        ppp             # Kernel PPP

Псевдоустройство sl предназначено для поддержки межсетевого протокола для последовательного канала (Serial Line Internet Protocol, SLIP), а устройство ppp поддерживает протокол «точка-точка» (Point to Point Protocol, PPP) на уровне ядра. Оба они давно устарели и не требуются для поддержки РРР в пространстве пользователя, если, конечно, у вас нет особых требований.

device        tun             # Packet tunnel

Псевдоустройство tun — это логический пакетный канал (logical packet tunnel). Используется различными программами для обмена пакетами с ядром. Такое псевдоустройство необходимо для поддержки РРР средствами, не входящими в ядро (userland PPP), — обычными коммутируемыми соединениями.

device        pty             # Pseudo-ttys (telnet etc)

Псевдоустройство pty — это псевдотерминал. Когда вы подключаетесь к системе по протоколам telnet или SSH (глава 15), FreeBSD должна иметь возможность отслеживать терминальные сеансы, выводить символы на экран и читать ввод с клавиатуры. Система обслуживает удаленное соединение как обычный физический монитор и клавиатуру. Псевдотерминал — это псевдоустройство, напоминающее терминал, связанное с соединением.

device        md              # Memory "disks"

Псевдоустройство md позволяет хранить файлы в памяти. Это очень удобно для организации очень быстрых хранилищ временных данных, но об этом мы поговорим в главе 8. Для большинства (но не для всех) серверов Интернета диски в памяти — это просто непродуктивное растрачивание оперативной памяти. Кроме того, диски в памяти могут использоваться для монтирования и доступа к образам дисков. Если вы не используете диски в памяти, этот параметр можно удалить из ядра.

Отключаемые устройства

Наконец, после псевдоустройств в конфигурационном файле GENERIC можно найти поддержку FireWire и устройств USB. Эти функциональные возможности всегда оформляются в виде модулей, так как представляют устройства, которые могут присутствовать, а могут и не присутствовать в системе.

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