Файловая система Unix (FHS)

Материал из llmdocs — справочник разработчика
Файловая система Unix (FHS)
СтандартFilesystem Hierarchy Standard
ПредшественникFSSTND (1994)
Текущая версияFHS 3.0 (2015)
СопровождениеLinux Foundation
Принципединое дерево с корнем /, устройства монтируются в каталоги
Виртуальные ФС/proc, /sys, /dev, /run
Файловые системыext4, XFS, Btrfs, ZFS, tmpfs

Файловая система Unix устроена как единое дерево каталогов с корнем /. В отличие от Windows с её дисками C: и D:, все устройства — диски, разделы, флешки, сетевые ресурсы — монтируются в каталоги этого дерева. Назначение стандартных каталогов в Linux описывает FHS (Filesystem Hierarchy Standard — стандарт иерархии файловой системы), благодаря которому администратор в любом дистрибутиве знает, где искать конфигурацию, логи и программы.[1]

История стандарта

В начале 1990-х каждый дистрибутив раскладывал файлы по-своему. В 1994 году вышел первый стандарт FSSTND, в 1997 году — FHS 2.0, обобщённый на все Unix-подобные системы, а в 2015 году Linux Foundation выпустила FHS 3.0. Современные системы на systemd дополнительно описывают иерархию в документе file-hierarchy(7).[3]

Основные каталоги

Каталог Назначение
/ корень всей иерархии
/etc конфигурация системы и служб: /etc/ssh/sshd_config, /etc/nginx/
/home домашние каталоги пользователей; /root — домашний каталог root
/usr установленные программы и данные только для чтения: /usr/bin, /usr/lib, /usr/share
/usr/local программы, установленные администратором вручную, вне пакетного менеджера
/opt крупные сторонние пакеты целиком: /opt/google/chrome
/var изменяющиеся данные: логи (/var/log), кэши, очереди, базы данных (/var/lib/postgresql)
/tmp временные файлы, часто очищается при перезагрузке
/srv данные, обслуживаемые сервером (сайты, FTP)
/boot ядро и загрузчик
/dev файлы устройств: /dev/sda, /dev/null, /dev/random
/proc, /sys виртуальные ФС с информацией о процессах и ядре
/run данные времени выполнения (PID-файлы, сокеты), в памяти
/mnt, /media точки монтирования — временные и съёмные носители

Исторически программы делились между /bin (необходимые для загрузки) и /usr/bin, потому что /usr мог находиться на отдельном диске. В большинстве современных дистрибутивов прошло объединение /usr (usr merge): /bin, /sbin и /lib стали символическими ссылками на соответствующие каталоги в /usr.[6]

«Всё есть файл»

Философия Unix представляет как файлы не только данные, но и устройства, процессы и параметры ядра:[2]

  • /dev/sda — диск целиком; запись в него — запись на диск напрямую.
  • /dev/null поглощает всё записанное, /dev/zero выдаёт нули, /dev/urandom — случайные байты.
  • /proc/<PID>/ — сведения о процессе (см. Процессы и сигналы); /proc/cpuinfo, /proc/meminfo — о системе.
  • /sys/ — устройства и параметры ядра; запись в некоторые файлы меняет настройки на лету.

Inode и ссылки

Файл на диске описывается inode — структурой с метаданными: тип, владелец, права, размер, время изменения и расположение данных. Имя файла хранится не в inode, а в каталоге — это просто запись «имя → номер inode».[4] Отсюда:

  • Жёсткая ссылка (ln a b) — ещё одно имя того же inode; файл удаляется, когда исчезает последнее имя.
  • Символическая ссылка (ln -s target link) — отдельный маленький файл, содержащий путь к цели; может указывать на каталоги и другие файловые системы, но «ломается», если цель удалить.
  • Файловая система может закончиться не по месту, а по inode — если создано очень много мелких файлов (df -i).

Монтирование

lsblk                                   # диски и разделы
df -h                                   # занятое место по точкам монтирования
sudo mount /dev/sdb1 /mnt/data          # подключить раздел
findmnt                                 # дерево смонтированных ФС
cat /etc/fstab                          # что монтируется при загрузке
du -sh /var/log/* | sort -h             # что занимает место

Файл /etc/fstab описывает, какие разделы и куда монтировать при загрузке; современные системы указывают разделы по UUID, а не по именам вроде /dev/sda1, которые могут меняться.[5]

Типы файловых систем

ФС Особенности
ext4 надёжный стандарт по умолчанию во многих дистрибутивах
XFS хорошо масштабируется на больших дисках, по умолчанию в RHEL
Btrfs копирование при записи, снимки, сжатие, подтома
ZFS снимки, контрольные суммы, RAID, встроенное сжатие
tmpfs ФС в оперативной памяти: /tmp, /run
overlayfs слои поверх друг друга — основа образов Docker

Практические советы

  • Конфигурацию служб ищите в /etc, логи — в /var/log или в журнале (journald и логи), данные служб — в /var/lib.
  • Не устанавливайте файлы вручную в /usr/bin — это территория пакетного менеджера; для своего используйте /usr/local или /opt.
  • Следите за заполнением /var: разросшиеся логи и кэши — частая причина остановки серверов.
  • Размещайте данные баз и важные каталоги на отдельных разделах или томах, чтобы переполнение не затронуло систему.

См. также

Источники

  1. Filesystem Hierarchy Standard 3.0
  2. hier(7) — Linux manual page
  3. file-hierarchy(7) — systemd
  4. inode(7) — Linux manual page
  5. mount(8) — Linux manual page
  6. freedesktop.org — The Case for the /usr Merge