Interview Questions
Linux

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

Редактировать на GitHub
Теоретические вопросыЧто такое файл в понятиях Unix-like операцинных системах?Где хранятся имена файлов/директорий?В каком файле находится информация о смонтированных каталогах в файловую систему?Что выведет команда cat 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: Ссылка на файл в файловой системе с использованием такого же 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 -<флаг> <файл>       # снятие
ФлагНазваниеЗначение
iimmutableФайл нельзя изменить, удалить, переименовать или записать в него (даже root).
aappend onlyВ файл можно только дописывать (лог-файлы). Нельзя удалить или перезаписать.
Ano atime updateНе обновлять время последнего доступа (экономит I/O).
Ssynchronous updatesВсе изменения сразу записываются на диск (без кэша).
dno dumpИгнорировать файл при бэкапах через dump.
uundeletable (undelete)Можно восстановить после удаления (не во всех FS поддерживается).
ccompressedХранится в сжатом виде (ext4 поддержка ограничена).
eextent formatИспользуется extents (в ext4 по умолчанию, обычно просто индикатор).
jdata journallingДанные пишутся в журнал вместе с метаданными.
tno 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 имеют major 1 → ими управляет один и тот же драйвер (/dev/null driver).
    • /dev/tty1, /dev/ttyS0, /dev/ttyS1 имеют major 4драйвер терминалов.
    • Разные minor (1, 64, 65) позволяют драйверу различать отдельные устройства.

Объяснение:

  • Major сообщает ядру, какой драйвер обрабатывать запросы для данного устройства.
  • Minor сообщает драйверу, какое именно устройство или канал он должен обслужить.
  • Само ядро не знает, что это за устройства — оно просто направляет операции драйверу, который зарегистрирован под соответствующим major-номером.

Практические вопросы

Разница между t.sh, . t.sh, "/t.sh" и ./t.sh

  1. t.sh

    • Просто имя файла.
    • Shell попытается найти t.sh в $PATH (в системных директориях, например /usr/bin, /bin, /usr/local/bin и т.д.).
    • Если файла там нет → будет ошибка command not found.
    • То есть без ./ текущая папка не ищется.
  2. . t.sh (или source t.sh)

    • Точка (.) = встроенная команда source.
    • Скрипт выполняется в текущем shell-процессе, а не в новом.
    • Все изменения окружения (например export VAR=1, cd /tmp) сохраняются после выполнения.
    • Обычно используют для загрузки конфигураций.
  3. "/t.sh"

    • Здесь указан абсолютный путь /t.sh.
    • Shell будет искать файл в корне файловой системы (/), а не в текущей папке.
    • Для выполнения нужны права на исполнение (chmod +x /t.sh), и файл действительно должен лежать в корне.
    • Если его нет → No such file or directory.
  4. ./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).

Нет, место не освободится.

  • Hardlink — это не копия файла, а ещё одно имя того же inode.
  • Данные удаляются только тогда, когда:
    1. счётчик ссылок (link count) inode достигает нуля,
    2. и файл не удерживается никаким процессом.
  • Пока есть хотя бы один 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

Оглавление

Теоретические вопросы
Что такое файл в понятиях Unix-like операцинных системах?
Где хранятся имена файлов/директорий?
В каком файле находится информация о смонтированных каталогах в файловую систему?
Что выведет команда cat 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. Почему?