Почему размер таблицы индексов обычно не изменяется?

19

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

Но мне кажется (мне), что было бы очень желательно избежать всего этого беспорядка, выделяя inode по требованию, полностью прозрачно для пользователей и системных администраторов. Если вы любите милые хаки, вы можете даже сделать саму таблицу inode файлом, и, таким образом, повторно использовать уже имеющийся код, который находит свободное место на диске. Если вам повезет, вы можете даже получить inode рядом с самими файлами, не пытаясь явно достичь этого результата.

Но никто (о котором я знаю) на самом деле не делает этого, так что, вероятно, есть улов, который я пропускаю. Есть идеи, что это может быть?

Марк В.Ю.
источник
4
Вы только что заново изобрели каталог основных файлов и индекс файлов 11 в VMS, предшественнике таблицы основных файлов в NTFS.
JdeBP
Я заново изобрел прекурсор для MFT? Здорово!
Марк VY

Ответы:

26

Скажем, вы сделали таблицу inode файлом; тогда следующий вопрос ... где вы храните информацию об этом файле? Таким образом, вам понадобятся «настоящие» inode и «расширенные» inode, такие как таблица разделов MS-DOS. Учитывая, вам нужен только один (или, может быть, несколько - например, чтобы ваш журнал был файл). Но у вас действительно были бы особые случаи, другой код. Любое повреждение этого файла также будет иметь катастрофические последствия. И учтите, что перед журналированием это было обычным делом для записываемых файлов, например, когда выходило из строя питание, которое было сильно повреждено. Ваши файловые операции должны быть много более надежными, чем сбой питания / сбой / и т.д. чем они были, например, ext2.

Традиционные файловые системы Unix нашли более простое (и более надежное) решение: поместите блок inode (или группу блоков) через каждые X блоков. Тогда вы найдете их с помощью простой арифметики. Конечно, тогда невозможно добавить больше (без реструктуризации всей файловой системы). И даже если вы потеряете / повредите блок инода, в который вы записывали, при сбое питания, это приведет к потере всего лишь нескольких инодов - намного лучше, чем существенная часть файловой системы.

Более современные дизайны используют такие вещи, как варианты B-дерева . Современные файловые системы, такие как btrfs, XFS и ZFS, не страдают от ограничений inode.

derobert
источник
2
Когда вы говорите «не страдайте от ограничений на иноды», означает ли это, что новые иноды распределяются полностью за кулисами, или кому-то нужно выполнить команду типа «растянуть таблицу сейчас»?
Марк VY
3
@MarkVY полностью за кадром (если inode действительно используются вообще).
Дероберт
Хорошо, так что мои знания явно сильно отстают от времени. Спасибо за подробный ответ. Я никогда не думал о том, что произойдет в случае потери питания или подобного. Так что мой милый взлом довольно опасен, если только «добавление в файл» не является атомарной операцией в файловой системе. Что вы утверждаете, было довольно редко в старые времена.
Mark VY
Я помню, как XFS и btrfs очень редко страдали от легкого повреждения файловой системы - тоже zfs? Это не риск для некоторых, но это может быть риск для важных данных и стоимость динамического распределения. Для XFS в этом магазине его принципиальной проблемой была полная неспособность сжать файловую систему любым способом.
user2066657
Btrfs, возможно, не страдает от ограничений inode, но страдает от совершенно другого сбоя, который вызывает аналогично запутывающие симптомы (в основном, он исчерпывает пространство метаданных, но при этом остается достаточно свободного пространства данных из-за неэффективного использования групп блоков). Это не только приводит к тому, что он сообщает об ошибках переполнения диска, когда dfсообщает о большом доступном пространстве, он не может быть исправлен путем удаления файлов, поскольку удаление файла требует выделения пространства метаданных.
Mark
17

Многие файловые системы имеют динамически размещаемую таблицу inode (или ее моральный эквивалент) (XFS, BTRFS, ZFS, VxFS ...)

Оригинальная Unix UFS имела inode, которые были исправлены во время создания файловой системы, и файловые системы, производные от нее (Linux EXT, Solaris UFS), часто продолжали схему. Это надежный и простой в реализации. Так много вариантов использования хорошо подходят, что проектирование новой файловой системы просто для того, чтобы избежать одной проблемы, не легко оправдать.

BowlOfRed
источник
Тем не менее, люди, решающие проблемы, которые трудно оправдать, достигли такого большого прогресса в области вычислительной техники.
user253751
2
Но также, большой прогресс в не простых в решении решениях :) Ранние «сложные» файловые системы - NTFS эпохи NT, reiserfs - имели возможность катастрофического сбоя, КОГДА они терпели неудачу ...
rackandboneman
6

Существуют файловые системы, которые динамически распределяют inode: по крайней мере Veritas VxFS (= файловая система по умолчанию HP-UX и один из вариантов, доступных в Solaris) и XFS (стандартный тип файловой системы в RHEL 7) работают сюда. Btrfs и IBM JFS тоже.

Телком
источник