Мое ядро FreeBSD

Сегодня мы научимся собирать ядро и мир (основные исполняемые файлы, библиотеки и тд) FreeBSD из сходных кодов. Ранее в заметке PostgreSQL: сборка из исходников и настройка под Linux мы выясняли, зачем нужно уметь собирать что-то из исходников. Основными сценариями являются оптимизация под конкретное железо и получение самого свежака прямо из ветки master. Кроме того, вы можете настроить ядро под свои конкретные нужды — выбрать шедулер, отключить IPv6, убрать поддержку лишнего железа и тд. Наконец, если вдруг вы планируете когла-нибудь стать коммитером в ядро FreeBSD, знания о том, как это ядро собирается, будут не лишними.

Дисклеймер: Многое из написанного ниже может потерять актуальность к моменту, когда вы будете это читать. Прежде, чем действовать по приведенной инструкции, не лишним будет сначала свериться с хэндбуком . Заметьте также, что ниже речь идет исключительно про сборку ядра и мира из исходников , а процедура бинарного обновления системы описана в заметке Памятка по обновлению ядра и мира FreeBSD .

Подготовка окружения

При написании заметки я использовал следующий установочный диск:

FreeBSD-10.2-RELEASE-amd64-disc1.iso

Лишней железки под рукой у меня не было, поэтому все эксперименты ставились на VirtualBox. Был выбран VirtualBox, а не Vagrant , так как нам понадобится доступ к монитору системы. В VirtualBox в настройках сети было создана два адаптера — один NAT и один Host Only. Первый нужен для доступа гостевой системы в интернет. Второй позволит ходить в гостевую систему с хост-системы по SSH.

После установки системы ставим пакеты git-lite, vim-lite, tree, bash, sudo, правим /usr/local/etc/sudoers, затем меняем оболочку пользователя:

sudo chsh -s / usr/ local/ bin/ bash eax

В ~/.gitconfig дописываем:


pager = less -S

Мне лично еще очень нравится иметь в системе привычный htop:

cd / usr/ posts
sudo portsnap fetch extract
cd sysutils/ htop
sudo make -DBATCH install clean

Подробности про первоначальную настройку системы и управление пакетами во FreeBSD вы найдете в заметках Использование FreeBSD на десктопе, версия 2.0 и Управление пакетами во FreeBSD при помощи утилиты pkg соответственно.

Собираем ядро

То, как будет собираться ядро FreeBSD, контролируется несколькими файлами конфигурации.

Часть настроек лежит в /etc/make.conf. Этот файл влияет на сборку портов, мира, ядра FreeBSD, и вообще любых программ на C. Здесь можно указать CPU, под который производится сборка, флаги оптимизации, и так далее. Перечень всех доступных опций можно подглядеть в /usr/share/examples/etc/make.conf и man make.conf . Пример /etc/make.conf:

# используем Clang 3.7 вместо идущего по дэфолту 3.4
CC=/usr/local/bin/clang37
CXX=/usr/local/bin/clang++37
CPP=/usr/local/bin/clang-cpp37

# оптимизируем код под используемый на машине CPU
CPUTYPE?=native

# флаги при компиляции кода на C и C++
CFLAGS+=-O2 -pipe
CXXFLAGS+=-O2 -pipe

Еще есть /etc/src.conf, который имеет немного другие настройки и затрагивает только ядро и мир. Подробности смотри в man src.conf . Пример /etc/src.conf:

CPUTYPE?=native
CFLAGS+=-O2 -pipe
COPTFLAGS+=-O2 -pipe

Наконец, также существует и файл конфигурации самого ядра. Про него будет рассказано далее.

Если при установке FreeBSD вы поставили галочку «установить все исходники», то исходники ядра и мира будут находится в каталоге /usr/src. Информацию о том, что в каком подкаталоге находится, можно найти в Developer’s Handbook и файле README .

# вместо head укажите интересующую вас ветку или тэг
cd / usr/ src && sudo svn co http:// svn.freebsd.org/ base/ head/ ./

Настройки, с которыми собирается ядро, лежат в файле:

/usr/src/sys/(архитектура)/conf/(конфиг)

Название архитектуры зависит от вашего CPU. Как правило, это либо i386, либо amd64. Конфиг ядра, идущего в системе по умолчанию, называется GENERIC. Можно скопировать его и назвать, например, MYKERNEL.

cd sys/ amd64/ conf
sudo cp GENERIC MYKERNEL

Конфиг хорошо документирован. К примеру, можно отключить поддержку IPv6 и IPSec, закомментировав две строчки:

#options INET6
#options IPSEC

Важно! В CURRENT по умолчанию включен механизм witness , предназначенный для поиска дэдлоков . Имейте в виду, что он может выводить в консоль пугающие стэктрейсы , некоторые из которых являются багами и должны быть зарепорчены в рассылку freebsd-current@, а некоторые являются вполне безобидными. Также сообщается, что механизм этот довольно тормозной, и потому вам вполне может захотеться его отключить.

Собираем ядро с нашими настройками:

cd ../ ../ ..
sudo make -j4 buildkernel KERNCONF =MYKERNEL

Перед установкой ядра делаем резервную копию текущего:

sudo cp -r / boot/ kernel/ / boot/ kernel.good

При установке нового ядра резервная копия создается автоматически, но эта копия будет затерта при следующей установке. После создания резервной копии вручную у нас под рукой всегда будет 100% рабочий GENERIC, с которого можно будет загрузиться в случае возникновения проблем.

Устанавливаем новое ядро:

sudo make installkernel KERNCONF =MYKERNEL

После установки ядро окажется в каталоге /boot/kernel, а резервная копия текущего ядра будет лежать в /boot/kernel.old.

Вместо пары шагов buildkernel и installkernel также можно было использовать команды:

sudo make -j4 kernel KERNCONF =MYKERNEL INSTKERNNAME =kernel.test
sudo nextboot -k kernel.test

Этим мы бы сказали положить ядро в /boot/kernel.test и использовать его один раз при следующей закрузке. Если все пройдет хорошо, после перезагрузки /boot/kernel.test можно будет переименовать в /boot/kernel. Этот вариант может быть удобнее, если к машине нет физического доступа.

Перезагружаемся:

sudo reboot

После загрузки системы проверяем версию ядра:

uname -a

Должны увидеть что-то вроде

FreeBSD vbox 11.0-CURRENT FreeBSD 11.0-CURRENT #0 6a8922d(master): Tue
Feb 28 13:40:05 MSK 2016 root@vbox:/usr/obj/usr/src/sys/MYKERNEL amd64

Если что-то пошло не так, при загрузке системы в меню можно выбрать загрузку с kernel.old (нажатием цифры 5). Также можно выбрать «Escape to a loader prompt» (нажатием цифры 3) и выбрать вообще любое ядро, например:

boot kernel.good

Таким образом, даже если мы вдруг запорим ядро, есть запасной парашют.

Собираем мир

Мир от FreeBSD 10 почти наверняка будет не лучшим образом работать с ядром FreeBSD 11. Поэтому не лишено смысла вместе с пересборкой ядра системы обновить сразу и мир.

Важно! Компиляция мира может занять очень много времени, особенно если в VirtualBox вы дали виртуалке только одно ядро. Если вы используете реальную машину, вам потребуется физический доступ к ней. Также от вас потребуется вручную смержить множество конфигов, подтвердить удаление множества файлов, а потом (!) переустановить все установленные пакеты и пересобрать все установленные порты. Возможно, вместо сборки нового мира, вам будет проще временно вывести машину из эксплуатации, поставить на нее новую систему, и настроить поверх все необходимое. Или воспользоваться уже упомянутым механизмом бинарного обновления. Как мне кажется, пересборка мира — процедура больше для разработчиков FreeBSD, чем администраторов боевых серверов.

Итак, переходим в каталог с исходниками:

cd / usr/ src

Чистим временные файлы, которые могли остаться с предыдущей сборки:

sudo rm -rf / usr/ obj

Собираем мир:

sudo make -j4 buildworld

Чтобы минимизировать риски, связанные с обновлением уже запущенных и работающих приложений, рекомендуется перевести ОС в однопользовательский режим:

# в окне VirtualBox или стоя рядом с сервером
sudo shutdown now

Теперь монтируем файловую систему (у меня ZFS):

zfs set readonly =off zroot
zfs mount -a

Если вы используете UFS, тогда.

дМС УВПТЛЙ СДТБ ОЕПВИПДЙНП ОБМЙЮЙЕ ЧУЕИ ЙУИПДОЩИ ЖБКМПЧ FreeBSD.

чП-РЕТЧЩИ, ДБЧБКФЕ УДЕМБЕН ЛТБФЛЙК ПВЪПТ ЛБФБМПЗБ, Ч ЛПФПТПН ВХДЕФ РТПЙУИПДЙФШ УВПТЛБ СДТБ. чУЕ ЛБФБМПЗЙ, ЛПФПТЩЕ ВХДХФ ХРПНЙОБФШУС, ВХДХФ ПФОПУЙФЕМШОЩНЙ РП ПФОПЫЕОЙА Л ПУОПЧОПНХ ЛБФБМПЗХ /usr/src/sys , ЛПФПТЩК ФБЛЦЕ ДПУФХРЕО ЛБЛ ЛБФБМПЗ /sys . ьФПФ ЛБФБМПЗ УПДЕТЦЙФ НОПЦЕУФЧП РПДЛБФБМПЗПЧ, РТЕДУФБЧМСАЭЙИ УПВПК ТБЪМЙЮОЩЕ ЮБУФЙ СДТБ, ОП ОБЙВПМЕЕ ЧБЦОЩН ДМС ОБУ ВХДЕФ ЛБФБМПЗ arch /conf , Ч ЛПФПТПН ЧЩ ВХДЕФЕ ТЕДБЛФЙТПЧБФШ ЛПОЖЙЗХТБГЙПООЩК ЖБКМ СДТБ Й Ч ЛПФПТПН ОБИПДЙФУС ЛБФБМПЗ compile , ЗДЕ ВХДЕФ УПВЙТБФШУС ЧБЫЕ СДТП. arch НПЦЕФ ВЩФШ i386 , amd64 , ia64 , powerpc , sparc64 ЙМЙ pc98 (БМШФЕТОБФЙЧОБС ЧЕФЧШ БРРБТБФОПЗП ПВЕУРЕЮЕОЙС, РПРХМСТОБС Ч сРПОЙЙ). чУЕ, ЮФП ОБИПДЙФУС ЧОХФТЙ ЛБФБМПЗБ ПРТЕДЕМЕООПК БТИЙФЕЛФХТЩ, ПФОПУЙФУС ФПМШЛП Л ЬФПК БТИЙФЕЛФХТЕ; ПУФБМШОПК ЛПД СЧМСЕФУС НБЫЙООП ОЕЪБЧЙУЙНЩН Й ПВЭЙН ДМС ЧУЕИ РМБФЖПТН, ОБ ЛПФПТЩЕ FreeBSD НПЦЕФ ВЩФШ РПФЕОГЙБМШОП РПТФЙТПЧБОБ. пВТБФЙФЕ ЧОЙНБОЙЕ ОБ МПЗЙЮЕУЛХА УФТХЛФХТХ ЛБФБМПЗПЧ, Ч ЛПФПТПК ЛБЦДПЕ РПДДЕТЦЙЧБЕНПЕ ХУФТПКУФЧП, ЛБЦДБС ЖБКМПЧБС УЙУФЕНБ Й ЛБЦДБС ПРГЙС ТБЪНЕЭБЕФУС Ч УЧПЈН УПВУФЧЕООПН ЛБФБМПЗЕ.

ч РТЙНЕТБИ ЬФПК ЗМБЧЩ РПДТБЪХНЕЧБЕФУС, ЮФП ЧЩ ЙУРПМШЪХЕФЕ БТИЙФЕЛФХТХ i386. еУМЙ БТИЙФЕЛФХТБ ЧБЫЕК УЙУФЕНЩ ПФМЙЮБЕФУС ПФ ЙУРПМШЪХЕНПК Ч РТЙНЕТБИ, ФП ЧБН ОЕПВИПДЙНП ВХДЕФ УППФЧЕФУФЧЕООП ЙЪНЕОЙФШ ЙНЕОБ ЛБФБМПЗПЧ.

рТЙНЕЮБОЙЕ:

еУМЙ ЛБФБМПЗ /usr/src/ ПФУХФУФЧХЕФ Ч ЧБЫЕК УЙУФЕНЕ (ЙМЙ ЬФПФ ЛБФБМПЗ РХУФ), ФП ЬФП ЪОБЮЙФ, ЮФП ЙУИПДОЩЕ ФЕЛУФЩ ОЕ ВЩМЙ ХУФБОПЧМЕОЩ. оБЙВПМЕЕ РТПУФПК УРПУПВ ХУФБОПЧЙФШ ЙИ - ЧПУРПМШЪПЧБФШУС , ЛБЛ ПРЙУБОП Ч тБЪДЕМљ21.5, > . дБМЕЕ, УПЪДБКФЕ УЙНЧПМЙЮЕУЛХА УУЩМЛХ ОБ /usr/src/sys/ :

# ln -s /usr/src/sys /sys

ъБФЕН, РЕТЕКДЙФЕ Ч ЛБФБМПЗ arch /conf Й УЛПРЙТХКФЕ ЖБКМ ЛПОЖЙЗХТБГЙЙ GENERIC Ч ЖБКМ У ЧЩВТБООЩН ЧБНЙ ЙНЕОЕН. оБРТЙНЕТ:

# cd /usr/src/sys/ i386 /conf # cp GENERIC MYKERNEL

рП ФТБДЙГЙЙ ЙНС УПУФПЙФ ЙЪ ВХЛЧ Ч ЧЕТИОЕН ТЕЗЙУФТЕ, Й ЕУМЙ ЧЩ РПДДЕТЦЙЧБЕФЕ ОЕУЛПМШЛП ЛПНРШАФЕТПЧ FreeBSD ОБ ТБЪМЙЮОПН ПВПТХДПЧБОЙЙ, ИПТПЫБС ЙДЕС ДПВБЧМСФШ ЬФП ЙНС Л ЙНЕОЙ ИПУФБ. нЩ ОБЪЧБМЙ СДТП MYKERNEL Ч ЬФПН РТЙНЕТЕ.

рПДУЛБЪЛБ:

рПНЕЭЕОЙЕ ЖБКМБ ЛПОЖЙЗХТБГЙЙ СДТБ Ч /usr/src НПЦЕФ ВЩФШ РМПИПК ЙДЕЕК. еУМЙ ЧЩ ЙУРЩФЩЧБЕФЕ РТПВМЕНЩ, ЙИ НПЦОП ТЕЫЙФШ ХДБМЙЧ /usr/src Й ОБЮБЧ ЧУЕ У ОБЮБМБ. рПУМЕ ЬФПЗП ПВЩЮОП ФТЕВХЕФУС ОЕУЛПМШЛП УЕЛХОД, ЮФПВЩ РПОСФШ, ЮФП ЧЩ ХДБМЙМЙ УПВУФЧЕООЩК ЖБКМ ОБУФТПКЛЙ СДТБ. оЕ ТЕДБЛФЙТХКФЕ ОЕРПУТЕДУФЧЕООП GENERIC , ПО НПЦЕФ ВЩФШ ФБЛЦЕ РЕТЕЪБРЙУБО Й РТЙ УМЕДХАЭЕН ПВОПЧМЕОЙЙ ДЕТЕЧБ ЙУИПДОЩИ ФЕЛУФПЧ , Й ЙЪНЕОЕОЙС СДТБ ВХДХФ РПФЕТСОЩ.

чЩ НПЦЕФЕ УПИТБОЙФШ ЖБКМ ЛПОЖЙЗХТБГЙЙ СДТБ Ч ДТХЗПН НЕУФЕ, Б ЪБФЕН УПЪДБФШ УЙНЧПМЙЮЕУЛХА УУЩМЛХ ОБ ЬФПФ ЖБКМ Ч ЛБФБМПЗЕ i386 .

оБРТЙНЕТ:

# cd /usr/src/sys/ i386 /conf # mkdir /root/kernels # cp GENERIC /root/kernels/ MYKERNEL # ln -s /root/kernels/ MYKERNEL

фЕРЕТШ ПФТЕДБЛФЙТХКФЕ ЖБКМ MYKERNEL Ч УЧПЈН МАВЙНПН ФЕЛУФПЧПН ТЕДБЛФПТЕ. еУМЙ ЧЩ ФПМШЛП ОБЮЙОБЕФЕ, ЕДЙОУФЧЕООЩН ДПУФХРОЩН ТЕДБЛФПТПН УЛПТЕЕ ЧУЕЗП ВХДЕФ vi , ЛПФПТЩК УМЙЫЛПН УМПЦЕО ДМС ФПЗП, ЮФПВЩ ПРЙУБФШ ЕЗП ЪДЕУШ, ОП Ч ВЙВМЙПЗТБЖЙЙ РЕТЕЮЙУМЕОП НОПЦЕУФЧП ЛОЙЗ, Ч ЛПФПТЩИ ЕЗП ЙУРПМШЪПЧБОЙЕ ИПТПЫП ПУЧЕЭЕОП. пДОБЛП FreeBSD РТЕДПУФБЧМСЕФ ВПМЕЕ РТПУФПК ТЕДБЛФПТ ee , ЛПФПТЩК, ЕУМЙ ЧЩ - ОПЧЙЮПЛ, РПДПКДЈФ ЧБН ВПМШЫЕ ЧУЕЗП. оЕ УФЕУОСКФЕУШ ЙЪНЕОСФШ УФТПЛЙ ЛПННЕОФБТЙЕЧ Ч ОБЮБМЕ ЖБКМБ, У ФЕН, ЮФПВЩ ПФПВТБЪЙФШ ЧБЫХ ЛПОЖЙЗХТБГЙА ЙМЙ ЙЪНЕОЕОЙС, ЛПФПТЩЕ ЧЩ УДЕМБМЙ РП УТБЧОЕОЙА У GENERIC .

еУМЙ ЧБН РТЙИПДЙМПУШ УПВЙТБФШ СДТП ДМС SunOS TM ЙМЙ ЛБЛПК-МЙВП ДТХЗПК ПРЕТБГЙПООПК УЙУФЕНЩ ФЙРБ BSD, НОПЗПЕ ЙЪ ФПЗП, ЮФП УПДЕТЦЙФУС Ч ЬФПН ЖБКМЕ ВХДЕФ ПЮЕОШ ЪОБЛПНП ЧБН. еУМЙ ЦЕ ЧЩ, ОБРТПФЙЧ, ЙУРПМШЪПЧБМЙ ДТХЗХА ПРЕТБГЙПООХА УЙУФЕНХ, ФБЛХА ЛБЛ DOS, ЖБКМ ЛПОЖЙЗХТБГЙЙ GENERIC НПЦЕФ РПЛБЪБФШУС ЧБН ЛТБКОЕ УМПЦОЩН, РПЬФПНХ УМЕДХКФЕ ЙОУФТХЛГЙСН Ч ТБЪДЕМЕ лПОЖЙЗХТБГЙПООЩК ЖБКМ НЕДМЕООП Й ЧОЙНБФЕМШОП.

оПЧПЕ СДТП ВХДЕФ УЛПРЙТПЧБОП Ч ЛБФБМПЗ /boot/kernel ЛБЛ /boot/kernel/kernel , Б УФБТПЕ СДТП ВХДЕФ РЕТЕНЕЭЕОП Ч /boot/kernel.old/kernel . фЕРЕТШ РЕТЕЪБЗТХЪЙФЕ УЙУФЕНХ ДМС ФПЗП, ЮФПВЩ ЙУРПМШЪПЧБФШ ОПЧПЕ СДТП. еУМЙ ЮФП-ФП РПКДЈФ ОЕ ФБЛ, ЧЩ НПЦЕФЕ ПВТБФЙФШУС Л ТБЪДЕМХ тЕЫЕОЙЕ РТПВМЕН Ч ЛПОГЕ ЬФПК ЗМБЧЩ, ЛПФПТЩК НПЦЕФ ПЛБЪБФШУС РПМЕЪЕО. оЕ ЪБВХДШФЕ РТПЮЙФБФШ ТБЪДЕМ, ЛПФПТЩК ПВЯСУОСЕФ ЛБЛ ЙУРТБЧЙФШ УЙФХБГЙА, ЛПЗДБ СДТП ОЕ ЪБЗТХЦБЕФУС .

рТЙНЕЮБОЙЕ:

дТХЗЙЕ ЖБКМЩ, ПФОПУСЭЙЕУС Л РТПГЕУУХ ЪБЗТХЪЛЙ, ФБЛЙЕ ЛБЛ ЪБЗТХЪЮЙЛ () Й ЕЗП ЛПОЖЙЗХТБГЙПООЩЕ ЖБКМЩ, ТБЪНЕЭБАФУС Ч /boot . нПДХМЙ УФПТПООЙИ РТПЙЪЧПДЙФЕМЕК НПЗХФ ВЩФШ РПНЕЭЕОЩ Ч /boot/kernel , ИПФС РПМШЪПЧБФЕМЙ ДПМЦОЩ ЪОБФШ, ЮФП ПЮЕОШ ЧБЦОП, ЮФПВЩ НПДХМЙ ВЩМЙ УЙОИТПОЙЪЙТПЧБОЩ У УПВТБООЩН СДТПН. нПДХМЙ, ОЕ ТБУУЮЙФБООЩЕ ОБ ТБВПФХ У УПВТБООЩН СДТПН, НПЗХФ ЧЩЪЧБФШ ОЕУФБВЙМШОПУФШ Й ОЕЛПТТЕЛФОПУФШ ТБВПФЩ.

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

src — Source for everything but encryption

и потом выбрать

sys — /usr/src/sys (FreeBSD kernel)

.
Доставить можно через /stand/sysinstall.
Считаем, что исходники ядра вы установили.
Под пользователем root идем в папку /usr/src/sys/i386/conf.
Копируем файл GENERIC, например в mykernel. Полученный файл и будем править.
Если у вас машина Pentium4, то советую сразу закоментировать строки:

cpu I386_CPU
cpu I486_CPU
cpu I586_CPU

пусть наша машина будет настроена на определенный процессор и не распыляется на всякую фигню 😉
Можно отключить не используемы устройства, что уменьшит размер ядра и соответсвенно нагрузку на процессор. Посмотреть какие у вас устройства можно коамандой dmesg, после загрузки компьютера.
Так же можно добавить устройства, которые по умолчанию не поддерживаются в ядре. Более подробно устройства описаны в файл LINT для FreeBSD ветки 4.х, и в файле NOTES для FreeBSD ветки 5.х.

После того как мы отредактировали наш файл, можно приступить к его компиляции.
Нам надо будет выполнить следующие команды:

config mykernel - конфигурим ядро
cd ../../compile/mykernel
make depend
make
make install - устанавливаем ядро

Если все прошло удачно, то все что нам надо это перезагрузиться.

P.S. Советую перед эксперементами сохранить нормальное ядро, например под именем kernel.good и тогда если не загрузилось наше новое ядро, мы вместо kernel.old указажем boot kernel.good. Это предлагаю сделать, потмоу что при новом собирании ядра наш kernel.old перезапишется например не рабочим ядром и мы вообще не сможем загрузиться.

P.P.S. Сохранение хорошего рабочего ядра:
Для FreeBSD 4.x — команда cp /kernel /kernel.good
Для FreeBSD 5.x — команда cp -R /boot/kernel /boot/kernel.good

Второй способ обновления ядра:
Перейдите в каталог /usr/src.
# cd /usr/src

Соберите ядро.
# make buildkernel KERNCONF=MYKERNEL

Установите новое ядро.
# make installkernel KERNCONF=MYKERNEL

Замечание: Этот способ построения требует наличия всех исходных файлов систем. Если вы только установили исходные файлы ядра, то используйте традиционный способ, как описано выше.

MYKERNEL — конфигурационный файл вашего ядра, который для i386 находится в папке /usr/src/sys/i386/conf. Если не указывать параметр KERNCONF, то соберется ядро GENERIC.

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

Будем использовать следующую версию системы для решения нашей задачи по настройке шлюза:

# uname -v FreeBSD 10.2-RELEASE-p8 #0 r292756M: Sat Dec 26 22:49:34 MSK 2015 root@freebsd:/usr/obj/usr/src/sys/GENERIC

На сервере установлены 2 сетевые карты:

В нашу задачу по настройке программного freebsd роутера будет входить настройка маршрутизации на сервере, установка и настройка ipfw, включение nat, настройка локального dhcp и dns сервера.

Подготовка сервера к настройке шлюза

Информацию о выданных leases dhcp сервера dnsmasq можно посмотреть в файле /var/db/dnsmasq.leases .

Анализ сетевой активности в freebsd с помощью iftop

Иногда хочется посмотреть, что происходит на роутере и кто использует интернет в данный момент. По-умолчанию, в системе нет готового средства для получения этой информации. На помощь нам придет простая программа iftop, которая позволяет в режиме реального времени посмотреть активность на сетевом интерфейсе.

Устанавливаем iftop на настроенный Freebsd шлюз:

# pkg install iftop

Запускаем iftop с указанием интерфейса и отображением используемых портов:

# iftop -i hn1 -P

Видим любопытную картину — кто, куда, по какому порту и с какой скоростью лезет.

Я для примера на одном из компьютеров запустил генератор трафика интернета. Он занял почти весь канал и это стало отлично видно на роутере с помощью iftop. Конечно, эта простая утилита не решает всех вопросов по мониторингу сетевой активности, но для представления текущей картины подходит, если вам не нужно что-то большее.

Заключение

Подведем итог того, что сделали. За короткое время настроили полноценный шлюз (по сути программный роутер) на базе Freebsd 10 для обеспечения выхода в интернет клиентов за сервером. При этом обеспечили автоматическое получение настроек. Даже на скромном виртуальном сервере такой шлюз способен переварить достаточно большой траффик.

Вся настройка занимает буквально 10-15 минут. Основное время уходит на сборку ядра. Чем выше версия Freebsd, тем дольше оно собирается, несмотря на то, что скорости железа существенно возрастают.

Пройдемся по пунктам и разберемся с тем, что конкретно мы сделали:

  1. Подготовили сервер к настройке шлюза.
  2. Пересобрали ядро с необходимыми параметрами.
  3. Настроили ipfw и nat, включили маршрутизацию.
  4. Установили и настроили dnsmasq для раздачи сетевых настроек по dhcp и dns сервера.
  5. Установили iftop для простейшего анализа сетевой активности на внешнем интерфейсе.

Этого достаточно для полноценной работы шлюза на Freebsd 10. Если есть необходимость подсчета пользовательского траффика или ограничения доступа к определенным ресурсам, можно к нему.

Июнь 3, 2015 12:15 пп 2 161 views | Комментариев нет

Операционная система FreeBSD 10.1 по умолчанию использует ядро GENERIC. Эта стандартная конфигурация используется для поддержки большого количества аппаратных средств из коробки. Компиляция пользовательского ядра, в свою очередь, позволяет повысить безопасность, увеличить функциональность и улучшить производительность сервера.

Для этого FreeBSD использует две ветки кода: стабильную и текущую. Стабильная ветка – это последний релиз кода, готовый к производству. Текущая ветка – это последний релиз кода от команды разработчиков, который предоставляет передовые функции, но при этом более уязвим к ошибкам и нестабильностям системы. В данном руководстве используется стабильная ветка кода.

Это руководство покажет, как выполнить пользовательскую компиляцию ядра FreeBSD.

Требования

1: Загрузка исходного кода ядра

Сначала нужно загрузить исходный код операционной системы.

FreeBSD, как и многие другие дистрибутивы UNIX, предоставляет публичный доступ к своему коду для скачивания и модификации. Для того, чтобы перекомпилировать ядро, сначала нужно скачать исходный код из системы контроля версий FreeBSD.

Для хранения кодов команда FreeBSD использует репозиторий Subversion, потому для начала нужно установить бинарный порт Subversion.

sudo pkg install subversion

По умолчанию система FreeBSD использует оболочку tcsh, которая использует внутреннюю хэш-таблицу команд в $PATH. После установки Subversion нужно выполнить команду rehash, благодаря которой система повторно читает конфигурационные файлы.

Теперь найдите копию последней стабильной ветки в каталоге /usr/src.

sudo svn co https://svn0.us-east.FreeBSD.org/base/stable/10 /usr/src

Возможно, система предложит принять сертификат сервера. Чтобы принять его, введите p, убедившись, что контрольная сумма файла (или fingerprint) совпадает с суммой, указанной внизу этой страницы .

2: Пользовательская настройка ядра

Теперь можно приступать к настройке ядра системы.

Согласно конвенции об именах конфигурационных файлов ядра, имя ядра должно записываться в верхнем регистре. В данном руководстве этот файл будет называться EXAMPLE. Настройки ядра хранятся в каталоге /usr/src/sys/architecture/conf; допустим, используется архитектура AMD64.

Откройте конфигурационный каталог:

cd /usr/src/sys/amd64/conf

Создайте файл EXAMPLE и откройте его для редактирования в любом текстовом редактореданном случае используется ее):

Ядро GENERIC поддерживает огромное количество различной аппаратуры; ядро EXAMPLE поддерживает только оборудование, необходимое для запуска сервера, все стандартные и ненужные устройства удалены. Также EXAMPLE поддерживает фаервол для фильтрации пакетов (pf), шейпинг трафика (altq), шифрование файловой системы (geom_eli) и безопасность IP (IPsec).

Примечание : Подробнее об опциях можно прочесть в документации FreeBSD . Попробуйте самостоятельно написать код для ядра.

3: Сборка и установка ядра

Создав пользовательские конфигурации ядра, нужно собрать и перекомпилировать его.

Вернитесь в каталог /usr/src и выполните команду make buildkernel, используя новый конфигурационный файл:

cd /usr/src
sudo make buildkernel KERNCONF=EXAMPLE

Это может занять некоторое время в зависимости от объёма ресурсов сервера (в среднем сервер в 1GB компилируется 90 минут).

После завершения перекомпиляции установите новое ядро:

sudo make installkernel KERNCONF=EXAMPLE

Затем перезапустите систему.

sudo shutdown -r now

После этого сервер отключит текущие сервисы, синхронизирует диски и обновит ядро.

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

sysctl kern.conftxt | grep ident

На экране должен появиться такой результат:

Настройка и перекомпиляция ядра выполнена успешно.

Tags: ,