Мое ядро FreeBSD

Мое ядро FreeBSD

Дистрибутив фрюхи часто называют самым подходящим для решения прикладных сетевых задач в локальной сети. Сегодня мы займемся решением одной из сетевых задач — настройкой шлюза на 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. Если есть необходимость подсчета пользовательского траффика или ограничения доступа к определенным ресурсам, можно к нему.

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

Для того, чтобы скомпилировать свое ядро необходимо установить исходники ядра (src- Source for everything but encryption). Если они уже установлены то заходим в каталог /usr/src/sys (FreeBSD kernel).Если же у вас не установлены исходники ядра, установить их можно через sysinstall. Считаем, что исходники ядра вы установили.

Под пользователем root идем в папку /usr/src/sys/i386/conf.

# cd /usr/src/sys/i386/conf

Копируем файл GENERIC, например в mykernel. Полученный файл и будем править.

Если у вас машина Pentium4, то советую сразу закоментировать строки:

Цитата
cpu I386_CPU
cpu I486_CPU
cpu I586_CPU

пусть наша машина будет настроена на определенный процессор и не распыляется на всякую фигню;)

Можно отключить не используемые устройства, что уменьшит размер ядра и соответсвенно нагрузку на процессор. Посмотреть какие у вас устройства можно коамандой dmesg, после загрузки компьютера.

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

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

Нам надо будет выполнить следующие команды:

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

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.

Соберите ядро.

# make buildkernel KERNCONF=MYKERNEL

Установите новое ядро.

# make installkernel KERNCONF=MYKERNEL

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

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

В статье описано как компилировать ядро 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 из сходных кодов. Ранее в заметке 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, тогда.



© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows