Перейти к содержанию

Иерархия файловой системы Linux и базовые понятия

Прежде чем диагностировать что-либо в Linux, нужна правильная ментальная модель того, где что лежит и почему. Эта статья охватывает стандарт иерархии файловой системы (FHS), права доступа и модель владения, которую предполагают все остальные статьи этого справочника.

Как это устроено

Linux организует всё как файлы под единым корнем (/) — здесь нет букв дисков. Отдельные физические или логические тома монтируются в директории этого дерева. Filesystem Hierarchy Standard (FHS) определяет назначение каждой директории верхнего уровня:

Путь Назначение
/bin, /sbin Основные бинарники (в современных системах обычно симлинки в /usr/bin, /usr/sbin)
/etc Конфигурационные файлы всей системы (обычный текст, без бинарников)
/var Переменные данные: логи (/var/log), очереди, кэши пакетов
/opt Сторонние/самодостаточные пакеты приложений
/proc, /sys Виртуальные файловые системы, показывающие состояние ядра и процессов — не настоящие файлы на диске
/home Домашние директории пользователей
/tmp Временные файлы, обычно очищаются при перезагрузке
/usr Основная масса установленного ПО, библиотек и документации

Стоит отдельно остановиться на /proc и /sys: они не занимают места на диске, их содержимое генерируется при чтении. /proc/<pid>/ хранит живую информацию о работающем процессе; /proc/meminfo, /proc/cpuinfo и /proc/net/ — это как раз то место, откуда такие утилиты, как free, top и (старый) netstat, реально берут свои числа.

Владение и права доступа

У каждого файла есть владелец (пользователь) и группа, плюс три триплета прав — владелец, группа, остальные — каждый с битами чтения (r), записи (w) и выполнения (x).

$ ls -l /etc/passwd
-rw-r--r-- 1 root root 2847 Oct 15 06:32 /etc/passwd

Читаем слева направо: - (обычный файл, в отличие от d для директории или l для симлинка), затем rw- (владелец root может читать/писать), r-- (группа root может только читать), r-- (все остальные тоже могут только читать).

Права обычно задаются двумя способами:

chmod 644 file.txt      # числовая форма: владелец=rw, группа=r, остальные=r
chmod u+x script.sh     # добавить выполнение только владельцу
chown alice:developers file.txt   # сменить владельца на alice, группу на developers

Числовая форма — это 3-значное восьмеричное число, по одной цифре на триплет, где чтение=4, запись=2, выполнение=1, суммируются: rw- = 4+2+0 = 6, r-- = 4. Так 644 означает: владелец может читать/писать, группа и остальные — только читать.

Sticky bit на /tmp

$ stat -c "%a %U:%G %n" /tmp
1777 root:root /tmp

Ведущая 1 — это sticky bit. На директории это означает: хотя писать в /tmp может любой пользователь (хвостовая 7), удалить или переименовать файл внутри может только тот, кто сам им владеет — не чужие файлы. Без этого бита общедоступная запись в /tmp позволила бы любому пользователю удалять временные файлы любого другого.

Различия Ubuntu/Debian и RHEL-подобных систем

Ubuntu/Debian RHEL/Alma/Rocky
Менеджер пакетов apt, dpkg dnf (yum на старых релизах), rpm
Shell по умолчанию dash для /bin/sh, bash интерактивно bash для обоих
Фронтенд файрвола ufw (обёртка над nftables/iptables) firewalld
SELinux Не установлен по умолчанию (вместо него AppArmor) Включён (Enforcing) по умолчанию
Структура конфигов Та же FHS, конфиги сервисов обычно в /etc/<service>/ Та же, но ожидайте SELinux-контексты на файлах

Сама структура FHS (/etc, /var, /usr, ...) идентична — это не специфичное соглашение дистрибутива, а кросс-дистрибутивный стандарт, которому следуют обе семьи.

Практическое задание

  1. Создайте тестовый файл и посмотрите его права по умолчанию:
    touch ~/test.txt
    ls -l ~/test.txt
    
  2. Уберите у себя право записи и попробуйте отредактировать файл, посмотрите, что произойдёт:
    chmod u-w ~/test.txt
    echo "hello" > ~/test.txt   # должно завершиться ошибкой
    
  3. Верните право записи и проверьте числовое значение прав:
    chmod u+w ~/test.txt
    stat -c "%a" ~/test.txt
    

Как проверить, что всё сделано правильно

  • Шаг 2 должен выдать bash: /home/<вы>/test.txt: Permission denied (bash выводит раскрытый путь) (или аналог вашего редактора).
  • После шага 3 stat -c "%a" должен показать 644 (или то значение, которое дал ваш исходный umask до того, как вы что-либо меняли).

Типичные ошибки

  • Использование chmod 777 для «исправления» ошибки доступа. Это делает файл доступным на запись и выполнение для всех, включая других пользователей и (если сервис смотрит в сеть) потенциально сервисы, которым вы не собирались давать доступ. Вместо этого найдите реальное несоответствие владельца/группы — ls -l и id <user> обычно показывают это сразу.
  • Путаница /bin и /usr/bin. В современных дистрибутивах они объединены (/bin — симлинк на /usr/bin), но скрипты, написанные для старых систем, иногда жёстко прописывают один из них.
  • Предположение, что /tmp постоянен. Многие дистрибутивы монтируют /tmp как tmpfs (в оперативной памяти) или очищают его при загрузке — не храните там то, что нельзя потерять.

⚠ Опасные команды

  • chmod -R 777 / или любой рекурсивный chmod/chown на системной директории может сломать sudo, SSH и большинство системных сервисов напрямую (многие демоны отказываются запускаться, если их конфиги доступны для записи всем, — это защитная мера). Никогда не запускайте рекурсивную смену прав вне директории, в которой вы уверены, что там только файлы вашего приложения.
  • rm -rf / (или rm -rf /*) — классическая катастрофическая ошибка — современный rm по умолчанию отказывается делать это для буквального корня, но rm -rf $VAR/, где $VAR пуст или не задан, разворачивается в то же самое, и не защищено от этого.

Связанные статьи

Контрольные вопросы

  1. В чём разница между /bin и /usr/bin в современном дистрибутиве Linux?
  2. Почему sticky bit важен именно для /tmp?
  3. Что даёт chmod 750 file владельцу, группе и всем остальным?
  4. Почему /proc называют «виртуальной» файловой системой, и что произойдёт, если попробовать проверить её размер через du?