Введение в индексные таблицы файловых систем
АрхивЛинуксоид (архив)Подробный разбор 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, то, несомненно увидите что указанное время на них различно, поскольку они отражают значение трех различных параметров.