FHS: структура файловой системы Linux
Если открыть ls / на любом Linux-сервере, вы увидите 15-20 одинаковых директорий: bin, etc, var, tmp, home, usr, и так далее. Эти имена не случайные — это FHS (Filesystem Hierarchy Standard), документ, который описывает, что куда класть в Linux-системе.
Стандарт зародился в 1994 году. Цель — чтобы программы знали, где искать конфиги, логи и данные, независимо от дистрибутива. Сейчас этого почти соблюдают: Ubuntu, Debian, Fedora, RHEL — все следуют FHS (с минимальными отличиями).
В этом уроке разберём каждую главную директорию: что там лежит, что туда класть DE, что не надо трогать.
Карта верхнего уровня
Это всё, что нужно знать про корень. Дальше пройдёмся детально по тем, что важны для 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).
В /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:
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.
Если диск заполняется неожиданно — первым делом смотрите /var. Логи могут расти до десятков GB. du -hd 1 /var | sort -h покажет, какая подпапка съедает место.
/tmp — временные файлы
/tmp — место для очень временных файлов. Эти правила про /tmp:
- World-writable. Любой пользователь может писать в /tmp. Но удалять может только владелец (sticky bit, об этом в модуле 6).
- Удаляется при перезагрузке. На большинстве систем /tmp очищается при boot. Иногда — каждые N часов через systemd-tmpfiles.
- Маленькое место. На современных 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/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
Практическое правило:
Попробуй сам
Посмотрите свою систему:
# Размер каждой 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.