February 26

Учим Linux: Файловая система

Введение

Давайте не будем вдаваться в элементарные подробности терминологии - что такое файловая система и тому подобное. Скажу лишь, что статья подготовлена для новичков и специалистов, желающих обновить свои знания. Я постарался написать коротко и по сути. Всего частей будет 11.

  1. 📁 Файловая система
  2. 👤 Пользователи и группы
  3. 🔐 Права доступа
  4. ⚙️ Процессы и система
  5. 🌐 Сеть
  6. 📋 Логи и мониторинг
  7. 🛡️ Hardening и безопасность
  8. 📦 Пакеты и обновления
  9. 🔧 Скриптинг и автоматизация
  10. 🔑 Криптография и сертификаты
  11. 🧩 Контейнеры (Linux-уровень)

Структура файловой системы

/
├── etc        # конфигурации системы и приложений
├── var        # переменные данные: логи, кэш, очереди
├── proc       # состояние ядра и процессов
├── sys        # устройства и драйверы
├── tmp        # временные файлы
├── home       # домашние директории пользователей
├── root       # домашняя директория суперпользователя
├── dev        # файлы устройств
├── usr        # программы и библиотеки
├── bin        # базовые утилиты (symlink на /usr/bin)
├── sbin       # команды администрирования (symlink на /usr/sbin)
├── opt        # сторонний софт
├── run        # runtime-данные процессов
├── mnt        # точки ручного монтирования
└── boot       # файлы загрузчика и ядро

Корневой каталог / - вершина всей иерархии. Всё остальное монтируется внутрь него. Рассмотрим ключевые каталоги подробнее.

/etc

От et cetera или Editable Text Configuration - здесь хранятся конфигурационные файлы всей системы. Настройки служб, сетевых параметров, пользователей - всё сюда. Важные файлы: /etc/passwd (пользователи), /etc/fstab (монтирование файловых систем), /etc/hosts (локальный DNS), /etc/ssh/sshd_config (настройки SSH-сервера).

/var

От variable - данные, которые постоянно меняются в процессе работы: логи (/var/log), почтовые очереди (/var/mail), спулеры (/var/spool), данные веб-серверов (/var/www). Именно сюда смотреть в первую очередь при диагностике проблем.

/proc

Виртуальная файловая система - файлы здесь не хранятся на диске, а генерируются ядром в реальном времени. Предоставляет информацию о запущенных процессах и состоянии ядра. Примеры: /proc/cpuinfo - информация о процессоре, /proc/meminfo - память, /proc/1/ - данные процесса с PID 1.

/sys

Ещё одна виртуальная ФС - интерфейс к устройствам и драйверам ядра. Позволяет читать и изменять параметры ядра и оборудования на лету. Широко используется при работе с сетевыми интерфейсами, дисками и другим железом.

/tmp

Временные файлы. Любой пользователь может создавать файлы здесь. Содержимое обычно очищается при перезагрузке или по таймеру (через systemd-tmpfiles). Не храните здесь ничего важного.

/home

Домашние каталоги обычных пользователей. Каждый пользователь получает свой подкаталог - /home/username. Здесь хранятся личные файлы, конфиги программ (скрытые папки вида .config, .ssh), документы.

/root

Домашний каталог суперпользователя. Намеренно вынесен отдельно от /home - для безопасности и доступности даже при проблемах с монтированием /home.

/dev

Файлы устройств - интерфейсы к аппаратному обеспечению. /dev/sda - первый жёсткий диск, /dev/sda1 - его первый раздел, /dev/null - «чёрная дыра» для ненужного вывода, /dev/zero - источник нулевых байт, /dev/random и /dev/urandom - генераторы случайных данных.


Навигация по файловой системе

ls - просмотр содержимого каталога

ls (от list) выводит список файлов и подкаталогов. Без аргументов показывает текущий каталог.

ls                    # Содержимое текущего каталога
ls /etc               # Содержимое /etc
ls -l                 # Подробный список: права, владелец, размер, дата
ls -a                 # Все файлы, включая скрытые (начинающиеся с точки)
ls -lh                # Подробный список с читаемым размером (KB, MB, GB)
ls -lt                # Сортировка по времени изменения (новые сверху)
ls -lS                # Сортировка по размеру (большие сверху)
ls -R                 # Рекурсивный вывод всех вложенных каталогов
ls -ld /etc           # Информация о самом каталоге, а не его содержимом

Флаги можно комбинировать. ls -lah - пожалуй, самая частая комбинация в работе: подробный список, скрытые файлы, читаемые размеры.

cd - смена текущего каталога

cd (от change directory) - основа навигации.

cd /etc               # Перейти в /etc (абсолютный путь)
cd logs               # Перейти в подкаталог logs (относительный путь)
cd ..                 # На уровень вверх
cd ../..              # На два уровня вверх
cd ~                  # В домашний каталог текущего пользователя
cd                    # То же самое, что cd ~
cd -                  # В предыдущий каталог (удобно для переключения между двумя)
cd /var/log           # Абсолютный путь от корня
cd - - очень удобная команда когда нужно быстро переключаться между двумя каталогами.

pwd - текущий рабочий каталог

pwd (от print working directory) выводит абсолютный путь к тому месту, где вы сейчас находитесь.

pwd# Вывод: /home/username/projects
pwd -P    # Показать реальный путь без symlink'ов
pwd -L    # Показать логический путь (по умолчанию)

find - поиск файлов и каталогов

find - мощный инструмент для поиска по имени, типу, размеру, правам, времени изменения и многому другому. Ищет рекурсивно в указанной директории.

# Поиск по имени
find . -name "*.log"              # Все .log файлы в текущем каталоге
find /etc -name "hosts"           # Файл hosts в /etc
find / -name "*.conf" 2>/dev/null # Все .conf файлы на всей системе, без ошибок
# Поиск по типу
find /var -type f                 # Только файлы (не каталоги)
find /etc -type d                 # Только каталоги
find /dev -type l                 # Только символические ссылки
# Поиск по размеру
find / -size +100M                # Файлы больше 100 MB
find /tmp -size -1k               # Файлы меньше 1 KB
# Поиск по времени
find /var/log -mtime -1           # Изменялись за последние 24 часа
find /tmp -atime +7               # Не открывались более 7 дней
# Поиск по правам и владельцу
find / -perm 777                  # Файлы с правами 777
find /home -user username         # Файлы конкретного пользователя
# Поиск + действие
find /tmp -name "*.tmp" -delete                 # Найти и удалить
find /var/log -name "*.log" -exec ls -lh {} \;  # Найти и выполнить команду

locate - быстрый поиск по базе данных

locate ищет не на диске в реальном времени, а по заранее собранной базе данных - поэтому работает значительно быстрее find. Минус: база не знает о файлах, созданных после последнего обновления.

locate passwd                  # Найти все пути, содержащие "passwd"
locate -i readme               # Поиск без учёта регистра
locate -c "*.conf"             # Подсчитать количество совпадений
locate -l 10 "*.log"           # Вывести максимум 10 результатов
sudo updatedb                  # Обновить базу данных вручную
В Ubuntu/Debian locate устанавливается отдельно. Начиная с Ubuntu 22.04 рекомендуется plocate вместо устаревшего mlocate — он быстрее за счёт более эффективного формата индекса: sudo apt install plocate. Команда locate при этом остаётся той же. База обновляется автоматически через cron/systemd-timer, обычно раз в сутки.

tree - дерево каталогов

tree визуализирует структуру каталогов в виде дерева - удобно для быстрого обзора проекта или системной директории.

tree                      # Дерево текущего каталога
tree /etc                 # Дерево /etc
tree -L 2                 # Ограничить глубину 2 уровнями
tree -L 3 /var            # /var на 3 уровня вглубь
tree -a                   # Включая скрытые файлы
tree -d                   # Только каталоги, без файлов
tree -f                   # Показывать полные пути
tree -h                   # Показывать размер файлов
tree -I "node_modules"    # Исключить каталог из вывода
Установка: sudo apt install tree

Работа с файлами и каталогами

cp - копирование

cp (от copy) копирует файлы и каталоги.

cp file.txt copy.txt              # Копировать файл
cp file.txt /tmp/                 # Скопировать в другой каталог
cp file1.txt file2.txt /tmp/      # Скопировать несколько файлов
cp -r dir1 dir2                   # Копировать каталог рекурсивно
cp -r dir1/ /backup/              # Копировать содержимое dir1 в /backup
cp -p file.txt copy.txt           # Сохранить права, владельца и временные метки
cp -u source.txt dest.txt         # Копировать только если source новее dest
cp -v file.txt /tmp/              # Подробный вывод (verbose)
cp -i file.txt existing.txt       # Спросить перед перезаписью

mv - перемещение и переименование

mv (от move) - и перемещение, и переименование делается одной командой.

mv old.txt new.txt                # Переименовать файл
mv file.txt /tmp/                 # Переместить файл в /tmp
mv file.txt /tmp/newname.txt      # Переместить и переименовать одновременно
mv dir1 dir2                      # Переименовать каталог
mv *.log /var/archive/            # Переместить все .log файлы
mv -i file.txt existing.txt       # Спросить перед перезаписью
mv -u source.txt dest.txt         # Переместить только если source новее
mv -v file.txt /tmp/              # Verbose-режим

rm - удаление

rm (от remove) удаляет файлы и каталоги.

Удалённые через rm файлы не попадают в корзину. Восстановление возможно, но сложно и не гарантировано. rm -rf - особо опасная команда, требует максимального внимания.
rm file.txt                   # Удалить файл
rm file1.txt file2.txt        # Удалить несколько файлов
rm *.tmp                      # Удалить все .tmp файлы
rm -i file.txt                # Запросить подтверждение
rm -r directory/              # Удалить каталог рекурсивно
rm -rf directory/             # Принудительное рекурсивное удаление без запроса
rm -v file.txt                # Verbose-режим - показывать что удаляется

mkdir - создание каталогов

mkdir (от make directory) создаёт новые каталоги.

mkdir new_dir                        # Создать каталог
mkdir dir1 dir2 dir3                 # Создать несколько каталогов
mkdir -p parent/child/grandchild     # Создать всю цепочку, если не существует
mkdir -m 755 secure_dir              # Создать с указанными правами
mkdir -v new_dir                     # Verbose-режим
mkdir -p незаменим в скриптах: без него команда упадёт с ошибкой при повторном запуске, если каталог уже существует. Флаг решает обе задачи сразу — «если каталог уже есть, всё в порядке; иначе создай его и все промежуточные».

touch - создание файлов и обновление временных меток

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

touch file.txt                    # Создать пустой файл
touch file1.txt file2.txt         # Создать несколько файлов
touch -m file.txt                 # Обновить только время модификации
touch -a file.txt                 # Обновить только время доступа
touch -t 202501011200 file.txt    # Установить конкретное время (YYYYMMDDhhmm)

ln - создание ссылок

ln (от link) создаёт жёсткие или символические ссылки.

Жёсткая ссылка (hard link) указывает на тот же inode, что и оригинал. Удаление исходного файла не уничтожает данные - они доступны через ссылку. Не работает между разными файловыми системами и не может ссылаться на каталоги.

Символическая ссылка (symlink) - указатель на путь к файлу или каталогу. Аналог ярлыка в Windows. Работает между ФС и с каталогами. При удалении оригинала ссылка становится битой.

ln file.txt hardlink.txt                  # Жёсткая ссылка
ln -s file.txt symlink.txt                # Символическая ссылка на файл
ln -s /etc/nginx/nginx.conf ~/nginx.conf  # Symlink с абсолютным путём
ln -s /var/www /srv/web                   # Символическая ссылка на каталог
ln -sf new_target.txt existing_link.txt   # Перезаписать существующий symlink
ls -la symlink.txt                        # Видно что это ссылка и куда ведёт

stat - подробная информация о файле

stat выводит полную информацию о файле: размер, тип, inode, права доступа, владелец, три временные метки.

stat file.txt
# Вывод:
#   File: file.txt
#   Size: 1024       Blocks: 8    IO Block: 4096  regular file
#   Device: 8,1      Inode: 131074    Links: 1
#   Access: (0644/-rw-r--r--)  Uid: (1000/username)   Gid: (1000/username)
#   Access: 2026-02-25 10:00:00
#   Modify: 2026-02-24 15:30:00
#   Change: 2026-02-24 15:30:00
stat /etc                       # Информация о каталоге
stat -f file.txt                # Информация о файловой системе, на которой лежит файл
stat --format="%n %s %U"        # Форматированный вывод: имя, размер, владелец

Три временные метки:

  • Access - последнее чтение файла
  • Modify - последнее изменение содержимого
  • Change - последнее изменение метаданных (права, владелец)

file - определение типа файла

file анализирует содержимое файла и определяет его тип - независимо от расширения.

file document.pdf          # Выведет: PDF document, version 1.6
file /bin/bash             # Выведет: ELF 64-bit LSB executable...
file archive.tar.gz        # Выведет: gzip compressed data...
file image.png             # Выведет: PNG image data, 1920 x 1080...
file script.sh             # Выведет: Bourne-Again shell script...
file unknown_file          # Полезно когда расширение неизвестно или отсутствует
file *                     # Определить тип всех файлов в текущем каталоге
file -i document.pdf       # MIME-тип вместо текстового описания

Просмотр содержимого файлов

cat - вывод содержимого файла

cat (от concatenate) выводит содержимое одного или нескольких файлов. Лучше всего подходит для коротких файлов.

cat file.txt                      # Вывести содержимое файла
cat file1.txt file2.txt           # Объединить и вывести два файла
cat -n file.txt                   # С номерами строк
cat -A file.txt                   # Показать спецсимволы ($ в конце строк, ^I для табуляции)
cat -s file.txt                   # Сжать несколько пустых строк в одну
cat /dev/null > file.txt          # Очистить файл (обнулить)
cat > newfile.txt                 # Создать файл и писать в него вручную (Ctrl+D для завершения)

less - постраничный просмотр

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

less /var/log/syslog
less +F /var/log/syslog          # Открыть в режиме отслеживания (как tail -f)
less -N file.txt                 # С номерами строк
less -S file.txt                 # Без переноса длинных строк

Управление внутри less:

more - упрощённый постраничный просмотр

more - предшественник less, умеет только прокручивать вперёд. Использовать less предпочтительнее, но more гарантированно есть на любой Unix-системе.

more /etc/passwd
more -5 file.txt         # Показывать по 5 строк

head - первые строки файла

head по умолчанию выводит первые 10 строк файла.

head file.txt                # Первые 10 строк
head -n 20 file.txt          # Первые 20 строк
head -n -5 file.txt          # Все строки, кроме последних 5
head -c 100 file.txt         # Первые 100 байт
head -q file1.txt file2.txt  # Несколько файлов без заголовков

tail - последние строки файла

tail по умолчанию выводит последние 10 строк.

tail file.txt                # Последние 10 строк
tail -n 20 file.txt          # Последние 20 строк
tail -n +5 file.txt          # Все строки, начиная с 5-й
tail -c 200 file.txt         # Последние 200 байт

tail -f - отслеживание файла в реальном времени

Флаг -f (от follow) держит файл открытым и выводит новые строки по мере их появления. Незаменим для мониторинга логов.

tail -f /var/log/syslog                  # Следить за системным логом
tail -f /var/log/nginx/access.log        # Следить за логом nginx
tail -fn 50 /var/log/auth.log            # Последние 50 строк + слежение
tail -f file1.log file2.log              # Следить за несколькими файлами
Ctrl+C для выхода из режима слежения. Если хотите следить за файлом даже после его ротации (пересоздания) - используйте tail -F (заглавная F).

Поиск внутри файлов

grep - поиск текста по шаблону

grep (от global regular expression print) ищет строки по шаблону в файлах или потоке данных. Одна из самых используемых команд в Linux.

grep "error" /var/log/syslog             # Строки содержащие "error"
grep -i "warning" file.txt               # Без учёта регистра
grep -n "root" /etc/passwd               # С номерами строк
grep -c "error" /var/log/syslog          # Подсчитать количество совпадений
grep -v "debug" app.log                  # Инвертировать: строки БЕЗ "debug"
grep -l "TODO" *.py                      # Только имена файлов с совпадениями
grep -w "root" /etc/passwd               # Только целые слова (не "rootdir")
grep -A 3 "error" file.log               # 3 строки после совпадения (After)
grep -B 2 "error" file.log               # 2 строки до совпадения (Before)
grep -C 2 "error" file.log               # По 2 строки до и после (Context)

grep -r - рекурсивный поиск

grep -r "function_name" .              # Во всех файлах текущего каталога
grep -r "TODO" /home/user/project      # В конкретном проекте
grep -rl "api_key" .                   # Только имена файлов рекурсивно
grep -r --include="*.py" "import" .    # Только в .py файлах
grep -r --exclude="*.log" "error" .    # Исключить .log файлы
grep -r --exclude-dir=".git" "fix" .   # Исключить каталог

grep -E - расширенные регулярные выражения

-E (или egrep) включает поддержку расширенного синтаксиса регулярных выражений.

grep -E "(error|fail|critical)" /var/log/syslog   # ИЛИ
grep -E "^root" /etc/passwd                       # Строки, начинающиеся с "root"
grep -E "bashquot; /etc/passwd                       # Строки, заканчивающиеся на "bash"
grep -E "[0-9]{1,3}\.[0-9]{1,3}" file.txt         # IP-адреса (упрощённо)
grep -E "^quot; file.txt                             # Пустые строки
grep -E "https?://" file.txt                      # http или https ссылки

awk - обработка и извлечение полей

awk - язык для построчной обработки текста. Особенно силён при работе с табличными данными, логами и файлами с разделителями.

Базовая модель: awk 'условие { действие }' файл. По умолчанию разделитель - пробел/tab, поля: $1, $2, ..., $NF (последнее поле), $0 - вся строка.

# /etc/passwd: user:x:uid:gid:info:home:shell
awk -F: '{print $1}' /etc/passwd                     # Имена всех пользователей
awk -F: '{print $1, $3}' /etc/passwd                 # Имя и UID
awk -F: '$3 >= 1000 {print $1}' /etc/passwd          # Только обычные пользователи (UID ≥ 1000)
awk -F: '{print $1": "$7}' /etc/passwd               # Форматированный вывод

# Работа с пробельным разделителем
awk '{print $1}' access.log                          # Первое поле (напр. IP в логе nginx)
awk 'NR==5' file.txt                                 # Вывести только 5-ю строку
awk 'NR>=5 && NR<=10' file.txt                       # Строки с 5 по 10# Встроенные переменные
awk '{print NR": "$0}' file.txt                      # Добавить номера строк
awk 'END{print NR}' file.txt                         # Подсчитать количество строк
awk '{sum += $1} END {print "Сумма:", sum}' numbers.txt  # Сложить числа из первого столбца

# BEGIN и END блоки
awk 'BEGIN{print "=== Пользователи ==="} -F: {print $1} END{print "=== Конец ==="}' /etc/passwd

sed - потоковый редактор

sed (от stream editor) обрабатывает текст построчно - заменяет, удаляет, вставляет, фильтрует. По умолчанию не изменяет исходный файл, а выводит результат в stdout.

# Замена
sed 's/old/new/' file.txt              # Заменить первое вхождение в каждой строке
sed 's/old/new/g' file.txt             # Заменить все вхождения (global)
sed 's/old/new/gi' file.txt            # Без учёта регистра
sed 's/root/admin/g' /etc/passwd       # Пример с реальным файлом

# Редактирование файла "на месте"
sed -i 's/old/new/g' file.txt          # Изменить файл (осторожно!)
sed -i.bak 's/old/new/g' file.txt      # Изменить файл, сохранив backup .bak

# Удаление строк
sed '/^#/d' config.txt                 # Удалить все комментарии (строки с #)
sed '/^$/d' file.txt                   # Удалить пустые строки
sed '5d' file.txt                      # Удалить 5-ю строку
sed '2,4d' file.txt                    # Удалить строки 2-4# Вывод конкретных строк
sed -n '5p' file.txt                   # Вывести только 5-ю строку
sed -n '5,10p' file.txt                # Строки 5-10
sed -n '/error/p' file.txt             # Строки содержащие "error"

# Добавление строк
sed '3a\Новая строка после 3-й' file.txt    # Добавить после строки 3
sed '1i\Заголовок' file.txt                 # Добавить перед строкой 1

В следующей части - пользователи и группы: создание, управление, /etc/passwd, /etc/shadow, sudo и всё что с этим связано. а пока держите Linux Cheatsheet — Файловая система

Навигация

Поиск файлов

Работа с файлами и каталогами

Просмотр содержимого

Поиск внутри файлов

Базовые команды терминала

Статья доступна на Хабе opensophy: https://hub.opensophy.com/docs/linux-filesystem/
Статьи, блоги и документации в первую очередь выходят и обновляются на Хабе с указанием автора и соавторов.

автор: @opensophy