---
tags: [freebsd, tooling]
verified: 2026-09-02
---

# FreeBSD — файловая структура и логика организации

## Обзор

Файловая иерархия FreeBSD — это не произвольное соглашение, а архитектурное решение, определяющее границы между базовой системой, пользовательским софтом, конфигурациями и runtime-данными. Понимание этой структуры — необходимое условие для осмысленного администрирования: без него невозможно понять, почему конфиг nginx лежит в `/usr/local/etc/`, а не в `/etc/`, и почему обновление base system не трогает установленные пакеты.

Каноническое описание иерархии содержится в `hier(7)` — man-страница, которая документирует дефолтный layout и обновляется вместе с системой. Эта статья не дублирует `hier(7)`, а объясняет архитектурную логику и причинно-следственные связи.

## Ключевой принцип: base system vs. local

Фундаментальное архитектурное решение FreeBSD — строгое разделение базовой системы и стороннего софта. Всё, что входит в base system (ядро, системные утилиты, библиотеки, shell), живёт в `/`, `/bin`, `/sbin`, `/usr/bin`, `/usr/sbin`, `/usr/lib`, `/etc`. Всё, что установлено из пакетов или портов, живёт в `/usr/local` — со своей структурой `bin/`, `sbin/`, `lib/`, `etc/`, `share/`.

Это разделение — не косметическое. Оно обеспечивает возможность обновлять base system через `freebsd-update` без риска затронуть пользовательские приложения, и наоборот — `pkg upgrade` не может сломать системные утилиты. В Linux-мире такой чёткой границы нет: системные и пользовательские пакеты управляются одним менеджером и живут в одних директориях.

С FreeBSD 15.0 менеджер у обоих слоёв может быть один: base ставится и обновляется тем же `pkg` из отдельного репозитория `FreeBSD-base`, где все пакеты называются `FreeBSD-*`. Границу это не размывает — base по-прежнему раскладывается по системным путям, порты по `/usr/local`, а ограничить операцию одним слоем позволяет `pkg upgrade -r FreeBSD-base`.

Практическое следствие: если нужно найти конфиг программы, первый вопрос — это часть base system или установленный пакет? В первом случае — `/etc/`, во втором — `/usr/local/etc/`.

## Корневая файловая система (/)

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

`/bin` и `/sbin` — основные пользовательские и системные утилиты. Начиная с FreeBSD 5.2 они динамически слинкованы (ранее были статическими), что позволяет использовать PAM и NSS-модули. Статические версии переехали в `/rescue`.

`/etc` — конфигурации base system. Ключевые файлы: `rc.conf` (главный конфиг системы и сервисов), `sysctl.conf` (параметры ядра), `fstab` (таблица монтирования), `pf.conf` (пакетный фильтр), `jail.conf.d/` (jails), `ssh/` (OpenSSH), `ssl/` (сертификаты и trust store). Дефолтные значения для rc-переменных лежат в `/etc/defaults/rc.conf` — этот файл не редактируется, переопределения вносятся в `/etc/rc.conf`.

`/boot` — загрузчик, ядро и модули. `kernel/` содержит текущее ядро, `kernel.old/` — предыдущее (автоматически сохраняется при обновлении). `loader.conf` управляет параметрами загрузки. `zfs/` — кэш ZFS-пулов, если используется ZFS. `modules/` — сторонние модули ядра (из pkg/ports, отделены от системных в `kernel/`).

`/lib` и `/libexec` — системные библиотеки и утилиты, критичные для бинарников из `/bin` и `/sbin`.

`/dev` — узлы устройств, управляемые `devfs(4)`. Создаются динамически, не хранятся на диске. Подкаталоги: `fd/` (файловые дескрипторы), `pts/` (псевдотерминалы), `gpt/` (разделы по GPT-меткам), `zvol/` (ZFS-тома), `dri/` и `drm/` (GPU).

`/rescue` — набор статически слинкованных утилит для аварийного восстановления. Все бинарники в `/rescue` — это hardlink'и на один файл, скомпилированный через `crunchgen(1)`, поэтому реальный размер каталога ~8–18 МБ, а не размер × количество утилит. Если `/bin` или `/sbin` становятся неработоспособными (например, после неудачного обновления shared-библиотек), `/rescue/sh`, `/rescue/mount`, `/rescue/fsck` и другие утилиты остаются доступными. Сценарий использования: загрузка в single-user mode, ремонт системы через `/rescue/mount -uw /`.

`/tmp` — временные файлы, обычно очищаются при перезагрузке (контролируется `clear_tmp_enable` в `rc.conf`).

`/root` — домашний каталог суперпользователя. Расположен в корневом разделе намеренно — чтобы root мог работать, даже если `/usr` и `/home` не смонтированы.

## /usr — основное дерево base system

`/usr` содержит основную массу base system: бинарники, библиотеки, заголовочные файлы, документацию, исходный код. Исторически `/usr` выносился на отдельный раздел — корневой раздел был маленьким и содержал только минимум для загрузки. Сейчас на UFS это по-прежнему распространённая практика; на ZFS обычно используются datasets.

`/usr/bin` и `/usr/sbin` — утилиты и демоны base system, не критичные для однопользовательского режима.

`/usr/lib` — библиотеки base system, включая `debug/` (символы отладки), `dtrace/` (библиотечные скрипты DTrace), `engines/` (модули OpenSSL).

`/usr/include` — заголовочные файлы для компиляции.

`/usr/share` — архитектурно-независимые данные: man-страницы (`man/`), timezone-информация (`zoneinfo/`), словари (`dict/`), скелетные файлы для новых пользователей (`skel/`), примеры (`examples/`).

`/usr/src` — исходный код base system. Наличие этого каталога — не случайность, а часть модели разработки: на STABLE и CURRENT обновление системы происходит через пересборку из исходников (`make buildworld && make installworld`). Структура `/usr/src` зеркалирует структуру установленной системы: `bin/`, `sbin/`, `lib/`, `sys/` (исходники ядра). Ставится он не всегда: в инсталляторе набор `src` по умолчанию выключен, а при установке через pkgbase его даёт отдельный набор пакетов `FreeBSD-set-src`.

`/usr/obj` — результаты сборки (объектные файлы, промежуточные артефакты). Генерируется при `make buildworld`, может быть безопасно удалён.

`/usr/ports` — дерево портов FreeBSD (опционально). Содержит Makefile'ы и метаданные для сборки стороннего софта из исходников. По умолчанию инсталлятор его не ставит, а `portsnap(8)`, которым дерево раздавалось раньше, удалён в 14.0 — теперь его получают клоном git-репозитория ports.

`/usr/tests` — тестовый набор FreeBSD, запускаемый через `kyua(1)`.

### /usr/local — территория пакетов

`/usr/local` воспроизводит структуру `/usr`, но для стороннего софта: `bin/`, `sbin/`, `lib/`, `libexec/`, `include/`, `share/` (man-страницы пакетов — в `share/man/`). Ключевое отличие — `etc/` для конфигураций пакетов: `/usr/local/etc/nginx/`, `/usr/local/etc/postfix/` и т.д.

`/usr/local/libdata/pkgconfig/` — файлы `.pc` для `pkg-config`, нужны при компиляции софта, зависящего от установленных библиотек.

`/usr/local/share/doc/freebsd/` — статьи, книги и FAQ FreeBSD Project.

## /var — runtime-данные

`/var` содержит данные, которые меняются в процессе работы системы: логи, почтовые ящики, PID-файлы, базы данных пакетов, очереди, кэши.

`/var/log/` — системные логи. `messages` — основной журнал syslog, `auth.log` — аутентификация, `daemon.log` — демоны, `debug.log` — отладочные сообщения. Ротация управляется через `newsyslog.conf`. Нет journald — используется классический `syslogd(8)`.

`/var/db/` — системные базы данных. `pkg/` — база установленных пакетов, `freebsd-update/` — загруженные обновления и временные файлы, `etcupdate/` — данные для `etcupdate(8)`.

`/var/run/` — PID-файлы, Unix-сокеты и другая информация о работающей системе. `utx.active` — база текущих пользователей.

`/var/cache/pkg/` — кэш загруженных пакетов.

`/var/spool/` — очереди: почтовые (`mqueue/`, `dma/`, `clientmqueue/`), печати (`lpd/`), cups (`cups/`).

`/var/tmp/` — временные файлы, которые переживают перезагрузку (в отличие от `/tmp`). `vi.recover/` — файлы восстановления для `vi(1)`.

`/var/crash/` — дампы ядра при kernel panic, записываемые `savecore(8)`.

## Специальные каталоги

`/compat/linux/` — корень для Linux binary compatibility layer (`linuxulator`). Если установлен пакет `linux_base-*`, здесь лежат Linux-библиотеки и минимальное окружение для запуска Linux-бинарников.

`/proc/` — процессная файловая система (`procfs`). В отличие от Linux, не монтируется по умолчанию в современных версиях FreeBSD — большинство утилит используют `sysctl` вместо `/proc`. Сама подсистема помечена в `procfs(4)` как устаревшая, взамен предлагаются `libprocstat(3)` и `kvm(3)`; монтировать её имеет смысл только ради совместимости с программами, которые без `/proc` не работают.

`/media/` — точки монтирования для съёмных носителей (`automount(8)`).

`/mnt/` — временная точка монтирования для ручного использования администратором.

`/home/` — домашние каталоги пользователей. Начиная с FreeBSD 14.0 это обычный каталог: `pw(8)` и `bsdinstall(8)` заводят домашние каталоги прямо в `/home`, а привычная по старым версиям символическая ссылка `/home` → `/usr/home` больше не создаётся.

`/nonexistent/` — несуществующий каталог, используемый по соглашению как home для сервисных аккаунтов, которым не нужна домашняя директория.

`/net/` — автомонтируемые NFS-шары (через `auto_master(5)`).

## Отличия от Linux FHS

Несколько ключевых расхождений с Linux Filesystem Hierarchy Standard, которые важно держать в голове при переключении между системами:

В FreeBSD нет `/opt` — весь сторонний софт идёт в `/usr/local`. Нет `/srv`. Нет разделения `/usr/lib` на `lib` и `lib64` — FreeBSD не использует multilib-подход, а 32-битные библиотеки совместимости лежат в `/usr/lib32`.

`/etc` в FreeBSD содержит только конфиги base system; в Linux туда же попадают конфиги пакетов. Это, пожалуй, самое практически значимое отличие — в FreeBSD чистота `/etc` гарантирована архитектурно.

`/rescue` не имеет аналога в стандартном Linux FHS (BusyBox в initramfs решает похожую задачу, но по-другому).

`/usr/src` — исходники самой ОС, а не отдельный пакет с исходниками ядра от мейнтейнеров дистрибутива, хотя ставить их при установке и необязательно.

## Навигация и полезные команды

`man hier` — каноническое описание иерархии, актуальное для конкретной установленной версии.

`whereis <name>` — поиск бинарника, исходников и man-страницы. Знает про `/usr/local`.

`which <name>` — путь к бинарнику, который будет вызван из текущего `$PATH`.

`find / -xdev` — поиск в пределах одной файловой системы (полезно, чтобы не уходить в `/usr` при работе с корневым разделом).

`du -xhd 1 /` — размер каталогов на корневом разделе, без спуска в другие файловые системы.

`pkg which /usr/local/bin/curl` — какому пакету принадлежит файл.

`ls -li /rescue` — демонстрация hardlink-структуры rescue (все файлы имеют один inode).

## Источники

- `hier(7)` — FreeBSD 15.1: [man.freebsd.org/cgi/man.cgi?query=hier&sektion=7](https://man.freebsd.org/cgi/man.cgi?query=hier&sektion=7)
- `rescue(8)`: [man.freebsd.org/cgi/man.cgi?query=rescue&sektion=8](https://man.freebsd.org/cgi/man.cgi?query=rescue&sektion=8)
- FreeBSD Handbook, Chapter 3 "FreeBSD Basics", Directory Structure: [docs.freebsd.org/en/books/handbook/basics/](https://docs.freebsd.org/en/books/handbook/basics/)
- FreeBSD Handbook: [docs.freebsd.org/en/books/handbook/](https://docs.freebsd.org/en/books/handbook/)

---

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

- [FreeBSD — архитектура и философия](./freebsd.md) — вводная статья цикла: почему base system отделена от портов
- [FreeBSD — pkg и Ports Collection](./freebsd-pkg-and-ports.md) — что именно устанавливается в `/usr/local`
- [FreeBSD — обновление системы](./freebsd-updating.md) — почему обновление base system не трогает пакеты
- [Linux — файловая иерархия и FHS](./linux-filesystem-hierarchy.md) — та же тема в Linux, для сравнения
- [FreeBSD — сводный cheatsheet](./freebsd-cheatsheet.md) — быстрая справка по ключевым каталогам
