Файловая система
Редактировать на GitHubcat a и почему?Как удалить файл с именем -rf?Как посмотреть описание дескриптора?Как посмотреть время последней модификации файла?Что такое inode? Какая информация там хранится?Что такое hard link? В чем разница между hard link и soft link? Примеры. EDITЧто такое файловый дескриптор, что там хранится?Какие бывают атрибуты файлов в Linux и что они значат?Что такое блочные устройства в Linux? Какие элементарные операции можно с ними выполнять?Что такое символьные устройства в Linux? Какие элементарные операции можно с ними выполнять?Что такое major и minor номера блочных устройств в Linux? Чему они соответствуют?Практические вопросыРазница между t.sh, . t.sh, "/t.sh" и ./t.shЕсть смонтированная файловая система размером 100 ГБ. На ней был файл размером 10 ГБ. Файл удалили, но место не освободилось. Файл реально отсутствует в каталоге, файловая система жива, не в режиме read-only. Почему так происходит и как это диагностировать/исправить?Файловая система (ext2/ext3/ext4 — значения не имеет) имеет 100 ГБ свободного места. Пытаешься записать файл размером 10 ГБ, но получаешь ошибку “No space available”. В чём может быть проблема?Если удалить файл размером 10 ГБ, но на него существует hardlink — освободится ли место?Файл имеет права 777. Я — root. При удалении получаю Operation not permitted. Почему?Теоретические вопросы
Что такое файл в понятиях Unix-like операцинных системах?
Файлы - это объекты, в которые мы записываем информацию и наши данные, исполняемые файлы, но кроме этих привычных нам понятий здесь есть файлы специального назначения - файлы устройств, файлы туннелей, сокетов и многое другое.
Типы файлов в Linux:
- Обычные файлы, для хранения информации;
- Специальные файлы - для устройств и туннелей;
- Директории.
Где хранятся имена файлов/директорий?
В Unix имена файлов и директорий хранятся в каталогах — это специальные файлы, где каждая запись содержит имя и ссылку на inode. Сам inode хранит уже метаданные (размер, права, владельца, временные метки и указатели на блоки данных), но не имя. Таким образом, имя → в каталоге, а содержимое и свойства файла → в inode и блоках данных.
В каком файле находится информация о смонтированных каталогах в файловую систему?
Файл /etc/fstab содержит информацию о смонтированных каталогах в файловую систему.
Что выведет команда cat a и почему?
mkdir /tmp/abc
cd /tmp/abc
ls >a 2>b
cat aОбработка команды идёт справа налево. Сначала создается файл b, потом создается файл a, команда ls отображает список файлов в текущей директории (файлы a и b уже созданы) в одну колонну и перенаправляет стандартный поток вывода (>) в файл a, а стандартный поток ошибок 2 в файл b.
Как удалить файл с именем -rf?
rm ./-rfКак посмотреть описание дескриптора?
Посмотреть полную информацию по дискриптору возможно командой
stat <path_to_file>Как посмотреть время последней модификации файла?
Можно через stat с нужным форматом:
stat --format=%y <file>Что такое inode? Какая информация там хранится?
Inode (индексный дескриптор) - структура данных, в которой хранятся метаданные файла и перечислены блоки с данными файла. Хранит всю информацию, кроме имени файла и данных. Каждый файл в данном каталоге является записью с именем файла и номером индекса. Вся остальная информация о файле извлекается из таблицы индексов путем ссылки на номер индекса. Номера inodes уникальны на уровне раздела. Каждый раздел как собственная таблица индексов. Если у вас закончились inode, вы не можете создавать новые файлы, даже если у вас есть свободное место на данном разделе.
Inodes хранит метаданные о файле, к которому он относится. Эти метаданные содержат всю информацию об указанном файле.
- Размер.
- Разрешение.
- Владелец/группа.
- Расположение жесткого диска.
- Дата/время.
- Любая другая необходимая информация.
Что такое hard link? В чем разница между hard link и soft link? Примеры. EDIT
Hard link: Ссылка на файл в файловой системе с использованием такого же inode идентификатора, как у файла, на который ссылаемся. Создадим файл realFile.
touch realFileСоздадим hard link командой ln <целевой_файл> <файл_ссылка>:
ln realFile hardLinkПроверим, что inode у файла realFile и hard ссылке hardLink имеют одинаковый идентификатор.
$ ls -li
итого 0
2359720 -rw-r--r-- 2 rmntrvn rmntrvn 0 апр 25 23:24 hardLink
2359720 -rw-r--r-- 2 rmntrvn rmntrvn 0 апр 25 23:24 realFileКак видно realFile и hardLink имеют одинаковый идентификатор inode.
Soft link: Создадим soft ссылку на файл realFile.
ln -s realFile softLinkПроверим, что числовой идентификатор softLink отличается от числового идентификатора realFile.
$ ls -li
итого 0
2359720 -rw-r--r-- 2 rmntrvn rmntrvn 0 апр 25 23:24 hardLink
2359720 -rw-r--r-- 2 rmntrvn rmntrvn 0 апр 25 23:24 realFile
2366763 lrwxrwxrwx 1 rmntrvn rmntrvn 8 апр 25 23:29 softLink -> realFileНекоторые нюансы:
-
Soft ссылки используют различные номера inode, чем основные файлы.
-
Soft ссылки становятся полезными, если исходный файл был удален.
-
Soft ссылки могут быть созданы из каталогов.
-
Soft ссылка может быть создана на пересечении файловых систем.
-
Hard ссылка может размещаться только на том же логическом разделе, что и оригинальный файл. Это связано с независимой идентификацией файлов на разных разделах.
-
Создание жестких ссылок не поддерживается для папок — только для файлов.
-
Файловая система должна поддерживать работу с hard ссылками.
Что такое файловый дескриптор, что там хранится?
Файловый дескриптор - неотрицательное целое число, которое используется в интерфейсе между пространством пользователя и пространством ядра (kernel) для идентификации ресурсов файла / сокета. Когда создаётся новый поток ввода-вывода, ядро возвращает процессу, создавшему поток ввода-вывода, его файловый дескриптор.
Какие бывают атрибуты файлов в Linux и что они значат?
Атрибуты - это специальные флаги на уровне файловой системы (ext2/3/4, XFS и др.), которые дополняют стандартные права (rwx).
Смотреть и изменять их можно командами:
lsattr <файл или каталог> # просмотр атрибутов
chattr +<флаг> <файл> # установка
chattr -<флаг> <файл> # снятие| Флаг | Название | Значение |
|---|---|---|
| i | immutable | Файл нельзя изменить, удалить, переименовать или записать в него (даже root). |
| a | append only | В файл можно только дописывать (лог-файлы). Нельзя удалить или перезаписать. |
| A | no atime update | Не обновлять время последнего доступа (экономит I/O). |
| S | synchronous updates | Все изменения сразу записываются на диск (без кэша). |
| d | no dump | Игнорировать файл при бэкапах через dump. |
| u | undeletable (undelete) | Можно восстановить после удаления (не во всех FS поддерживается). |
| c | compressed | Хранится в сжатом виде (ext4 поддержка ограничена). |
| e | extent format | Используется extents (в ext4 по умолчанию, обычно просто индикатор). |
| j | data journalling | Данные пишутся в журнал вместе с метаданными. |
| t | no tail-merging | Отключить оптимизацию хранения мелких файлов в ReiserFS. |
Что такое блочные устройства в Linux? Какие элементарные операции можно с ними выполнять?
Блочные устройства (block devices) — это устройства, которые работают с данными блоками фиксированного размера (обычно 512 байт или 4 КБ) и позволяют произвольный доступ к этим блокам.
К блочным устройствам относятся:
- жёсткие диски (HDD, SSD);
- разделы (
/dev/sda1,/dev/nvme0n1p1); - флешки и внешние диски;
- RAID-массивы;
- LVM-тома.
Основные элементарные операции с блочными устройствами:
- Чтение блока данных — чтение информации из произвольного сектора/блока.
- Запись блока данных — запись данных в определённый блок.
- Буферизация и кеширование — хранение блоков в памяти для ускорения работы.
- Форматирование — создание файловой системы на устройстве.
- Разметка — создание и управление разделами (через
fdisk,parted).
Примеры команд:
lsblk # посмотреть блочные устройства
fdisk -l # вывести информацию о разделах
dd if=/dev/sda of=/dev/null bs=1M count=10 # чтение первых 10 МБ
blkid # показать UUID и тип файловых системЧто такое символьные устройства в Linux? Какие элементарные операции можно с ними выполнять?
Символьные устройства (character devices) — это устройства, которые передают данные потоком байт, без буферизации по блокам и без возможности произвольного доступа (данные читаются/пишутся последовательно).
Типичные примеры символьных устройств:
- терминалы (
/dev/tty,/dev/console), - последовательные порты (
/dev/ttyS0,/dev/ttyUSB0), - устройства ввода (
/dev/input/*), - виртуальные устройства (
/dev/null,/dev/random,/dev/zero).
Основные элементарные операции:
- Чтение (
read) — получение данных из устройства (поток байт). - Запись (
write) — отправка данных на устройство. - Управление (
ioctl) — передача управляющих команд драйверу устройства. - Открытие/закрытие (
open/close) — подключение и завершение работы с устройством.
Примеры:
cat /dev/null # устройство, которое "поглощает" все данные
cat /dev/zero | head -c 10 # вывод 10 нулевых байт
cat /dev/random | hexdump # чтение случайных байт
echo "hello" > /dev/tty # вывод текста на терминалЧто такое major и minor номера блочных устройств в Linux? Чему они соответствуют?
Каждое устройство в Linux (блочное или символьное) имеет два идентификатора:
- Major number — указывает, какой драйвер управляет устройством.
- Minor number — позволяет драйверу различать конкретные устройства или их экземпляры.
Они уникально идентифицируют устройство в системе и используются ядром для связи с нужным драйвером.
Пример (фрагмент вывода ls -l /dev):
crw-rw-rw- 1 root root 1, 3 Feb 23 1999 null
crw------- 1 root root 10, 1 Feb 23 1999 psaux
crw------- 1 rubini tty 4, 1 Aug 16 22:22 tty1
crw-rw-rw- 1 root dialout 4, 64 Jun 30 11:19 ttyS0
crw-rw-rw- 1 root dialout 4, 65 Aug 16 00:00 ttyS1
crw------- 1 root sys 7, 1 Feb 23 1999 vcs1
crw------- 1 root sys 7,129 Feb 23 1999 vcsa1
crw-rw-rw- 1 root root 1, 5 Feb 23 1999 zeroЗдесь:
- Первое число — major, второе — minor.
- Например:
/dev/nullи/dev/zeroимеют major1→ ими управляет один и тот же драйвер (/dev/null driver)./dev/tty1,/dev/ttyS0,/dev/ttyS1имеют major4→ драйвер терминалов.- Разные minor (
1,64,65) позволяют драйверу различать отдельные устройства.
Объяснение:
- Major сообщает ядру, какой драйвер обрабатывать запросы для данного устройства.
- Minor сообщает драйверу, какое именно устройство или канал он должен обслужить.
- Само ядро не знает, что это за устройства — оно просто направляет операции драйверу, который зарегистрирован под соответствующим major-номером.
Практические вопросы
Разница между t.sh, . t.sh, "/t.sh" и ./t.sh
-
t.sh- Просто имя файла.
- Shell попытается найти
t.shв $PATH (в системных директориях, например/usr/bin,/bin,/usr/local/binи т.д.). - Если файла там нет → будет ошибка
command not found. - То есть без
./текущая папка не ищется.
-
. t.sh(илиsource t.sh)- Точка (
.) = встроенная команда source. - Скрипт выполняется в текущем shell-процессе, а не в новом.
- Все изменения окружения (например
export VAR=1,cd /tmp) сохраняются после выполнения. - Обычно используют для загрузки конфигураций.
- Точка (
-
"/t.sh"- Здесь указан абсолютный путь
/t.sh. - Shell будет искать файл в корне файловой системы (
/), а не в текущей папке. - Для выполнения нужны права на исполнение (
chmod +x /t.sh), и файл действительно должен лежать в корне. - Если его нет →
No such file or directory.
- Здесь указан абсолютный путь
-
./t.sh- Запуск из текущего каталога.
./указывает явно: возьми файлt.shименно отсюда.- Запустится как отдельный процесс.
- Требует права на исполнение (
chmod +x t.sh).
🔑 Итог:
t.sh→ поиск в $PATH.. t.sh→ выполнить в текущем shell (source)."/t.sh"→ абсолютный путь из корня../t.sh→ запуск из текущего каталога.
Есть смонтированная файловая система размером 100 ГБ. На ней был файл размером 10 ГБ. Файл удалили, но место не освободилось. Файл реально отсутствует в каталоге, файловая система жива, не в режиме read-only. Почему так происходит и как это диагностировать/исправить?
Такое поведение возможно, если удалённый файл по-прежнему открыт каким-либо процессом.
- Когда файл удаляется в Linux, удаляется только запись в директории (link). Пока есть открытые дескрипторы, данные файла продолжают занимать место на диске.
- Простая проверка:
lsof | grep deleted— покажет процессы, держащие удалённые файлы.fuser <путь>— покажет PID процессов, использующих файл.
- Решения:
- Завершить соответствующий процесс.
- Если нельзя завершить — в некоторых случаях можно освободить место, перенаправив
/proc/<PID>/fd/<номер>в/dev/null.
/proc/<PID>/fd/<номер> — это ссылка на файл, открытый процессом.
<номер> — файловый дескриптор (0 = stdin, 1 = stdout, 2 = stderr и т.д.).
Используется для диагностики: видно, какие файлы удерживает процесс, даже если они удалены.
- После закрытия дескриптора место будет освобождено.
Файловая система (ext2/ext3/ext4 — значения не имеет) имеет 100 ГБ свободного места. Пытаешься записать файл размером 10 ГБ, но получаешь ошибку “No space available”. В чём может быть проблема?
Причина — закончились свободные inode’ы.
- В файловых системах ext* место ограничено не только размером диска, но и числом inode’ов, которые создаются при форматировании.
- Если inode закончились, новые файлы создать нельзя, даже при наличии свободного места.
- Диагностика:
df -h→ показывает свободное место.df -i→ показывает количество и использование inode’ов.
- Решения:
- Удалить мелкие ненужные файлы, чтобы освободить inode’ы.
- При необходимости пересоздать файловую систему с большим количеством inode’ов (параметр
-iуmkfs.ext4).
Если удалить файл размером 10 ГБ, но на него существует hardlink — освободится ли место?
Нет, место не освободится.
- Hardlink — это не копия файла, а ещё одно имя того же inode.
- Данные удаляются только тогда, когда:
- счётчик ссылок (link count) inode достигает нуля,
- и файл не удерживается никаким процессом.
- Пока есть хотя бы один hardlink, данные продолжают занимать место на диске.
Файл имеет права 777. Я — root. При удалении получаю Operation not permitted. Почему?
Права 777 относятся к доступу к содержимому файла, а не к его удалению.
Удаление контролируется каталогом, где файл лежит, и системными атрибутами.
Ошибка Operation not permitted возможна, если:
- на файле или каталоге установлен атрибут immutable (
chattr +i); - каталог имеет sticky-бит (например,
/tmp), и файл принадлежит другому пользователю; - файловая система — NFS с включённым
root_squash(root мапится в nobody); - включена политика SELinux/AppArmor, запрещающая удаление.
Даже root не может удалить файл, если эти ограничения активны.
Последнее обновление: 14 окт. 2025 г., 12:08:27