Как Linux сохраняет папку сопоставления -> имя_файла -> индексный дескриптор?

Вам нужно загрузить конкретные RPM с веб-сайта ОС. Например, для CentOS загрузите файл RPM из http://vault.centos.org/

4
25.04.2017, 18:48
3 ответа

Каталог, семантически говоря, является отображением имени файла в индексный дескриптор. Так создается абстракция дерева каталогов, соответствующая интерфейсу между приложениями и файловыми системами. Приложения могут назначать файлы по имени и перечислять список файлов в каталоге, и каждый файл имеет уникальный указатель, который называется «индексный дескриптор».

Как реализована эта семантика, зависит от типа файловой системы. Кодирование каталога зависит от каждой файловой системы. В большинстве файловых систем Unix каталог представляет собой сопоставление имен файлов с номерами inode, и есть отдельная таблица, отображающая номера inode в данные inode.(Данные inode содержат метаданные файла, такие как разрешения и временные метки, расположение содержимого файла и т. Д.) Отображение может быть списком, хеш-таблицей, деревом ...

Вы не можете увидеть это сопоставление с Vim . Vim не показывает область хранения, представляющую каталог. Linux, как и многие другие современные системы Unix, не позволяет приложениям напрямую видеть представление каталога. Каталоги действуют как обычные файлы, когда дело касается их записи в каталогах и их метаданных, но не когда дело доходит до их содержимого. Приложения читают из обычного файла с помощью системных вызовов, таких как open , read , write , close ; для каталогов есть другие системные вызовы: opendir , readdir , closedir , а изменение каталога выполняется путем создания, перемещения и удаления файлов. Приложение, подобное cat , использует open , read , close для чтения содержимого файла; такое приложение, как ls , использует opendir , readdir , closedir для чтения содержимого каталога. Vim обычно работает как cat для чтения содержимого файла, но если вы попросите его открыть каталог, он будет работать как ls и распечатать данные в красиво отформатированном виде.

Если вы хотите увидеть, как каталог выглядит изнутри, вы можете использовать такой инструмент, как debugfs для ext2 / ext3 / ext4.Убедитесь, что вы ничего не изменяете! Такой инструмент, как debugfs , обходит файловую систему и может полностью ее уничтожить. Ext2 / ext3 / ext4 debugfs безопасен, потому что он находится в режиме только для чтения, если вы явно не разрешаете запись с помощью параметра командной строки.

# debugfs /dev/root
debugfs 1.42.12 (29-Aug-2014)
debugfs: dump / /tmp/root.bin
debugfs: quit
# od -t x1 /tmp/root.bin

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

1
27.01.2020, 20:55

Я подозреваю, что вы читаете очень, очень старое изложение того, как работает файловая система Unix. То, что вы описываете, было верно в конце 1970-х годов или около того, но это уже не верно ни для одной современной файловой системы.

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

0
27.01.2020, 20:55

Эта цитата о том, как (логически — фактические структуры в наши дни часто сильно отличаются) работают файловые системы Unix. И вы можете увидеть номера инодов, например, с помощью флага -i на ls:

$ ls -li
total 8
532028 -rw-r--r-- 1 anthony anthony 115 Apr 25 12:07 a
532540 -rw-r--r-- 1 anthony anthony  70 Apr 25 12:07 b

Номер слева — это инод. И если я запускаю ln b c (создавая жесткую ссылку), то:

$ ls -li
total 12
532028 -rw-r--r-- 1 anthony anthony 115 Apr 25 12:07 a
532540 -rw-r--r-- 2 anthony anthony  70 Apr 25 12:07 b
532540 -rw-r--r-- 2 anthony anthony  70 Apr 25 12:07 c

Разрешения и размер являются частью inode, а не каталога. Достаточно легко увидеть, что происходит после chmod 0600 c:

$ ls -li
total 12
532028 -rw-r--r-- 1 anthony anthony 115 Apr 25 12:07 a
532540 -rw------- 2 anthony anthony  70 Apr 25 12:07 b
532540 -rw------- 2 anthony anthony  70 Apr 25 12:07 c

оба b и c изменились, потому что они имеют один и тот же индексный дескриптор.

Однако ядро ​​предоставляет доступ к файловой системе пользовательскому пространству только через четко определенный API (за исключением необработанных устройств, таких как /dev/sda1). Он предоставляет пользовательскому пространству доступ к набору системных вызовов для выполнения таких действий, как создание и удаление ссылок, изменение разрешений, чтение и запись файлов, переименование и т. д. Он не предоставляет необработанные базовые структуры данных файловой системы пользовательскому пространству. Это по ряду веских причин: это позволяет сетевые файловые системы, это означает, что ядро ​​​​может применять разрешения и поддерживать правильные структуры данных файловой системы, это означает, что вы можете использовать разные файловые системы (с разными структурами данных) без необходимости изменять пользовательское пространство.

Таким образом, по сути, vim dir просто показывает вам список каталогов — примерно так же, как это делает ls. Это делается с помощью модуля vim под названием Netrw, как сказано выше (попробуйте :help netrw в vim). На самом деле вы не можете редактировать базовые структуры данных файловой системы.

3
27.01.2020, 20:55

Теги

Похожие вопросы