Я изучаю операционные системы из книги OSTEP. В главе, посвященной реализации файловых систем, есть временная шкала создания файла, которая отображает, какие операции выполняются с типом элементов файловой системы (inode, блоков данных, inode / data bitmaps и т. Д. c) при создании файла. На следующем рисунке показана временная шкала.
Временная шкала создания файла
Предположим, мы хотим создать файл bar
в /foo/
, поэтому файл будет /foo/bar
. какие элементы данных будут доступны?
Я понял следующие шаги
(1) Начните чтение с root
, до go до места, где мы хотим создать файл, поэтому сначала мы читаем индекс root, чтобы мы могли получить доступ к его блоку данных, чтобы найти номер индекса в каталоге foo
.
(2) Считать из блока данных root номер индекса foo
.
( 3) Теперь прочитайте из индекса foo
, чтобы найти местоположение его блока данных.
(4) В блоке данных foo
мы проверяем, есть ли файл с именем bar
. Мы можем приступить к созданию, только если это не так, поскольку Linux не разрешает одинаковые имена файлов в одном каталоге.
(5) Предполагая, что мы можем продолжить, мы читаем из растрового изображения inode, чтобы найти, какой inode доступен для выделения.
(6) Затем мы распределяем этот инод, записывая в соответствующее местоположение растрового изображения обнаруженного выше инода.
(7) Затем мы делаем запись в foo
для файла bar
. Запись будет пара ('bar', <inode no of bar>)
. Итак, запись в foo
.
(8) Теперь я застрял в этом чтении, выполненном в иноде bar
. Зачем нам читать с этого инода?
Я думаю, что мы должны написать прямо в inode бара. Мы должны записать метаданные bar в этот индекс, верно? Тогда почему мы читаем, слышим?