Иерархия файловой системы 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).
Читаем слева направо: - (обычный файл, в отличие от 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¶
Ведущая 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, ...) идентична — это не специфичное соглашение дистрибутива, а кросс-дистрибутивный стандарт, которому следуют обе семьи.
Практическое задание¶
- Создайте тестовый файл и посмотрите его права по умолчанию:
- Уберите у себя право записи и попробуйте отредактировать файл, посмотрите, что произойдёт:
- Верните право записи и проверьте числовое значение прав:
Как проверить, что всё сделано правильно¶
- Шаг 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пуст или не задан, разворачивается в то же самое, и не защищено от этого.
Связанные статьи¶
Контрольные вопросы¶
- В чём разница между
/binи/usr/binв современном дистрибутиве Linux? - Почему sticky bit важен именно для
/tmp? - Что даёт
chmod 750 fileвладельцу, группе и всем остальным? - Почему
/procназывают «виртуальной» файловой системой, и что произойдёт, если попробовать проверить её размер черезdu?