FreeBSD - компилируем ядро
Компиляция "своего" ядра системы необходимый шаг. Скорость загрузки, малый размер ускоряют работу сервера (утверждение не проверено но знаю что это правда). Мне в работе пока что не надо но подготовлюсь :)что найду на эту тему закину сюда.
- Войдите на сайт для отправки комментариев
Тюнингую ядро почтового сервака
Возникла проблема. Создал конфиг нового ядра. На самом деле просто убрал неиспользуемые типы процессора и сетевые карты и SCSI контроллеры.
после компиляции и успешной перезагрузки
site# uname -a
FreeBSD site.ubcua.tv 7.0-RELEASE-p4 FreeBSD 7.0-RELEASE-p4 #0: Sun Sep 28 22:50:33 EEST 2008
после чего ни один порт не грузится - говорит что нету ветки 7.0-RELEASE-p4
откатил к прошлому ядру
%uname -a
FreeBSD site.ubcua.tv 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Sun Feb 24 19:59:52 UTC 2008
Цитата
Во FreeBSD обнаружены три новые уязвимости:
# "amd64 swapgs local privilege escalation " - локальный злоумышленник может выполнить код в системе с привилегиями ядра (root), изменив состояние стека пользовательского приложения и инициировав GPF (General Protection Fault) в момент передачи управления приложению, после обработки ядром прерывания, trap или системного вызова. Уязвимости подвержена только amd64 сборка всех поддерживаемых версий FreeBSD. Проблема устранена в 7.0-RELEASE-p4 и 6.3-RELEASE-p4.
# "nmount(2) local arbitrary code execution" - возможность выполнения кода локального злоумышленника в контексте ядра, в случае когда непривилегированным пользователям предоставлена возможность монтирования файловых систем. Уязвимость вызвана ошибкой в системном вызове nmount, передающем пользовательские данные ядру без надлежащей проверки границ. Проблеме подвержена только ветка FreeBSD 7, исправление внесено в 7.0-RELEASE-p4. В качестве временного решения можно запретить операции монтирования пользователям: "sysctl vfs.usermount=0".
# "Remote kernel panics on IPv6 connections " - удаленный злоумышленник может вызвать крах ядра (kernel panic), отправив по сети специальным образом модифицированный IPv6 (ICMPv6) пакет. Обязательным условием проявления уязвимости является необходимость наличия в системе IPv6 TCP сокетов, принимающих внешние соединения. Уязвимости подвержены все поддерживаемых версий FreeBSD, проблема устранена в 7.0-RELEASE-p4 и 6.3-RELEASE-p4.
очень подробно
Сборка ядра и возможные проблемы при сборке.
Автор: lissyara.
А зачем вообще нужно собирать собственное ядро? Со стандартным ядром - GENERIC работает большинство железяк, все программы. Но - в GENERIC нет поддержки файрволла, оно неоптимизированно для Ваших нужд... Да и железок лишних там слишком много, зачем вам секция касающаяся SCSI контроллеров если у Вас их нет? А почти два десятка моделей сетевых плат, когда у на серваке стоят всего две-три, да ещё и одной модели? Куча разных процессоров - от i386 до P-IV и AMD K7 - реально-то стоит только один проц. Ещё ядро надо пересобирать при обнаружении новых уязвимостей. Происходит это не так часто, но ошибаются все. В том числе и те, кто делают FreeBSD.
Да, конечно, не исключена возможность, что сгорит мама и придётся хард переставлять на другую машину - тогда будут проблемы - если старая машина была P-III и из ядра были выкинуты все другие процессоры, то на другой маме - например под K7 фря может даже не загрузиться, не говоря уже о нормальной работе. Да и если возникнет необходимость заменить, например сетевуху, на другую модель - придётся пересобирать ядро. Но - ядро на современных машинах пересобирается минут 5, максимум 7. Да и прибавка к быстродействию машины стоит того, чтобы один раз заморочиться и оптимизировать ядро.
Итак. Для пересборки ядра у Вас должны быть установлены его исходные тексты. Проверяем:
Если наблюдаем такую картину, то всё есть. Если в папке /usr/src ничего нет - надо их доставить с установочного диска. Делаем это таким образом:
Теперь, когда исходные кодя ядра установлены, приступаем с правке файла конфигурации ядра.
Если у Вашей машины конфигурация i386 - а это 80386, 80486, 80586 (первые пни), P-II, P-III, P-IV, AMD K5, AMD K6, AMD K6-II, AMD K6-III, AMD K7 (Duron, Athlon, Sempron) то делаете то же что и я. Если архитектура отличается - тогда в директории /usr/src/sys/ ищете архитектуру, которая у Вас и делаете там похожие действия :) Архитектуру можно посмотреть, после загрузки таким макаром:
Подробней про архитектуры можно узнать на www.freebsd.org или в файле /etc/defaults/make.conf. К нему, кстати, мы ещё вернёмся. Наверное, возник вопрос, зачем я так извращённо копировал файл GENERIC - чтобы не забыть дату когда я его делал. Вот мой файл конфигурации ядра:
Я его специально выложил в таком непотребном виде, просто закомментировав ненужные строки - чтобы было наглядно видно, что я убрал, а что оставил. Также были добавлены несколько строк непосредственно мною - для поддержки IPFW и ipforward.
По окончании инсталляции заглянем в /
Ядро стало меньше почти втрое. Перезагружаемся командой shutdown -r now, и проверяем всё ли работает нормально. У меня всё прекрасно подцепилось не считая ругани отдельных приложений на пропавший протокол IPv6 - на эту тему надо копать их конфиги, или просто забить (но это неверный метод!).
Теперь рассмотрим вариант, что у вас что-то неполучилось. В простых случаях, например, не работает сеть - надо просто изменить конфиг и пересобрать ядро. Для этого можно и локально поработать недолго :) В более сложном варианте - фря не грузится вообще - такое вполне возможно, если Вы на горячую руку ампутировали что-то нужное - например подержку SCSI-контроллера на котором висят винты, или вообще ампутировали файловую систему из ядра :) Бывает и такое. Тоже не надо терять голову, проблема решается сравнительно просто - надо загрузиться со старым ядром и заново пересобрать новое. На моменте загрузки, когда идёт 10-секундный обратный отсчёт времени (у меня, кстати, 2-х секундный :)) надо сделать то, что он просит - нажать любую клавищу, кроме [Enter], я, например, жму 'Esc':
Как итог мы получаем приглашение загрузчика. Советую ознакомится со списком команд - их совсем мало, и времени это немного займёт. Теперь, выгружаем новое ядро из памяти, загружаем туда GENERIC (или Ваше старое ядро, если на машине какой-то нестандартный набор железа), и загружаем ОС:
После загрузки собираем новое ядро и снова пробуем.
Спасибо за
Спасибо за подробно "разжеванный" мануал, давно искал такой
Для себя делал.
Для себя делал. Пользуйтесь
www.vinnitsa.com
1. Зачем нужно перегенерировать ядро (kernel)?
При инсталяции FreeBSD у вас появится в системе ядро, которое вполне работоспособно. Зачем его переделывать?
Дело в том, что это ядро (так называемая GENERIC конфигурация) как раз предназначена для того, чтобы система успешно развернулась на "железе" любой конфигурации (из поддерживаемых, конечно).
В эту конфигурацию встроена поддержка ВСЕХ типов накопителей (HDD и CD) и ВСЕХ сетевых карт, которые на данный момент поддерживаются FreeBSD. Это вполне логично - вы должны иметь возможность поставить свой Unix и дополнительные программы на тот HDD, который имеется у вас в машине и суметь войти в сеть, какой бы сетевой карточкой вы ни пользовались.
В то же время, в ядро не включены некоторые полезные модули, которые могут вам понадобится в дальнейшем, особенно, если вы хотите использовать вашу машину в качестве сервера. (Например - поддержка firewall, PPP-сервера, bpf и т.п.).
Итак. Перегенерировать ядро стоит для того чтобы -
- убрать все лишнее (драйверы устройств, которых у вас нет);
- добавить то, чего не хватает.
Первое позволит вам ускорить загрузку (так как система не будет тратить время на поиск и тестирование несуществующих в вашей машине устройств) и сэкономить место в ОЗУ, занимаемое ядром.
Ну, а без второго, скорее всего, вы не сможете решить свои задачи :). 2. Как перегенерировать ядро системы?
В общем виде этот процесс выглядит так:
- развернуть исходники ядра (я обычно заказываю их в процессе инсталяции, но если вы этого не сделали, то можно добавить их "вручную");
- составить свою конфигурацию (конфигурационный файл);
- запустить программу config, которая создаст необходимые файлы *.h и *.c в соответствии с вашей конфигурацией;
- скомпилировать новое ядро с помощью программы make;
- установить новое ядро на место;
- перезагрузиться. Теперь более подробно.
2.1 Разворачивание исходников.
Прежде всего посмотрите в директорию
/usr/src/sys
если она не пустая, то все что вам нужно уже на месте. И вы можете спокойно перейти к следующему пункту.
В противном случае, вам надо взять из дистрибутива нужные файлы и установить их.
Не забудьте, что вам в данном случае необходима только та их часть, которая называется sys.
2.2 Составление конфигурационного файла.
Перейдите в директорию /usr/src/sys/i386/conf.
Здесь имеются два конфигурационных файла GENERIC и LINT. Первый представляет собой конфигурацию того ядра, которое установилось у вас при инсталяции системы. Вы можете посмотреть там - что в данный момент может ваше ядро.
Второй же файл представляет собой скорее описание всех возможных элементов конфигурационного файла, чем реальную конфигурацию. Если вы попытаетесь построить ядро в такой конфигурации, оно, скорее всего даже не будет работать. Во всяком случае, памяти "отожрет" по максимуму :).
Вам необходимо составить свой файл. Его название значения не имеет. Можете назвать его MyConfig или MyComputer. Я обычно даю ему то же название, что и доменное имя машины.
В качестве основы для нового файла вы можете использовать один из уже имеющихся файлов - GENERIC или LINT.
Если вы возьмете за основу GENERIC, то вам придется убрать оттуда описания всех лишних устройств и дописать необходимые вам options.
Если же вы возьмете за основу LINT, то все редактирование будет заключаться в удалении всего ненужного. Однако, это может оказаться весьма утомительным занятием.
Итак. Скопируйте один из имеющихся конфигов
cp GENERIC MyConfig
или
cp LINT MyConfig
И подправьте его любым текстовым редактором.
Hint: Если вы не успели еще поставить никакого текстового редактора "с человеческим лицом", можно использовать редактор ee, который у вас наверняка уже стоит. Он довольно простой, но вполне полноценный экранный редактор.
Как я уже сказал, основным "мануалом" по составлению новой конфигурации служит файл LINT. Причем, там должны быть описаны самые "свежие" options, которые появились в той версии, которую вы ставите, и еще не описаны в других "мануалах". (К сожалению, "должны быть" и "есть" - не одно и то же.)
2.3 Подготовка к генерированию
После того, как вы закончили редактировать свою конфигурацию (пусть она называется MyConfig, например), наберите команду
config MyConfig
Она создаст в директории /usr/src/sys директорию compile/MyConfig (о чем и сообщит вам в конце своей работы) и поместит туда файлы, необходимые для компиляции ядра.
2.4 Трансляция (собственно само генерирование) ядра
Перейдите в директорию /usr/src/sys/compile/MyConfig и наберите команду
make
она сделает все что нужно.
Учтите, что kernel - достаточно сложная программа, поэтому ее компиляция потребует довольно много времени. От 15-20 минут на Pentium'е до часа, на 386 процессоре.
Если в процессе компиляции обнаружатся фатальные ошибки, придется пересмотреть свой конфиг, исправить его и повторить пункты 2.3 - 2.4.
(У меня такие случаи были, когда я попросил некоторые опции, возможные только для Pentium, забыв указать в начале файла, что хочу поддержку процессора i586)
2.5-2.6 Установка нового ядра и Перезагрузка
После того, как компиляция ядра успешно завершилась наберите комманду
make install
она переименует старое ядро в kernel.old и поместит в корневую директорию ваш новый kernel.
После этого можно (и нужно) перегрузить компьютер.
Если загрузка нового ядра не получилась (такое тоже возможно), вы можете загрузится со старым ядром. Для этого, в начале загрузки на подсказку Boot: надо быстро сказать kernel.old.
Естественно, после этого надо снова вернуться к редактированию вашей конфигурации и повторить все последующие пункты.
Только не торопитесь. Если новое ядро опять окажется неработоспособным, вы можете попасть в неприятную ситуацию, так как после очередного "make install" -
kernel.old - предыдущая неработающая версия kernel
kernel - новая, столь же бесполезная.
Конечно, если вы не пожалели места на диске, у вас должен был остаться в корневой директории файл kernel.GENERIC и вы можете всегда загрузить его. Однако, в остальных случаях он не нужен, поэтому я, например, его обычно удаляю.
А чтобы при этом не попасть в вышеописаную ситуацию, можно переименовать пока еще работающий kernel.old в kernel.work или kernel.original и продолжать свои эксперименты. Во всяком случае, у вас всегда останется по крайней мере один "загружабельный" вариант ядра.
Важное замечание по поводу драйверов устройств.
Если вы добавили в конфигурации ядра устройства (реальные или pseudo-device), возможно потребуется создать для них файлы-устройства в директории /dev.
Какие-то общие рекомендации по этому поводу дать трудно, поскольку это зависит от того - какие устройства вы добавляли в конфиг-файл, а их много разных.
Во всяком случае, если вы знаете какого файла (в /dev) не хватает, его можно создать с помощью программки MAKEDEV, которая лежит в той же /dev. Это даже не программа, а командный файл, в начале которого есть коментарии, в которых более-менее подробно описаны возможные аргументы (имена устройств) для MAKEDEV.
И еще, поскольку, /dev наверняка не прописана в вашем PATH, запускать ее нужно /dev/MAKEDEV ... , или, если вы находитесь в самой директории /dev, то ./MAKEDEV ...