Библиотека — FreeBSD — файловая структура и логика организации [X]
Шифр
freebsd-filesystem-hierarchy
Разделы
freebsd tooling
Сверено
2 сентября — в этот день утверждения статьи сверялись с первоисточниками, а не правился текст
Объём
11 732 знака · 11 разделов · чтения около 10 минут

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).

Источники


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

Из библиотеки института уносят только знания. Читателей здесь не считают: посещение не регистрируется, отметок в издании не остаётся, счётчиков нет ни у одного издания фонда.

Издание пополняется и пересверяется. Текст доступен на условиях CC BY-SA 4.0 — унесённое можно передавать дальше на тех же условиях.