Learning Platform
Глоссарий Troubleshooting
Урок 05.01 · 20 мин
Начальный
LinuxFHSFilesystemDirectory Structure

FHS: структура файловой системы Linux

Если открыть ls / на любом Linux-сервере, вы увидите 15-20 одинаковых директорий: bin, etc, var, tmp, home, usr, и так далее. Эти имена не случайные — это FHS (Filesystem Hierarchy Standard), документ, который описывает, что куда класть в Linux-системе.

Стандарт зародился в 1994 году. Цель — чтобы программы знали, где искать конфиги, логи и данные, независимо от дистрибутива. Сейчас этого почти соблюдают: Ubuntu, Debian, Fedora, RHEL — все следуют FHS (с минимальными отличиями).

В этом уроке разберём каждую главную директорию: что там лежит, что туда класть DE, что не надо трогать.


Карта верхнего уровня

Главные директории корня Linux
/Корень файловой системы. ВСЕ файлы в Linux находятся внутри. Нет 'C:\\' и 'D:\\' — только один корень. Диски монтируются внутрь корня
/binБазовые команды для всех (ls, cp, cat, bash). Раньше отделялось от /usr/bin, сейчас обычно symlink в /usr/bin
/sbinКоманды для администратора (mount, fsck, shutdown). Требуют root для использования. Тоже обычно symlink в /usr/sbin
/usrUser Specific Resources. /usr/bin, /usr/sbin, /usr/lib — большинство программ системы. Обычно read-only
/etcEt Cetera. Конфиги всей системы. /etc/passwd, /etc/ssh/sshd_config, /etc/cron.d/. Текстовые, можно редактировать
/varVariable data. Логи, кеши, БД, mailspools. /var/log, /var/lib, /var/cache. Растёт со временем
/tmpTemporary files. Удаляется при перезагрузке (обычно). World-writable (любой может писать)
/homeДомашние директории пользователей. /home/alice, /home/bob. Здесь работают пользователи
/rootДомашняя директория root. Отдельно от /home, потому что /home может быть на другом диске, а root home должен быть всегда доступен
/optOptional. Сторонние пакеты, не входящие в дистрибутив. Например, /opt/google/chrome, /opt/spark
/procВиртуальная файловая система ядра. Информация о процессах: /proc/1234/status, /proc/cpuinfo. Не на диске, генерируется ядром
/sysВиртуальная FS для kernel objects. Драйверы, устройства, hardware: /sys/class/, /sys/devices/. Можно записывать для управления
/devDevice files. /dev/null, /dev/sda1, /dev/tty. Special files для общения с драйверами
/bootBootloader, kernel images. GRUB-конфиги, vmlinuz-*, initrd-*. Маленький, обычно 500MB
/mntMount points для временного монтирования (USB-флешка, network share). Не для постоянного
/mediaАвто-mount съёмных носителей (USB, CD). Используется системой автоматически

Это всё, что нужно знать про корень. Дальше пройдёмся детально по тем, что важны для DE.


/etc — конфигурация всей системы

/etc (et cetera — «и прочее») — это место, где живут конфиги ВСЕХ системных программ. По FHS — только текстовые конфиги, никаких бинарных файлов.

Что DE встречает в /etc:

$ ls /etc | head -20
adduser.conf
alternatives/
apparmor.d/
apt/
bash.bashrc                # глобальный .bashrc для всех пользователей
ca-certificates/           # корневые сертификаты для SSL
cron.d/                    # дополнительные cron-задачи
cron.daily/                # скрипты, запускаемые ежедневно
crontab                    # системный crontab
environment                # глобальные переменные окружения
fstab                      # таблица монтирования файловых систем
group                      # список групп
hostname                   # имя хоста
hosts                      # локальный DNS (mapping IP -> name)
passwd                     # список пользователей (но не пароли!)
profile                    # глобальный profile для всех login shells
shadow                     # пароли пользователей (хешированные), только root
ssh/                       # конфиг SSH (sshd_config, ssh_config)
sudoers                    # правила sudo
systemd/                   # юниты systemd

Самые важные для DE:

  • /etc/hosts — локальный mapping IP-адресов на имена. Полезно для override DNS («сделать так, чтобы api.example.com резолвилось в localhost для тестирования»).
  • /etc/fstab — таблица монтирования. Если монтируете additional диски для хранилища данных.
  • /etc/cron.d/ — cron-задачи. ETL-скрипты по расписанию обычно тут.
  • /etc/systemd/system/ — кастомные systemd-сервисы (например, ваш Airflow worker).
  • /etc/passwd и /etc/group — пользователи и группы (модуль 6).
WARNING

В /etc редактируете ТОЛЬКО как root (через sudo). Многие файлы доступны только на чтение для обычных пользователей. Редактирование /etc/passwd или /etc/sudoers неправильно может заблокировать ваш доступ к системе. Делайте backup перед изменением: sudo cp /etc/sudoers /etc/sudoers.bak.


/var — переменные данные

/var — место для всего, что меняется во время работы системы. Логи растут, БД пишутся, кеши накапливаются.

$ ls /var
backups/      cache/        crash/        lib/          local/
lock/         log/          mail/         opt/          run/
spool/        tmp/

Что важно для DE:

Подразделы /var для DE
/var/logГлавное место логов. /var/log/syslog (общий), /var/log/auth.log (вход в систему), /var/log/nginx/, /var/log/postgresql/. Где живут логи Airflow зависит от настройки
/var/libState Files программ. /var/lib/postgresql/data — БД Postgres, /var/lib/docker — Docker storage, /var/lib/mysql
/var/cacheКеши, которые можно безопасно удалить (программа их пересоздаст). apt, pip, dnf — все хранят cache здесь
/var/tmpPersistent temp (НЕ удаляется при reboot, в отличие от /tmp). Для временных файлов, которые нужны несколько дней
/var/runPID-файлы запущенных сервисов: /var/run/nginx.pid содержит PID процесса nginx. Чаще теперь /run
/var/spoolОчереди: /var/spool/cron — пользовательские crontabs, /var/spool/mail — почта

Junior DE регулярно сталкивается с /var/log/:

# Системный лог
$ sudo tail -50 /var/log/syslog

# Конкретного сервиса
$ sudo tail -f /var/log/nginx/error.log

# Логи Postgres
$ sudo ls /var/log/postgresql/
postgresql-17-main.log     postgresql-17-main.log.1.gz

На современных systemd-системах часть логов уехала в journald (бинарный формат, доступ через journalctl), но многие сервисы всё ещё пишут текстом в /var/log/. Подробнее про journalctl — в модуле 15.

TIP

Если диск заполняется неожиданно — первым делом смотрите /var. Логи могут расти до десятков GB. du -hd 1 /var | sort -h покажет, какая подпапка съедает место.


/tmp — временные файлы

/tmp — место для очень временных файлов. Эти правила про /tmp:

  1. World-writable. Любой пользователь может писать в /tmp. Но удалять может только владелец (sticky bit, об этом в модуле 6).
  2. Удаляется при перезагрузке. На большинстве систем /tmp очищается при boot. Иногда — каждые N часов через systemd-tmpfiles.
  3. Маленькое место. На современных Ubuntu /tmp часто tmpfs (в RAM), размером 50% от RAM. Не клайте туда 100GB.

Когда полезно /tmp для DE:

# Промежуточные файлы в pipeline
$ TMPFILE=$(mktemp /tmp/etl-XXXXXX.csv)
$ curl https://api.example.com/data > "$TMPFILE"
$ process_data.py "$TMPFILE" > /var/data/result.csv
$ rm "$TMPFILE"

mktemp — это правильный способ создать tmp-файл. Он генерирует уникальное имя (заменяет XXXXXX на случайные символы), предотвращает race condition (когда два процесса берут одно имя).

Никогда не пишите большие данные в /tmp. Если ETL-pipeline качает 50GB паркетов — используйте /var/data/ или специальную /scratch директорию, согласованную с devops.


/home и /root

/home — папка для пользовательских домашних директорий:

$ ls /home
alice  bob  charlie

Каждый пользователь имеет свою /home/имя/. Туда же ссылается ~ в shell (echo $HOME покажет ваш путь).

/root отдельно от /home, потому что:

  • Иногда /home монтируется с отдельного диска или с сети (NFS). Если в момент load /home недоступен — root всё равно может войти и починить.
  • Безопасность: root-данные не смешиваются с user-данными.

В DE с /home встречаемся постоянно: dot-files (.bashrc, .ssh/, .aws/), репозитории, виртуальные среды Python.


VFS: виртуальная файловая система как абстракция ядра

/proc и /sys — виртуальные файловые системы

/proc и /sys — это не настоящие файлы на диске. Это интерфейсы ядра, представленные в виде файловой системы. Когда вы читаете /proc/cpuinfo, ядро на лету генерирует ответ.

$ cat /proc/cpuinfo | head -20
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model name  : Intel(R) Xeon(R) Platinum 8488C
...

$ cat /proc/meminfo | head -5
MemTotal:       16384000 kB
MemFree:         8192000 kB
MemAvailable:   12288000 kB
Buffers:          524288 kB
Cached:          3145728 kB

$ ls /proc | head -10
1            # процесс с PID 1
1234         # процесс с PID 1234
buddyinfo
cgroups
cmdline
consoles
cpuinfo
crypto
devices
diskstats

В /proc/PID/ — детальная информация о процессе:

$ ls /proc/$$    # $$ — PID текущего shell
cmdline       # как был запущен (полная команда)
cwd           # текущая директория (symlink)
environ       # переменные окружения
exe           # путь к исполняемому файлу (symlink)
fd/           # открытые file descriptors
limits        # лимиты процесса (memory, files, cpu)
maps          # карта памяти
mounts        # видимые монтирования (внутри namespace)
status        # статус, RAM usage, signals

Это супер-полезно для отладки: «какие файлы открыл процесс?» — ls -l /proc/PID/fd/. «Сколько памяти?» — cat /proc/PID/status | grep Vm.

/sys — это интерфейс к kernel objects: устройства, драйверы, hardware. Записывая в файлы /sys можно управлять системой:

# Узнать текущий governor процессора
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
performance

# Узнать размер диска
$ cat /sys/block/sda/size
1953525168

Подробнее про /proc и /sys — в модулях 09 (процессы) и 13 (диски).

/proc и /sys как инструменты наблюдения за ядром

/dev — устройства как файлы

В Unix всё — файл. Включая устройства. /dev/sda — это SSD/HDD как файл (читать = читать с диска, писать = записать на диск напрямую). /dev/tty — текущий терминал. /dev/null — чёрная дыра (всё, что туда пишется, исчезает).

Полезные файлы в /dev
/dev/nullЧёрная дыра. `cmd > /dev/null` — выкинуть stdout. `cmd 2>/dev/null` — выкинуть stderr. `cmd > /dev/null 2>&1` — выкинуть всё
/dev/zeroБесконечный поток нулевых байтов. Полезно для тестов: `head -c 1G /dev/zero > test.dat` — создать файл 1GB
/dev/randomКриптографически случайные байты. /dev/urandom — то же, но не блокируется при нехватке энтропии
/dev/sda /dev/nvme0n1Физические диски. /dev/sda1 — первый раздел. Записывать туда напрямую = катастрофа
/dev/ttyТекущий терминал. `echo 'hi' > /dev/tty` пишет в окно, даже если stdout перенаправлен
/dev/pts/NPseudo-terminals (новые табы терминала)

/dev/null — это самый используемый «файл» в DE-практике:

# Запустить процесс в фоне, выкинуть все логи
$ ./long_etl.py > /dev/null 2>&1 &

# Проверить, есть ли команда (тихо)
$ if command -v jq > /dev/null 2>&1; then echo "jq installed"; fi

/opt — third-party software

/opt — место для независимых программ, не входящих в дистрибутив. Это удобно: каждая программа в своей папке, легко удалить (rm -rf /opt/spark).

$ ls /opt
google/         # Google Chrome
spark/          # Apache Spark
airflow/        # ваш Airflow

Каждая папка обычно содержит свой bin/, lib/, etc/. Софт «привязан к /opt/», не пытаясь использовать системные пути.

В DE здесь часто живут:

  • Spark (если установлен не через apt)
  • Hadoop
  • Java-приложения (Kafka, Elasticsearch)
  • Кастомные DE-tools, написанные внутри компании

Куда класть свои данные/скрипты как DE

Практическое правило:

Куда что класть для DE-сервера
Скрипты компанииETL-скрипты, DAG-и Airflow. Обычно в репозитории кода, который deploy в /opt/company/ или /srv/company/
Данные (большие)Сырые CSV/parquet файлы. НЕ в /home (мало места). Часто отдельный диск, смонтированный в /data или /var/data
Логи DAGЛоги Airflow обычно в /var/log/airflow/ или прямо в репозитории airflow в logs/. systemd-сервисы — в journald (journalctl)
Промежуточные tempДля небольших файлов pipeline. mktemp в /tmp если меньше GB. Иначе свой /scratch
Конфиги сервисовairflow.cfg, k8s manifests — обычно в репо с кодом. systemd-юниты — в /etc/systemd/system/
BackupsБазовый бэкап-каталог обычно /var/backups/. На проде часто отдельный mount /backup/

Попробуй сам

Посмотрите свою систему:

# Размер каждой top-level папки
$ sudo du -hd 1 / 2>/dev/null | sort -h
4.0K   /tmp
8.0K   /mnt
16K    /media
24K    /opt
...
2.3G   /usr
5.1G   /var
7.5G   /home

# Информация о ядре через /proc
$ cat /proc/version
Linux version 7.0.0-23-generic (buildd@lcy02-amd64-001) (gcc-13 ...)

# Информация о памяти
$ cat /proc/meminfo | head -3
MemTotal:       16384000 kB
MemFree:         8192000 kB
MemAvailable:   12288000 kB

# Список процессов через /proc
$ ls /proc/ | grep -E '^[0-9]+$' | head -10
1
234
567
...

# Открытые файлы вашего shell
$ ls -l /proc/$$/fd
total 0
lrwx------ 1 user user 64 May 13 14:00 0 -> /dev/pts/0
lrwx------ 1 user user 64 May 13 14:00 1 -> /dev/pts/0
lrwx------ 1 user user 64 May 13 14:00 2 -> /dev/pts/0

Видите: fd 0 (stdin), 1 (stdout), 2 (stderr) — все подключены к pts/0 (вашему терминалу). Это та цепочка из урока 2.1.


Проверка знанийKnowledge check
DE-сервер забивается диском. /var вырос до 50GB. Какие шаги диагностики?
ОтветAnswer
Систематический подход. (1) Узнать, какие подпапки /var съели место: `sudo du -hd 1 /var | sort -h`. Скорее всего, /var/log или /var/lib огромные. (2) Если /var/log: смотреть, какой сервис: `sudo du -hd 1 /var/log | sort -h`. Часто журналы Postgres, nginx или какой-то приложение, забившее лог-файл (не rotation). Решение: настроить logrotate, удалить старые логи. (3) Если /var/lib: возможно, /var/lib/docker (старые образы и volumes), /var/lib/postgresql (data сама БД), /var/lib/apt (кеш скачанных пакетов). Чистить через `docker system prune -a`, `apt clean`, или backup+migrate базы на больший диск. (4) Профилактика: настроить мониторинг disk-space (alert при 80%), включить logrotate для собственных приложений, периодически чистить /tmp и /var/cache. Подробнее про работу с дисками — в модуле 14.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 5. Что такое FHS?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 5