← Все статьи
INFRASTRUCTURE

Философия Unix/Linux и структура файловой системы

Разбираем философию Unix/Linux, стандартные потоки, конвейеры и назначение основных каталогов файловой системы.

Содержание статьи
  1. Что важно понять в начале
  2. Философия Unix: маленькие инструменты
  3. Одна утилита — одна основная задача
  4. Текст — универсальный формат обмена
  5. Команды можно соединять
  6. Стандартные потоки: stdin, stdout и stderr
  7. Всё ли в Linux является файлом
  8. Корень файловой системы `/`
  9. Основные каталоги Linux
  10. `/home`
  11. `/root`
  12. `/etc`
  13. `/var`
  14. `/tmp`
  15. `/usr`
  16. `/opt`
  17. `/srv`
  18. `/run`
  19. `/dev`
  20. `/proc`
  21. `/sys`
  22. Где размещать собственный сервис
  23. Как исследовать файловую систему безопасно
  24. Как эти идеи пригодятся дальше
  25. Итог

Linux часто начинают изучать со списка команд: ls, cd, cp, grep, chmod. Такой подход работает, но быстро приводит к механическому копированию инструкций. Гораздо полезнее сначала понять модель, на которой построена система.

В этой статье разберём философию Unix/Linux, устройство командной строки и структуру файловой системы. После этого будет проще понимать не только отдельные команды, но и инструкции для Docker, Caddy, PostgreSQL и собственных сервисов.

Что важно понять в начале

Linux — это не только ядро операционной системы. В повседневной работе мы имеем дело с ядром, файловой системой, shell, системными утилитами, службами и приложениями.

Главная идея Unix-подобных систем — составлять сложные действия из небольших понятных компонентов. Одна программа делает одну задачу, а результат можно передать другой программе.

Например, одна команда найдёт файлы, вторая отфильтрует строки, третья отсортирует результат. Вместо отдельной огромной программы администратор получает набор простых инструментов, которые можно комбинировать.

Философия Unix: маленькие инструменты

У Unix-подхода нет одной официальной формулы, но на практике особенно важны несколько принципов.

Одна утилита — одна основная задача

ls показывает содержимое каталога, grep ищет текст, sort сортирует строки, wc считает строки или символы. Каждая команда относительно проста, но вместе они позволяют решать сложные задачи.

ls -la /var/log
grep -Rni "error" /var/log

Первая команда показывает файлы логов, вторая ищет в них строки с error без учёта регистра и с номерами строк.

Текст — универсальный формат обмена

Многие настройки Linux хранятся в обычных текстовых файлах. Их можно открыть, проверить через Git, сравнить, передать по SSH или обработать скриптом.

Например, конфигурация сервиса может находиться в /etc, а журнал — в /var/log. Это не означает, что все файлы в Linux обязательно текстовые. Бинарные данные, базы и устройства устроены иначе, но текстовые конфигурации остаются важной частью системы.

Команды можно соединять

Результат одной команды можно использовать как вход для другой. Это называется конвейером, или pipeline.

find /var/log -type f | sort

Здесь find формирует список файлов, а sort сортирует этот список. Символ | передаёт стандартный вывод первой команды на стандартный ввод второй.

Стандартные потоки: stdin, stdout и stderr

У большинства консольных программ есть три стандартных потока:

  • stdin — стандартный ввод;
  • stdout — обычный вывод;
  • stderr — сообщения об ошибках.

По умолчанию вводом является клавиатура, а выводом — терминал. Но потоки можно перенаправлять.

Записать обычный вывод в файл:

printf '%s\n' 'проверка' > result.txt

Оператор > создаёт файл заново или перезаписывает его. Для добавления в конец используется >>:

printf '%s\n' 'ещё одна строка' >> result.txt

Перенаправить ошибки:

some-command 2> errors.log

Объединить обычный вывод и ошибки:

some-command > output.log 2>&1

В последней команде 2>&1 означает: направить поток ошибок туда же, куда сейчас направлен обычный вывод.

Всё ли в Linux является файлом

Фраза «в Linux всё — файл» является полезным упрощением, но не буквальным описанием каждого объекта.

Обычные файлы, каталоги, устройства и некоторые системные интерфейсы представлены способом, похожим на работу с файлами. Благодаря этому программы могут использовать единые операции чтения и записи.

Например:

  • обычный файл можно читать;
  • каталог можно перечислять;
  • устройство можно открывать через специальный файл в /dev;
  • информацию о процессах можно смотреть через виртуальную файловую систему /proc.

Это делает систему гибкой, но не означает, что любой объект можно редактировать обычным текстовым редактором.

Корень файловой системы /

В Linux нет отдельных дисков C: и D: в привычном для Windows виде. Есть единое дерево каталогов, начинающееся с корня /.

Примеры абсолютных путей:

/etc/ssh/sshd_config
/var/log/syslog
/home/alex/project

Первый символ / означает корень файловой системы. Путь /etc/ssh/sshd_config не имеет отношения к текущему каталогу: это абсолютный путь.

Относительный путь считается от текущего каталога:

./config/app.env
../backup/database.dump

Здесь . означает текущий каталог, а .. — родительский.

Текущий каталог можно узнать командой:

pwd

Основные каталоги Linux

Структура может немного отличаться между дистрибутивами, но назначение основных каталогов обычно похоже.

/home

Домашние каталоги обычных пользователей:

/home/alex
/home/deploy

Личные файлы, настройки shell, SSH-конфигурация и проекты пользователя обычно находятся здесь.

/root

Домашний каталог суперпользователя root. Это не то же самое, что корень файловой системы /.

/root

/etc

Системные конфигурационные файлы. Здесь можно встретить настройки SSH, пользователей, служб, сети и других компонентов.

Примеры:

/etc/ssh/
/etc/systemd/
/etc/hosts

Изменять файлы в /etc нужно внимательно: ошибка может повлиять на загрузку или доступ к серверу.

/var

Изменяемые данные, которые появляются во время работы системы:

  • логи в /var/log;
  • кэш в /var/cache;
  • очереди и состояние некоторых служб;
  • данные, которые не подходят для /etc.

Когда на сервере заканчивается место, /var — один из первых каталогов, который стоит проверить.

/tmp

Временные файлы. Не следует хранить здесь важные данные: содержимое может очищаться при перезагрузке или автоматически по правилам системы.

/usr

Программы, библиотеки и общие ресурсы, установленные системой. Несмотря на название, это не домашний каталог пользователя.

Часто встречаются:

/usr/bin
/usr/sbin
/usr/lib
/usr/share

/opt

Дополнительные приложения, которые устанавливаются отдельно от основной системы. Этот каталог часто используют для самостоятельных программ и сторонних пакетов.

/srv

Данные сервисов, которые система предоставляет наружу. Каталог не всегда используется конкретным приложением, но его назначение хорошо подходит для данных веб-сервисов.

/run

Временное состояние работающей системы: PID-файлы, Unix-сокеты и другая информация, необходимая активным службам. После перезагрузки содержимое обычно создаётся заново.

/dev

Специальные файлы устройств: дисков, терминалов и других объектов, с которыми может работать ядро.

Не следует удалять или изменять файлы в /dev без понимания их назначения.

/proc

Виртуальная файловая система с информацией о процессах и ядре. Здесь нет обычных файлов, которые хранятся на диске в привычном смысле.

Например:

cat /proc/loadavg
cat /proc/meminfo

/sys

Ещё один виртуальный интерфейс к информации о ядре, устройствах и драйверах. Для повседневной работы достаточно знать, что это системный каталог, а не место для хранения проектов.

Где размещать собственный сервис

Универсального единственного правила нет, но полезно разделять системные файлы, конфигурацию и данные приложения.

Например, проект можно разместить в:

/opt/my-service

или в:

/srv/my-service

Если сервис запускается от отдельного пользователя, его рабочий каталог может находиться в домашнем каталоге этого пользователя. Главное — не смешивать проект с системными файлами и заранее понимать, где будут:

  • конфигурация;
  • логи;
  • постоянные данные;
  • backup;
  • временные файлы.

Для Docker Compose каталог проекта часто содержит docker-compose.yml, Caddyfile и .env, а постоянные данные находятся в Docker volumes.

Как исследовать файловую систему безопасно

Начните с просмотра, не изменяя файлы:

pwd
ls -la /
ls -la /etc
ls -la /var/log
df -h
du -sh /var/* 2>/dev/null

Команда df -h показывает свободное место файловых систем. du -sh оценивает размер каталогов.

Перед любой операцией с системным каталогом полезно проверить:

  1. в каком каталоге вы находитесь (pwd);
  2. какой путь собираетесь использовать;
  3. что именно находится в каталоге (ls -la);
  4. от какого пользователя выполняете команду (whoami).

Особенно внимательно нужно относиться к командам, которые удаляют или перезаписывают файлы.

Как эти идеи пригодятся дальше

Философия Unix объясняет, почему администратор постоянно использует конвейеры, перенаправления и небольшие утилиты.

Структура файловой системы помогает понимать инструкции:

  • SSH-конфигурация находится в /etc/ssh;
  • системные логи — в /var/log;
  • пользовательские SSH-ключи — в ~/.ssh;
  • Compose-проект имеет собственный рабочий каталог;
  • данные PostgreSQL и n8n должны храниться в постоянных volumes;
  • секреты нельзя складывать в публичный каталог или случайный временный файл.

Следующая статья серии будет посвящена базовым командам терминала: перемещению по каталогам, созданию и копированию файлов, просмотру содержимого и безопасному редактированию через vi.

Итог

Linux проще изучать, если видеть в нём не набор загадочных команд, а систему из связанных принципов:

  • небольшие утилиты решают отдельные задачи;
  • команды соединяются через стандартные потоки;
  • конфигурация и данные находятся в предсказуемых местах;
  • файловая система представляет единое дерево от корня /;
  • системные каталоги имеют разное назначение;
  • перед изменением важно понимать путь, владельца и последствия операции.

Этой основы достаточно, чтобы уверенно перейти к терминалу и начать выполнять практические задачи на сервере.

Материал подготовил Злой админ