---
tags: [freebsd]
verified: 2026-09-05
---

# FreeBSD — архитектура, философия и базовые принципы системы

## Введение

FreeBSD — полноценная операционная система класса UNIX, а не дистрибутив. В отличие от Linux-экосистемы, где система собирается из множества независимых проектов (ядро, coreutils, systemd, glibc — всё от разных команд), FreeBSD разрабатывается как единый инженерный продукт: ядро, системные утилиты, init-система, библиотеки и документация создаются, версионируются и тестируются совместно.

Это определяет ключевые свойства системы: предсказуемость поведения, архитектурная чистота, стабильность под нагрузкой и строгое разделение системного и пользовательского слоёв.

## Архитектура системы

### Base System

Базовая система (base system) включает ядро, драйверы, системные библиотеки, init, shell (`/bin/sh` — ash-совместимый), системные утилиты и rc-службы. Все компоненты синхронизированы по версиям и обновляются атомарно. Текущую версию базовой системы можно проверить через `freebsd-version`.

Принципиальное отличие от Linux: в FreeBSD нет понятия «дистрибутив» — есть одна система с одним деревом исходников (`/usr/src`), из которого собирается всё, от ядра до `ls`.

### Ports и Packages

FreeBSD архитектурно разделяет системный и пользовательский слой:

| Слой     | Назначение                    | Расположение   |
| -------- | ----------------------------- | -------------- |
| Base     | сама операционная система     | `/`, `/usr`    |
| Ports    | сборка программ из исходников | `/usr/ports`   |
| Packages | готовые бинарные пакеты       | `/usr/local`   |

Сторонний софт устанавливается в `/usr/local` (бинарники, библиотеки, конфиги), системные файлы остаются в `/`. Это разграничение позволяет обновлять base system независимо от приложений и наоборот — фундаментальный архитектурный выбор, которого в большинстве Linux-дистрибутивов нет.

Ports — это дерево Makefile'ов с патчами и метаданными для сборки из исходников с возможностью выбора опций (`make config`). Packages — бинарные пакеты, собранные из тех же портов с дефолтными опциями. Для большинства задач достаточно `pkg`, порты нужны когда требуется специфическая конфигурация сборки.

## Философия

Linux-подход — система как конструктор: выбираешь ядро, init-систему, набор утилит, пакетный менеджер. FreeBSD-подход — система как инструмент: всё уже собрано, протестировано и задокументировано как единое целое.

FreeBSD не пытается скрыть устройство системы. Она предполагает, что администратор понимает, что делает, и ценит минимализм, прозрачность, контроль и воспроизводимость поведения. Практически любой компонент системы можно изучить на уровне исходного кода — это не декларация, а реальная практика: исходники base system доступны в `/usr/src`, а документация (Handbook) считается эталоном системной документации в UNIX-мире.

Модель релизов консервативна: новые функции внедряются только после тщательного тестирования. Ветка RELEASE — это production-ready система, STABLE — промежуточная с бэкпортами, CURRENT — development.

## Управление системой

### Конфигурация

Вся настройка централизована в текстовых файлах. Основные системные конфиги: `/etc/rc.conf` (главный — включение сервисов, сетевые настройки, параметры загрузки), `/etc/sysctl.conf` (параметры ядра), `/etc/fstab`, `/etc/hosts`. Конфигурации стороннего софта лежат в `/usr/local/etc/` — это следствие архитектурного разделения base/packages.

### Сервисы (rc-система)

Система служб основана на классической rc-модели. Скрипты лежат в `/etc/rc.d/` (системные) и `/usr/local/etc/rc.d/` (из пакетов). Управление:

```sh
service nginx start
service sshd restart
sysrc nginx_enable=YES    # включение сервиса (редактирует rc.conf)
```

В rc.d есть механизм зависимостей через директивы REQUIRE/BEFORE/AFTER в скриптах, но он значительно проще systemd — нет сокет-активации, нет cgroups-интеграции, нет параллельного запуска по умолчанию. Всё реализовано через shell-скрипты, что делает систему полностью прозрачной и отлаживаемой.

### Логи

Основной системный журнал — `/var/log/messages`. Ротация настраивается через `newsyslog.conf`. Нет journald — используется классический syslog (`syslogd`).

## Ключевые подсистемы

### Jails

Jails — встроенный механизм контейнеризации, появившийся в FreeBSD 4.x (2000 год), задолго до Docker и LXC. Jail — это изолированное окружение с собственной файловой системой, сетевым стеком, пользователями и процессами, работающее на том же ядре.

В отличие от Linux-контейнеров, jails не требуют дополнительных инструментов — это часть base system. Управление через `jail(8)`, конфигурация в `/etc/jail.conf`. Для удобства существуют надстройки: `bastille`, `cbsd`, `pot`.

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

### UFS (Unix File System)

UFS2 — историческая и до сих пор поддерживаемая файловая система FreeBSD, используемая по умолчанию при установке без ZFS. Включает soft updates (механизм обеспечения целостности метаданных без журналирования, с меньшим overhead'ом чем классический journaling) и опциональное journaling через SUJ (Soft Updates Journaling) для ускорения `fsck` после сбоя.

Главное преимущество UFS перед ZFS — минимальные требования к ресурсам. ZFS активно использует ARC (Adaptive Replacement Cache) и при малом объёме RAM (1–2 ГБ и менее) может создавать memory pressure, что на VPS с ограниченной памятью приводит к деградации. UFS работает стабильно даже на 256–512 МБ RAM, что делает её разумным выбором для лёгких VPS и embedded-сценариев.

Чего нет в UFS по сравнению с ZFS: нет контрольных сумм данных (silent data corruption не детектируется), нет copy-on-write, нет встроенного сжатия и дедупликации, нет boot environments. Снапшоты есть и они встроенные — `mksnap_ffs(8)` часть base, — но устроены заметно примитивнее ZFS-овских. Разметка через `gpart`, управление через стандартные `newfs`, `tunefs`, `mount`.

Trade-off прост: UFS — для ресурсо-ограниченных или простых сценариев, ZFS — когда важны целостность данных, снапшоты и гибкость управления хранилищем, но при наличии достаточной RAM (минимум 4 ГБ, комфортно от 8 ГБ).

Все цифры памяти в этом разделе — ориентир из практики, а не документированное требование, и стоит читать их именно так. Ни Handbook, ни `zfs(8)` минимума RAM для ZFS не задают вовсе; единственный порог, который вообще есть в документации, — предупреждение инсталлятора при `hw.physmem` меньше примерно 200 МиБ («At least 256 MiB is recommended»), и относится оно к установке через пакетный base, а не к выбору между UFS и ZFS. Порядок величин практикой подтверждается, первоисточником — нет.

### ZFS

FreeBSD — одна из лучших платформ для ZFS (наряду с illumos-производными). ZFS интегрирован в base system начиная с FreeBSD 7.0. Рекомендуемой файловой системой проект её при этом не объявляет: Handbook перечисляет Auto (ZFS), Auto (UFS), Manual и Shell как равноправные варианты разметки, а `bsdinstall(8)` про свой интерактивный разметчик пишет прямо противоположное — «autopart — … Defaults to UFS».

Ключевые возможности: copy-on-write, снапшоты, встроенное сжатие, checksumming, RAID-Z (программный RAID без аппаратного контроллера), `boot environments` (загрузочные окружения — позволяют откатить систему после неудачного обновления).

Управление через `zpool` и `zfs`. Boot environments управляются через `bectl`.

### DTrace

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

Полезен для диагностики производительности, отладки сетевого стека, анализа I/O-паттернов. В Linux аналогичную нишу занимают eBPF/bpftrace, но DTrace во FreeBSD — зрелый и стабильный инструмент, доступный из коробки.

## Управление пакетами

Основной инструмент — `pkg`. Базовые операции:

```sh
pkg update              # обновление индекса репозитория
pkg install <package>   # установка
pkg upgrade             # обновление всех пакетов
pkg info                # список установленных
pkg search <name>       # поиск
pkg audit               # проверка уязвимостей
```

## Обновление системы

FreeBSD разделяет обновление base system и пакетов — это принципиально.

Обновление базовой системы бинарными патчами:

```sh
freebsd-update fetch install
```

Граница применимости `freebsd-update` проходит не по имени ветки, а по тому, что Release Engineering выпускает в бинарном виде: обновления собираются для ALPHA, BETA, RC и RELEASE и не собираются для PRERELEASE, STABLE и CURRENT.

Для веток без бинарных обновлений остаётся пересборка из исходников (`make buildworld`, `make installworld`) — но это уже не единственный путь: пакеты base публикуются и для активных веток STABLE и CURRENT, причём для веток разработки — дважды в сутки.

Начиная с 15.0 у base появился второй способ: система ставится и обновляется как набор пакетов с именами `FreeBSD-*` из отдельного репозитория `FreeBSD-base` (исторически этот подход называют pkgbase), и `bsdinstall` при установке спрашивает, какой метод использовать — традиционные дистрибутивные наборы или пакеты. В 15.0 pkgbase заявлен как technology preview, и в 15.1 (текущий production-релиз, 15.0 переведён в legacy) статус тот же: дистрибутивные наборы остаются умолчанием установочных образов всей серии 15.x. `freebsd-update` и дистрибутивные наборы поддерживаются на всём цикле stable/15, а убрать их планируют в 16.0.

```sh
pkg upgrade -r FreeBSD-base   # обновление base на системе, установленной через pkgbase
```

Два способа не сочетаются, и это не рекомендация, а проверка в коде: обнаружив пакетный base, `freebsd-update` печатает «freebsd-update is incompatible with the use of packaged base» и завершается с кодом 1. Так что путей обновления base сейчас три — бинарные патчи, пакеты и сборка из исходников, — и на конкретной системе действует ровно один.

Обновление пакетов:

```sh
pkg upgrade
```

При использовании ZFS перед обновлением рекомендуется создать boot environment (`bectl create pre-upgrade`) — это даёт возможность откатиться при проблемах.

## Структура файловой системы

| Путь             | Назначение                              |
| ---------------- | --------------------------------------- |
| `/`              | базовая система                         |
| `/usr`           | пользовательские программы base system  |
| `/usr/local`     | сторонний софт (из pkg/ports)           |
| `/usr/src`       | исходники base system                   |
| `/usr/ports`     | дерево портов                           |
| `/etc`           | конфиги системы                         |
| `/usr/local/etc` | конфиги пакетов                         |
| `/var`           | runtime-данные и логи                   |
| `/boot`          | загрузчик и ядро                        |

## Базовые инструменты администратора

| Утилита    | Назначение                         |
| ---------- | ---------------------------------- |
| `ifconfig` | настройка сетевых интерфейсов      |
| `route`    | управление таблицей маршрутизации  |
| `netstat`  | статистика сети и соединений       |
| `sockstat` | просмотр открытых сокетов          |
| `systat`   | интерактивный мониторинг (сеть, I/O, VM) |
| `top`      | мониторинг процессов               |
| `ps`       | список процессов                   |
| `service`  | управление службами                |
| `sysrc`    | редактирование rc.conf             |
| `sysctl`   | параметры ядра                     |
| `kldload`  | загрузка модулей ядра              |
| `kldstat`  | список загруженных модулей         |
| `dmesg`    | сообщения ядра                     |
| `pkg`      | управление пакетами                |
| `bectl`    | boot environments (ZFS)            |

## Преимущества

FreeBSD особенно сильна в серверных и сетевых задачах: стабильная работа под нагрузкой, один из лучших сетевых стеков среди open-source ОС (исторически TCP/IP-стек FreeBSD был эталонной реализацией), первоклассная поддержка ZFS, встроенная контейнеризация через jails, строгая и предсказуемая архитектура.

## Ограничения

Поддержка оборудования уже от Linux — особенно это касается новейших GPU, Wi-Fi-чипов и периферии ноутбуков. Меньше десктоп-ориентированного софта, хотя существует Linux binary compatibility layer (`linuxulator`), позволяющий запускать Linux-бинарники. Порог входа выше: система предполагает осознанное администрирование. Экосистема контейнеров и оркестрации (Docker, Kubernetes) ориентирована на Linux — это основной практический барьер для многих сценариев.

## Оптимальные сценарии использования

Серверы, сетевые сервисы (DNS, почта, прокси), firewall/маршрутизация (pf — один из лучших пакетных фильтров), storage-системы (ZFS + NFS/iSCSI/Samba), jail-based хостинг, лабораторные и инфраструктурные среды.

## Рекомендуемый порядок изучения

Файловая структура и навигация → rc-система и управление сервисами → сеть (ifconfig, pf, routing) → pkg и порты → sysctl и конфигурация ядра → jails → ZFS → DTrace.

Читать всё это лучше по [FreeBSD Handbook](https://docs.freebsd.org/en/books/handbook/) — он покрывает каждый пункт списка и написан как учебник, а не как справочник.

## Источники

- `freebsd-base(7)` — pkgbase: имена `FreeBSD-*`, репозиторий `FreeBSD-base`, `pkg upgrade -r FreeBSD-base`, наборы `FreeBSD-set-*`, публикация для STABLE и CURRENT; HISTORY — поддержка появилась в 15.0: [man.freebsd.org/cgi/man.cgi?query=freebsd-base&sektion=7](https://man.freebsd.org/cgi/man.cgi?query=freebsd-base&sektion=7)
- `freebsd-update(8)` — BINARY UPDATES AVAILABILITY: для каких веток бинарные обновления собираются: [man.freebsd.org/cgi/man.cgi?query=freebsd-update&sektion=8](https://man.freebsd.org/cgi/man.cgi?query=freebsd-update&sektion=8)
- Исходник `freebsd-update.sh`, ветка releng/15.1 — взаимоисключение `freebsd-update` и пакетного base: [cgit.freebsd.org/src/plain/usr.sbin/freebsd-update/freebsd-update.sh?h=releng/15.1](https://cgit.freebsd.org/src/plain/usr.sbin/freebsd-update/freebsd-update.sh?h=releng/15.1)
- FreeBSD 15.0-RELEASE Announcement — pkgbase как technology preview, удаление дистрибутивных наборов в 16.0 с сохранением на весь цикл stable/15: [freebsd.org/releases/15.0R/announce/](https://www.freebsd.org/releases/15.0R/announce/)
- FreeBSD Handbook, Chapter 2 "Installing FreeBSD" — два способа установки начиная с 15.0, дистрибутивные наборы как умолчание в 15.x, варианты разметки: [docs.freebsd.org/en/books/handbook/bsdinstall/](https://docs.freebsd.org/en/books/handbook/bsdinstall/)
- FreeBSD Handbook, Chapter 27 "Updating and Upgrading FreeBSD" — pkgbase как tech preview с 15.0 и планы замены `freebsd-update`: [docs.freebsd.org/en/books/handbook/cutting-edge/](https://docs.freebsd.org/en/books/handbook/cutting-edge/)
- `bsdinstall(8)` — `autopart` по умолчанию выбирает UFS: [man.freebsd.org/cgi/man.cgi?query=bsdinstall&sektion=8](https://man.freebsd.org/cgi/man.cgi?query=bsdinstall&sektion=8)
- `jail(8)` — HISTORY: jail появился в FreeBSD 4.0, конфигурационный файл в 9.1: [man.freebsd.org/cgi/man.cgi?query=jail&sektion=8](https://man.freebsd.org/cgi/man.cgi?query=jail&sektion=8)
- `sh(1)` — AUTHORS: происхождение `/bin/sh` от ash: [man.freebsd.org/cgi/man.cgi?query=sh&sektion=1](https://man.freebsd.org/cgi/man.cgi?query=sh&sektion=1)
- `freebsd-version(1)` — раздельные версии ядра и userland: [man.freebsd.org/cgi/man.cgi?query=freebsd-version&sektion=1](https://man.freebsd.org/cgi/man.cgi?query=freebsd-version&sektion=1)
- `hier(7)` — `/usr/local`, `/usr/ports`, `/usr/src` и разделение base и local: [man.freebsd.org/cgi/man.cgi?query=hier&sektion=7](https://man.freebsd.org/cgi/man.cgi?query=hier&sektion=7)
- `tunefs(8)` — soft updates journaling и его влияние на время `fsck`: [man.freebsd.org/cgi/man.cgi?query=tunefs&sektion=8](https://man.freebsd.org/cgi/man.cgi?query=tunefs&sektion=8)
- `mksnap_ffs(8)` — снапшоты UFS: [man.freebsd.org/cgi/man.cgi?query=mksnap_ffs&sektion=8](https://man.freebsd.org/cgi/man.cgi?query=mksnap_ffs&sektion=8)
- `rc.conf(5)` — параллельного запуска служб по умолчанию нет, `jail_parallel_start` включается явно: [man.freebsd.org/cgi/man.cgi?query=rc.conf&sektion=5](https://man.freebsd.org/cgi/man.cgi?query=rc.conf&sektion=5)
- FreeBSD 7.0-RELEASE Release Notes — ZFS добавлен в 7.0: [freebsd.org/releases/7.0R/relnotes/](https://www.freebsd.org/releases/7.0R/relnotes/)
- FreeBSD Release Information — модель релизов и текущий статус веток: [freebsd.org/releases/](https://www.freebsd.org/releases/)

---

## Связанные заметки

- [FreeBSD — файловая структура](./freebsd-filesystem-hierarchy.md) — следующая статья цикла: как организована иерархия каталогов
- [FreeBSD — сводный cheatsheet](./freebsd-cheatsheet.md) — карта всех статей цикла и быстрая справка по командам
- [FreeBSD — обновление системы](./freebsd-updating.md) — механизм обновлений base system и пакетов
- [FreeBSD VPS: Honeypot](./freebsd-honeypot-guide.md) — практический сценарий на реальном сервере
- [sudo vs doas](./sudo-vs-doas.md) — утилиты повышения привилегий, doas родом из OpenBSD
- [Магия как метафора: язык и культура Unix](./unix-magic-culture.md) — откуда взялся демон-маскот и остальной словарь Unix
- [Загрузка: от питания до первой инструкции ядра](./os-boot-sequence.md) — механизм загрузки на трёх архитектурах, с трёхступенчатой цепочкой FreeBSD в сравнении
