Философия Unix/Linux и структура файловой системы
Разбираем философию Unix/Linux, стандартные потоки, конвейеры и назначение основных каталогов файловой системы.
Содержание статьи
- Что важно понять в начале
- Философия Unix: маленькие инструменты
- Одна утилита — одна основная задача
- Текст — универсальный формат обмена
- Команды можно соединять
- Стандартные потоки: stdin, stdout и stderr
- Всё ли в Linux является файлом
- Корень файловой системы `/`
- Основные каталоги Linux
- `/home`
- `/root`
- `/etc`
- `/var`
- `/tmp`
- `/usr`
- `/opt`
- `/srv`
- `/run`
- `/dev`
- `/proc`
- `/sys`
- Где размещать собственный сервис
- Как исследовать файловую систему безопасно
- Как эти идеи пригодятся дальше
- Итог
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 оценивает размер каталогов.
Перед любой операцией с системным каталогом полезно проверить:
- в каком каталоге вы находитесь (
pwd); - какой путь собираетесь использовать;
- что именно находится в каталоге (
ls -la); - от какого пользователя выполняете команду (
whoami).
Особенно внимательно нужно относиться к командам, которые удаляют или перезаписывают файлы.
Как эти идеи пригодятся дальше
Философия Unix объясняет, почему администратор постоянно использует конвейеры, перенаправления и небольшие утилиты.
Структура файловой системы помогает понимать инструкции:
- SSH-конфигурация находится в
/etc/ssh; - системные логи — в
/var/log; - пользовательские SSH-ключи — в
~/.ssh; - Compose-проект имеет собственный рабочий каталог;
- данные PostgreSQL и n8n должны храниться в постоянных volumes;
- секреты нельзя складывать в публичный каталог или случайный временный файл.
Следующая статья серии будет посвящена базовым командам терминала: перемещению по каталогам, созданию и копированию файлов, просмотру содержимого и безопасному редактированию через vi.
Итог
Linux проще изучать, если видеть в нём не набор загадочных команд, а систему из связанных принципов:
- небольшие утилиты решают отдельные задачи;
- команды соединяются через стандартные потоки;
- конфигурация и данные находятся в предсказуемых местах;
- файловая система представляет единое дерево от корня
/; - системные каталоги имеют разное назначение;
- перед изменением важно понимать путь, владельца и последствия операции.
Этой основы достаточно, чтобы уверенно перейти к терминалу и начать выполнять практические задачи на сервере.