Почему в специальных файлах устройств есть inode?

11

Файлы устройства не являются файлами сами по себе. Это интерфейс ввода / вывода для использования устройств в Unix-подобных операционных системах. Они не используют места на диске, однако, они все еще используют inode, как сообщается statкомандой:

$ stat /dev/sda
      File: /dev/sda
      Size: 0               Blocks: 0          IO Block: 4096   block special file
Device: 6h/6d   Inode: 14628       Links: 1     Device type: 8,0

Используют ли файлы устройств физические inode в файловой системе и зачем они вообще нужны?

direprobs
источник
2
Индод и данные - это файл. Без инода у вас нет файла. (Файлы устройств не имеют данных)
user253751

Ответы:

16

Короткий ответ: это возможно, только если у вас есть физическая файловая система /dev(и если вы используете современный дистрибутив Linux, вы, вероятно, этого не сделаете).

Длинный ответ следует:

Все это восходит к оригинальной философии UNIX, согласно которой все является файлом. Эта философия является частью того, что сделало UNIX таким универсальным, потому что вы могли напрямую взаимодействовать с устройствами из пользовательского пространства, не нуждаясь в специальном коде в вашем приложении, чтобы напрямую взаимодействовать с физическим оборудованием.

Изначально это /devбыл просто еще один каталог с известным именем, куда вы помещали файлы своего устройства. Некоторые системы UNIX все еще используют этот подход (я полагаю, что OpenBSD все еще делает), и вы обычно можете сказать, если система похожа на это, потому что у нее будет много файлов устройств для устройств, которых система на самом деле не имеет (например, файлы для каждого возможный раздел на каждом возможном диске). Это экономит место в памяти и время при загрузке за счет использования немного большего дискового пространства, что было хорошим компромиссом для ранних систем, поскольку они, как правило, были очень ограничены в памяти и не очень быстрыми. Это обычно называется наличием статического электричества /dev.

В современных системах Linux (и я полагаю также, что FreeBSD и, возможно, последние версии Solaris), /devэто временная файловая система в памяти, заполняемая ядром (или udev, если вы используете Systemd, потому что они не доверяют ядру делать почти все) , Это экономит место на диске за счет некоторого объема памяти (обычно менее нескольких МБ) и очень незначительных накладных расходов на обработку. Он также имеет ряд других преимуществ, одним из которых является то, что проще обнаруживать аппаратные средства с «горячей» заменой. Обычно это называется динамикой /dev.

Однако в обоих случаях доступ к узлам устройства осуществляется через обычный уровень VFS, что по определению означает, что у них должен быть индекс (даже если это виртуальный, который просто существует, чтобы подобные вещи работали так, как stat()это должно быть. С практической точки зрения, это оказывает нулевое влияние на системы, которые используют динамические, /devпотому что они просто хранят иноды в памяти или генерируют их по мере необходимости, и почти нулевое воздействие, где /devстатично, потому что иноды занимают почти нулевое пространство на диске, и большинство файловых систем либо не имеют верхнего предела их или обеспечение гораздо больше, чем кто-либо может понадобиться.

Остин Хеммелгарн
источник
3
Осторожно поднимает руку. Я был в проекте, где на сервере не было inode. Это был наконец кризис, в котором наша команда должна была убедить руководство инвестировать в замену этой серверной системы, которая была разработана (плохо, как вы можете себе представить!) До того, как кто-либо из нас туда попал.
KRyan
@KRyan Это может случиться, но в наши дни это случается редко, если администратор явно не уменьшил число при создании файловой системы. Многие современные файловые системы (по крайней мере, NTFS, BTRFS и ZFS, я думаю, что XFS тоже может это сделать) на самом деле динамически распределяют inode, поэтому на многих более новых системах фактически невозможно завершить работу.
Остин Хеммельгарн
@KRyan У меня тоже была такая проблема. И на самом деле это была хорошо спроектированная система, если ее немного датировать и выводить в потоки (каждая транзакция требовала независимого журнала, который хранился на диске, в конце концов он просто заполнялся крошечными маленькими
инодами
1
Od and Docker является своего рода Famous за то, что он вызвал именно эту проблему с inode.
Котейр
@AustinHemmelgarn Семейство ext довольно печально известно тем, что имеет статическое число inode (и, следовательно, заканчивается). Кстати, это также наиболее используемая файловая система Linux, вероятно, с огромным отрывом (сценарии, в которых хранятся огромные объемы данных в стороне от XFS, при этом ZFS и BTRFS относительно новые), и по умолчанию для большинства дистрибутивов. Конечно, в современной системе максимальные значения inode по умолчанию на много порядков превышают количество файлов устройств, которые у вас когда-либо будут.
Боб
15

Файлы устройств также имеют разрешения, которые хранятся в inode.

Хауке Лагинг
источник
Отличный момент, который я забыл упомянуть.
Остин Хеммельгарн
5
Не только разрешения, но и тип файла и другие метаданные. Классически, сам каталог содержит только имя и номер инода - ничто не указывает на то, что файл является устройством, пока вы не прочитаете инод.
Жиль "ТАК - перестань быть злым"
12

Каталоги - это просто отображение имен файлов на inode, поэтому все, что относится к названию (файл, символическая ссылка, устройство, FIFO, сокет), должно быть в inode, больше некуда его поместить.

Информация об устройстве хранится в иноде. Здесь есть старшие и младшие номера устройств, а также разрешения, метки времени и т. Д. Здесь хранится поле типа, которое говорит о том, что это блочное или символьное устройство, а не обычный файл.

Inode для устройств просто не использует поля, которые содержат карту блоков файла.

Barmar
источник
0

Без инода у вас было бы только имя файла, в котором содержалась бы вся информация об рассматриваемом устройстве. Это означает, что «хорошие» имена устройств вроде /dev/sdaбы могут быть исключены: вам нужно имя, которое можно привязать к конкретному драйверу, например /dev/ohci/sda.

Что еще более важно, все инструменты, которые полагаются на inode (например stat, lsи т. Д.), Должны быть изменены, чтобы обрабатывать пути /devособым образом. Это было бы чрезмерно большим объемом работы без видимой выгоды по сравнению с текущим состоянием вещей.

Дмитрий Григорьев
источник