Файловая система 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Символические ссылки (symlinks)
# Создать
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.12Symlink — указатель на другой файл. Если цель удалена — ссылка «висит» (broken symlink).
Жёсткие ссылки (hard links)
В отличие от 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 — крайний случай |
Связанные материалы
- filesystem-hierarchy — полная таблица FHS
- permissions-model — rwx, chmod, chown, SUID/SGID
- devices-and-disks — блочные устройства, mount, fstab, LVM
- manage-disks — практика: fdisk, mkfs, mount, LVM