| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Пришло время поговорить о сборке ядра еще раз. Первый раз я писал об этом в "CodePump #1", но времена меняются, и выходят все новые и новые версии данной ОС. Естественно, что меняется и ядро "FreeBSD". Данная статья описывает пересборку ядра для "FreeBSD 5.3", т.к. на данный момент у меня именно такая система. Было проведено множество экспериментов и выбрано то, что делать нужно. Поехали (с)
1. Способы сборки ядра и окружения
2. Конфигурация системы
3. Процесс сборки
4. Если..
5. "loader.conf"
1. Способы сборки ядра и окружения
1.1 Используем старый способ
Этот способ не рекомендую не только я, но и сами разработчики. Однако, если вам не важно, что у вас будет "крутится", и как оно будет это делать, то это способ для вас.
1) Запустите утилиту "config" и передайте в качестве параметра имя вашего ядра. Например:
# config KERNEL
Это создаст исходный код ядра.
2) Перейдите в каталог, где собирается ядро - обычно это "/usr/src/sys/i386/"
# cd /usr/src/sys/i386/
3) Собираем ядро командой "make", т.е.
# make depend
# make
Если все правильно, то необходимо установить ядро
4) делаем:
# make install
1.2 Новый способ сборки
Рекомендуемый отныне способ сборки
1) переходим в каталог "/usr/src"
# cd /usr/src
2) Собираем ядро с помощью "make" и указываем, что это ядро, и указываем его имя.
# make buildkernel KERNCONF=KERNEL
!вместо KERNEL необходимо указать имя вашего файла ядра
3) Запускаем процесс установки ядра
# make installkernel KERNCONF=KERNEL
После всех манипуляций вы получите новое ядро и модули в "/boot/kernel" и старое в "/boot/kernel.old".
2. Конфигурация системы
Рассмотрим необходимые действия для создания конфига ядра и окружения. В первую очередь это файл "/etc/make.conf". Если файл не существует в "/etc", то просто скопируйте его туда из "/usr/src/share/examples/etc/make.conf"
2.1 изменения в "make.conf"
Файл "make.conf" позволяет системе наиболее точно определять параметры для сборки не только ядра, но и любых программ.
Открываем файл на запись и раскомментируем такие параметры:
CPUTYPE - для определения архитектуры вашей машины.
может быть:
-----
Intel x86 architecture:
(AMD CPUs) athlon-mp athlon-xp athlon-4 athlon-tbird athlon k6-3 k6-2 k6 k5
(Intel CPUs) p4 p3 p2 i686 i586/mmx i586 i486 i386
Alpha/AXP architecture: ev67 ev6 pca56 ev56 ev5 ev45 ev4
Intel ia64 architecture: itanium
-----
пример:
CPUTYPE?=p4
Затем необходимо установить параметр KERNEL, т.е. вписать туда имя вашего (будущего) ядра.
пр. KERNEL=MIRACLE
Прошу учитывать, что в "make.conf" можно изменить много параметров, но я затрагиваю лишь основные.
NO_FORTRAN=true --таким образом, отменим сборку библиотек для фортрана (они вам нужны?)
NO_I4B=true --уверен, что вам не нужен "isdn4bsd"
NO_KERBEROS=true --если вы не являетесь человеком, помешанным на безопасности, то "Kerberos 5" вам так же не нужен
NO_LPR=true --и это нам не нужно
NO_SHAREDOCS=true --документация это хорошо, но мы уж как-нибудь ручками ее поставим
NOGAMES=true -- ='(
NOINET6=true --IP 6 версии вам пока не пригодится, в ближайшие года 3 точно
NOINFO=true --опять же, информация это очень хорошо, но зачем нам лишнее?
NOPROFILE=true --и это нам незачем
NO_BIND=true --скорее всего "BIND" вам не нужен
COMPAT4X=yes --это обязательно, совместимость с 4 веткой
Если у вас установлен "perl", то, скорее всего, в конце файла вы найдете нечто вроде этого:
PERL_VER=5.8.5
PERL_VERSION=5.8.5
PERL_ARCH=mach
NOPERL=yo
NO_PERL=yo
NO_PERL_WRAPPER=yo
не обращайте на это внимание, "perl" плохого не сделает =))
Допишите в файл такую строку:
CUPS_OVERWRITE_BASE=yes
2.2 изменения в "sysctl.conf"
Этот файл служит для изменения параметров окружения при загрузке. Если его нет в "/etc", то скопируйте его туда из "/usr/src/etc/".
Посмотреть все опции можно командой "sysctl" с параметром "-a":
# sysctl -a
Я советую сразу вписать в файл:
kern.coredump=0
kern.nodump_coredump=1
что, по идее, отключит создание dump-файлов. Это, конечно, если вы не разработчик чего-то, что падает в корку =)
kern.maxfiles=1024 --позволяет вам изменять максимальное количество открытых дескрипторов файлов. Данный параметр зависит от параметра "MAXUSERS" в конфиге ядра, который зависит от количества оперативной памяти и вашего желания.
Так же, стоит вписать в файл
hw.snd.pcm0.vchans=5
hw.snd.maxautovchans=5
что создаст 5 каналов для аудио
остальные параметры сейчас разбирать не буду, т.к. пишу отдельную статью на эту тему, но не успеваю к этому номеру.
2.3. изменения в конфиге ядра
Для начала конфигурирования ядра вашей системы я советую выполнить "dmesg", что покажет вам все устройства, которые система смогла найти.
# dmesg
Исходя из этих данных, начинаем создание файла конфигурации ядра.
Файл, созданный разработчиками, находится по адресу "/usr/src/sys/i386/conf/GENERIC". Желательно скопировать его в файл с другим названием и править уже последний. Выглядеть все должно примерно так:
# cd /usr/src/sys/i386/conf/
# cat GENERIC > KERNEL
# ee KERNEL
Теперь о параметрах. Первое, что вы должны изменить это архитектуру машины:
machine i386
может быть: alpha, amd64, i386, ia64, pc98, powerpc, sparc64 для соответствующих архитектур.
Затем параметр типа процессора:
cpu I486_CPU
cpu I586_CPU
cpu I686_CPU
Желательно оставить только 1 параметр, но если вы не уверены, что делаете, то оставьте все.
Теперь правим метку ядра, нужно чтобы параметр был именем вашего ядра, т.е. носил имя вашего файла конфигурации ядра. В нашем примере это "KERNEL".
ident KERNEL
Теперь подробнее о "maxusers". Этот параметр влияет на многие параметры системы, необходимо задать его таким, сколько пользователей одновременно (!) будут использовать ОС + чуть больше.
maxusers 25
Максимальное количество одновременно запущенных процессов будет высчитываться по формуле:
20 + 16 * maxusers
так что смотрите внимательно.
! Важно, что параметр влияет только на конфигурационные таблицы, а не на количество пользователей.
Обязательным параметром является npx, что позволяет использовать аппаратную и программную мощь для операций с плавающей точкой.
! Не отключайте параметр
device npx
Файл для настройки драйверов устройств должен быть в "/boot/device.hints". При задании "hints" вы "вкомпилируете" эти параметры в ядро. Я не рекомендую это делать. Закомментируйте.
# hints "GENERIC.hints"
Параметр, который увеличит ваше ядро раз так в 5-6, очень хорош для отладки. Обычно не используется, так что можно смело комментировать.
# makeoptions DEBUG=-g
Планировщик заданий стоит оставить, он может пригодиться.
options SCHED_4BSD
Так же доступен новый планировщик, но ходят слухи, что его пока не стоит использовать, но если очень хочется, то вместо "SCHED_4BSD" надо ввести "SCHED_ULE".
Еще одна обязательная опция, используемая для сетевых возможностей. Оставить необходимо, хотя бы, для обратной связи.
options INET
А вот смело убрать можно поддержку 6 версии IP:
# options INET6
Скорее всего, вы загружаетесь с жесткого диска, тогда оставьте "Berkeley Fast Filesystem"
options FFS
Для более высокой скорости записи на диски включите:
options SOFTUPDATES
И еще одна необходимая опция:
options UFS_ACL
вот что обещают разработчики системы, если вы ее отключите:
"ACL включены по умолчанию, и не должны выключаться в случае если они ранее использовались на файловой системе, так как это удалит списки управления доступом и изменит то, как защищены файлы, непредсказуемым образом".
Не выключайте =)
Вы можете увеличить скорость дисковых операций взамен лишней памяти (а такая бывает? =)
options UFS_DIRHASH
Поддержка использования дисков в памяти для корневой ФС:
options MD_ROOT
Если вы работаете в сети и подключаете сетевые диски BSD, то включите, я же не использую это дома, поэтому закомментировал
#options NFSCLIENT
#options NFSSERVER
#options NFS_ROOT
Для других ФС есть другие параметры. Для MS-DOS это:
options MSDOSFS
а для CD-ROM это:
options CD9660
Для всего этого есть модули (речь о модулях пойдет ниже)
options PROCFS
options PSEUDOFS
обеспечивают вам работу виртуальной ФС. Она необходима для многих программ, например для "ps" - для вывода большей информации.
Если у вас очень большое количество разделов на диске, то нужно использовать:
#options GEOM_GPT
у меня нет, поэтому отключил
Совместимость с 4.3BSD:
options COMPAT_43
Слово разработчикам: "Не выключайте эту опцию; некоторые приложения будут вести себя странно, если этой опции не будет в ядре".
Для всех "старых" платформ (i386, Alpha) следует использовать совместимость с FreeBSD4.X, т.е.
options COMPAT_FREEBSD4
Для полной идентификации SCSI-устройств ядру следует приостановиться на некоторое время, вы можете указать это время:
options SCSI_DELAY=15000
(15 сек)
Поддержка трассировки процессов:
#options KTRACE
Поддержка разделяемой памяти System V, используется многими приложениями. Поддержка семафоров System V и поддержка сообщений System V используются не часто, но отключать не рекомендую.
options SYSVSHM
options SYSVSEM
options SYSVMSG
Расширения реального времени:
options _KPOSIX_PRIORITY_SCHEDULING
Создание устройства клавиатуры в "/dev":
options KBD_INSTALL_CDEV
Распечатка регистров для более легкой отладки:
options AHC_REG_PRETTY_PRINT
options AHD_REG_PRETTY_PRIN
Включение "Giant" в число адаптивных. Giant - система защиты для ядра.
options ADAPTIVE_GIANT
В ядре можно сконфигурировать размер файла введенных команд
options SC_HISTORY_SIZE=1024
Что отличает профессионала от новичка? Конечно же, цвет консоли (шутка).
Поменять цвет вашей консоли можно таким хитрым способом:
options SC_PIXEL_MODE
options SC_NORM_ATTR="(FG_GREEN|BG_BLACK)"
options SC_NORM_REV_ATTR="(FG_YELLOW|BG_GREEN)"
options SC_KERNEL_CONS_REV_ATTR="(FG_BLACK|BG_RED)"
options SC_KERNEL_CONS_ATTR="(FG_RED|BG_BLACK)"
Распределение прерываний набором I/O APIC. Желательно не отключать.
device apic
device isa
должно присутствовать в любой системе, т.е. обязательно. Включает определение isa-устройств.
Определение устройств eisa:
device eisa
Автоопределение карт PCI + интерфейс PCI->ISA
device pci
если у вас есть AGP-карта в системе, то включите:
device agp
Контроллер флоппи-дисков:
#device fdc
Поддержка устройств типа ATA и ATAPI.
device ata
поддержка дисков ATA:
device atadisk
поддержка ATA RAID дисков:
#device ataraid
поддержка ATAPI CD-ROM:
device atapicd
поддержка флоппи ATAPI:
#device atapifd
поддержка ATAPI-стримеров:
device atapist
статическая нумеровка устройств:
options ATA_STATIC_ID
Далее идут списки устройств, вам необходимо оставить те, которые у вас есть.
Например, есть PS/2 мышь, значит оставляем:
device psm
и нет "3ware ATA RAID", значит:
#device twe
Заставка при загрузке
device splash
так же это устройство требуется для некоторых скринсейверов.
Обязательно раскомментируйте:
device sc
это драйвер консоли.
Для поддержки "Advanced Power Management" раскомментируйте
#device apm
Таймер для "APM" и "ACPI":
#device pmtimer
! Внимание: нельзя одновременно использовать и APM, и ACPI!
Поддержка "PCMCIA" (для ноутбуков)
device cbb
device pccard
device cardbus
Будьте внимательны при выборе своей сетевой карты, многие из них требуют включенного:
device miibus
и включенного:
device ether
Устройство системной памяти:
device mem
device bpf
приведу слова разработчиков:
"Фильтр пакетов Berkeley. Это псевдоустройство позволяет переводить сетевые интерфейсы в "неразборчивый" (promiscuous) режим, в котором перехватывается любой пакет в широковещательной сети (например, ethernet). Эти пакеты могут быть сохранены на диск и/или исследованы при помощи tcpdump".
Будьте внимательны при конфигурировании.
3. Процесс сборки
Если вы "пересобираете" ядро первый раз, то я советую не выполнять действия, приведенные в пунктах 1.1 и 1.2, а использовать вот такой метод:
1) cd /usr/src/
2) make buildworld
3) make buildkernel KERNCONF=KERNEL
4) make installkernel KERNCONF=KERNEL
5) reboot
6) mergemaster -p
7) make installworld
8) mergemaster
9) reboot
Перед этим очень важно сделать копию вашего ядра. Поймите, это очень важно. Так что скопируйте директорию "/boot/kernel" в "/boot/kernel.work". Не вздумайте копировать в "/boot/kernel.old", т.к. система автоматически запишет туда ваше ядро до пересборки. Делать копию необходимо, т.к. при двух неудачных сборках вы будете иметь 2 неработающих ядра.
4. Если...
что-то у вас не получается. Разберем, что может не получиться.
1) Команда "config" выдает ошибки.
Значит, что нарушен синтаксис конфигурационного файла ядра. Посмотрите внимательно на то место, на которое указывает "config" =)
2) Ошибки при "make".
Скорее всего, это значит, что вы написали что-то не то в файле конфигурации ядра, внимательно посмотрите на чем прерывается выполнение "make" и попробуйте исправить конфиг ядра.
3) Ошибки при установке (make install)
Здесь ситуация достаточно критичная - что-то не так в системе. Вспомните, что вы изменяли и попробуйте вернуть это на место.
4) Ядро не запускается.
Это очень распространено даже среди заядлых BSD-шников, хотя у них это происходит по недосмотру, а не от незнания. При загрузке системы появляется меню, из которого можно попасть в консоль загрузки. Загрузите работающую копию ядра оттуда, например вот так:
boot /boot/kernel.work
или
boot /boot/kernel.old
! Внимание: "/boot/kernel.old" содержит предыдущее ядро до сборки, в том числе может содержать неисправное.
Для восстановления ядра в консоли можно ввести:
# chflags noschg /kernel
Так же возможна проблема с "loader.conf", если вы его правили, как это сделать мы сейчас и разберем.....
5. "loader.conf"
файл должен находится в директории "/boot/kernel/defaults/". Открываем его редактором и начинаем править.
Для подробной информации при загрузке включите
verbose_loading="NO"
т.е. должно получится verbose_loading="YES"
Время показа меню загрузки (в сек.)
autoboot_delay="5"
Хаки ядра - те же опции, которые можно вписывать в "sysctl.conf".
kern.maxfiles="1024" #максимальное кол-во открытых дескрипторов
kern.maxproc="512" #максимальное кол-во процессов
Помните опцию в ядре для определения SCSI-устройств? вот она здесь:
kern.cam.scsi_delay="2000"
Далее идут модули. Фишка в том, что вы можете грузить драйверы устройств напрямую в ядро, без компиляции. До недавнего времени это было правилом хорошего тона, но сейчас оказалось, что драйвер в модуле "съедает" памяти почти в 2 раза больше, чем в ядре. Если у вас много оперативной памяти - то выносите все в модули.
Бинарная совместимость с "Linux".
Для этого используется эмулятор "linux":
linux_load="YES"
Так же вы можете загружать свои модули, синтаксис для модуля такой:
#module_load="YES" #загрузить модуль с именем "module"
К статье я креплю архив файлов своей системы.
/files/miracle.tgz
p.s. очень надеюсь, что никто не додумается собрать ядро МОЕЙ системы на СВОЕЙ машине.
|
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |