Архивы: по дате | по разделам | по авторам

Введение в индексные таблицы файловых систем

АрхивЛинуксоид (архив)
автор : Станислав Лапшанский   04.10.2002

Подробный разбор inodes - элементов индексной таблицы

Статья является переводом текста Dru Lavigne доступного по адресу: http://www.onlamp.com/pub/a/bsd/2001/03/07/FreeBSD_Basics.html.

В первых двух частях мы рассматривали структуру таблицы разделов и файловой системы. Мы узнали, что компьютер находит слайс FreeBSD при помощи информации содержащейся в BIOS'овской таблице разделов. Слайс FreeBSD в свою очередь содержит UNIX'овую таблицу разделов, в которой записана «разметка диска». Она описывает расположение файловых систем на слайсе. В этой статье мы, наконец, сможем рассмотреть элементы индексной таблицы (inodes), что они из себя представляют и какую информацию о них может предоставить FreeBSD.

Давайте рассмотрим вывод программы disklabel, запущенной на одной из моих машин. Я немного обрезал вывод так, что бы была видна только информация о разделах:

disklabel ad0
<вырезано>

8 partitions:
#     size offset fstype [fsize bsize bps/cpg]
a:  102400      0 4.2BSD    0    0     0 # (Cyl.  0 - 6*)
b:  270976 102400   swap                 # (Cyl.  6*- 23*)
c: 6538455      0 unused    0    0       # (Cyl.  0 - 406)
e:   40960 373376 4.2BSD    0    0     0 # (Cyl. 23*- 25*)
f: 6124119 414336 4.2BSD    0    0     0 # (Cyl. 25*- 406*)

Обратите внимание что тип файловой системы в которой отформатированы разделы «a», «e» и «f» – «4.2BSD», этой аббревиатурой обозначается Berkeley fast file system (FFS – быстрая файловая система Беркли). Следует обратить внимание на то, что каждый раздел определен интервалом принадлежащих ему цилиндров. Видно, что раздел «a» использует цилиндры 0-6, раздел «e» размещается на цилиндрах 23-25, и, наконец раздел «f» занимает 25-406 цилиндры. Символом «*» обозначаются разделы, начало или конец которых не выровнены по границе цилиндра.

Что же такое цилиндр? Если вы не слишком хорошо знаете как работает жесткий диск, то вас может заинтересовать эта статья (и имеющиеся в ней картинки).

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

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

Единственная индексная таблица, содержащаяся на отформатированном разделе с файловой системой, хранит сведения о всех данных размещенных на этой группе цилиндров. Итак:

  • Каждая файловая система отвечает за одну группу цилиндров.
  • Группа цилиндров может иметь только одну индексную таблицу.

Любой раздел содержащий файловую систему разделен на три части:

  • Область, содержащую суперблок.
  • Область, в которой размещаются записи индексной таблицы.
  • Остальное пространство, использующееся для хранения файлов.

В суперблоке записаны параметры файловой системы, такие как количество блоков, их размер, размер фрагмента, а так же количество записей в индексной таблице. (Если вам любопытно, что еще хранится в суперблоке, прочитайте страницу руководства man 5 fs.) Эти параметры были определены в команде newfs, при помощи ключей, которые вы задали при создании файловой системы. Это означает, что если по прошествии некоторого времени вы обнаружите что на файловой системе заканчиваются записи индексной таблицы или свободные блоки, то для смены этих параметров, вам придется заново пересоздать всю файловую систему. Перед этим создайте и протестируйте резервную копию ваших данных, поскольку утилита newfs уничтожит все данные, содержащиеся на разделе.

За суперблоком размещается индексная таблица, содержащая записи обо всех данных находящихся на разделе. Каждая запись в таблице занимает 128 байт и содержит информацию о соответствующем файле. Это так называемые метаданные. Вы можете сами посмотреть что содержат эти метаданные, заглянув в файл /usr/include/ufs/ufs/dinode.h. Несмотря на то что этот файл на языке Си, он хорошо прокомментирован и его легко прочитать. Вот что хранится в каждой из записей:

  • права доступа к файлу
  • количество ссылок на файл
  • номер записи в индексной таблице
  • размер файла в байтах
  • время последнего обращения к файлу (atime)
  • время последнего изменения файла (mtime)
  • время последнего изменения записи о файле в индексной таблице (ctime)
  • ссылка на прямые дисковые блоки
  • ссылка на косвенные дисковые блоки
  • флаги статуса (chflags)
  • количество реально занятых блоков
  • генерация файла
  • владелец файла
  • группа владельцев файла

Обратите внимание, что имя файла не является частью метаданных. Файловой системе безразлично имя файла, ей необходим только номер записи в индексной таблице, связанной с файлом.

Немало метаданных вы сможете посмотреть при помощи «длинного» формата просмотра содержимого каталога. Давайте посмотрим вывод содержимого корневого каталога в «длинном» формате, при помощи команды ls -l:

ls -l /

total 6429
-r--r--r--   1 root  wheel     4735 Nov 20 07:03 COPYRIGHT
drwxr-xr-x   2 root  wheel     1024 Dec 21 19:09 bin
drwxr-xr-x   3 root  wheel      512 Dec 21 12:27 boot
drwxr-xr-x   2 root  wheel      512 Dec 21 10:19 cdrom
lrwxr-xr-x   1 root  wheel       11 Dec 21 12:27 compat -> /usr/compat
drwxr-xr-x   3 root  wheel    13824 Feb 25 09:15 dev
drwxr-xr-x  15 root  wheel     2048 Dec 22 18:20 etc
drwxr-xr-x   1 root  wheel     7168 Jan  1  1980 floppy
lrwxrwxrwx   1 root  wheel        9 Dec 21 12:29 home -> /usr/home
-r-xr-xr-x   1 root  wheel  3258128 Nov 20 08:02 kernel
-r-xr-xr-x   1 root  wheel  3258128 Nov 20 08:02 kernel.GENERIC
drwxr-xr-x   2 root  wheel      512 Nov 20 06:56 mnt
drwxr-xr-x   2 root  wheel     2560 Dec 21 10:33 modules
dr-xr-xr-x   1 root  wheel      512 Feb 25 10:32 proc
drwxr-xr-x   2 root  wheel      512 Dec 23 08:30 root
drwxr-xr-x   2 root  wheel     2048 Dec 21 19:09 sbin
drwxr-xr-x   4 root  wheel     1024 Dec 21 10:19 stand
lrwxrwxrwx   1 root  wheel       11 Dec 21 12:22 sys -> usr/src/sys
drwxrwxrwt   2 root  wheel      512 Feb 25 09:15 tmp
drwxr-xr-x  19 root  wheel      512 Feb 11 19:04 usr
drwxr-xr-x  18 root  wheel      512 Nov 20 08:13 var

Мы получили семь столбцов, показывающих по каждому файлу следующую информацию:

  • права доступа к файлу
  • количество ссылок на файл
  • владелец
  • группа владельцев
  • размер в байтах
  • время последнего изменения файла
  • имя файла

Первые шесть столбцов отражают содержимое метаданных в соответствующих элементах индексной таблицы.

Если необходимо, вы можете посмотреть номер элемента индексной таблицы для каждого файла, добавив в команду ls ключ «i»:

ls -li /

total 6429
 441 -r--r--r--   1 root  wheel     4735 Nov 20 07:03 COPYRIGHT
  46 drwxr-xr-x   2 root  wheel     1024 Dec 21 19:09 bin
6323 drwxr-xr-x   3 root  wheel      512 Dec 21 12:27 boot
  44 drwxr-xr-x   2 root  wheel      512 Dec 21 10:19 cdrom
 444 lrwxr-xr-x   1 root  wheel       11 Dec 21 12:27 compat -> /usr/compat
6272 drwxr-xr-x   3 root  wheel    13824 Feb 25 09:15 dev
  36 drwxr-xr-x  15 root  wheel     2048 Dec 22 18:20 etc
 236 drwxr-xr-x   1 root  wheel     7168 Jan  1  1980 floppy
 451 lrwxrwxrwx   1 root  wheel        9 Dec 21 12:29 home -> /usr/home
 443 -r-xr-xr-x   1 root  wheel  3258128 Nov 20 08:02 kernel
 442 -r-xr-xr-x   1 root  wheel  3258128 Nov 20 08:02 kernel.GENERIC
 241 drwxr-xr-x   2 root  wheel      512 Nov 20 06:56 mnt
 242 drwxr-xr-x   2 root  wheel     2560 Dec 21 10:33 modules
   2 dr-xr-xr-x   1 root  wheel      512 Feb 25 10:32 proc
 358 drwxr-xr-x   2 root  wheel      512 Dec 23 08:30 root
 363 drwxr-xr-x   2 root  wheel     2048 Dec 21 19:09 sbin
   5 drwxr-xr-x   4 root  wheel     1024 Dec 21 10:19 stand
 440 lrwxrwxrwx   1 root  wheel       11 Dec 21 12:22 sys -> usr/src/sys
   2 drwxrwxrwt   2 root  wheel      512 Feb 25 09:15 tmp
   2 drwxr-xr-x  19 root  wheel      512 Feb 11 19:04 usr
   2 drwxr-xr-x  18 root  wheel      512 Nov 20 08:13 var

Обратите внимание – в листинге появился новый столбец. Число в первом столбце как раз и является номером элемента в индексной таблице для этого файла. Элемент номер 2 встречается несколько раз: он присутствует в строках proc, tmp, usr и var. Элемент с номером 2 всегда является первым в файловой системе и отражает корневую (стартовую) точку файловой системы. Список смонтированных файловых систем мы можем посмотреть при помощи команды df:

df

Filesystem  1K-blocks    Used    Avail Capacity  Mounted on
/dev/ad0s2a     49583   27729    17888    61%    /
/dev/ad0s2f   2967289  737169  1992737    27%    /usr
/dev/ad0s2e     19815    3647    14583    20%    /var
procfs              4       4        0   100%    /proc
mfs:27         131231       1   120732     0%    /tmp

Мы видим ожидаемую картину – usr, var, proc и tmp являются смонтированными файловыми системами. Не забывайте, что каждая файловая система имеет свою индексную таблицу, поэтому элемент номер 2 для системы usr является записью совсем другой таблицы, чем например элемент номер 2 в системе var. Их сходство заканчивается только номером, а так же тем, что оба они являются корневыми элементами для соответствующих файловых систем.

В утилите df (disk free) имеется ключ, который позволяет вам узнать, сколько всего элементов в индексной таблице конкретной файловой системы. Давайте еще раз выполним команду df, теперь с ключом «-i»:

df -i

Filesystem  1K-blocks     Used    Avail Capacity iused   ifree  %iused  Mounted on
/dev/ad0s2a     49583    27729    17888    61%    1074   11468     9%   /
/dev/ad0s2f   2967289   739993  1989913    27%   90852  655130    12%   /usr
/dev/ad0s2e     19815     3645    14585    20%     391    4663     8%   /var
procfs              4        4        0   100%      25     507     5%   /proc
mfs:27         131231        1   120732     0%       1   33277     0%   /tmp

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

Напоследок я упомяну о mtime, atime, and ctime, параметрах в которых содержится различная информация связанная со временем.

Параметр «mtime» отражает время последнего изменения файла. Оно показывает, когда в последний раз изменялось содержимое файла. Например, если вы откроете файл в вашем текстовом редакторе и добавите или удалите несколько строк, тем самым вы измените содержимое файла. Параметр «mtime» поменяется, в момент сохранения файла на диск. Запомните, что команда «ls -l» показывает именно «mtime».

Параметр «atime» показывает когда к файлу последний раз обращались. Например, если вы просматриваете файл при помощи команды more, вы осуществляете доступ к файлу, тем самым изменяя параметр «atime». Для того что бы посмотреть параметр «mtime», вместо стандартного «atime», используйте команду ls с ключами «-lut»:

ls -lut /

total 6429
dr-xr-xr-x   1 root  wheel      512 Feb 26 14:06 proc
drwxr-xr-x   2 root  wheel     1024 Feb 26 14:03 bin
drwxr-xr-x   2 root  wheel     2048 Feb 26 14:03 sbin
drwxr-xr-x   3 root  wheel    13824 Feb 26 13:54 dev
drwxrwxrwt   2 root  wheel      512 Feb 26 13:54 tmp
drwxr-xr-x  19 root  wheel      512 Feb 25 14:02 usr
drwxr-xr-x  18 root  wheel      512 Feb 20 02:01 var
drwxr-xr-x   2 root  wheel      512 Feb 20 01:59 root
drwxr-xr-x   4 root  wheel     1024 Feb 20 01:59 stand
drwxr-xr-x  15 root  wheel     2048 Feb 20 01:59 etc
drwxr-xr-x   2 root  wheel      512 Feb 20 01:59 cdrom
drwxr-xr-x   3 root  wheel      512 Feb 20 01:59 boot
drwxr-xr-x   2 root  wheel      512 Feb 20 01:59 mnt
drwxr-xr-x   2 root  wheel     2560 Feb 20 01:59 modules
lrwxrwxrwx   1 root  wheel        9 Dec 21 12:29 home -> /usr/home
lrwxr-xr-x   1 root  wheel       11 Dec 21 12:27 compat -> /usr/compat
lrwxrwxrwx   1 root  wheel       11 Dec 21 12:22 sys -> usr/src/sys
-r-xr-xr-x   1 root  wheel  3258128 Nov 20 08:02 kernel
-r-xr-xr-x   1 root  wheel  3258128 Nov 20 08:02 kernel.GENERIC
-r--r--r--   1 root  wheel     4735 Nov 20 07:03 COPYRIGHT
drwxr-xr-x   1 root  wheel     7168 Jan  1  1980 floppy

Параметр «ctime» обновляется каждый раз, когда меняются данные в самом элементе индексной таблицы. Например, если вы изменяете права доступа, владельца или группу владельца, то этим самым вы изменяете содержимое записи в индексной таблице, а также параметр «ctime». Значение «ctime» можно узнать при помощи ключей «-lc» команды ls:

ls -lc /

total 6429
-r--r--r--   1 root  wheel     4735 Dec 21 12:22 COPYRIGHT
drwxr-xr-x   2 root  wheel     1024 Dec 21 19:09 bin
drwxr-xr-x   3 root  wheel      512 Dec 21 12:27 boot
drwxr-xr-x   2 root  wheel      512 Dec 21 10:19 cdrom
lrwxr-xr-x   1 root  wheel       11 Dec 21 12:27 compat -> /usr/compat
drwxr-xr-x   3 root  wheel    13824 Feb 26 13:54 dev
drwxr-xr-x  15 root  wheel     2048 Dec 22 18:20 etc
drwxr-xr-x   1 root  wheel     7168 Jan  1  1980 floppy
lrwxrwxrwx   1 root  wheel        9 Dec 21 12:29 home -> /usr/home
-r-xr-xr-x   1 root  wheel  3258128 Dec 21 12:27 kernel
-r-xr-xr-x   1 root  wheel  3258128 Feb 11 19:04 kernel.GENERIC
drwxr-xr-x   2 root  wheel      512 Dec 21 10:27 mnt
drwxr-xr-x   2 root  wheel     2560 Dec 21 10:33 modules
dr-xr-xr-x   1 root  wheel      512 Feb 26 14:07 proc
drwxr-xr-x   2 root  wheel      512 Dec 23 08:30 root
drwxr-xr-x   2 root  wheel     2048 Dec 21 19:09 sbin
drwxr-xr-x   4 root  wheel     1024 Dec 21 10:19 stand
lrwxrwxrwx   1 root  wheel       11 Dec 21 12:22 sys -> usr/src/sys
drwxrwxrwt   2 root  wheel      512 Feb 26 13:54 tmp
drwxr-xr-x  19 root  wheel      512 Feb 11 19:04 usr
drwxr-xr-x  18 root  wheel      512 Dec 21 19:15 var

Если вы внимательно посмотрите на эти три листинга команды ls, то, несомненно увидите что указанное время на них различно, поскольку они отражают значение трех различных параметров.

© ООО "Компьютерра-Онлайн", 1997-2024
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.