Перейти к содержанию

2. Файловая система и диски


Inodes, ссылки, ext4 vs XFS, монтирование и fstab, LVM/RAID/квоты и диагностика проблем типа «No space left on device».


Inodes и ссылки

Inode

Inode (index node) — структура на диске, хранящая метаданные файла: тип, права, владелец, размер, временные метки и указатели на блоки данных. Имя файла хранится в каталоге (каталог — список пар «имя → inode»). Один inode может быть доступен под разными именами (жёсткие ссылки) или через путь-алиас (символическая ссылка). Лимит числа файлов на разделе ограничен количеством inode (проверка: df -i).

Жёсткие и символические ссылки

  • Жёсткая ссылка (hard link) — ещё одна запись в каталоге с тем же inode. Файл существует, пока есть хотя бы одна жёсткая ссылка. Нельзя создать жёсткую ссылку на каталог и на другой раздел. Создание: ln file linkname.
  • Символическая (мягкая) ссылка (symlink) — отдельный файл, в котором записан путь к целевому файлу. Может указывать на каталог и на другой раздел; при удалении цели ссылка становится «битой». Создание: ln -s target linkname.

При «No space left on device» при свободных гигабайтах часто исчерпаны inode (много мелких файлов); смотреть df -i и при необходимости чистить или переносить мелкие файлы.


ext4 и XFS

ext4

ext4 — развитие ext3: журналируемая ФС, поддержка больших объёмов и файлов, экстенты (extents) для снижения фрагментации. Широко используется по умолчанию во многих дистрибутивах. Резервное расширение и сжатие (online resize) поддерживается; сжатие размера — с ограничениями и осторожностью.

XFS

XFS — журналируемая ФС, изначально ориентирована на большие файлы и высокую пропускную способность. Хорошо ведёт себя при больших последовательных операциях; при заполнении уменьшить раздел нельзя (только расширить). Метаданные и журнал отдельно; при сбоях возможна быстрая проверка. В RHEL/CentOS/Rocky часто выбирают XFS по умолчанию.

Краткое сравнение

Критерий ext4 XFS
Уменьшение раздела Ограниченно, с рисками Не поддерживается
Расширение онлайн Да Да
Много мелких файлов Обычно норма Может быть нагрузка на метаданные
Большие файлы, потоковая запись Хорошо Очень хорошо

Монтирование: mount, umount, fstab

mount / umount

Раздел или сетевая ФС становятся доступны в дереве каталогов после монтирования: ядро связывает точку монтирования с корнем этой ФС. Команды:

# Монтирование по устройству и точке
sudo mount /dev/sdb1 /mnt/data

# Размонтирование
sudo umount /mnt/data
# или по устройству
sudo umount /dev/sdb1

Если «device is busy» — какой-то процесс использует файлы на этой ФС; найти: lsof /mnt/data или fuser -vm /mnt/data, завершить процессы или выйти из каталога.

fstab

Файл /etc/fstab задаёт, что монтировать при загрузке: устройство (или UUID/LABEL), точку монтирования, тип ФС, опции, dump и fsck порядок. После добавления строки монтирование при старте выполнит systemd (systemd-fstab-generator). Проверка синтаксиса: sudo mount -a (смонтирует всё из fstab, что ещё не смонтировано).

Пример строки:

UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  /data  xfs  defaults  0 2

Использование UUID предпочтительно: имя устройства (/dev/sdb1) может меняться при добавлении дисков.


LVM (Logical Volume Manager)

LVM даёт абстракцию над дисками: физические тома объединяются в группу томов, из неё создаются логические тома, которые можно расширять (и при поддержке ФС — без остановки сервисов).

PV, VG, LV

  • PV (Physical Volume) — блочное устройство (диск или раздел), включённое в LVM: pvcreate /dev/sdb, pvdisplay.
  • VG (Volume Group) — группа из одного или нескольких PV; пул места: vgcreate myvg /dev/sdb, vgextend myvg /dev/sdc.
  • LV (Logical Volume) — «виртуальный» раздел внутри VG, на который создаётся ФС: lvcreate -L 10G -n mylv myvg, lvextend -L +5G /dev/myvg/mylv (или -l +100%FREE).

После расширения LV нужно расширить файловую систему:

  • ext4: sudo resize2fs /dev/myvg/mylv
  • XFS: sudo xfs_growfs /mount/point (у XFS расширение только «вперёд», по точке монтирования).

Практика: создать LVM и расширить без downtime

# Создать PV на диске
sudo pvcreate /dev/sdb

# Создать VG
sudo vgcreate myvg /dev/sdb

# Создать LV и ФС
sudo lvcreate -L 10G -n data myvg
sudo mkfs.xfs /dev/myvg/data
sudo mount /dev/myvg/data /data

# Добавить диск в VG и расширить LV без остановки
sudo pvcreate /dev/sdc
sudo vgextend myvg /dev/sdc
sudo lvextend -l +100%FREE /dev/myvg/data
sudo xfs_growfs /data

RAID (0 / 1 / 5 / 10)

RAID — объединение нескольких дисков для отказоустойчивости и/или производительности. Кратко:

Уровень Описание Минимум дисков Отказоустойчивость Использование
0 Чередование (striping); данные размазаны по дискам. 2 Нет Максимальная скорость, риск потери при отказе любого диска.
1 Зеркало (mirror); полная копия на каждом диске. 2 Да (один диск). Надёжность, ограниченный объём.
5 Чередование + распределённая чётность; один блок на N дисков под чётность. 3 Да (один диск). Баланс объёма и надёжности.
10 Зеркало пар + чередование (1+0). 4 Да (до одного диска в каждой паре). Высокая надёжность и производительность.

В Linux RAID часто реализуют через mdadm (программный RAID) или аппаратный контроллер. Для DevOps важно понимать: при RAID 0 данные теряются при отказе любого диска; при 1/5/10 — восстановление из деградированного массива (replace failed disk, rebuild).


Квоты (Quotas)

Квоты ограничивают использование места или число inode пользователем или группой на разделе. Включение: опция usrquota/grpquota в fstab (или при mount), затем quotacheck, quotaon. Настройка лимитов: setquota или edquota. Проверка: quota -s, repquota. Важно при мультитенантных окружениях и общих домашних каталогах, чтобы один пользователь не исчерпал место на разделе.


Практика

Восстановить файл после удаления (через inode)

Если файл удалён (rm), но процесс ещё держит его открытым, содержимое остаётся на диске до закрытия дескриптора. По имени восстановить нельзя; если известен inode (например, из логов или из /proc/<pid>/fd), можно скопировать данные из открытого дескриптора:

# Найти процесс, держащий удалённый файл (показывает inode и путь)
sudo lsof +L1
# или по процессу
ls -la /proc/<pid>/fd/

# Скопировать содержимое через дескриптор (inode всё ещё существует, пока процесс держит fd)
sudo cp /proc/<pid>/fd/<fd_number> /path/to/recovered_file

Если процесс уже закрыл файл, восстановление с ext4/XFS без специализированных утилит и бэкапов обычно невозможно. Поэтому важно не убивать процесс, пока не скопировали данные из fd.

Найти причину «No space left on device»

  1. Место на разделе: df -h — какой раздел заполнен (часто / или /var).
  2. Inode: df -i — если свободно место, но inode 100% — удалять или переносить мелкие файлы, чистить кэши (например, пакетный кэш в /var).
  3. Кто съедает: du -sh /var/*, du -sh /var/log/* и т.д.; часто логи, временные файлы, дампы.
  4. Удалённые файлы, ещё открытые процессами: lsof +L1 — такие файлы не освобождают место до закрытия; перезапуск сервиса освободит.

!!! tip "Практика"

При инциденте с местом: 1) df -h и df -i; 2) du по крупным каталогам; 3) при необходимости lsof +L1; 4) очистка логов/кэша или расширение тома (LVM + growfs).

Паттерны и антипаттерны

Паттерн Описание
В fstab использовать UUID Имена устройств меняются; UUID стабилен.
Мониторить место и inode Алерты по 85–90% заполнения и по inode, чтобы не доводить до «No space».
Расширять LVM по шагам pvcreate → vgextend → lvextend → resize2fs/xfs_growfs.
Антипаттерн Почему плохо Что делать
Убивать процесс с открытым удалённым файлом Данные станут недоступны. Сначала скопировать из /proc//fd.
Расширять XFS «назад» XFS не поддерживает сжатие тома. Планировать размер заранее или использовать ext4, если нужно сжимать.

Дополнительные материалы