Сборка pfSense из исходного кода
pfSense CE - проект с открытым исходным кодом на базе FreeBSD. Исходный код размещен на GitHub и включает три основных репозитория: базовую систему с GUI, модифицированные исходники FreeBSD и коллекцию портов. Разработчики могут собирать pfSense из исходников, вносить исправления через System Patches без полной пересборки или участвовать в развитии проекта через pull request.
Репозитории исходного кода
Разработка pfSense CE ведется в трех репозиториях на GitHub:
| Репозиторий | Содержимое | Назначение |
|---|---|---|
| pfSense/pfSense | GUI-код, скрипты сборки | Веб-интерфейс, PHP-логика, утилиты |
| pfSense/FreeBSD-src | Исходный код ОС | Ядро и базовая система FreeBSD |
| pfSense/FreeBSD-ports | Порты и пакеты | Сборочная информация для ПО, пакеты pfSense |
Основная ветка разработки - master для репозитория pfSense/pfSense и devel для FreeBSD-ports. Релизные ветки именуются по схеме RELENG_2_8_1.
Требования к среде сборки
Для сборки pfSense из исходного кода необходима среда на базе FreeBSD соответствующей версии. pfSense использует poudriere для сборки пакетов и формирования установочных образов.
Минимальные требования:
- FreeBSD версии, соответствующей целевому релизу pfSense (см. таблицу соответствия )
- Установленный poudriere для сборки портов
- Достаточное дисковое пространство (минимум 50 ГБ для полной сборки)
- Git для работы с репозиториями
# Установка необходимых инструментов на FreeBSD
pkg install git poudriereСтруктура репозитория pfSense
Репозиторий pfSense/pfSense содержит:
src/- PHP-файлы веб-интерфейса, конфигурационные скриптыtools/- скрипты сборки и утилиты разработчикаsrc/etc/inc/- основные PHP-модули (config.inc, util.inc, interfaces.inc)src/usr/local/www/- страницы веб-интерфейсаsrc/etc/phpshellskel/- скрипты PHP Shell
Сборка из исходного кода
Процесс сборки pfSense CE из исходников:
# Клонирование основного репозитория
git clone https://github.com/pfsense/pfSense.git
cd pfSense
# Переключение на нужную ветку (например, RELENG_2_8_1)
git checkout RELENG_2_8_1
# Запуск сборки (требуется настроенная среда poudriere)
./build.shПолная сборка включает компиляцию ядра FreeBSD, сборку всех портов через poudriere и формирование установочного ISO-образа. Процесс занимает значительное время и требует правильной настройки среды.
System Patches - патчи без пересборки
Пакет System Patches позволяет применять исправления к pfSense без полной пересборки системы. Патчи могут быть получены из официального репозитория, вставлены вручную или загружены из сторонних источников.
Установка
Установите пакет через System > Package Manager > Available Packages, найдя System Patches.
Использование
После установки пакет доступен через System > Patches. Он предоставляет:
- Получение рекомендованных патчей от Netgate с возможностью автоприменения
- Добавление пользовательских патчей из URL, текста или файла
- Применение и откат патчей через веб-интерфейс
- Тестирование исправлений из pull request до их включения в релиз
System Patches особенно полезен для проверки исправлений из GitHub перед обновлением до следующей версии pfSense.
gitsync - обновление между снимками
Утилита gitsync синхронизирует PHP-код из Git-репозитория pfSense CE, позволяя получить исправления между официальными релизами без установки нового снимка.
Ограничения
- Работает только с pfSense CE, не совместим с pfSense Plus
- Синхронизирует только PHP-файлы - бинарные изменения не применяются
- Некоторые PHP-изменения требуют соответствующих бинарных обновлений, доступных только через полный снимок
- Рекомендуется использовать только по указанию разработчиков или при глубоком понимании процесса разработки
Запуск gitsync
Из меню консоли pfSense выберите пункт 12 (developer shell):
> playback gitsync masterИли из стандартной оболочки (пункт 8 консоли):
pfSsh.php playback gitsync masterДля синхронизации с конкретной веткой релиза замените master на имя ветки:
pfSsh.php playback gitsync RELENG_2_8_1Если Git не установлен, установите его вручную:
pkg install gitПри ошибках, связанных с изменением URL репозитория, удалите старый клон:
rm -rf /root/pfsense/
pfSsh.php playback gitsync masterОтправка pull request
Для внесения изменений в pfSense CE через GitHub:
- Создайте запись об ошибке или функции в Redmine pfSense (исключение - мелкие исправления опечаток)
- Форкните нужный репозиторий:
pfSense/pfSense- для изменений базовой системы и GUIpfSense/FreeBSD-ports- для изменений пакетов
- Внесите изменения в соответствующую ветку:
master- для pfSense/pfSensedevel- для FreeBSD-ports
- Укажите номер записи Redmine в сообщении коммита
- Создайте pull request с описанием и ссылкой на Redmine
- Добавьте ссылку на PR в соответствующую запись Redmine
Pull request можно протестировать на действующей системе через пакет System Patches до его принятия в основную ветку.
Руководство по стилю кодирования
pfSense использует стиль K&R BSD KNF. Основные правила:
Форматирование
- Табуляция для отступов (ширина 8), пробелы запрещены
- Фигурные скобки обязательны для всех блоков
if,for,foreach, даже однострочных - Пробел между ключевым словом и скобкой (
if (,foreach (), но не между именем функции и аргументами (function_name() - Отсутствие пробелов в конце строк
PHP-соглашения
- Имена переменных в нижнем регистре с подчеркиванием (
$my_variable) или camelCase ($myVariable) - Не использовать
$gкак переменную цикла - конфликт с глобальной переменной pfSense$g - Использовать
elseifвместоelse ifдля совместимости с альтернативным синтаксисом PHP - Не использовать устаревшие функции PHP
Безопасность
- Минимизировать вызовы shell-команд; при необходимости использовать
escapeshellarg()для переменных - Всегда экранировать пользовательский ввод через
htmlspecialchars()при выводе - Следовать принципам MVC: разделять логику отображения, валидации и хранения данных
Комментарии
- Использовать
//или/* */, писать на английском языке - Метки:
TODO:для запланированных доработок,FIXME:для известных проблем,NOTE:для важных пояснений
Рекомендации по PHP 8.x
pfSense перешел на PHP 8.x, что требует внимания при разработке:
- Строгая типизация: неявные приведения типов вызывают предупреждения
- Удаленные функции:
each(),create_function(),mysql_*недоступны - Именованные аргументы: совместимость с именами параметров в функциях
- Использовать
elseifвместоelse if- последний вариант некорректно работает с альтернативным синтаксисом
Проверяйте совместимость кода с целевой версией PHP перед отправкой pull request.
Ядро отладки
Для диагностики проблем на уровне ядра pfSense предоставляет пакет с отладочными символами:
pkg install pfSense-kernel-debugОтладочное ядро содержит символы, необходимые для анализа дампов памяти (core dumps) и трассировки ядра. Используйте его при воспроизведении kernel panic или при подготовке отчета об ошибке, связанной с ядром.
Политика по проблемам FreeBSD
pfSense основан на FreeBSD, и некоторые проблемы относятся к базовой системе FreeBSD, а не к pfSense. При обнаружении ошибки, связанной с ядром, драйверами или базовыми утилитами FreeBSD:
- Проверьте, воспроизводится ли проблема на чистой FreeBSD соответствующей версии
- Если проблема воспроизводится на FreeBSD - сообщите о ней в баг-трекер FreeBSD
- Если проблема специфична для pfSense - создайте запись в Redmine pfSense
Разработчики Netgate не занимаются исправлением проблем в базовой системе FreeBSD, за исключением критических уязвимостей безопасности.
Сообщение об ошибках и запрос функций
Сообщение об ошибках
Для сообщения об ошибке в pfSense:
- Проверьте, не описана ли проблема в существующих записях Redmine pfSense
- Соберите диагностическую информацию (версия pfSense, версия FreeBSD, логи)
- Создайте новую запись с детальным описанием: шаги воспроизведения, ожидаемое и фактическое поведение
- Приложите скриншоты, логи и информацию о panic (если применимо)
Запрос функций
Запросы новых функций также создаются в Redmine. Опишите предлагаемую функциональность, обоснование и потенциальные варианты реализации. Технические вопросы по разработке обсуждаются на форуме Netgate .
Связанные разделы
- Разработка пакетов pfSense - создание собственных пакетов, структура порта, XML-манифест
- Пользовательские скрипты pfSense - скрипты автоматизации, Shellcmd и Cron
- API и автоматизация - программное управление через REST API