Skip Return Title Contents

ИЕРАРХИЯ ФАЙЛОВЫХ СТРУКТУР

Разновидности файлов

На логическом уровне файловые системы OS UNIX образуют иерахическую структуру с именованными узлами, которые соответствуют файлам. Различают 3 разновидности файлов, доступ к которым идентичен:

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

Обозначения базовых имен файлов и каталогов образуют произвольные цепочки печатных символов ASCII, исключая металитеры '*', '\' и '?', которые специальным образом обрабатывают командные процессоры OS UNIX. Расширение базовых имен не является обязательным, поэтому символ '.' в общем случае не означает начало расширения имени файла и трактуется как равноправный с другими символ имени файла.

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

Для формального описания иерархических отношений в файловых системах недостаточно базовых имен каталогов и файлов. В OS UNIX принято универсальное соглашение, которое позволяет однозначно определить положение любого файла или каталога по маршрутному имени. Маршрутное имя образует цепочка имен каталогов, через которые проходит маршрут от корня иерархии файловой системы до специфицируемого файла. Корневой каталог обозначает символ '/'. Тот же символ применяется для разделения имен каталогов в маршрутном имени файла. Маршрутное имя текущего каталога отображает команда pwd. Желаемое изменение текущего каталога обеспечивает команда cd. Использование длинных маршрутных имен не всегда удобно и целесообразно. К файлу можно обращаться по сокращенному маршрутному имени относительно текущего каталога '.', используя специальное обозначение родительского каталога "..", для адресации в направлении корня файловой системы.

Исходя из соображений надежности, целесообразно создавать многотомные файловые структуры, располагая корневую и пользовательские файловые системы на отдельных физических или логических внешних устройствах, которые монтируются к корневой при инициализации многопользовательского режима работы OS UNIX. Схема авто-монтирования определяется файлом fstab, который расположен в каталоге etc корневой файловой системы (/etc/fstab), но может быть изменена явным использованием команд mount и umount. Состав пользовательских файловых систем может быть произвольным. Иерархия корневой файловой системы практически универсальна. В различных версиях OS UNIX корневая файловая система включает следующий классический набор каталогов и файлов:

boot
программа начальной загрузки ядра или автономной загрузки других OS;
unix
файл, содержащий программу ядра OS UNIX;
bin
каталог наиболее популярных команд (ar, cat, cc, cmp, dd, df, du, echo, grep, find, file, mv, mkdir, ld, ls, lpr, passwd, pr, pwd, rm, rmdir, sort, tar и т.д.);
dev
каталог специальных файлов (fd0, lp0, null, mem, mouse, ha0a, rfd0, rha0a, rsa0a, sa0a, tty00 и т.д.);
etc
каталог административных команд и таблиц (init, fsck, fstab, getty, gettytab, mkfs, mount, umount, passwd, rc, printcap, update, sync, shutdown, termcap, ttys и т.д.);
lib
каталог основных библиотек об'ектных модулей (libc.a, libm.a, libx.a, libcursors.a и т.д.);
tmp
каталог временных файлов;
mnt
каталог монтирования пользовательских файловых систем.

Кроме перечисленных корневая файловая система имеет каталог usr, который включает подкаталоги:

adm
каталог файлов системного учета и администрирования (cron, messages, wtmp, utmp, syslog и т.д.);
bin
каталог инструментальных средств (awk, make, lex, yacc, ed, vi, emacs и т.д.);
lib
каталог дополнительных библиотек об'ектных модулей (например, libstdc++.a), макропакетов подготовки документации (mm, me, ms), файлов шрифтов и раскладки клавиатуры (kbd);
man
каталог страниц оперативного руководства, сгруппированного по функциональному признаку из подкаталогов man1 - man8;
include
каталог заголовочных файлов системы программирования C и С++.

Следует отметить, что различные версии OS UNIX могут незначитено отличаться по архитектуре корневой файловой системы. В частности, в версиях BSD и SUN содержание каталога usr образует отдельную файловую систему, которая монтируется к корневой на этапе начальной загрузки OS UNIX.

 

Обычные файлы

Обычные файлы сохраняют информацию, которая получается в результате выполнения прикладных и системных программ. Непосредственно OS UNIX не накладывает никаких ограничений на структуру данных в обычном файле. Поэтому в общем случае обычный файл интерпретируется как произвольная байтовая последовательность. Информационную структуру обычного файла определяют прикладные и системные программы, которые создают и обрабатывают его. В OS UNIX принято выделять следующие разновидности обычных файлов:

Текстовые файлы имеют строковую структуру и содержат символ LF (line feed - перевод строки) с кодом ASCII 0xA (\n) в конце каждой строки. Текстовые файлы создаются и модифицируются текстовыми редакторами или иными инструментальными средствами текстовой обработки данных. Тексты могут иметь различную функциональную ориентацию, которая накладывает дополнительные ограничения на их структуру. Это могут быть исходные коды программ на различных языках программирования, документы, предназныченные для обработки текстовыми процессорами nroff или troff, различные системные таблицы (например, termcap, printcap, passwd, ttys и т.д.), формат которых ориентирован на использующие их системные программы, командные файлы на языке интерпретатора команд (sh, csh, ksh, bash), исходные тексты программ для лексического (lex) и синтаксического (yacc) анализа, наконец, текстовые файлы для прикладной обработки.

Об'ектные модули создаются компиляторами систем программирования по исходным кодам программ. Файлы об'ектных модулей имеют расширение ".o". Следующие командные строки вызывает компилятор cc для построения об'ектных модулей func1.o и func2.o по исходным кодам func1.c и func2.c, соответственно, в системе программирования C:

$ cc  -c  func1.c
 
$ cc  -c  func1.c

Выполняемые файлы (загрузочные модули) создаются редактором связей ld из об'ектных модулей. Следующая командная строка вызывает редактор связей ld для создания выполняемого файла prog из об'ектных модулей func1.o и func2.o:

$ ld  -o  prog  func1.o  func2.o

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

$ cc  -o  prog  func1.o  func2.o
 
$ cc  -o  prog  func1.c  func2.c

Выполняемый файл состоит из 5-ти секций. Первая секция задается структурой struct exec, поля которой определят размеры сегмента кода, сегмента данных, таблицы символов и таблицы перемещений. Вторая секция, программный сегмент, содержит исполняемый код программы. Третья секция включает сегмент инициализированных и неинициализированных данных. Две последние секции содержат таблицы символов и перемещений, которые используются отладчиком и могут быть исключены командой strip. Это позволяет уменьшить об'ем выполняемого файла в среднем на 10%.

Архивные файлы образуются путем об'единения нескольких обычных файлов (чаще всего об'ектных модулей) в единый архив командой архивации ar. В начале архива, созданного командой ar, размещается магическое число 017775458. Затем последовательно размещаются файлы, составляющие архив. Каждый файл размещается в архиве с границы слова и снабжается заголовком, который задается структурой struct ar_hdr. Эта структура содержит следующие поля:

ar_name - имя файла;
ar_date - дата модификации файла;
ar_uid - идентификатор владельца файла;
ar_gid - идентификатор группы владельца файла;
ar_mode - код защиты файла;
ar_size - размер файла в байтах.

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

Важный методический недостаток архива - последовательный доступ к данным, что значительно увеличивает время обработки больших архивов. Получить доступ к любому файлу архива можно только просмотрев заголовки всех предшествующих файлов. Более того, команда ar будет продолжать просмотр архива до конца в надежде обнаружить другие файлы с заданным именем. Указанного недостатка лишены библиотечные файлы.

Библиотечный файл может быть получен путем обработки архива командой ranlib, которая строит в начале архива ссылочную таблицу symdef. Формат ее элементов задается структурой struct symdef, которая имеет 2 поля:

stroff - смещение имени файла в таблице symdef;
cloc - положение файла внутри библиотеки.

Предварительный просмотр таблицы symdef обеспечивает непосредственный доступ команды ar к любому желаемому файлу архива без перебора заголовков предшествующих файлов. Это существенно сокращает время доступа к любому файлу библиотеки по сравнению с обычным архивом.

Однако, архивация файлов не сопровождается компрессированием (сжатием) данных. Компрессированые файлы образуются командами gzip, compress или compact. Команды gzip и compress использует адаптивное кодирование по методу Лемпела-Зива. Команда compact реализует адаптивное кодирование по методу Хаффмана. Для компрессированной архивации файлов используется следующая технология: сначала группа файлов обрабатывается командой ar, затем полученный архив файлов сжимается командой gzip, compress или compact, компрессированный архив может быть сохранен на гибком диске или ленте командой tar.

 

Каталоги файлов

Каталоги (директории, справочники, оглавления) используются в файловых системах OS UNIX для группировки файлов, имеющих одного владельца, связанных общей тематикой или об'единенных по какому-либо иному организационному принципу. Например, каталог bin в корневой файловой системе содержит наиболее популярные команды, каталог lib - библиотеки систем программирования. При разработке большого программного проекта целесообразно сосредоточить его файлы в отдельном каталоге. Для каждого пользователя OS UNIX создает собственный домашний каталог, который автоматически становится текущим в начале его сеанса работы с системой. Каталог может включать произвольное число файлов и подкаталогов с любым уровнем вложенности, устанавливая отношения иерархической принадлежности на множестве узлов файловой системы.

В соответствии с концепцией файловых систем OS UNIX, каталог является файлом, который содержит специальным образом организованное оглавление всех файлов и подкаталогов, принадлежащих ему в логическом смысле. Это оглавление устанавливает соответствие между именами файлов в каталоге и собственно файлами. Указанное соответствие обеспечивается внутренней организационной структурой каталога как файла. Файл каталога состоит из записей, соответствующих элементам каталога (файлам и подкаталогам). В простейшем случае эти записи имеют равную длину и описываются следующей структурой на C-коде:

structdirect {
intd_ino;
chard_name[14];
}; 
В структуре struct direct поле d_name используется для хранения имени файла. Если длина имени файла меньше 14 байт, то свободная часть поля заполняется символами с кодом 0. Поле d_ino структуры struct direct содержит номер индексного дескриптора для файла с именем, указанным в поле d_name данной записи файла каталога. Как известно, в индексном дескрипторе сосредоточена информация о всех атрибутах файла (тип и код защиты, идентификаторы владельца и группы владельца, даты создания и модификации, длина и адреса блоков данных файла).

Любой (даже пустой) каталог содержит 2 обязательных элемента с именами '.' и "..". Элемент каталога, содержащий в поле d_name структуры struct direct имя '.', имеет в поле d_ino номер индексного дескриптора файла, где хранится информация о текущем каталоге. Элемент каталога, содержащий в поле d_name структуры struct direct имя "..", имеет в поле d_ino номер индексного дескриптора файла, который является родительским каталогом текущего. Используя имя '.', можно ссылаться на текущий каталог, не зная его имени. Используя имя "..", можно адресоваться по дереву файловой системы в направлении корня, не зная имен родительских каталогов. По договоренности корневому каталогу файловой системы соответствует индексный дескриптор с номером 1.

Таким образом, из структуры каталога видно, что файл каталога содержит имена файлов и ссылки на их индексные дескрипторы. Такой подход, когда имя файла, с которым оперирует пользователь, отделено от атрибутов файла, которые обрабатывает система, позволяет гибко манипулировать внешним представлением иерархии файлов в файловой системе, не изменяя положения блоков данных файлов на внешнем устройстве. В частности, один и тот же файл можно внести в несколько различных каталогов, безразлично под одинаковыми или разными именами. Хотя имена одного и того же файла могут быть произвольными в различных каталогах, где присутствует запись о нем, но им будет сопоставлен одинаковый номер индексного дескриптора и, соответственно, один и тот же индексный дескриптор, который является ключем доступа к блокам данных файла на внешнем устройстве. Указанный ссылочный механизм в файловых системах OS UNIX управляется командой ln и системным вызовом link.

Число ссылок на файл из различных каталогов фиксируется в поле di_nlink структуры индексного дескриптора struct dinode. Когда число ссылок в этом поле становится равным 0, индексный дескриптор файла освобождается и блоки данных файла включаются в список свободных блоков файловой системы. Следует отметить, что в OS UNIX нет пользовательской команды удаления файлов с числом ссылок, большим 1. Команда rm, которая по традиции считается командой удаления файлов, удаляет только ссылку на указанный файл в соответствующем каталоге, корректируя поле ссылок его индексного дескриптора. Аналогичный эффект достигается в прикладных программах системным вызовом unlink.

 

Специальные файлы

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

Каждому внешнему устройству компьютера, OS UNIX ставит в соответствие как минимум 1 специальный файл. Обычно они сосредоточены в каталоге dev корневой файловой системы. Связь имени специального файла с конкретным внешним устройством обеспечивает индексный дескриптор. Тип специального файла задает поле di_mode структуры индексного дескриптора struct dinode. Для специального блокориентированного файла в этом поле установлены биты с восьмиричной маской 060000, для байториентированного - с маской 020000. Специальные блок- и байт-ориентированные файлы обеспечивают интерфейс с внешними устройствами блочной и символьной структуры, соответственно.

Символьный (байториентированный) интерфейс ввода-вывода поддерживают: терминал, принтер, физическая внутренняя память (RAM, ROM, CMOS), манипулятор типа "мышь" и другие периферийные устройства, подключенные через последовательные линии связи или параллельный порт. Существует неформальное соглашение по обозначению байториентированных специальных файлов. Например, терминалам соответствуют специальные файлы с именами ttyXX, где XX - номер последовательной линии связи или номер псевдо терминала на одной физической консоли. Нужно отметить, что специальные файлы с обозначением ttyXX часто применяются для обслуживания принтеров с последовательным интерфейсом, которые подключают по последовательным линиям связи. Принтеры с параллельным интерфейсом, подключенные по параллельным портам, доступны через специальные файлы lpN, где N обозначает номер параллельного порта.

К периферийным устройствам с блочной структурой традиционно относятся накопители для жестких или гибких дисков и магнитной ленты. В версиях OS UNIX, построенных на основе стандарта System V release 4.2, принята универсальная спецификация специальных файлов для блокориентированных устройств, расчитанных на SCCI и не-SCCI (например, IDE) интерфейс. Эта спецификация отражает:

В обозначении устройств, подключенных через не-SCCI, например, через IDE интерфейс, отсутствует номер гнезда SCCI адаптера.

В частности, для жестких дисков, подключенных через SCCI интерфейс, специальный файл обозначается: cCtTdDsS. Значения параметров C, T, D и S назначаются по следующим соображениям. Каждый контроллер жесткого диска с номером C может обслуживать до 4-х дисковых накопителей с номерами D от 0 до 3, где каждый диск имеет до 16-ти разделов с номерами S от 0 до f16. Большинство SCCI адаптеров поддерживают до 7-ми устройств, которые подключены к гнездам с номерами T от 1 до 7. В аналогичной по форме спецификации специального файла кассетного стриммера параметр S обозначает емкость ленты и имеет значение 0 - для накопителя емкостью 60 Мб или 1, если емкость накопителя 120 Мб.

Следует отметить, что в различных версиях OS UNIX введены собственные обозначения блокориентированных специальных файлов, которые отличаются от универсальных спецификаций стандарта System V release 4.2. Например, для специальных файлов накопителей на гибких дисках обычно выбирается обозначение fd, с соответствующей добавкой, которая указывает номер накопителя, плотность записи и об'ем. Иногда вместо об'ема указывается число треков на дюйм и число секторов на дорожке.

Все перечисленные выше внешние устройства с блочной структурой также поддерживают байториентированный доступ в "прозрачном" (raw) режиме. Поэтому для них предусмотрены соответствующие байториентированные специальные файлы, которые обеспечивают символьный доступ к устройствам с блочной структурой, когда это необходимо. Имена байториентированных специальных файлов для внешних устройств с блочной структурой имеют префикс r или распологаются в отдельном подкаталоге rdsk каталога dev.

В заключении следует отметить, что специальные файлы, обладая особой внутренней структурой, не могут быть созданы теми же средствами как обычные файлы или каталоги. Для создания специальных файлов используют команду или системный вызов mknod. Их аргументы определяют тип и номер устройства, байт- или блок-ориентированный интерфейс, обозначение специального файла в файловой системе и права доступа к нему. Драйвер нового устройства должен быть включен в состав ядра OS UNIX.


More Less Title Contents

Hosted by uCoz