Россия |
Начальная загрузка операционной системы
Файловая система Unix
Файловая система в Unix - "деревянная", состоит из файлов и каталогов. На каждом разделе диска создается собственная независимая файловая система. Отдельные файловые системы "сцепляются" вместе, в единое общее дерево директорий. Такая операция называется "монтированием". Выглядит это примерно так:
mount -t ufs /dev/dsk/m197_c0d0s5 /home1 mount -t ufs /dev/dsk/m197_c0d0s4 /usr df
Получить доступ к файлам "несмонтированной" файловой системы невозможно. Порочная практика MS-DOSа - сколько разделов, столько и "дисков" (a: b: c: d: e: ... k: l: m: n:) в Unix не применяется. В Unix всегда есть ровно одно общее дерево каталогов, и, по большому счету, пользователям совершенно все равно, на каком именно диске или разделе диска расположены его файлы /usr/spool/moshkow или /home1/moshkow/bin/mcopy...
Файловая система Unix кэшируется буферным кэшем. Операция записи на диск выполняется не тогда, когда это приказывает выполняемый процесс, а когда операционная система сочтет нужным это сделать. Это резко поднимает эффективность и скорость работы с диском, и повышает опасность ее использования. Выключение питания на "горячей", работающей Unix-машине приводит к разрушениям структуры файловой системы.
При каждой начальной загрузке Unix проверяет - корректно ли была выключена машина в прошлый раз, и если нет - автоматически запускает утилиту fsck (File System Check) - проверку и ремонт файловых систем..
Внутренняя структура файловой системы Unix
Раздел диска, в котором создана файловая система, разбит на три части.
Содержит служебную информацию: Тип файловой системы, Размер Начало списка свободных блоков. . . . что-то еще
ОБЛАСТЬ INOD-ов. Занимает примерно 8% общего размера раздела. inode - Index-node - описатель файла. Он содержит всю информацию о файле, за исключением имени файла, и собственно данных файла. В inod 'е хранится:
тип файла (файл, каталог, именованный канал, специальный файл) кто владелец права(атрибуты) файла время модификаци/создания файла адреса блоков, из которых состоит файл что-то еще ...
ОБЛАСТЬ ДАННЫХ. В этой области расположены ВИРТУАЛЬНЫЕ блоки с данными файлов. Незанятые блоки провязаны в СПИСОК СВОБОДНЫХ БЛОКОВ
Файлы бывают двух основных типов. ФАЙЛ, КАТАЛОГ.
- ФАЙЛ - он и есть файл.
- КАТАЛОГ - файл фиксированного формата: состоит из строчек с именами файлов, входящих в каталог
имя_файла1 Номер_Инода1 имя_файла2 Номер_Инода2 . . .
Чтобы получить доступ к файлу по имени, операционная система
- находит это имя в каталоге, содержащем файл,
- берет Номер_Инода файла,
- по номеру находит inod в области inod 'ов,
- из inod 'а берет адреса блоков, в которых расположены данные файла,
- по адресам блоков считывает блоки из области данных.
Все.
Формат индексного описателя файла.
Область инодов разбита на 64-х байтные структуры - inod 'ы. В inod 'е хранится:
Тип файла (файл/каталог/специальный файл/fifo/socket) Атрибуты (права доступа) Владелец файла Группа-владелец файла Времена создания, модификации, последнего доступа к файлу Длина файла Адрес 1-го блока файла Адрес 2-го блока файла ... Адрес 10-го блока файла Адрес блока косвенной адресации (блока с 256 адресами блоков) Адрес блока 2-й косвенной адресации (блока с 256 адресами блоков с адресами) Адрес блока 3-й косвенной адресации (блока с адресами блоков с адресами блоков с адресами)
Точный формат структуры файловой системы см. man fs
Специальные файлы
В Unix помимо обычных файлов и каталогов существуют еще и специальные файлы. Они используются для обозначения физических устройств компьютера. (Железок). В сущности, что такое файл? Это "нечто", куда можно записывать данные как последовательность байтов и считывать их оттуда. И, значит, вполне естественным выглядит, например, файл /dev/console - соответствующий консольному терминалу. Все, что выводится в файл /dev/console, будет просто появляться на экране терминала. При попытке чтения из файла /dev/console вы будете получать (внимание!) не то, что нарисовано в данный момент на экране, а то, что вводится с клавиатуры. Попробуйте выполнить команды
su echo Привет > /dev/console cat /dev/console Ctrl-C
Для каждого терминала unix-машины существует соответствующий ему файл. Обычным терминалам соответствуют файлы, которые называются примерно так:
/dev/contty01 или /dev/tty02 или /dev/ttyFD02 или /dev/ttyS0 (и т.д., возможны варианты)
Псевдотерминалам (они эмулируются, когда вы входите в систему по сети, посредством команд типа telnet, rlogin ) соответствуют специальные файлы
/dev/pty*, или /dev/pty/*
Команда who, или who am i сообщит вам, как называется ваш собственный терминал.
Существуют специальные файлы, соответствующие жесткому диску в целом ( /dev/rdsk/m197_c0d0s7 ) и всем его разделам ( /dev/dsk/m197_c0d0s* ). Если вы будете читать из этих файлов, то получите все байтики, как они лежат на жестком диске, с нулевого цилиндра и до последнего... А если вы в этот файл что-нибудь запишете, то получите (потом) богатый опыт по переформатированию и разметке жесткого диска.
- /dev/mem - файл, изображающий оперативную память.
- /dev/audio - если "закатить" в него файл звукового формата (*.wav, *.au, ...?) - то он будет озвучен динамиком компьютера, а команда cat /dev/audio будет принимать все, что произносится в микрофон. Впрочем, я отвлекся, у нас ведь не PC, не Silicon Graphic и не SPARCstation.
- /dev/zero - из него можно считать сколько угодно нулевых байтов
- /dev/null - а в него можно писать, и читать из него - тоже, в неограниченных количествах и с неизменным результатом: NULL - он и есть null. А в MSDOS его аналог называется NUL.
Специальные файлы бывают двух типов:
- блочные - запись и чтение допускаются только блоками.
Например, разделы дисков с файловой системой являются
таковыми.
ls -al /dev/fd* brw-rw---- 1 root floppy 2, 28 Jul 18 1994 /dev/fd0H1440 brw-rw---- 1 root floppy 2, 32 Jul 18 1994 /dev/fd0H2880 brw-rw---- 1 root floppy 2, 12 Jul 18 1994 /dev/fd0H360
- символьные(бесструктурные, сырые, row) - можно читать и писать
отдельными байтами. К ним относятся терминалы, магнитные
ленты, неформатированные диски и разделы дисков без файловой системы.
ls -al /dev/tty* crw--w--w- 1 moshkow sys 4, 1 Jan 15 22:00 /dev/tty1 crw--w--w- 1 root root 4, 2 Jan 15 20:37 /dev/tty2 crw--w--w- 1 root root 4, 2 Jan 15 20:37 /dev/tty2
Различие - первая буква в листинге команды ls -l
Понятия "размер" у специального файла не существует. Ведь этот файл обозначает физическое устройство. Фактически это ссылка на соответствующий драйвер. Вместо длины команда ls показывает для таких файлов два числа: "мажорный" и "минорный" номера устройств. Будем считать для ясности, что "мажор" - это порядковый номер драйвера устройства, а "минор" - внутренний номер устройства в таблице обслуживающего его драйвера.