Иерархия файловой системы
В Linux одно дерево файловой системы с корнем /. Filesystem Hierarchy Standard назначает каждому каталогу верхнего уровня роль: /etc для конфигурации, /var для изменяемого состояния, /proc и /sys для живых данных ядра. Всё, включая устройства и параметры ядра, — это файл.
На Windows у тебя есть C:\, D:\, C:\Program Files, C:\Users. На Linux есть ровно одно дерево с корнем в /. Всё — диски, USB-накопители, сетевые ресурсы, запущенные процессы и настройки ядра — выглядит как файл где-то в этом дереве. Сетевая карта — файл в /dev. Список запущенных процессов — директория в /proc. Параметр ядра для размеров TCP-буферов — файл в /proc/sys/net. Как только ты знаешь, где что живёт в дереве и почему, ты знаешь, куда смотреть, когда что-то в системе работает неправильно.
После этого урока ты сможешь ориентироваться в основных каталогах верхнего уровня, объяснить, что относится к /etc, /var, /usr, /proc, /sys, /dev и /home, а также использовать модель «всё есть файл» для чтения живого состояния системы из /proc.
Одно дерево, всё смонтировано в него. У Linux единое пространство имён с корнем в /. Дополнительные диски, разделы и сетевые файловые системы монтируются по конкретным путям внутри дерева — они не получают букв дисков. Второй диск может быть смонтирован в /mnt/data, USB-накопитель — в /media/alice/usb. С точки зрения каждой программы есть только одна файловая система.
Эта конструкция пришла из Unix: «всё есть файл». Не метафорически — ядро открывает аппаратные устройства, конечные точки межпроцессного взаимодействия и своё внутреннее состояние как записи в пространстве имён файловой системы. Чтение /dev/sda даёт сырые байты диска. Чтение /proc/1/status даёт информацию о PID 1. Запись в /sys/block/sda/queue/scheduler меняет планировщик дискового I/O во время работы.
/etc — статическая конфигурация. Исторически «et cetera», теперь канонное место для общесистемных конфигурационных файлов. Программы читают из /etc при запуске; они не пишут в него во время нормальной работы.
ls /etc | head -20
cat /etc/hostname # имя машины
cat /etc/os-release # идентификация дистрибутива
cat /etc/resolv.conf # конфигурация DNS-резолвера
ls /etc/systemd/system/ # файлы юнитов systemd, которые ты добавилПравило: если ты редактируешь поведение демона, ты редактируешь файл в /etc. Если конфигурационный файл отсутствует в /etc, демон возвращается к скомпилированным значениям по умолчанию.
/var — переменное (изменяемое) состояние. Всё, что меняется во время нормальной работы, живёт здесь: логи, очереди почты, базы данных пакетов, кэши, файлы блокировок.
ls /var/log/ # системные и прикладные логи
ls /var/lib/ # постоянное состояние приложений (база dpkg, контейнеры)
ls /var/cache/ # кэшированные данные, которые можно воссоздать
ls /var/run/ # (симлинк на /run) PID-файлы, сокеты
tail -f /var/log/syslog # следить за системным логом в реальном времениПрактическое следствие: если диск заполняется, /var/log часто является виновником. Если сервис не запускается из-за «не удаётся получить блокировку», файл блокировки обычно в /var/run или /var/lock. Размещение /var на отдельном разделе — классическая техника защиты сервера: рост логов не сможет заполнить корневой раздел и уронить ОС.
/usr — установленные программы. Сокращение от «Unix System Resources» (не «user»). Содержит подавляющее большинство установленного программного обеспечения:
/usr/bin— пользовательские исполняемые файлы (grep,vim,python3,nginx)/usr/lib— разделяемые библиотеки и приватные данные программ/usr/share— архитектурно-независимые данные (man-страницы, файлы локализации, иконки)/usr/local— программное обеспечение, которое ты скомпилировал и установил сам (не через пакетный менеджер)
Корневые /bin и /sbin теперь обычно являются симлинками на /usr/bin и /usr/sbin в современных дистрибутивах (так называемый «usr merge»). Это упрощает bind-монтирование и образы контейнеров.
which nginx # /usr/sbin/nginx
ls -la /bin # симлинк → /usr/bin на современном Debian/Ubuntu/proc и /sys — живые окна ядра. Это виртуальные файловые системы, генерируемые полностью в памяти ядра — ничего не записывается на диск. Чтение файла в /proc или /sys вызывает функцию ядра, которая собирает данные по запросу.
cat /proc/cpuinfo # модель CPU, ядра, функции
cat /proc/meminfo # использование RAM в байтах
cat /proc/loadavg # средняя нагрузка системы
cat /proc/uptime # секунды с момента загрузки
cat /proc/version # строка версии ядра
cat /proc/mounts # текущие смонтированные файловые системы
cat /proc/net/tcp # таблица TCP-сокетов в hex/dev хранит файлы устройств. /dev/null отбрасывает всё записанное в него. /dev/urandom предоставляет криптографически стойкие случайные байты. /dev/sda — первый SATA-диск. Символьные и блочные файлы устройств — механизм, с помощью которого программы пользователя взаимодействуют с железом через слой драйверов устройств ядра.
Диагностика переполнения диска без GUI.
df -h # использование диска по точкам монтирования (в человекочитаемом виде)
du -sh /var/log/* # размер каждой директории логов
du -sh /var/cache/apt/ # кэш пакетов aptВывод df показывает, какая файловая система заполнена. Если это /var, то du внутри /var/log находит виновников. Типичные причины: /var/log/journal (постоянный журнал systemd без настроенного ограничения размера), ротированные nginx-логи, которые никогда не удалялись, или кэш пакетов apt после многих обновлений.
# Очистить кэш apt для освобождения места
sudo apt clean
# Удалить старые журналы, оставив только последние 500 МБ
sudo journalctl --vacuum-size=500MОбе команды работают через ядро — apt clean удаляет файлы в /var/cache/apt/archives, journalctl --vacuum-size удаляет файлы журнала в /var/log/journal. Никакой магии: всё есть файл, файлы имеют размеры, размеры суммируются.
▸Почему это работает
macOS также имеет единое дерево файловой системы с корнем в /, и некоторые имена директорий совпадают (/etc, /tmp, /usr). Но FHS — стандарт Linux/GNU; у macOS свои соглашения. Приложения macOS живут в /Applications, данные пользователя — в ~/Library, и нет /var/log/syslog (используй log show вместо этого). При отладке на macOS пути отличаются, даже если концепция та же.
▸Частая ошибка
Никогда не храни данные приложения напрямую в / или /usr — они будут перезаписаны при обновлениях ОС или пакетов. Правильные места: конфигурация в /etc, постоянное состояние в /var/lib/<appname>, временные файлы в /tmp (очищается при перезагрузке) или /var/tmp (переживает перезагрузку). Приложения, пишущие в /usr, создают конфликты с пакетным менеджером и являются классическим источником ошибок «работало до обновления».
Ты читаешь файл /proc/1/status и видишь использование памяти PID 1 (systemd). Что именно произошло?
У Linux единое дерево файловой системы с корнем в /. Filesystem Hierarchy Standard назначает смысл каждому каталогу верхнего уровня: /etc для статической конфигурации, /var для изменяемого состояния и логов, /usr для установленных программ, /home для данных пользователей. /proc и /sys — виртуальные файловые системы, генерируемые в памяти ядра: чтение их запрашивает живое состояние ядра. /dev открывает железо как файлы. Принцип «всё есть файл» не метафора: устройства, процессы, параметры ядра и сетевые интерфейсы — все появляются как пути в дереве и могут быть прочитаны или записаны стандартным файловым I/O.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.