- •И.Н.Акуленок, а.В.Акуленок
- •Часть I. Основы операционной системы unix Утверждено советом университета
- •Введение
- •Глава 1. История создания ос unix
- •Реализации oc unix
- •Unix на платформе Intel
- •Доля компьютеров с ос unix (1993 год)
- •Продажи unix–серверов (III квартал 2007 года)
- •1.1. Первые шаги по созданию unix
- •1.2. Исследовательские версии unix
- •1.3. Основные стандарты
- •1.3.1. Основные задачи стандартизации
- •1.4. Разработчики операционных систем
- •1.4.1. Версии at&t
- •1.4.2. Версии Microsoft/sco
- •1.4.3. Версии университета Беркли
- •1.4.4. Версии компании Sun
- •1.4.5. Версии компании Nowell
- •1.4.6. Популярные версии unix
- •1.4.7. Свободно распространяемые системы unix
- •1.5. Реализация ядра unix
- •1.5.1. Микроядро Mach
- •1.5.2. Микроядро Chorus
- •1.6 Характеристики oc unix
- •1.6.1.Файловая система
- •1.6.2. Многозадачность
- •1.6.3. Многопользовательский режим
- •1.6.4. Мобильность
- •1.6.5. Виртуальная память
- •1.6.6. Связь между задачами
- •1.6.7. Внешние устройства
- •1.6.8. Связь между компьютерами
- •1.6.9. Графический пользовательский интерфейс
- •1.6.10. Безопасность
- •1.6.11. Поддержка баз данных
- •1.6.12. Наличие стандартов
- •1.6.13. Открытость
- •1.6.14. Разработка программного обеспечения
- •1.7. Контрольные вопросы
- •1.8. Тесты
- •Глава 2. Функционирование ос unix
- •2.1. Ядро
- •2.1.1. Функции ядра
- •2.1.2. Структура ядра
- •2.1.3. Файловая подсистема
- •2.1.4. Подсистема управления процессами
- •2.1.5. Подсистема ввода/вывода
- •2.2. Командный процессор Shell
- •2.3. Программы–утилиты
- •2.4. Контрольные вопросы
- •2.5. Тесты
- •Глава 3. Процессы
- •3.1. Контекст процесса
- •3.3. Типы процессов
- •3.3.1. Системные процессы
- •3.3.2. Демоны
- •3.3.3. Прикладные процессы
- •3.4. Атрибуты процесса
- •3.4.1. Идентификатор процесса
- •3.4.2. Идентификатор родительского процесса
- •3.4.3. Приоритет процесса
- •3.4.4. Терминальная линия
- •3.4.5. Реальный и эффективный идентификаторы пользователя
- •3.4.6. Реальный и эффективный идентификаторы группы
- •3.4.7. Идентификатор терминальной группы
- •3.5. Иерархия процессов
- •3.6. Взаимодействие процессов
- •3.6.1. «Отцы», «дети», «сироты», «зомби»
- •3.7. Системные вызовы
- •3.7.1. Механизм создания процесса и запуска программы
- •3.7.2. Графический пример дерева процессов
- •3.8. Связи между процессами
- •3.8.1. Сигналы
- •Сигналы posix 1.1
- •3.8.2. Очереди сообщений
- •3.8.3. Семафоры
- •3.8.4. Совместная память
- •3.8.5. Программные каналы
- •3.8.6. Программные гнезда
- •3.9. Контрольные вопросы
- •3.10. Тесты
- •Глава 4. Файловая система unix
- •4.1. Имена файлов
- •4.2. Структура файловой системы
- •4.2.1. Загрузочный блок
- •4.2.2. Суперблок
- •4.2.3 Дескрипторы файлов
- •4.2.4. Блоки данных и свободные блоки
- •4.3. Типы файлов
- •4.3.1. Обычные файлы
- •4.3.2. Каталоги
- •4.3.4. Символические связи
- •4.3.5. Fifo – Именованные каналы
- •4.3.6. Сокеты
- •4.3.7. Обозначение типов файлов
- •Типы файлов
- •4.4. Дескриптор обычного файла
- •4.5. Дескриптор каталога
- •4.6. Дескриптор специального файла
- •4.7. Системная таблица файлов
- •4.8. Монтирование файловых систем
- •4.9. Демонтирование файловых систем
- •4.10. Проверка и восстановление файловых систем
- •4.11. Журналирование файловых систем
- •4.12. Контрольные вопросы
- •4.13. Тесты
- •Глава 5. Этапы начальной загрузки ос Unix
- •5.1. Загрузка и инициализация ядра
- •5.2. Распознавание и конфигурирование устройств
- •5.3. Создание спонтанных процессов
- •5.4. Выполнение команд оператора
- •5.5. Выполнение командных файлов запуска системы
- •5.6. Переход в многопользовательский режим
- •5.7. Контрольные вопросы
- •5.8. Тесты
- •Глава 6. Обзор командных файлов
- •6.1. Процесс init
- •6.1.1. Формат файла inittab
- •6.1.2. Уровни выполнения
- •Уровни выполнения
- •6.1.3. Дисциплины обработки процесса
- •Дисциплины обработки процесса
- •6.1.4. Запуск и этапы работы процесса init
- •6.2. Процесс rc
- •6.2.1. Сценарии запуска системы Solaris
- •6.3. Процесс cron
- •6.4. Процесс регистрации пользователей
- •6.5. Контрольные вопросы
- •6.6. Тесты
- •Глава 7. Останов системы
- •7.1. Выключение питания
- •7.2. Команда shutdown
- •7.3. Команда halt
- •7.4. Изменение уровня выполнения процесса init
- •Глава 8. Задачи системного администрирования
- •8.1. Инструменты администрирования
- •8.1.1. Администрирование aix
- •8.1.2. Администрирование hp-ux
- •8.1.3. Администрирование Solaris
- •8.1.4. Администрирование Linux
- •8.2. Пользователь root
- •8.2.1. Команда su
- •8.3. Добавление новых пользователей в систему
- •8.3.1. Файл /etc/passwd
- •Идентификаторы пользователей
- •8.3.2. Файл /etc/group
- •8.4. Контрольные вопросы
- •8.5. Тесты
- •Литература
- •Содержание
- •Глава 1. История создания ос unix 6
- •Глава 2. Функционирование ос unix 51
- •Глава 3. Процессы 75
- •Глава 4. Файловая система unix 116
- •Акуленок Ирина Николаевна Акуленок Анатолий Васильевич
- •Часть I. Основы операционной системы unix
4.2.1. Загрузочный блок
При создании файловой системы на диске первый блок (номер 0, размер 8 Кбайт) отводится для программы начальной загрузки ОС (boot block), даже если диск не будет содержать ядро UNIX. Если носитель допускает начальную загрузку, то этот блок содержит короткую программу–загрузчик. Обычно она читает более длинную вторичную загрузочную программу или само ядро OC UNIX.
Хотя для запуска системы требуется только один блок загрузки, каждая файловая система имеет свой (пусть даже пустой) блок загрузки.
4.2.2. Суперблок
Следующий блок называется суперблоком – superblock (номер 1, размер 8 Кбайт). Суперблок – это наиболее ответственная область файловой системы, содержащая информацию, которая необходима для работы с файловой системой в целом. Он следит за жестким диском и обычно (за исключением некоторых программных вызовов) пользователь не имеет к нему прямого доступа. Суперблок описывает состояние файловой системы – какого она размера, сколько файлов может в ней храниться, где располагается свободное пространство, доступное для файловой системы, и другая информация.
К статической информации относится:
размер дискового пространства, доступного файловой системе (в блоках);
число блоков, зарегистрированных для i–узлов;
имя файловой системы;
имя тома;
время последнего изменения;
время последнего копирования (back up).
К динамической информации относится:
ссылки на список свободных блоков;
ссылки на список свободных i–узлов.
Ядро периодически переписывает суперблок на диск, если в суперблок были внесены изменения, для того, чтобы обеспечивалась согласованность с данными, хранящимися в файловой системе.
4.2.3 Дескрипторы файлов
Следом за суперблоком располагаются списки самих индексных узлов и свободных блоков.
Индексный дескриптор – это особая структура, представленная целым положительным числом, в которой файловая система хранит информацию о файле. Каждый индексный дескриптор содержит около сорока информационных полей, например таких как: тип файла, владелец файла, группа владельца файла, код прав доступа к файлу, размер файла, время последнего обращения к файлу, время последней модификации файла и др. Большая часть информационных полей используется только ядром ОС.
Чтобы упростить понимание термина «индексный дескриптор», можно подразумевать под ним уникальный номер, которым система обозначает конкретный файл. Этим номером является индекс таблицы, в которой перечислены все файлы системы.
Имя же файла – не более чем запись в каталоге, связывающая его и индексный дескриптор. Имеется ровно один i–node (описатель файлов) для каждого каталога или файла в файловой системе. Место для них резервируется при создании файловой системы.
Собственно, файловой системой в UNIX и называется область диска, содержащая систематизированные при помощи индексных дескрипторов данные. При обращении к файлу ядро первым делом выясняет, в какой файловой системе он находится, а затем – какой i–node ему соответствует. Таким образом, в разных файловых системах могут встречаться дескрипторы с одинаковыми индексами.
Размер индексного дескриптора фиксирован и составляет, например, в ОС Solaris в UFS 128 байт.
Каждая файловая система имеет фиксированное количество индексных дескрипторов, которые образуются при создании файловой системы (обычно при начальной инициализации диска). Таким образом, это количество является максимальным количеством файлов, которое может содержать файловая система.
Например, если раздел состоит из 1000000 байт, и число байт на дескриптор составляет 1000, то будет создано 1000 индексных дескрипторов.
Это количество не может быть изменено без повторной инициализации файловой системы, которая сопровождается разрушением всех данных, хранящихся в файлах. Файловая система может (хотя и редко) испытывать нехватку индексных дескрипторов, но это случается только при наличии множества файлов небольшого объема.
Команда ls –l выдает большую часть информацию из индексного дескриптора. Команда ls –i выводит номер индексного дескриптора. Команда stat предоставляет практически всю информацию, содержащуюся в индексном дескрипторе.
Логическое представление файла отличается от его физического представления. Логическое представление – это то, что вы видите, когда распечатываете файл. Вы получаете поток символов, которые представляют содержимое файла. Физическое представление – это истинная организация файла на диске. Файл, размер которого превышает один блок, обыкновенно разбросан по диску. Когда вы осуществляете доступ к файлу, система UNIX находит отдельные блоки в правильном порядке и организует логическое представление информации в файле.
Разумеется, что при такой организации файлов в UNIX должен существовать список, который бы показывал, как конвертировать физическое представление файла в его логическое представление. Это и есть список индексных дескрипторов, или как их еще называют список i–узлов (i–nodes).
Каждый i–узел содержит 13 указателей (рис. 4.2) Первые 10 указателей непосредственно ссылаются на блоки данных файла.
Рис. 4.2. Адресация блоков файла
Поскольку блок содержит 512 байтов, то этого достаточно для обработки файлов до 512 .10 = 5 120 байтов.
Если длина файла больше, чем 5120 байта, используется 11–ый указатель i–узла, ссылающийся на косвенный блок из 128 ссылок на блоки данных. Использование косвенного блока позволяет увеличить длину файла до величины 512 * (10 + 128) = 70656 байтов.
Если и этого недостаточно, то используется 12–й указатель i–узла, который ссылается на дважды косвенный блок, содержащий 128 ссылок на косвенные блоки. Тогда максимальный размер файла увеличивается до величины 512 * (10 + 128 + 1282) = 8459264 байтов.
Наконец, использование последнего, 13–го указателя на трижды косвенный блок из 128 ссылок на дважды косвенные блоки, дает предельную длину в файловой системе:
512 * (10 + 128 + 1282 + 1283) = 1082201088 байтов.
Разные версии OC UNIX могут отличаться количеством ссылок в i–узле, косвенных блоках и размером блока данных.
Обычный пользователь OC UNIX не имеет, да и не должен иметь дела с индексными дескрипторами, по меньшей мере, до того, пока индексная структура не нарушена и не нуждается в восстановлении, но это уже дело системного администратора.
Например, в ОС Solaris размер блока составляет 8192 байта или 4Кб. Структура, описывающая физическое размещение файла на диске, в UFS представляет собой последовательность из 15 номеров блоков.
Первые двенадцать номеров блоков содержат просто номера блоков данных. Тринадцатый номер - это номер косвенного блока первого уровня (indirect blocks),. В блоке первого уровня содержится до 2048 адресов блоков данных (речь идет о 8192-байтных блоках). Следовательно, через номер косвенного блока первого уровня, можно сохранить файл размером – 2048 × 8192 байта = 16777216 байт.
Четырнадцатый номер блока содержит номер косвенного блока второго уровня. Косвенный блок второго уровня содержит 2048 номеров косвенных блоков первого уровня, таким образом, через косвенный блок второго уровня адресуется до 20482 блоков данных. Адресуемые через номер косвенного блока второго уровня – 20482 × 8192 байта = 34359738368 байт.
В пятнадцатый номер блока записан номер косвенного блока третьего уровня. Косвенный блок третьего уровня содержит 2048 номеров косвенных блоков второго уровня, так что через косвенный блок третьего уровня адресуется до 20483 блоков данных. Адресуемые через номер косвенного блока третьего уровня – 20483 × 8192 байта = 70368744177664 байта.
Файл не может располагаться на разных разделах UNIX. Файл может быть фрагментирован, хотя файловая система построена так, чтобы свести фрагментацию к минимуму. Теоретически рекомендуется не заполнять файловую систему более, чем на 70%, чтобы не увеличивать фрагментацию при работе.
Вместе получается примерно 64 Тбайт. Однако ОС Solaris 9 на данный момент не поддерживает файлы размером более 1 Тбайт.
Все современные системы UNIX используют 128-байтный индексный дескриптор, который вмещает больше информации и номер блока в нем занимает не 3 байта (как в прошлом), а 4. Поэтому адресовать можно весьма большие разделы.
28 байт в таком дескрипторе отводится под разные расширения, включая место для 32-разрядных идентификаторов владельца и группы файла, а также под 64-разрядные поля времен модификации. Введение 64-разрядных полей времени в UNIX вместо прежних 32-разрядных нужно для того, чтобы избежать "проблемы 2031 года", т.к. именно в этом году перестанет хватать 32 байт для представления времени в системах UNIX. Разработчики обоснованно полагают, что до тех пор все существующие системы UNIX будут заблаговременно переведены на 64-разрядную архитектуру.
