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

TL;DR: Всё — файл. Единый корень /. FHS стандартизирует структуру на всех дистрибутивах. /etc — конфиги, /home — пользователи, /var/log — логи, /tmp — временное.

Философия: всё — файл

В Linux всё представлено как файл: обычные файлы, директории, устройства (/dev/sda), процессы (/proc/1234), сетевые сокеты. Это позволяет работать с любым ресурсом одними инструментами (cat, echo, ls).

FHS (Filesystem Hierarchy Standard)

Все дистрибутивы следуют единому стандарту:

/                          корень (root directory)
├── /bin/                  основные команды (ls, cp, grep)
├── /sbin/                 системные команды (ifconfig, iptables)
├── /boot/                 kernel, bootloader (GRUB)
├── /dev/                  файлы устройств (sda, tty, null)
├── /etc/                  конфигурация системы
│   ├── passwd             пользователи (user:x:uid:gid:name:home:shell)
│   ├── shadow             хеши паролей (только root)
│   ├── group              группы
│   ├── hosts              локальный DNS
│   ├── fstab              монтирование дисков при загрузке
│   ├── sudoers            кто может sudo
│   └── systemd/system/    юниты systemd
├── /home/                 домашние директории пользователей
├── /root/                 домашняя root-пользователя
├── /lib/, /lib64/         системные библиотеки
├── /usr/                  пользовательские программы
│   ├── bin/               команды пользователей
│   ├── local/             локально установленное ПО
│   └── share/             общие данные (документация, иконки)
├── /var/                  переменные данные
│   ├── log/               логи системы и приложений
│   ├── cache/             кэши
│   └── tmp/               временные файлы приложений
├── /tmp/                  временные файлы (очищается при reboot)
├── /proc/                 процессы (виртуальная FS, в памяти)
├── /sys/                  информация о системе (виртуальная FS)
├── /run/                  runtime данные (PID, sockets)
├── /opt/                  стороннее ПО (большие приложения)
├── /srv/                  данные сервисов
├── /media/                автомонтирование (USB, CD)
└── /mnt/                  ручное монтирование

Абсолютные vs относительные пути

Абсолютный — от корня: /home/user/documents/file.txt. Однозначный, работает из любого места.

Относительный — от текущей директории: ../documents/file.txt. Короче, но зависит от pwd.

Специальные обозначения: . — текущая директория, .. — родительская, ~ — домашняя (/home/user), - — предыдущая (для cd -).

Типы файлов

СимволТипПример
-Обычный файл/etc/hosts
dДиректория/home/user/
lСимволическая ссылка/usr/bin/python → python3
bБлочное устройство/dev/sda (диск)
cСимвольное устройство/dev/tty (терминал)
sСокет/run/docker.sock
pИменованный канал (pipe)FIFO-файлы
# Первый символ в ls -l показывает тип
ls -la /dev/sda
# brw-rw---- 1 root disk 8, 0  /dev/sda
# ^-- b = block device
# Создать
ln -s /path/to/target /path/to/link
 
# Пример: альтернативная версия Python
ln -s /usr/bin/python3.12 /usr/local/bin/python
 
# Проверить куда ведёт
readlink -f /usr/local/bin/python
ls -la /usr/local/bin/python
# lrwxrwxrwx ... python -> /usr/bin/python3.12

Symlink — указатель на другой файл. Если цель удалена — ссылка «висит» (broken symlink).

В отличие от symlink, жёсткая ссылка — это дополнительное имя для того же inode (той же структуры данных на диске). Оба имени полностью равноправны — нет «оригинала» и «ссылки».

# Создать жёсткую ссылку
ln original.txt hardlink.txt
 
# Оба файла имеют одинаковый inode
ls -li original.txt hardlink.txt
# 12345 -rw-r--r-- 2 user user 100 ... original.txt
# 12345 -rw-r--r-- 2 user user 100 ... hardlink.txt
#   ↑                ↑
#   inode (одинаковый) счётчик ссылок = 2

Файл реально удаляется с диска только когда счётчик ссылок (link count) падает до нуля — то есть удалены все имена, указывающие на этот inode.

Символическая ссылкаЖёсткая ссылка
Что хранитПуть к цели (текст)Номер inode
Через границы ФСДаНет (inode уникален в пределах ФС)
На директорииДаНет (запрещено, во избежание циклов)
При удалении цели«Висит» (broken)Файл остаётся доступен через другое имя
Свой inodeДа (отдельный)Нет (общий с целью)
Видно что это ссылкаl в ls -lНе видно (только по счётчику > 1)

Файл физически удаляется с диска только когда счётчик жёстких ссылок падает до 0 и ни один процесс не держит файл открытым.

Скрытые файлы

Файлы начинающиеся с . — скрытые. Конфигурация хранится в домашней директории:

~/.bashrc          конфигурация bash
~/.ssh/            SSH ключи и конфиги
~/.config/         конфигурация приложений (XDG)
~/.local/          данные приложений
~/.gitconfig       конфигурация git
ls -la ~           # показать скрытые файлы

Местонахождение ядра

Файлы, критичные для загрузки системы, хранятся в /boot/:

/boot/
├── vmlinuz-6.8.0-generic          # сжатый образ ядра
├── initrd.img-6.8.0-generic       # initramfs (временная FS для загрузки)
├── System.map-6.8.0-generic       # таблица символов ядра (для отладки)
├── config-6.8.0-generic           # конфигурация, с которой собрано ядро
└── grub/                          # конфигурация загрузчика

Загружаемые модули ядра (драйверы, ФС, сетевые протоколы) хранятся в /lib/modules/<версия>/:

ls /lib/modules/$(uname -r)/
# kernel/    ← модули по категориям (drivers/, net/, fs/...)
# modules.dep ← зависимости между модулями
 
# Работа с модулями
lsmod                              # загруженные модули
modinfo ext4                       # информация о модуле
sudo modprobe module_name          # загрузить модуль
sudo modprobe -r module_name       # выгрузить модуль

Подробнее о загрузке: boot-process.

Подводные камни

СитуацияСовет
«Не нахожу файл»find / -name "filename" 2>/dev/null или locate filename
«Нет доступа»Проверить права: ls -la, использовать sudo для системных файлов
«Диск заполнен»df -h (свободное место), du -sh /var/* (что занимает)
«Удалил важный файл»В Linux нет корзины. Используйте бэкапы. extundelete — крайний случай

Связанные материалы