Текст
                    Матвеев М. Д.

Ядро

Ыпих

СБОРКА, НАСТРОЙКА
УПРАВЛЕНИЕ

"Издательство Наука и Техника"

Сант-Петербург

УДК 004.42 ББК 32.973 Мал леев М. Д. Ядро Ьпчцх. Сборка, НАСТРОЙКА, УПРАВЛЕНИЕ — СПь.: Издательство Наука и Техника, 2023 —352 с., ил. /5АУ 978-5-907592-14-8 В этой книге собрана самая разнообразная и полезная информация о ядре 1лпих. Спектр материалов достаточно широк: от самых основ (компиляция ядра, загрузчик ОК.СВ2, управление процессами), до более сложных тем (обработка прерываний, таймеры и отслеживание хода времени, управление памятью ядра и т.д.). Отдельное внимание будет уделено различным аспек- там файловой и псевдофайловой систем [лпих, управлению хранилищем, механизмам кэширования чтения и записи ядра. Также будет рассмотрено взаимодействие ядра с разными типами устройств и модулей, а для практики мы даже создадим свой несложный модуль. Книга будет полезна как начинающих линуксоидам, так и более опытным пользователям, которые хотят больше узнать о ядре Ыпих. Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав. Издательство не несет ответственности за доступность материалов, ссылки на которые вы можете найти в этой книге. На момент подготовки книги к изданию все ссылки на интернет-ресурсы были действующими. 18ВЫ 978-5-907592-14-8 Контактные телефоны из ельства: (812)412 70 26 Официальный сайт: пц.сот.гс © Матвеев М. Д. © И тательство На) ка и 1 езншга (оригинал -чакет)
Содержание ГЛАВА 1. ВВЕДЕНИЕ В ОПЕРАЦИОННУЮ СИСТЕМУ И ЯДРО ЫК ИХ ......................................И 1.1. НАЧАЛО. 1950 - 1990-ЫЕ ГГ. .............. 12 1.2. ИЗ М1МХ В 1ЛЮГ1Х. ЭТАП ЯДРА_________________15 1.3. ЭТАП ДИСТРИБУТИВОВ..........................16 ГЛАВА 2. ОСНОВНЫЕ СВЕДЕНИЯ О ЯДРЕ..............19 2.1. ЧТО ЕСТЬ ЯДРО.............................20 2.2. ОСОБЕННОСТИ ЯДРА ЫМ'Х.....................23 2.3. ВЕРСИЯ ЯДРА Ы1ЧЦХ.........................26 2.4. ВЫБОР ЯДРА ПРИ ЗАГРУЗКЕ...................27 2.5. СООБЩЕНИЯ ЯДРА ПРИ ЗАГРУЗКЕ_______________28 2.6. ПЕРЕДАЧА ЯДРУ ПАРАМЕТРОВ..................30 ГЛАВА 3. КОМПИЛЯЦИЯ ЯДРА.......................35 3.1. ПОЛУЧЕНИЕ ИСХОДНИКОВ ЯДРА.................36 3.2. РАСПАКОВКА АРХИВА С ИСХОДНЫМ КОДОМ........38 3.3. ИСПОЛЬЗОВАНИЕ ПАТЧЕЙ......................39 3.4. СОДЕРЖИМОЕ КАТАЛОГА С ИСХОДНЫМИ КОДАМИ....39 3.5. СБОРКА ЯДРА...............................40
3.6. КОМПИЛЯЦИЯ МОДУЛЕЙ...............................43 3.7. УСТАНОВКА ЯДРА................................. 44 3.8. ПРАКТИЧЕСКИЙ ПРИМЕР: УСТАНОВКА ЯДРА 6.® В ЦВ1ЖТ11 22.04.45 ГЛАВА 4. ЗАГРУЗЧИК (ЖСВ2.....................................49 4.1. ЗАГРУЗЧИКИ ЬЮТХ__________________________________50 4.2. КОНФИГУРАЦИОННЫЕ ФАЙЛЫ ........................ 51 4.3. ВЫБОР МЕТКИ ПО УМОЛЧАНИЮ....................... 57 4.4. ЗАГРУЗКА 58 4,5. ПАРОЛЬ ЗАГРУЗЧИКА СКЦВ2__________________________58 4.6. УСТАНОВКА ЗАГРУЗЧИКА........................... 61 4.7. СИСТЕМА ИНИЦИАЛИЗАЦИИ.......................... 61 4.7.1. Принцип работы.................... 62 4.7.2. Конфигурационные фай™ ......„„„ „ ......64 4.7.3. Цели .......................... 67 4.8. УПРАВЛЕНИЕ СЕРВИСАМИ ПРИ ИСПОЛЬЗОВАНИИ 5Т5ТЕМО___68 ГЛАВА 5 КАК ЯДРО УПРАВЛЯЕТ ПРОЦЕССАМИ........................71 5.1. ЧТО ТАКОЕ ПРОЦЕСС_______________________________________72 5.2. СТРУ КТУРЫ, СВЯЗАННЫЕ С ПРОЦЕССАМИ...............74 5.2.1. Список згдач и структура процесса. . . 74 5.2.2. Состояния процесса................ 77 5.2 3. Дескриптор процесса.............. 79 5.3. КОНТЕКСТ ПРОЦЕССА________________________________82 5.4. СОЗДАНИЕ НОВОГО ПРОЦЕССА И ЕГО ЗАВЕРШЕНИЕ........83 5.5. ПОТОКИ__.._______________________________________87 5.6. ПЛАНИРОВЩИК........„.............................91 5.7. УПРАВЛЕНИЕ ПРОЦЕССАМИ ИЗ КОНСОЛИ.................92
(*^1пих Содержание 5,7.1. Команда.!рч, тсе и ЙШ............................—...—......................------------- 92 Получение информации о процессе......................................................... 92 Изменение приоритета процесса........................................................... 97 Аварийное завершение процесса..............................................................98 5.7.2. Коман.;а <о/>......................................................................................... 100 5.7.3. Инфоомация об использовании памяти и дискового пространства.. 102 5 7.4. Команда /ичег...................................... 104 ГЛАВА 6. ОБРАБОТКА ПРЕРЫВАНИЙ......107 6.1. ЧТО ТАКОЕ ПРЕРЫВАНИЯ.............................108 6.2. ОБРАБОТЧИКИ ПРЕРЫВАНИЯ___________________________109 6.2.1. Что такое обработчик прерывания? ..109 6.2.2. Регистрация обработчика прерывания.110 6.3. ПИШЕМ СОБСТВЕННЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЯ__________113 6.4. АР1 ДРАЙВЕРОВ ВЫСОКОГО УРОВНЯ____________________116 6.5. КОНТЕКСТ ПРЕРЫВАНИЯ______________________________117 6.6. ФУНКЦИЯ ОО_1П00__________________________________119 6.7. ИНТЕРФЕЙС /РЯОС/1М ЕККЕРТ8.......................122 ГЛАВА 7. ТАЙМЕРЫ И ОТСЛЕЖИВАНИЕ ХОДА ВРЕМЕНИ..127 7.1. УЧЕТ ВРЕМЕНИ В ЯДРЕ............................128 7.2. ТАЙМЕРЫ ЯДРА...................................130 7.3. АР1 ТАЙМЕРА____________________________________132 7.4. РЕАЛИЗАЦИЯ ТАЙМЕРОВ ЯДРА_______________________135 ГЛАВА 8 УПРАВЛЕНИЕ ПАМЯТЬЮ..........................139 8.1. КА КАЯ БЫВАЕТ ПАМЯТЬ?..........................140 8.1.1. Физическая и виртуальная..........140 8.1.2. Файловая и анонимная............ 143 *
8.1.3, Вытесняемая и невытесняемая память.................... 144 8.1.4. Разные 1ипы адресов .... 146 8.2. МЕТОДЫ УПРАВЛЕНИЯ ПОДСИСТЕМОЙ ПАМЯТИ.......................................................148 8.2.1. Подкачка и невытесняемая память ........................148 8.2.2. Системный вызов т1оск().................................148 8.2.3. ОО.М кШег...............................................149 8.2.4. с^гоир!.................................................150 8.2.5. КЦМА ................................................. 160 8.3. МЕХАНИЗМ РАСПРЕДЕЛЕНИЯ 1Ж0.................................................................151 8.4. ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ ОБ УПРАВЛЕНИИ ПАМЯТЬЮ В ЫГШХ..153 8 4.1. Снова о виртуальной памяти .............................153 8.4.2. Большие страницы....................................... 155 84.3 Зоны ................................................-....................155 8 4.4. Узлы....................................................156 8.4 5. Кэш страницы......................................... 156 8 4.6. Анонимная память........................................157 8.4.7. Освобождение............................................157 8.4.8. Уплвадение (сжатие)................................ 158 8.5. БОЛЬШИЕ СТРАНИЦЫ. БОЛЕЕ ПОДРОБНО..........................................159 8.5.1. Общая информация .. ....................................159 8.5.2. Взаимодействие политики памяти задач с выделением/ освобождением больших страниц..................................166 8.5.3. Атрибуты больших страниц для каждого узла ..............166 8.5.4. Использование больших страниц........................ ;. 167 8.6. ПРАК ТИКУМ АДМИНИСТРАТОРА.................................................169 8.6.1. Полезные команды оболочки............'..................169 Файл /ргос/теттГо.........................................169 Команда 1ор и ес улучшенный вариант Н1ор„..^.............................. 170 Команда/гее...............................................172 Ком анда .................••••••••••••••••••••••••••••«••«••••••••••я.173 8.6.2. Интерфейс СМА...........................................174 8.6.3 Добавление файла подкачки .......................... .174
Г Х)пих..............^НННИИ1^И1И1^^ИМН11МНМИМШши*мвШ| ГЛАВА 9 ФАЙЛОВАЯ СИСТЕМА И ЯДРО................................177 9.1. ВИРТУАЛЬНАЯ ФАЙЛОВАЯ СИСТЕМА ЫХГХ.........................178 9-2. РЕГИСТРАЦИЯ И МОНТИРОВАНИЕ ФАЙЛОВОЙ СИСТЕМЫ...............180 9.3. ОБЪЕКТ СУПЕРБЛОКА.........................................183 9.3.1. Структура ИгисГ5ирег_орега11ОП5,.................................................... 184 9.3.2. Структура зггис! хапгкагиНеп...............187 9.4. ОБЪЕКТ ИНОДА..............................................188 9.5. ОБЪЕКТ АДРЕСНОГО ПРОСТРАНСТВА.............................192 9.5 1. Обедая информация . ............ . 192 9.5.2 Обработка ошибок во время обратной записи...194 9.5.3 . Струкзура зи1гис1 аМге55_8расе_орега^оп^.................................... 195 9.6. ОБЪЕКТ ГИЕ................................................202 9.7. КЭШ ЗАПИСЕЙ КАТАЛОГА (ОСАСНЕ).............................207 9.7.1. Структура Деп1гу_орега11оп$................207 9.7.2. АР1 кэша записей каталогов.................211 ГЛАВА 10. ПСЕВДОФАЙЛОВЫЕ СИСТЕМЫ...............................213 10.1. НАЗНАЧЕНИЕ...............................................214 10.2. ПСЕВДОФАЙЛОВАЯ СИСТЕМА 5Г5Г5.».......................... 215 10.3. ПСЕВДОФАЙЛОВАЯ СИСТЕМА РКОС..............................216 ГЛАВА 11. ПОЛЬЗОВАТЕЛИ И ГРУППЫ................................221 11.1. ВВЕДЕНИЕ В УЧЕТНЫЕ ЗАПИСИ Ы?ШХ......................... 222 11.2. ПОЛУЧЕНИЕ ПОЛНОМОЧИЙ КООТ________________________________225 11.3. УПРАВЛЕНИЕ УЧЕТНЫМИ ЗАПИСЯМИ ПОЛЬЗОВАТЕЛЕЙ...............231 11.3.1. Создание учетной записи пользователя..... 231 11,3.2. Файлы /е1с/ракзу(1 и 'еСс/вНмкпу .... ... .. 233 11.3.3. Изменение и удаление учетных записей.... 236 • —
11.3.4. Группы пользователей........................................ 240 11.4. МОДУЛИ РАМ________________________________________________241 11.4 1. Ограничиваем доступ к системе по ГР-адресу.244 11.4 2. Ограничиваем время входа в сист ему,.......................... 246 11.4.3. Ограничение системных ресурсов с помощью РАМ....................247 ГЛАВА 12. БЛОЧНЫЙ ВВОД/ВЫВОД.........................................................251 12.1. БЛОЧНЫЕ УСТРОЙСТВА.............................................................252 12.2. СТРУКТУРА БЛОЧНОГО УСТРОЙСТВА................................................ 253 12.3. БУФЕРЫ.........................................................................254 12.4. ПЛАНИРОВЩИКИ 13ВОДА/ВЫВОДА.....................................................257 12.4.1. Алгоритм (1сшШпе................................................258 12.4.2. Алгоритм Срр................................................ ...259 12.4.3. АлгорчзмЬ'ОО? .... 259 12 4 4. Настройка планировщиков.................................... 260 Настройка планировщика СР<2....................................... 261 Настройка планировщика АеаДИпе.....................................263 12.5. НАС! РОЙКА ОБЩИХ ПАРАМЕТРОВ БЛОЧНОГО ВВОДА/ВЫВОДА .....264 ГЛАВА 13. МЕХАНИЗМЫ КЭШИРОВАНИЯ ЧТЕНИЯ И ЗАПИСИ ЯДРА Ы?ШХ....................................267 13.1. ДИСКОВЫЙ КЭ1Г1 И ОТЛОЖЕННАЯ ЗАПИСЬ.............................................268 13.2. МЕТОДЫ КЭШИРОВАНИЯ.............................................................269 13.3. КЭШИРОВАНИЕ НА ПРАКТИКЕ..------------------------------------------------------273 ГЛАВА 14. УСТРОЙСТВА И МОДУЛИ........................................................279 14.1. ТИПЫ УСТРОЙСТВ_________________________________________________________________280 14.2. МОДУЛИ ЯДРА__________________________________________________________________ 281 14.2.1. Написание простого мо/гуля 281
14.2.2. Сборка модуля................................. . 284 В пределах дерева исходных кодов ядра................284 Вне дерева исходников ядра ........................ 286 14.2.3. Установка модулей.............................. 286 14.2.4. Загрузка модулей................................. 286 14.3. РАЗ РАБО ГКА СЛОЖНЫХ МОДУЛЕЙ.............................................287 14.3.1. Компиляция модулей из нескольких файдов исходного кода.287 14.3.2. Зависимости между модулями 288 14.3.3. Загрузка модулей с зависимостями 288 ГЛАВА 15. УПРАВЛЕНИЕ ХРАНИЛИЩЕМ .....291 15.1. ПОДКЛЮЧЕНИЕ НОВОГО ЖЕСТКОГО ДИСКА И ЕГО РАЗМЕТКА....... 292 15.2. МЕНЕДЖЕР ЛОГИЧЕСКИХ ТОМОВ............................... 300 15.2.1. Введение в 1,УМ....................... . 300 15.2.2. Уровни абстракции ГУМ.................. 301 15.2.3. Немного практики..........................302 15.3. РАСШИРЕНИЕ ЬУМ ПРОСТРАНСТВА_______________________________305 ПРИЛОЖЕНИЕ 1. ФАЙЛЫ КОНФИГУРАЦИИ ЫРШХ.309 П1.1. КОНФИГУРАЦИОННЫЕ ФАЙЛЫ................. 310 П1-2. ПОДКАТАЛОГИ С КОНФИГУРАЦИОННЫМИ ФАЙЛАМИ.319 ПРИЛОЖЕНИЕ 2. КОМАНДНЫЙ ИНТЕРПРЕТАТОР ВА8Н.. 329 П2.1. НАСТРОЙКА ВА&Н........................ 330 П2.2. ЗАЧЕМ НУЖНЫ СЦЕНАРИИ ВА8Н...............334 112.3. СЦЕНАРИЙ "ПРИВЕТ, МИР!"................335 П2.4. ПЕРЕМЕННЫЕ В СЦЕНАРИЯХ________________ 336 П2.5. ПЕРЕДАЕМ ПАРАМЕТРЫ СЦЕНАРИЮ.............338
..............V Упчх П2.6. ОБРАБОТКА МАССИВОВ............................339 П2.7. ЦИКЛЫ ГОК И Я'ШГЕ............................ 339 П2Л. УСЛОВНЫЕ ОПЕРА! ОРЫ............................340 П2.9. ФУНКЦИИ В ВАКН................................342 П2.10. ПРАКТИЧЕСКИЕ ПРИМЕРЫ СЦЕНАРИЕВ_________________343 Проверка прав пользователя , ............343 Проверка свободною дисконого пространства с уведомлением по е-шаП....343 ПРИЛОЖЕНИЕ 3. СЕТЕВАЯ ФАЙЛОВАЯ СИСТЕМА КГ8..345 ПЗ-1. ВКРАТЦЕ О МГ8 И УСТАНОВКЕ НЕОБХОДИМЫХ ПАКЕТОВ...346 П3.2. ФАЙЛ /ЕТС/ЕХРОКТ8.....*..................... 347 ПЗ.З- ИСПОЛЬЗОВАНИЕ ЭТ8-КЛИЕНТА................... 349 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ИНФОРМАЦИИ.........350
Глава 1. Введение в операционную систему и ядро Ыних
1.1. Начало. 1950 - 1990-ые гг. Говоря об истории Ыпих нельзя не начать с операционной системы 1Л41Х, поскольку Ыпих зарождалась не на розном месте. Когда говорят о Ыпих, то первое, что приходит на ум об этой операционной системе - это то, что она распространяется по лицензии ОрепЗоогсе, го есть исходные коды самой операционной системы абсолютно свободно доступны и любой желающий может ними воспользоваться, в том числе и для создания собственного программного продукта. Подробно о самой лицензии говорить не будем - в Интернете полно информации на эту тему. Не нужно думать, что Ыпих - это первая ОрепЗоигсе-опсрационная систе- ма. Нет, в 1950-ые годы практически все программное обеспечение в США разрабатывалось студентами и распространялось абсолютно бесплатно. Ни- каких ограничений на распространение ПО не было -- вы могли взять ис- ходные коды любого продукта и использовать их как вам пожелается. Тогда еще не существовало лицензии ОрепЗоигсе, но никто даже не задумывался о лицензировании про1раммных продуктов. Первой операционной системой, которая распространялась свободно была малоизвестная система А-2. кото- рая была написала для СМУАС Яетш^оп КапЛ. На рисунке 1.1 изображен этот компьютер, занимающий всю комнату средних размеров.
Рис. 1.1. ГУIVАСЛепйп&оп Напд В 50-ые годы прошлого века началось зарождаться ОрепЗоигсе-движение, тогда оно называлось группой ЗЬаге - результатом работы этой группы была одноименная операционная система, появившаяся в конце 1950-ых. Также в конце 50-ых годов компания АЭК начала разрабатывать програм- му для антозаполнения блок-схем. В силу определенного стечения обсто- ятельств этой компании свой программный продукт пришлось переделать для плаг формы 1ВМ401, но коммерческого успеха у данной платформы не было, ведь все ждали бесплатное решение от АЛК.. Сама же компания АОК не могла допустить выход бесплатного продукта, иначе бы она стала банкро- том. Поэтому ее разработчик, желая получить хоть что-то, продал патент на программу в 1968-ом году. Эту дату считают датой коммерциализа)щи ПО и датой, когда ПО из полезного бонуса к «железу» превратилось в отдельный продукт. Параллельно, в том же 1968-ом году специалисты из Ве11 ЬаЬз возрсждач,т операционную систему МиШсз. Они планировали сделать небольшой патч (англ. ра1ск — заплатка), который перерос в отдельную операционную си- стему для мини-компьютера РПР-7. Новая операционная система стала на- зываться Ишсз. Именно так - мы не опечатались. Изначально то, что мы знаем как 11шх, называлось Ишсз. •
Первые версии Г)тез были написаны на ассемблере, но позже код был пере- писан на языке высокого уровня С и проект был переименован в (Лих Это сделало новую операционную систему более портативной и простой в ис- пользовании. Изюминкой (кроме портативности) стала иерархическая фай- ловая система с одним корневым каталогом Поскольку холдинг АТ&Т, в состав которого входила Ве11 ЬаЪз, подписал соглашение с правительством США, запрещающее компании продавать про- граммное обеспечение, исходный код Цшх был дос гулен бесплатно. В пер- вую очередь его получили научные организации. В 70-ые годы Калифорнийский университет в Беркли получил лицензию от АТ&Т. Группа энтузиастов разработала свой вариант С1М1Х - свой дистрибу- тив. который получил название В8О - Вегке1еу Бойзчаге ПгзгпЬибоп В начале 80-ых АТ&Т отказались от концепции бесплатною распростране- ния ПО. Поэтому параллельно существовали две версии (ЛЧ1Х - бесплатная В8С и коммерческая от АТ&Т. Открытая операционная система В8О сразу стала популярной, особенно в начале 80-ых, когда ГГшх от АТ&Т переста- ла бесплатно распространяться. По вполне понятным причинам компании АТ&Т это не понравилось, и она подала в суд на университет. В результате университету Беркли пришлось переписать существенную часть кода - весь заимствованный из 11шх код. Теперь об Ореп8оигсе. История зарождения открытого ПО началась в конце 70-х годов прошлого века, когда программист Мэтгью Столлман запросил исходный код драйвера принтера у коллег из Массачусетского технологиче- ского института, но получил отказ. Данный факт обидел Столлмана, которо- го не устраивали ограничения, наложенные на обмен исходниками. Поэтому он решил создать операционную систему с открытым кодом - любой жела- ющий мог бы вносить в нее изменения. В сентябре 1983 года он объявил о создании проекта (ЖГГ (ОЬШ'з По1 Пптх). В основе проекта лежал манифест, который стал фундаментом для лицензии ОРЬ (бепега! РиЫгс Ысепзе). что и стало началом движения ОрепЗоигсс. Несколько лет спустя Эндрю Танепбаум разработал ГГшх-подобную опера- ционную систему Мних, которая планировалась как учебное пособие для студентов. Лицензия на Мтгх тогда стоила 69 долларов - довольно недо- рого, поэтому ь начале 90-ых эта система завоевала популярность среди раз- работчиков.
1.2. Из Мпнх в Ыпих. Этап ядра Собственно, сама операционная система Мних не была полноценной опе- рационной системой. Она создавалась для демонстрации основных прин- ципов настоящих (полноценных) операционных систем. Ее полный исход- ный код, который занимал всего 12 тысяч строк, был опубликован в книге А.Таненбаума «Операционные системы». Данную книгу купил Линус Тор- вальдс (Ып.хз ТогуаИз). В 1991 году Линус установил на свой компьют ер операционную систему М1П1Х, но разочаровался в ней. Он принял решение усовершенствовать ее - ведь исходный код «Миникса» был доступен со всеми комментариями. Сна- чала он просто переписал программу эмуляции терминала, а затем фактиче- ски взялся за создание собственной операционной системы. 25 августа 1991 года появилась на свет операционная система Ыпих. Конеч- но, это была еще не та операционная система Ыпих, которую мы знаем, но она уже тогда была лучше своего прародителя - в ней работали командный интерпретатор Ьа«1т и компилятор §сс. Сообщение о создании ковой опе- рационкой системы было помещено в группу новостей сотр.оз.тпйх, там же предлагалось всем желающим протестировать ее. Кроме информации о выходе новой ОС в новостном письме было несколько тезисов относительно новой операционной системы. Если вкратце, то: • Исходный код полностью переписан (то есть М1шх использовался как идея, но весь код для Ыпих у.001 был написан заново). • Ыпих не будет такой громоздкой как ОМИ. • Ыпих распространяется бесплатно. Кстати, изначально Линус называл ядро своей операционной системы Ргеакз, но администратору ГТР-сервера, на который заливались исходники новой операционной системы, такое название не понравилось и он переиме- новал его в Ыпих. После публикации новости о Ыпих в 1руппе сотр.оь.пйшх началось интен- сивное развитие Ыпих, к ее разработке в помощь Торвальдсу подключились энтузиасты со всего мира. — ничто так не сокращает расстояния, как Ин- тернет. С момента появления версии 0 01, которой практически нельзя было
пользоваться, до создания версии 1.0, пригодной для обычных пользовате- лей, а не программистов, прошло почти три года (она появилась в марте 1994 года). Первая версия обладала поддержкой сети (поддерживался протокол ТСРЛР). а также графическим интерфейсом X У/тбоху. Кстати, система X ХЛ/тскт появилась в Ыпих еще в 1992 году одновременно с поддержкой ТСР/1Р. На секунду, АЛбпбохуз 3.11, которая появилась в ноябре 1993 году, поддержкой сети не обладала. Поддержка сети появилась лишь в версии ХУшбохуз 3.11 Тог ХУогк§гоирз. Так что с самого начала Ыпих была на голову выше коммерческою детища М1 егозой. Первые версии Ыпих распространялись на обыкновенных дискетах. Всего было две дискеты: первая содержала ядро, а вторая — корневую файловую систему и необходимые про1раммвг. Именно поэтому данный этап в раз- витии Ыпих мы назвали этапом ядра. По сути, кроме ядра и некоторых не очень сложных утилит в самом начале ничего не было Установить подобную версию Ыпих на компьютер мог только специалист Чуть позже появились первые дистрибутивы, которые включали то же ядро и корневую файловую систему, а также программу для установки всего этого на компьютере. Программа установки поставлялась, как правило, на отдель- ной дискете. Изначально Ыпих распространялся без лицензии ОРЬ. Другими словами, разработчики могли использовать ядро, модифицировать его. но не могли перепродавать результаты своих трудов. 1.3. Этап дистрибутивов Что такое дистрибутив Ыпих? По сути - это ядро и дополнительные программы Любой желающий (даже сейчас) может создать собственный дистрибутив Ыпих, определив набор и параметры программ, входящих в его состав. Собственно, создать дистрибутив не очень сложно и это под силу од- ному, технически грамотному 1Т-специалисту (понятно, когда есть команда, то работа пойдет быстрее). Первые дистрибутивы появились в 1992 году. Тогда отдельные энтузиасты или группы энтузиастов выпускали разные дистрибутивы (каждый, есте- ственно, под своим именем). Фактически они отличались друг от друга лишь названием и программой установки. В дальнейшем различия между дистри- бутивами стали более существенными. ^4,1111111111111114, Щ|1Щ14,П1||111Щ 1Щ1 1ЛЦЦ1ЦЦ1ЦЛ щцц
Самый первый дистрибутив, появившийся в начале 1992 года, назывался МСС 1п1епт Ыпих (МапсЬсз^ег Сотри:! п§ СсШге, Манчестерский компью- терный центр). Он был создан на базе версии 0.12 в феврале 1992 года. Ав- тор дистрибутива ставил перед собой цель усовершенствовать процедуру установки ядра и добавить несколько полезных функций. МСС стал примером для всех остальных. Вскоре стали появляться другие дистрибутивы. Многие из них прожили совсем недолго и мало кому извест- ны, например, дистрибутив ТАМЫ, разработанный в Техасском университе- те. Настоящий прорыв произвел дистрибутив 8Ь8 (Ьйря://ги.\У1к1реб!а.ог§/5У1к1/ 8ой1апст§_Е!пих 8у81ет), выпущенный в октябре 1992 года, поскольку именно он содержал поддержку ТСР/1Р и графическую систему X УУпккпу (автор этой статьи помнит, сколько труда требовалось, чтобы настроить ее). Впоследствии данный дистрибутив бурно развивался и постепенно транс- формировался в один из самых популярных дистрибутивов тою времени — 81аск\уаге. Да, 8Е8 много не прожил. Всего два года, но зато он послужил основой для дистрибутива 81аскугаге, который существует и по сей день. Первая версия 81аск\уате увидела свет 17 июля 1993 года. 81аск\уаге - отличный пример классического дистрибутива. Да, в нем нет всяких модных примочек, как в ЦЬшйи, он не обновляется каждые два года, но это тот самый 1 тих. Если хотите, ггие Ипих. Впрочем, СгепЫо Ыпих - тоже пример дистрибутива для насгоящил фанагов, обладающих свободным временем. В 1993 году также появился и второй популярнейший дистрибутив - ОеЫап. Автор дистрибутива - Иан Мердок. Дистрибутив создан при поддержке Р8Г (Ргее Зоймаге Роипйапоп) Столлмана. Изначально задумывался как альтер- натива 8Ь8, но получился даже более удачным. На сегодняшний день явля- ется наиболее удачным и стабильным дистрибутивом в мире. На его базе был создан ряд других дистрибутивов, в том числе мега-популярный дис- трибутив ЦЬшйи. Дистрибутивостроение развивалось не только в США. В Германии в 1992 году была основана компания 8118Е (8ой\уаге- ип<18умет ЕпЕу!ск1ип§). Они первые начали выпускать Ыпих для бизнес-клиентов. По сути, сначала они выпускали адаптированную для немецкого рынка версию 81асклуаге. Со временем дистрибутивы разрослись до таких размеров, что распростра- нять их на дискетах стало нельзя. Дистрибутив на 50 дискетах - вполне реально. А что делать, если, скажем, дискета №41 окажется бракованной?
Как раз к тому времени компакт-диски и их приводы немного подешевели. Компания Неё На! была одной из первых, выпустивших свою разработку на СВ. Начиная с середины 90-ых, все дистрибутивы Ыпих постепенно переш- ли на СО, а затем - на ОУО. Первая версия К.е<1 На! появилась в 1995 году. Современные дистрибутивы распространяются, как правило, в виде 180- образа ОУО-диска Далее этот образ записывается либо на ОУО, либо на флешку и производится установка на физический компьютер. С виртуаль- ным еше проще - 180-образ «подсовывается» виртуальной машине и произ- водится установка системы на виртуальный диск. Мы сейчас не будем рассматривать этапы развития даже самых популярных дистрибутивов, поскольку ядро унифицировано, а надстройка над ядром (то есть ПО, входящее в состав дистрибутива) не является предметом этой книги.
Глава 2. Основные сведения о ядре
2.1. Что есть ядро Говоря о ядре по умолчанию понимаешь, что это основной компонент систе- мы Вроде бы и так понятно, но информатика - наука точная, поэтому давай- те разбираться, какой именно компонент операционной системы называется ядром и за что он отвечает. Ведь из-за роста возможностей само понятие операционная система стало очень размытым. Многие считают, что все, что они видят на экране (кроме прикладных программ) и есть операционная система. С одной стороны, это так и есть. Ведь операционная система - это та часть компьютерной системы, которая отвечает за основные функции использования и администрирозания. Сюда же входит ядро, драйверы устройств, системный загрузчик, команд- иая/графическая оболочка, файловая система и базовые системные утилиты В общем, только минимально необходимые для работы компьютера компо- ненты. Не является частью операционной системы прикладное ПО - тексто- вый редактор, браузер, медиа-проигрыватель и т.д. А вот понятие система охватывает все ПО на компьютере - и операционную систему, и прикладные программы. Понятно, что ядро является частью операционной системы. Можно сказать, что интерфейс пользователя (будь то командная строка или храфическах обо- лочка) является внешней частью ОС, а ядро - внутренней.
Ядро - это программное обеспечение, предоставляющее базовые функции для всех остальных частей операционной системы. Именно ядро управляет аппаратным обеспечением («железом») и распре- деляет системные ресурсы В англоязычной литературе можно встретить термины супервизор (аарепнког), основная часть (соге), «внутренности» (нНетак) - это и есть ядро. К компонентам ;дра относятся: • Обработчики прерываний, которые обслуживают запросы на прерыва- ния, поступающие от различных устройств; • Планировщик, распределяющий процессорное время между многими процессами; • Система управления памятью, которая управляет адресным простран- ством процессов; • Системные службы, такие как сетевая подсистема и подсистема межпро- цессного взаимодействия. Обычно ядро находится в привилегированном положении по отношению к пользовательским программам, то есть у ядра есть полный доступ к «же- лезу» и ко всем областям защищенной памяти. Системные переменные (зу81ет 81а1е) и область памяти, в которой находится ядро, вместе называ- ются пространством ядра (кегпеГзрасе). Прикладным программам доступна лишь малая часть ресурсов, они не мо- гут выполнять некоторые системные функции, напрямую работать с аппара- турой, системной памятью (то есть не могут выходить за рамки адресного пространства, которое выделено прикладной программе ядром). Прикладные программы взаимодействуют с ядром с помощью системных вызовов. Посмотрите на рис. 2.1. Допустим, нашей программе нужно открыть файл. Для этого она использует системный вызов орсп(). Протрам- ма работает в пользовательском режиме (ияег то<1е), далее она обращается к режиму ядра, которое что-то делает. В конкретном примере - выполняет код реализации функции ореп() и возвращает какой-то результат (например, код ошибки или дескриптор открытого файла).
Рис. 2.1. Программа и системный вызов ореп() Когда прикладная программа выполняет системный вызов, говорят, что ядро выполняет работу от имени прикладной программы Более того, говорят, что прикладная программа выполняет системный вызов в пространстве ядра, а ядро выполняется в контексте процесса. В функции ядра входит также управление системным аппаратными компо- нентами. Все платформы, на которых работает операционная система 1лпих (и не только) используют механизм прерываний (пйеггир!). Когда аппаратно- му устройству необходимо как-то взаимодействовать с системой, оно поставляет на шину специальный сигнал, который, в буквальном смысле слова, прерывает работу процессора Далее процессор запускает специаль- ную программу в ядре (обработчик прерывания, пйеггпрГ ЬапсИег), причем все эю происходит в реальном масштабе времени. Каждому типу прерыва- ния соответствует определенный помер - именно гак можно узнать, какой именно обработчик нужно запустить. Например, при вводе символа с клави- атуры контроллер клавиатуры генерирует прерывание, чтобы дать знать си- стеме, что в буфере клавиатуры есть новые данные, которые еще не обрабо- таны операционной системой. Ядро определяет номер прерывания, которое пришло в систему, и запускает соответствующий обработчик прерывания.
Последний обрабатывает данные, поступившие с клавиатуры, и даст знать контроллеру клавиатуры о том, что ядро готово для приема новых данных. Во многих операционных системах, в том числе и в Ыпих, обработчики пре- рываний выполняются не в контексте процессов, а в специальном контек- сте прерывания (пйеггир! соШехТ), который не связан ни с одним процессом. Данный контекст существует специально, чтобы дать возможность обработ- чику быстро отреагировать на прерывание и завершить работу. В случае простоя система запускает в ядре в контексте процесса специаль- ный холостой процесс (161с ргосезз). Поэтому можно сказать, что процессор всегда находится в одном из трех режимов: 1. Выполнение прикладной программы в непривилегированном режиме; 2. Выполнение операций в контексте процесса в привилегированном режи- ме от имени определенного процесса; 3 Обработка прерываний в контексте прерывания, ке связанном с каким-то процессом. 2.2. Особенности ядра Ьтих Все сказанное ранее можно отнести к ядру любой операционной системы, не только Ьтих. Понятно, что у каждого ядра есть свои особенности. Мы сейчас не будем рассуждать о ядре той же 5Ут6о*8, а лучше поговорим об особенностях ядра Ыпих на фоне ядер других 11шх-подобных систем. В большинстве своем все ядра Ишх являются монолитными бинарными файлами. Они существуют в виде больших исполняемых образов, которые выполняются в одном адресном пространстве. Для работы таких ядер тре- буется система с контроллером управления страничной организацией па- мяти (ра§е гпетогу тападстсп! ипй, ММ11). Такое «железо» позволяет защитить память в системе и предоставить каждому процессу уникальное виртуальное адресное пространство. Для работы Ыпих также нужен ММ11. Существуют отдельные реализации, позволяющие работать без ММС. что позволяет запускать Ыпих на миниатюрных встроенных системах, у кото- рых нет блока ММС
Ранее было отмечено, что ядро Ъ’шх/Ыпих является монолитным. А какие еще ядра бывают? Ядра операционных систем можно разделить на две боль- шие группы по особенностям их построения: монолитные и микроядра. Монолитное ядро является самым простым и до середины 1980-ых годов все ядра были монолитными. Монолитное ядро реализовано в виде одного большою процесса, который выполняется в одном адресном пространстве. Такие ядра обычно хранятся на диске в виде одного большого статического бинарного файла. Все службы ядра находятся и выполняются в одном боль- шом адресном пространстве ядра. Взаимодействия в ядре осуществляются очень просто, потому что все, что выполняется в режиме ядра, выполняется в одном адресном пространстве. Можно отметить простоту и высокую про- изводительность монолитных ядер. При реализации микроядра обычно разработчики отказываются от одного большого процесса. Все функции ядра разделяются на несколько процессов, которые называются серверами. В привилегированном режиме работают только определенные серверы, а все остальные работают в пользователь- ском. Все серверы изолированы и независимы друг от друга и каждый за- пускаеюя в собственном адресном пространстве. Прямой вызов функций, как в случае с монолитным ядром, невозможен. Все взаимодействия с ядром осуществляются посредством механизма межпроцессного взаимодействия (1РС, ГЩегргосезз Соттитсайоп). Даже сами серверы взаимодействуют друг с другом через 1РС. Разделение серверов позволяет предотвратить воз- можность выхода из строя одного сервера при выходе из строя другого. Бо- лее того, модульный принцип построения системы позволяет по мере необ- ходимости одному серверу выгрузить из памяти другой сервер. Наличие дополнительного механизма (речь идет об 1РС) требует дополни- тельных ресурсов по сравнению с обычным вызовом функций, что приво- дит к падению производительности системы по сравнению с монолитны- ми ядрами Типичный пример микроядра - ядро операционной системы УУтбохуз ЫТ. Подобное ядро используется во всех современных версиях АМтбохуз, включая 10 и 11. В последних версиях У/шбом'ь все серверы вы- полняются только в пространстве ядра, что является отклонением от перво- начальной идеи микроядра, но позволяет повысить производительность, так как нс нужно постоянно переключаться между пользовательским и привиле- гированным режимами. Ядро Ыпих монолитное, те оно выполняется в одном адресном простран- стве, в режиме ядра. Однако ядро Ыпих позаимствовало некоторые хорошие
решения из микроядерной модели: в нем используется модульный принцип построения, возможность приоритетного планирования самого себя (его называюI ядром с приоритетным мульти- программным режимом, или кете1 ргеетрИоп), поддерживается многопо- точный режим, а также возможность динамической загрузки в ядро внешних бинарных файлов (модулей ядра). Далее в этой книге мы поговорим об этом - вам не нужно собирать ядро, содержащее в себе весь необходимый функ- ционал. Некоторый функционал может' быть включен по мере необходимо- сти в ядро посредством загрузки модуля. Ядро Ыпих не использует никаких функций микроядерной модели, которые бы могли привести к снижению производительности: все выполняется в ре- жиме ядра с непосредственным вызовом функций вместо передачи сообще- ний. Следовательно, операционная система Ыпих — модульная, многопо- точная, с приоритетным планированием самого ядра. Рассмотрим следующие особенности ядра Ыпих - то, чем оно отличается от других Ышх-подобных систем: • Ядро Ыпих поддерживает динамическую загрузку модулей ядра. Хотя ядро и является монолитным, его функционал можно расширить без пе- рекомпиляции ядра путем динамической загрузки исполняемою кода из модуля. • Ядро Ыпих поддерживает 8МР (симметричную многопроцессорную об- работку;. Современные Ишх также поддерживают 8МР. но традицион- ные ядра Ъ’шх, существовавшие в момент, когда появилась Ыпих, такой поддержки не имели. • В ядре Ыпих поддерживается приоритетное планирование. В огличие от традиционных версий ОС Птх, ядро Ыпих в состоянии прервать выпол- нение текущего задания, даже если оно работает в режиме ядра. Если го- ворить о Ошх, то поддержка приоритетного планирования есть только в 8о1апз и 1К1Х. В большинстве ядер других вариантов такая возможность отсутствует. • В Ыпих принята объект но -ориентированная модель устройств, в которой поддерживаются классы устройств, события, возникающие при горячем подключении устройств, и файловая система в пространстве пользовате ля 5у«Г8 (иьсгзрасе йеугсе ЩевузЩт).
• В ядре Ыпих используется интересный подход для поддержки многопо- точности (Чкгсабз): потоки ни чем ке отличаются от обычных процессов. • В ядре Ыпих отсутствуют некоторые функции ОС Ишх, которые разра- ботчики посчитали плохо спроектированными, как, например, поддержка интерфейса 8ТКЕАМ8, или поддержка стандартов, которые невозможно аккуратно реализовать 2.3. Версия ядра Ыпих Прежде, чем мы приступ к следующей главе, нужно поговорить о версиях и вариантах ядра. Начнем с вариантов. Существует два варианта ядра - стабильный (з1аЫе) и разрабатываемый (бсуе1ортепг). Разрабатываемый вариант переходит в стабильный по окончанию тести- рования. То есть новые стабильные версии ядра обычно выпускаются для исправления ошибок и предоставления новых драйверов устройств. В раз- рабатываемых версиях ядра допустима некорректная работа некоторых ком- понентов - это в порядке вещей, поскольку ядро еще не объявлено стабиль- ным. Поэтому для ргобисПоп- систем, таких как серверы, рабочие станции обычных пользователей подходят только стабильные варианты ядра. Для энтузиастов, желающих попробовать новые функции ядра, которые еще не стали достоянием общественности, и помочь сообществу разработчиков протестировать эти самые новые возможности, как раз и предназначен раз- рабатываемый вариант. Понять, какой вариант ядра используется конкретно в вашей системе, очень просто: по номеру версии. Версию ядра всегда представляют три или четыре числа. Если числа четыре - перед нами 100% стабильный выпуск, посколь- ку четвертое число - это как раз номер стабильной версии. Третье число - номер выпуска, второе число - номер младшей версии (тшог), а первое - основной номер (пнуог) версии. Также можно понять, какое ядро перед нами по номеру младшей версии. Если он нечетный - значит перед нами деу-вариант, если четный - стабильный Рассмотрим примеры: • 4.1.2- беу-вариант (тшог =1)
• 4.2 - стабильный вариант (два последних числа опушены), «стабиль- ность» определяется по четному значению тшог. • 4.2 10.1 - стабильный вариант, номер выпуска (геугкюп) = 10, номер ста- бильной версии - 1. Процесс разработки ядра включает несколько фаз. Вначале разработчики ядра работают над новыми функциями, что напоминает хаос. Через опре- деленное время ядро оказывается сформировавшимся, и, в конце концов, объявляется о замораживании функций. Начиная с этого момента никакие новые запросы на включение новых функций в ядро не принимаются. Счи- тается, что ядро достигло стабильного уровня и его исходный код заморажи- вается. 2.4. Выбор ядра при загрузке У вас (даже если установлен всего один дистрибутив) может быть установ- лено несколько ядер. Например, вы можете установить дистрибутив, в нем будет одна версия ядра, а затем установить более новую версию ядра вруч- ную. При зшрузке вы сможете выбрать нужную вам версию ядра. На рис. 2.2 показано меню за)рузчика АзГта Ыпих, где пользователю предлагается выбрать одну из версий ядра - §епепс или кагйепей. Рис. 2.2. Выбор ядра при загрузке системы
Вторая версия повышает общую защищенность системы от взлома. Так, йагбепеб ядро умеет блокировать массу потенциально опасных операций, а компилятор Ьагбепе<1-§сс позволяет защитить компилируемые им програм- мы от взлома типовыми методами вроде переполнение буфера. Грубо гово- ря, если у вас стоит «дырявая» версия программы X, и ее пытается взломать хакер, то в обычной системе у него это получится, а в йагбепей — не полу- чится, да еще и в лог запись пойдет. Номер версии ядра выводится при входе в систему (если вы входите в консо- ли) или его можно узнать командой ипате -а (рис. 2.3). На рис. 2.3 показано, что в ЦЪипш 20.04 используется версия ядра 5.4.0 - даже не 5.7.0. иЬипСифиЬипЕи-уЬоте: - О = - □ л иЬип1и^иЬип1:и уЬоне: $ ипате -а 1Лпих иЬипГи-иИоте 5.4.0-39-депегЛс #43-НЬип1и БИР Рг1 Зип 19 18:28:31 НТ С 2020 Х8б_64 Х86 64 х8б_64 СШ/1Лпих иЬия Си Итоге: $ | Рис. 2.3. Команда ипате -а 2.5. Сообщения ядра при загрузке При загрузке ядро выводит сообщения, просмотреть которые можно коман- дой: Дтезд | 1езз
Обычно сообщения ядра понятны сами по себе без особых комментариев. Например, в самом начале выводится версия ядра и переданные ядру пара- метры: [ 0.000000] Ыпих уегз!оп 5.4.0-39-депег1с (Ьи11Д<1@1су01-атД64-016) [дсс уегзхоп 9.3.0 (ОЬипЪи 9.3.0-10иЪипСи2)) #43-ОЬипЪи ЗМР Гг1 Дип 19 10:28:31 ОТО 2020 (ОЬипСи 5.4 0-39.43-депег1с 5.4.41) [ 0.0000001 Соггаг.апд Ипе: В00Т_1МАЗЕ=/Ьоо1/ут11пи2-5.4.0-ЗЭ-депег1с гоо1.-Ш1Э’05^аЗе4е-1605-478с-8<1Ь9-Ь6д562а01асЗ го дииеС зр1азН Карта физической памяти: [ 0.000000] ВЮЗ-е820: [тип ОхОООООООООООООООО-ОхООООООООСООЭеНГ изаЫе [ 0.000000] В1О5-е620: [теш 0х000000000009е000-0х00000000С009НЕГ] гезе^еа [ 0.000000] ВЮЗ-е820: [тет ОхОООООООООООсаООО-ОхСООООООООООсЬЕй] гезегуес! [ 0.000000] В1ЭЗ-е820: [тет ОхОООООООООООасООЭ-ОхОООООООООООЯЕК] гезегуеа [ 0.000000] ВЮЗ-е920: [теп ОхООООООООООЮОООО-ОхООООООООИесШ] изаЫе [ 0.000000] ВЮЗ-е820: [тет 0х00000000иеес000-0х000000001те4ейг АСР1 с!аЪа [ 0.000000] ВЮЗ-е820: [тет 0х000000001гей000-0к0000000016еш1] АСР1 №73 [ 0.000000] ВТО8-е320: [тет ОхОООООООСИЮОООО-ОхОООООООО И5Й] озаЫе [ 0.000000] ВЮЗ-е320: [тет ОхООООСОООеООООООО-ОхООООООООейЖГ] ге.чегуес [ 0.000000] ВЮ6-е820: [тет ОхСОООООООТесООООО-ОхООСОООООТесОе5Г] гезегуей [ 0.000000] ВЮЗ-е820: [тет ОхСООСООООГееООООО-ОхОООООСООГееООйГ] гезегуес! [ 0.000000] ВЮЗ-е820: [тет ОхОООСООООЫеООООгОхСОООООООЯЩЯГ гезегуез Сообщит, что найдена 5МР-таблица (значит, наша машина является много- процессорной или хотя бы содержит процессор с несколькими ядрами): [ 0.000000] #оип<1 ЗМР МР-ТаЫе а! [тет 0х000Г6о?0-0х0001бьИ] тарреД а! [ЙЙ380000056ЫО] Выведет информацию о процессоре: [ 0.694470] зтрЬооС: СРИ0: 1пИе1(К) Соге(ТМ) 15-72000 СРО @ 2.50СН2 (1атИу: Охб, тоде1: 0x8с, зСеррхпд: 0x9) [ 0.715491] зтр: ВгоидИг ир 1 псйе, 2 СРОз Частоту процессора и рейтинг в «попугаях»:
[ 0.000001] Ъвс: ОеСесЬес! 2711.997 МН 2 ргосеззог [ 0.715491] згг.рвоо1_: ТоГа1 о Г 2 ргосеззогз асРгуаЬес! (10847.98 ВодоМТРЗ) Во§оМ1Р8 - это псевдорейтинг, который показывает, сколько миллионов пустых операций процессор может выполнить за секунду. Судить о произво- дительности по этому рейтингу можно только косвенно. Исследуйте вывод ядра самостоятельно. Уверен, в нем вы найдете мною ин- тересного, в том числе и о своей системе. 2.6. Передача ядру параметров Поскольку ядро - это программа, то ней можно передать параметры, влия- ющие на поведение ядра. Первым делом разберемся, как передать ядру па- раметры. Сначала в меню загрузчика нужно выбрать загрузочную запись, которую вы хотите отредактировать (рис. 2.2). Далее нужно нажать е для ре- дактирования конфигурации затру зчика. Среди строк конфигурации ОВЦВ2 найдите строку, которая начинается со слова «Нппх». Это и есть строка загрузки ядра Ыпих. Сразу после «1;пих» указывается путь к ядру, а все, что после него - это и есть параметры ядра. Отредактируйте имеющиеся пара- метры или добавьте новые параметры в конец строки. В главе 4 будет показано, как сохранить конфигурацию ОЯОВ2 (после пе- резагрузки внесенные вами изменения будут потеряны, поэтому их нужно внести в конфигурационные файлы СК.11В2), а пока нажмите СТг1+х для загрузки с отредактированной вами конфигурацией. Самые основные часто используемые параметры ядра описаны в таблице 2 1. Таблица 2.1. Часто используемые параметры ядра Ыпих Параметр Описание Параметры корневой файловой системы гоо1=устройство Указывает устройство, содержащее корневую фай- ловую систему. Вы можете указать, как короткое имя устройства (/беу/ясЫ), гак и ШЛО устройства
гоо1Гз1уре“тип Тип корневой файловой системы. Обычно в нем нет необходимости, поскольку ядро само определяет тип ФС гооЬуай Ядро будет ждать появления устройства с корневой файловой системой. Вы можете держать ядро на жест- ком диске, а корневую файловую систему на П8В- диске. С точки зрения производительности может и не очень хорошо, но зато неплохо с точки зрения без- опасности, когда весь жесткий диск с данными можно быстро извлечь и удалить гоо1с1е]ау-Н Подождать И секунд перед монтированием файловой системы го Монтирует корневую ФС в режиме «только чтение». После прочерки утилитой /езк корневая ФС будет перемонтирована в режим гл ПУ Монтирует корневую ФС в режим «чтенис/запись». Но то1да вам нужно отредактировать сценарии ини- циализации системы и удалить из них вызов утилиты Гзск, поскольку проверять ФС в режиме пт этой ути- литой нельзя Параметры, связанные с аппаратными средствами ПО8С81 Отключает поддержку 8С81 поикЬ Отключает поддержку СЗВ порете! а Отключает поддержку РСМС1А-карт псарю Отключает поддержку АР1С Полезен, если вы уви- дите при загрузке сообщение об ошибке, связанной с АР1С
поИтгай Отключает программные КАЮ-массивы, созданные на уровне В108 тет=ххххМ Задает точный размер оперативной памяти, например, тет=4096М у^а-режим Задает УОА-режим. Можно попросить ядро позволить вам выбрагь один из режимов, передайте ядру такой параметр - у^а-азк Параметры управления питанием поарт Отключает расширенное управление питанием АРМ аср!^©!? Отключает АСР1 (Аскапсес! Сопй^иганоп апй Ро\уег ЫегГасе) рс1=поаср1 Отключить АРС1 для РС1 Общесистемные параметры 1пк=программа Позволяет указать систему инициализации. Во многих системах, если указать в качестве <программа> /Ып/ ЬазЬ вы получите тот же однопользовательский ре- жим, но при этом система не будет запрашивать у вас пароль гоо1, поэтому такая лазейка часто используется для обхода системы безопасности и несанкциониро- ванного доступа геЬоог=тип Указывает тип перезагрузки; м'агт (теплая) или со14 (холодная) 8т§1е Однопользовательский режим, который может исполь- зонаться для восстановления системы в случае сбоя ди1е! Отключает большинство сообщений ядра при загрузке системы
Задает задержку в К секунд перед выводом следующе- го сообщения ядра. Система будет загружаться очень Ьоо1_де1ау-=М медленно, лучше дождаться загрузки, выполнить ко- манду Лтез# и в спокойной обстановке прочитать все сообщения
Глава 3. Компиляция ядра
В этой главе мы в общих чертах рассмотрим получение исходных кодов, компиляцию и установку ядра в произвольной Ьших-системе - без привязки к какому-то дистрибутиву. Однако в каждом дистрибутиве есть свои особен- ности, поэтому мы также рассмотрим весь этот процесс в ЦЪипШ 22.04 - получение и установку ядра 6.0. 3.1. Получение исходников ядра Исходный код ядра Ыпих можно скачать с сайта кегпе!.ог§. На этом сайте доступна как последняя версия ядра, так и архивы с предыдущими версия- ми. Вы можете скачать как полный исходный код, так и инкрементный патч, позволяющий повысить версию ядра без закачки всех исходников. Такие патчи удобны, если вы, например, скачали, оз компилировали и установили ядро, скажем, версии 5.4, а затем хотите перейти на версию 5 6. В этом слу- чае вам не нужно опять скачивать исходники, которые довольно объемны, а достаточно скачать только патч (набор изменений), который превратит вашу версию 5.4 в более новую 5.6.
о 0 ТЪе Ыпих Кегле! АгсЫуез АЬад Сйл6»аи8 ₽Ар Не4шке5 ЯдпаЗД» Зйепе*? Ртоисы исавоп НТТР *го^/*и^«гв(.<хд/р»А СТ плр57/дя.квлч1огд,' К5*КС <5упс//геупсквтес»|д/р>Л/ 1Ле«Вйеа5е 6.1.6 Ф тигЛпе 62-к4 2023-0Ы5 (аПий] 1р*кМ р«Ч (уйугсйЧ (Ьтои^ яэЫе 4.14 2023-01-14 ГлгЪаЦ( [рдр| (ракК] [кх рлкЫ (Ьге*ве] («папдйэд] 5мЫ* 6.0.79 [ЕОЦ 2О23-ОН2 [тмЬаЦ] [рдр] (ржсП] !*к ржсЧ 1**л *й) [впамзв] (слапдефд] Юпфжт. 5.15.88 2О2ЭЧГ-И [игЬай] [рдрПрмЛ] [их ракЬ] [ит*б4Л (Ьлл*ве| [сКалдЫрд] (алдтапя 5.Ю.ИЗ 2023-0144 (апмй] (рдр( (₽«*] Г«с расЭД !”«* <йЯ] Рхо»ж1 [спапде<од] Юпдипя 5.4228 2022-12-:9 (аиьй] [рдр] (рмсВ] [кк рмсЬ] [<лст> йЯЧ (Ьго*»] (с^алдйод) капдолк 419749 20224244 [жЪвЩ [рдр] [р*кЬ] (яс ржН] |ч»»сЙП [Ьгемд*] [€Ьапдек>дЗ (олдмст 4Л4302 2022-1244 (гэпмеЦ (рдр] (рассЬ] [ик рвсП] {*>«» с(Ж) [Егспчзе] [сг4п$е<од] Юпдапп 49337(ЕОЦ 2023-01-07 [мгоаЩ [рдр] (рв«Ь] Г*х рак*1) 1Ьго?л«] [свапдЛод] Шхл-пыг леи-20230117 202301-17 рхстгее] ОЬж ’япи ГУ-х, ж»*пгмк>л Кмп4 I т Ч<*» АИг^ Рис. 3.1. Сайт мпт.кегпекогк, где можно скачать самые разные вер< ии ядра Как видите, можно скачать шгЬаП (архив с расширение 1аг.§х), а также патч (раТсЬ). Однако загрузка исходников с сайта кетеГог^ - это для новичков. Если у зас уже есть опыт разработки на одном из современных языков программирова- ния, скорее всего, вы уже знакомы с СИГ СИ-это система версий, позволяющая отслеживать вносимые отдельны- ми разработчиками изменения в проект программного обеспечения. Примечательно, что Ой также был разработан Линусом Торвальдсом имен- но для обслуживания исходных кодов ядра Ьтпх, когда другие подобные системы перестали соответствовать его требованиям. Если опыт работы с Ой у вас есть, сам будет гораздо проще использовать для получения исходников ядра: $ д1Л с!опе д1€://дз€.кегле!.огд/рсЬ/зст/Гхпих/кегг.еС/длХ/ТсгиаГдз/Ипих.дТТ
После загрузки исходного кода нужно обновить дерево до состояния послед- него обновления, которое сделал Линус. Для этого введите следующее: $ доЛ ри11 Данные команды позволяют загрузить последнюю версию ядра Ыпих с последними правками. Если нужна определенная версия ядра, тогда, можно ее указать при получении репозитария: $ дЬС с1опе дхТ://д1С.кегпе1.огд/риЬ/8сп;/11пих/кегпе1./д1Т/Тогуа1<1з/ Ипих-6.2.д1Т 3.2. Распаковка архива с исходным кодом Получив исходные коды, нужно их откомпилировать. Архив Лаг исходного кода ядра распространяется в сжатых форматах СМП 21р (§21р) и Ьх1р2. Формат Ъх1р2 лучше, поскольку он обеспечивает больший коэффициент сжатия по сравнению с форматом &’1р. Архив ядра в формате Ьх1р2 имеет имя Ипих-х.у.г.(аг.Ьг2, где х.у.х — номер соответствующей версии исходного кода ядра. После загрузки файла его нужно распаковать с помощью простой команды Если Лаг-архив сжат с помощью утилиты Ьх1р2, введите такую команду: $ Ъаг Ипих-х.у.г.Ьаг.ЬгЗ Если сжатие выполнено с помощью $ар, то команда должна иметь следую- щий вид: $ Ъаг хуг^ Ипих-х. у. 2 . Таг. дг Обе эти команды позволяют разархивировать и развернуть дерево исходных кодов ядра в каталог Епих-х у.х. При использовании Ой для получения ис- ходного кода ядра и управления им вам не нужно загружать архив в формате
.1аг. Просто введите команду с1опе, как было описано ранее, и она сама захрузит и распакует самую последнюю версию дерева исходного кода ядра. 3.3. Использование патчей Если вы скачали не полный исходный код, а только заплатку (патч), тогда применить ее можно так; $ раТсЪ -р! < ../ра^сЪ-х.у.2 Разумеется, нужно перейти в каталог. содержащий дерево исходных кодов (в каталог, в который вы распаковали архив с исходниками) и сами исходники должны существовать (должны быть ранее загруженными). 3.4. Содержимое каталога с исходными кодами После распаковки исходного кода в папку Нпих-х.у.г вы обнаружите множе- ство подкаталогов. Рассмотрим их содержимое: • агей - исходный код, специфичный для аппаратной платформы. • Ыоск - слой блочных операций ввода/вывода. • сгурго - криптографический АР1. • ОосшпепШюп - различная документация. • дпуегя - драйверы устройств. • бгти эге - микропрограммы устройств, необходимые для использования • - подсистема виртуальной файловой системы и отдельные файловые системы, • тпс1ибе - заголовочные файлы ядра. • 1п11 - код для загрузки и инициализации ядра. * 1’рс - код межпроцессного взаимодействия.
• кегле! - основные подсистемы ядра, такие как планировщик. • ИЪ - вспомогательные подпрограммы. • пт - подсистема управления памятью и поддержка виртуальной памяти. • и е1 - сетевая подсистема, • затркз - примеры и демонстрационный код. • зспрк -сценарии компиляции и построения ядра. • вес игйу - модуль безопасности I .тих. • Митт! - звуковая подсистема. • <оок - вспомогательные утилиты для разработки Ыпих • пег - код инициализации пространства пользователя. • у1т< - инфраструктура виртуализации. Кроме подкаталогов в каталоге с исходниками будут несколько файлов. Самый главный файл - МакеШе, содержащий инструкции по сборке ядра. 3.5. Сборка ядра Сборка ядра достаточно проста и в некоторых случаях даже проще, чем сборка некоторых других программных продуктов. Но при сборке ядра нуж- но первым делом его сконфигурировать. Ведь ради этого часто и устраивают перекомпиляцию ядра, поскольку при установке системы ядро то уже отком- пилировано и прекрасно работает. Часто целью перекомпиляции является добавление нового функционала з ядро - под держку необходимых драйверов и функций. Поскольку в ядре существует бесчисленное количество функций и вариантов поддерживаемого аппаратного обеспечения, возможностей по конфигурации, мягко говоря, много. Процесс конфигурации выполняется с помощью указания ряда параметров конфигурации з виде СОМР16ФУНК- ЦИЯ. Например, поддержка симметричной многопроцессорной обработки (Зупипейто тц1йргосе831Пё, 8МР) устанавливается с помощью параметра С0ИЕЮ8МР. Если этот параметр установлен, то поддержка функций 5МР включена. Если не установлен, то функции поддержки 8МР отключены. Па- рамеры конфигурации используются как для определения того, какие фай-
лы должны быть скомпилированы во время сборки ядра, так и для управле- ния процессом компиляции через директивы препроцессора. Парамехры конфтурации, которые управляю”" процессом сборки ядра, бывают двух типов: логические (ЬооНеап) и с тремя состояниями (ЧпзШе). Логические параметры могут принимать значение уе& или по. Как прави- ло, парамегры конфигурации ядра наподобие СОМГЮ РКЕЕМРТ являются логическими. Параметры конфигурации с тремя состояниями могут при- нимать значение уел, по или тоМе. Значение тос1и1е означаем, что данный параметр конфигурации установлен, но соответствующий ему код должен быть скомпилирован в виде модуля (те как отдельный объект, который за- гружается динамически) В случае параметров конфигурации с тремя со- стояниями значение уе& явно указывает на то, что соответствующий код должен быть скомпилирован в основной файл образа ядра, а не в виде моду- ля. Драйверы устройств обычно определяются параметрами конфигурации с тремя состояниями. Параметры конфигурации можно задавать также в виде строк символов или чисел. Эти параметры не управляют процессом сборки ядра, а позволяют указать значения, которые встраиваются в исходный код с помощью дирек- тив препроцессора. Например, с помощью параметра конфигурации можно указать размер статически размещаемого массива. Ядра многих дистрибутивов компилируются как часть дистрибутива и даже поставляются в виде КРМ/ОЕВ пакетов. В таких дистрибутивах может быть несколько уже скомпилированных ядер, например, одно с поддержкой 8МР. другое - без поддержки. Зы можете установить нужный паке! с помощью обычного менеджера пакетов, ядро установится, а потом выберите его в меню загрузчика при захрузке системы или настроите автозапуск нужного вам ядра. Но иногда бывает, что ядро нужно скомпилировать, например, для реализа- ции поддержки определенного оборудования, самостоятельно. Или же вы хотите попробовать новую версию ядра - как правило, энтузиасты этим часто заморачиваются В любом случае у каждого свои причины перекомпи- лировать ядро, если вам это нужно, то вы должны знать зачем. Конфигурирование ядра осуществляется или посредством редактирования файла сопйё или же с помощью специальных утилит. Редактировать вруч- ную можно, если вам нужно включить/выключить пару опций, и вы точно знаете, как они называются. Во всех остальных случаях нужно использо- вать утилиты конфигурации. Для запуска утилит конфигурации используйте одну из трех команд:
$ таке сопйд $ таке теписспйд $ таке дсопйд Первая утилита работав! в текстовом режиме. Она будет работагь всегда, в отличие от той же §соп]1§, которая не будет работать, если вы установили Ыпих без поддержки графического интерфейса (на серверах он лишний). Вторая наиболее удобная - она и удобнее, и работает в консоли В этих трех утилитах все параметры конфигурации делятся на категории вроде Ргосезвог Туре ап<1 Ева&гез (Типы и свойства процессора). При этом пользователь имеет возможность перемещаться по категориям, просматри- вать парамехры конфигурации ядра и, разумеется, изменять их значения Иногда бывает так, что вы внесли изменения в конфигурацию, перекомпи- лировали и установили ядро, а система после этого не запускается или же что-то работает некорректно. Нужно загрузиться с использованием преды- дущего ядра и ввести команду: $ таке йе^сопйд Данная команда позволяет создать файл конфигурации, содержащий стан- дартные значения параметров для текущей аппаратной платформы. После этого нужно снова перекомпилировать и установить ядро, либо же попы- тагься снова - внести изменения ь конфигурацию и при этом быть белее внимательным Параметры конфигурации сохраняются в файле .слп5§, который находится в корне дерева каталогов исходного кеда ядра. Большинство разработчиков считают, что гораздо проше непосредственно отредактировать этот файл конфигурации. В самом деле, с помощью любого текстовою редактора достаточно легко выполнить поиск нужного параметра в этом файле и из- менить его значение. После внесения изменений в файл конфигурации или при использовании существующего файла конфигурации для нового дерева каталогов исходного кода ядра, ею необходимо ратифицировав и обновить конфигурацию с помощью команды $ паке оХДсопйд
Эту команду вам также нужно запустить перед сборкой ядра. Параметр кон- фигурации СОЫВЮ 1КСОМРЮ_РКОС позволяет сохранять все текущие параметры конфигурации ядра в виде сжатою файла сопб§ и поместить ею в каталог /ргос. Это позволит вам легко создать клон текущей конфигура- ции при сборке нового ядра. Если этот параметр конфигурации установлен в вашем текущем ядре, то просто скопируйте файл соий^-ё2 из каталога /ргос и воспользуйтесь им для создания нового ядра, как показано ниже. $ асаЬ /ргое/сопйд. дг > .сопПд $ таке сЫсопйд После того, как вы сконфигурируете ядро, его можно откомпилировать. Для этого введите команду: $ таке Выполнение команды таке занимает весьма прилично времени. Сколько именно, зависит от производительности вашего компьютера. Бывает так, что компиляции ядра нужно ждать несколько часов. Но ничего не поделаешь, придумайте, чем заняться это время. 3.6. Компиляция модулей После компиляции ядра нужно также откомпилировать модули. Когда вы настраиваете функции ядра с помощью программы конфигуратора, вы мо- жете ту или иную функцию выключить, включить или же оставить включен- ной в виде модуля - вариант М. Включать нужно те функции, которые вам нужны всегда, а вот если функция постоянно не нужна, например, поддерж- ка какого то устройства, которое потенциально вам может пригодиться, вы можете оставить ее включенной в виде модуля. После компиляции ядра вам нужно откомпилировать модули, то есть все функции, которые вы пометили как М. Для компиляции модулей нужно ввести команду $ таке тодиХез
Время выполнения этой команды зависит от количества функций, которые вы отметили как М. Тоже придется подождать некоторое время. После компиляции модулей их нужно установить: $ зидо таке тос1и1е8_1пз1:а11 3.7. Установка ядра После завершения процесса сборки ядра его нужно проинсталлировать в системе. Процесс инсталляции существенно зависит от используемой аппа- ратной платформы и типа системного загрузчика. Вы можете найти различные руководства в Интернете, описывающие слож- ный процесс установки ядра. В современном мире нужно ввести только две следующие команды: 3 зис!о таке апзХаЫ $ зис1о ирйайе-дгиЬ Перед вводом второй команды загляните в каталог /Ьоо1. В нем должно быть два файла: 1п11:гс1.1тд-6 . О . 0-гс7 чтЫпиг-б. 0.0-гс7 Номер версии может у вас отличатпея. Первый файл - это образ диска па- мяти инициализации (1пй НАМ П1зк}, второй - собственно, сам файл ядра. Вывод второй команды будет примерно таким: Зоигсапд й1е '/екс/с1е1аи11:/дгиЬ' Зоигстпд Й1е '/еЪс/бебаиЫ/дгиЬ.а/ХпЫ-зеХесХ.сХд' бепегаМпд дгиЬ сопйдигаХХоп Й1е . . . Гоипд Ыпих Хшаде: /ЪооХ/утЫпиг-б. 0.0-хс7 Гоипа хпЫгс! Хтаде: /ЪооТ/1пЫгс1. з.тд-6.0.0-гс7
Еоипй Ипих хгг.аде: /Ьоо^/ут11пи2-5.15.0-46-депег1с Еоипс! 1таде: /ЬооЪ/1пП:гд.1тд~5.15.0-46-депег1с Еоипд Иг.их хтаде: /ЬооЪ/угп11пи2-5.13.0-ЗО-депетхс Гсипд хпзЛгс! хтаде: /ЬооЪ/хплЛгс!. 1тд-5.13.0-ЗО-депегхс Еоипд тетЪезТ86+ хтаде: /ЬооЪ/тепгЬезЪЙб+.е!Е Еоипй тепгезг.85+ атаде: /Ьоог/тет1:езс86+.Ып Команда $ис1о нужна для установки ядра (первая команда) и обновления конфигурации загрузчика (вторая команда). После этого можно перезагру зить систему командой геЪоос и пробовать новое ядро. Примечание. Компилировать ядро вы можете как обычный пользователь, а вот для установки ядра нужны полномочия гоо1. 3.8. Практический пример: установка ядра 6.0 в ИЬип(и 22.04 Представим, что у нас есть последняя версия дистрибутива ЦЬипШ. Понят- но, что разработчики дистрибутивов не всегда поспевают за разработчиками ядра и бывает, что в последней версии дистрибутива версия ядра далеко не самая последняя. Попробуем проашрейдить ядро до версии 6.0 (установка других версий, по крайней мере линейки 6.x, будет выполняться аналогич- но) на примере дистрибутива ЦЪипш. Первым делом посмотрим, какая версия ядра используется в данный момент: ипате -а Вывод будет таким: Ыпих иЬипси2204 5.15.0-33-депег±с #34-ОЬипС.и ЗМР Иеб Мау 18 13:34:26 ПТС 2022 х86_€4 х86 64 х86_64 СЫО/Ыпих Установим все необходимые пакеты дтя сборки ядра - без них у вас. ничего не выйдет: Ф
арХ 1пзХа11 ЬиИс1~ез5епХ1а1 йма^ез руХЪопЗ ИЬпсигзез-деч Нех Ызоп ИЬзз1-деч Ьс ИЬе1Х-5еч 731Д дпирд2 идеХ -у После этого можно загрузить исходники ядра: мдеХ ЬХХрз: //дО.. кегпе!. огд/ХогчаХсЗз/Х/Ипих-б. 0-гс7 . Хаг. дг После загрузки распакуем архив: Хаг хчХ Ипих-гб . 0-гс7 . Хаг. дг са Ипих-6.0-гс7/ Скопируем текущую конфигурацию ядра в .сопй§ - чтобы вы использовали конфигурацию с включенными опциями, которые включены в вашем ядре. Иначе может оказаться, что какая-то опция будет выключена, и система бу- дет работать некорректно после сборки ядра: ср -V /ЬооХ/сопйд-$(ипате -г) .сопйд Запустим программу конфигурации: таке теписопйд Рис. 3.2. Конфигуратор ядра в УЬип1и 22.04
Внесите изменения в конфигурацию ядра. Можете ничего не вносить, если просто хотите научиться перекомпилировать ядро. Обязательно (если вноси- ли изменения) нажмите кнопку 8ауе. Далее нужно отключить 8У8ТЕМНЕУОСЛПОМ Это можно сделать ко- мандами: зсгхркз/сопйд —дДзаЫе ЗУЗТЕМ_КЕУОСАТ1ОК_КЕГЗ таке ХосаХтодсопйд Построим сжатый образ ядра - он занимает меньше места на диске: таке Ь2Хтаде Вывод будет примерно таким: ЗУХГС 1пс1 ийе/сопйд/аиСо. сопГ. стс1 .НОЗТСС зсгз ркз/ксопйд/сопХ'. о НОЗТХЮ зсгаркз/ксопЯд/сопГ ЗУЗНБ1Х агск/х86/1пс1айе/депегакед/иарД/азт/ипХзкд 32.к ЗУЗНСЧ агск/х86/1пс1ис1е/депега1:ес1/иар1/азт/ип1з'Ьс1_64 .к ЗУЗНСЧ агск/х86/1пс1ис1е/депега1:ес1/иар1/а.*зт/ип1зкс1 х32.к ЗУЗТВЬ агск/хвб/ХпсХийе/дспегакед/азт/зузсаИз 32.к ЗУЗНОК агск/х8б/1пс1ис1е/депегакес1/азт/ип1зкй_32_ 1а32 .к ЗУЗНОК агск/х86/1пс1ис1е/депегакед/азт/ип1зки_64_х32.к После этого соберем и установим модули: таке тоРиХез зис1с таке то<1и1ез_1пзка11 Осталось установить ядро и обновить загрузчик: зис!с таке апзкаИ зидо ирйаке-дгиЬ
Перезагружаем компьютер: геЬооЪ После загрузки введите команду: ипагсе -а Вы должны увидеть версию ядра: Ыпих иЬип'Ьи22С4 6.0.0-гс7 Мы видим, что версия ядра изменилась на 6 0. Собственно, на этом все В следующей главе мы поговорим о такой важной части при работе с ядром Ыпих как настройка загрузчика ОВ.ОВ - чтобы вы понимали, что делает команда ир(1а1е-ртиЬ.
Глава 4. Загрузчик СК1Ш2
4.1. Загрузчики Ыпих Существует несколько загрузчиков Ыпих. На сегодняшний день основным загрузчиком является 6К.0В2, который устанавливается по умолчанию во всех современных дистрибутивах Ыпих. Одним из самых "древних" загрузчиков является ЫЬО (Ыпих ЬОабег). Этот за1рузчик давно уже не используется и ему на смену пришел загрузчик ОКЫВ (СКапб Ошйеб Вообоабег). ОКОВ является более гибким загрузчи- ком и "понимает" много разных файловых систем, в том числе РАТ/РАТ32, ехГ2, ехгЗ, КегзегРЗ, ХР8, В8ЭР8. На смену ОКЫВ пришел загрузчик ОКОВ2. Его особенности - очень запу- танный и неудобный файл конфигурации, но время не стоит на месте, и если вы хотите использовать последние новинки в мире файловых систем Ыпих, а именно файловую систему ех!4 и загрузку с ЬУМ, вы должны исгользовать ОК11В2. Также ОК11В2 поддерживает 11ЕР1, но это пригодится вам, только если вы - счастливый обладатель жесткого диска объема 2 Тб или больше. Собственно, 6К13В2 сейчас устанавливается во всех современных дистрибу- тивах, и нет смысла возвращаться па СКИВ. Если возникнет необходимость, вы можете вернуться на обычный ОКЫВ, установив пакет й*"иЬ-1е§асу, но такая возможность есть только для платформы х86.
4.2. Конфигурационные файлы В каталоге /еЗс/вгиЬ.д хранятся шаблоны, определяющие насзройки ОК.ЦВ2. Также некоторые его параметры хранятся в файле 'е1с/ЦеЕаи11/^шЬ. По шаблонам из /еЗс/§гиЪ.<1 и файлу 'е1с/<1еГаик/§п1Ь программой /изг/зЬш/ёгиЪ- тксопй§ создается рабочий конфигурационный файл /ЬооЗ/§гиЬ/§гиЬ.сГ§. который по задумке разработчике,! ОК.ПВ2 вы не должны редактировать вручную. Поэтому есть две стратегии настройки ОК13В2. Первая заключается в непо- средственном редактировании файла /Ьоо1/§гиЪ/§гаЬ.сГ§. Загрузчику 6К1Л32 вес равно, кто или что отредактирует этот файл - или вы или программа ^гнЬ-шксопбё. Вторая заключается в редактировании файлов из катало- га 'е!с/§гиЬ.с и файла /еЗс/беГаик/ёгиЬ. После чего вы будете должны ввести команду §гиЪ-тксопр^ для создания файла /Ьоо!/утиЪ/§гиЬ.сГ§ по заданным вами настройкам. Чтобы решить, какая из стратегий для вас лучше, нужно знать формат и со- держимое всех этих файлов. Начнем с основною файла конфигурации, кото- рый сложнее и длиннее файла конфигурации обычного СВ.ПВ (см. лист. 4.1). Листинг 4.1. Файл конфигурации /Ьоо1/дгиЬ/дгиЬ.сГд # Не редактируйте этот файл вручную! # # Он автоматически генерируется программой дгиЬ-гг.ксог.йд по шаблонам # из /ебс/дгиЪ.й и настройкам из /ебс/<1еРаи1Р/дгиЬ Н# НАЧАЛО файла /ебс/дгиЬ.Д/00_Ь.еаДег ### 1Р [ -з $ргейх/дгиЬепч ]; Рйеп 1оаД_епч й # Загрузочная метка по умолчанию зеб <1еРаи1Ъ="0" ФР [ п$ {ргеч_заусс!_епбгу}" ]; ЪНеп зеб зачео еп1_гу="${ргеч_зачес!_епбгу}" заче_епч заче<1_епегу зеб ргеч_зачес!_епЪгу" заче_епч ргеч_зачес!_елТгу
зек Ьоок_опсе=кгие а ГипсМоп заVес^е^аи^1: { 1€ [ -г "$ (Ьоок_опсе}" ]; ЪЬеп за^ес1_епЪгу="$ {сЬозеп} " г>ауе_епу зауед_еп1:гу й } ГипсМоп 1оас1^1с1ео { 1пзтод уЬс- хпзтод ^а хпзтод V^<^ео_Ьосйз 1пзтос1 У1с1ео_сгггиз } 1пзтос1 рагЪ_тз<1об 1ПЗГПОС1 ех!_2 # Корневое устройство зек гоок=' (Ьс10,тзс1оз1) ' веагсЬ —по-йорру — 1з--ии1с1 —зек=гоок Ь7300е54-йТ5-4к31 -8002 Ьеа43с64к344 И 1оас1Гопк /изг/зЬаге/дгиЬ/ип1сос1е .рк2 ; ЪЬеп зек дкх1годе=640х480 1оа<1_у1с1ео 1П31ГОС1 д!хЬегт 1пзто4 рагС_тзс!оз 1пзто<3 ехЪ2 зеЪ гооЪ=' (ЬдО,тзс1оз1) ' зеагсЬ —по-Дорру —€з-ии!д —ееЪ=гооЬ Ь7300е54-Ш5-4:Е31-8С02~ Ьеа43с64€344 зек 1оса1е_<31г=($гоок)/Ьоок/дгиЬ/1оса1е зек 1апд=ги_ви тзтоЗ деккехк Я Регт1па1_ои'ириЬ дкхк.егт зет: к.1теоик=5 # ## КОНЕЦ файла /е'кс/дгиЬ.с1/00_11еааег ### # ## НАЧАЛО файла /екс/дгш>.с1/05_с1еЫап_ЬЪепе ### 1пзтос1 раг(1_гг1зс1оз тпзтсд ехк2 # Корневое устройство зек госк='.(Ъа0,шз<3оз1) ' зеагсЬ —по-Порру —кз-ииШ —зеЬ=юок Ь7300е54-Дк5-4Г31-8С02-Ьеа43с641344 1пзтос1 рпд ЬаскдгоипсМ.таде /изг/зЪаге/±тадез/с1езкЪор-Ьазе/зоу~дгиЬ.рпд; ЪПеп зек со1ог_погта1-иЫке/Ыаск зек со!ог_ЫдЫ 1дП1:=Ыаск/юЪ1Ъе
е!зе зеЪ тепи_со1ог_погта1=суаг/Ыие зеЪ тепи_со1ог_ЫдЪЫдЫ=иЫ1е/Ыие II #<# КОНЕЦ файла /е1с/дгиЬ.о/05_<1еЫап_Ы1ете ### ### НАЧАЛО файла /егс/дгиЬ.<1/10_Ыпих ### # Содержит главную загрузочною метку. Далее мы ее рассмотрим подробнее телиепЬгу 'ЮеЫаи (ЗЫЦ/Ыпих, Ыпих 5.2.0-4-. шк!64' —с1азз сЗеЫап —с1азз дпи- Ыпих —с1азз дпи —с1азз оз { 1оас1_у1с1ео тпзтоа дгЧо 1пзтос1 рагб_тз<1оз зпзтоЦ ехб2 зеб гооб='(Н<40,тпздоз1) ' зеагсЬ —по-Порру —Ез-ииШ —зеЪ=гюоб Ь73С0е54-ЙГ5-4131-8Э02- Ьеа43с641344 есЬо 'Загружается Ыпих 5.2.0-4-атс164 1 хпих /ЬооД/утЫпиг-Ь.2.0-4 атс164 гоо1=Ц01В=Ь7300е54-П15--4131-8002- Ьеа43с64Г344 го 1пИ:гс1=/1пзг.а11/дбк/1п1Ъгс1.д2 дигеб есЪо 'Загружается начальный гапкЫзк ...' хпЫгй /ЬооЫЗпЫгс!. 1тд-5.2.0-4-ат<164 } тепиепЫу 'РеЫаг СНЦ/Ыпих, Ыпих 5.2.0-4-ат<164 (гесоуегу тебе)' —с1азз иеЫап —с1азз дпи-Ыпих —с1азз дпи —с1азз оз { 1оа<1_у1с1ео Чпзтод дгхо 1пзто<1 рагб_тздоз 1пето<1 ехЪ2 зеб гооб=' (Ь.а0,тздоз1) ' зеагсЬ —по-Порру —Гз-ии1д —зеИчгооб Ь7300е54-Я^5-4131-8002- Ъеа43с641344 есЬо 'Загружается Ыпих 5.2.0-4-агис164 ...' Ыпих /ЬооС/утЫпи2-5.2.0-4-атс164 гооЪ=Ш)1Э=Ь7300е54-й15-4131-8002- Ьеа43с641344 го згг.дЗе 1пЫ.г<1=/1пз1.а11/д1:к/1пЫгс1.дг есЬо 'Загружается начальный гатсНзк ...' ГпЫго /Ъооб/1пЫгс1.1тд-Ь. 2.0-4-ата64 ### КОНЕЦ /е!:с/дгиЬ.с1/10_11пих #*# #Н НАЧАЛО /еЬс/дгиЬ.с!/20_Ыпих_хеп ### КОНЕЦ /ебс/дхиЬ.с1/20_Ыпих_хеп ### ##* НАЧАЛО /ебс/дгиЬ.<4/20_тет±езб86+ ### # Метка для тетЬ.езт.86 - программы для проверки памяти тег.иепбгу "Методу без! (тепЛезб86н) " { 1пзтод раг±_тздо5 Чпзтод ехб2 зеб гоо1:=' (ЬдО,тзЧоз!) '
зе&гсй —по-Йорру —Рз-ииШ —зеР=гооР Ь7300е54-ДГ5-4Г31-8002- Ьеа43с64Р344 11ппх16 /ЬооР/тетРезР86+.Ып } тепиепргу "Мегг.огу Р<езР (тетРезР86т, зег1а! сопзо1е 115200)" { гпзтос! рагР_тзс1оз 1пзтос1 ехР2 зеР гооР=| (М0,тзс1оз1) ' зеагсЬ --по-Йорру —Рз-иигб —зеР=гооР Ь7300е54-йР5-4Р31-8002- Ьеа43с64Г344 11пих16 /ЬооР/тетРезР8 6+.Ьзг_ сопзо1е=РРу80,115200п8 } тепиепргу "Мётогу РезР (тетРезР86+, ехреггтепРа! ти1Р1ЬооР)" { 1пзто<1 рагР_тзс1оз хпзтой ехР2 зеР гооР=' (Ьй0,тз<1оз1) ' зеагсЬ —по-Йорру —Гз-иигб —зе!=гооР Ь7300е54-ЙГ5-4Р31-8002- Ьеа43с64Р344 ти1Р1ЬооР /ЬооР/тетРезР86+_ти1Р1ЬооР .Ып ) тепиепргу "Мегг.огу РезР (тетРезР86+, зег±а1 сопзо!е 115200, ехрег.тепра! ти1Р1ЬооР) " { гпзтос! рагР_тзс1оз хпзтод ехР2 зеР гооР-' (М0,тзс1оз1) ' зеагсЬ —по-Йорру —Рз-иихд —зеР-гооР Ь7300е54--йР5-4Р31-8002- Ьеа43с64Г344 ти1Р1ЬсоР /ЬооР/тетРезР86+_ти1Р1ЬооР.Ып сопзо1е=РРу80,115200г.8 } # ## КОНЕЦ /еРс/дгио.с!/20_тетРезР86+ ### # Далее этот файл я немного сократил, поскольку дальше в нем нет ничего интересного Файл огромный и его синтаксис напоминает синтаксис Ьазй-сценариев. Если вы просмотрели этот конфигурационный файл, то вы уже догадались, что делает программа ёГиЬ-шксопй^: она собирает воедино все файлы из ката- лога /е1с/§гиЬ.<1 (кстати, в листинге 4 1 перечислена большая часть из этих файлов) и вносит в общий конфигурационный файл из /е1с/деГаи11/§гиЬ. Основная запись из всею листинга 4.1 - это запись тепиеп1гу. Именно в та- ких записях описываются элементы меню загрузчика ОКОВ.
тепиепЪгу '1)<зЫап ОЫЪ/Ыпих, Ыпик 5.2.0-4-атс164' —сХаяв ДеЫап —с1азз дпи- Ипих —с1азз дпи —с1азз оз { 1оаа_у1с1ео 1пзто<1 дгто Тпзтоа рагЪ_тзс1оз 1ПЗШОС1 ехЪ2 зеТ гооТ=' (Ис10,тзс1оз1) ' зеагсЬ —по-Порру —Гз-ииШ —зеТ=гооЪ Ь7300е54-йГ5-4Г31-8002- Ьеа43с64Г344 есйо ’ЬоасНпд Ыпих 5.2.0--4'атс164 Ыпих /ЬооЪ/ттПпие-б.2.0-4-атс164 гооЪ=(ЛЛО=Ь73СОе54-ЙГ5-4Г31-80С2- Ьеа43сб4Г344 го 1пЫгд=/:1пзЪа11/д'1к/1п1Ъгс1.д2 диТеГ есйо 'ЬоьсИпд 1п1Ыа1 гатсЦзк 1пЫгс1 /ЬооЬ/1п1Ъг<3. гтд-5.2.0-4-атдб4 } В одинарных кавычках после тепиепТгу указывается название загрузоч- ной метки. Далее идут параметры, которые вообще можно не указывать и от этого ВеЫап загружаться не перестанет. В фигурных скобках - основная конфигурация. Директива 1оа<1_уи1ео - это ни что иное, как вызов функции 1оас1_у1с1ео, которая также описана в этом файле конфигурации. Функция вставляет некоторые модули (команда тзтосГ), необходимые для раооты графического режима. Обратите внимание, что команды йшпоА загружают не модули ядра Тлпих. а модули СЖ.ЦВ2, которые находятся в каталоге /Ьоог/ 8гиЬ. Внутри {} можно использовать команду еско для обозначения различных этапов загрузки, что и сделано в нашем примере. Можете отказаться от еско, на загрузку это никак не повлияет. Основные команды - это Нпих и тИп1. Первая указывает путь к ядру Ыпих и задает параметры ядра. В нашем случае параметр ядра гоо1 указывает устройство, на котором находится корневая файловая система. Устройство указано в Виде ШИЛ. ЦПЮ-имена очень удобны. Представим, что у вас есть один жесткий диск 8АТА и дна контроллера. Если вы подключите его ко вто- рому контроллеру, обвгчное имя изменится (например, бвшо /беу/яйа, а стало /бсу/збЬ), а Ю-имя - нет. При желании, вы можете указать имя в старом формате, например, гоо1=/беу/8с1а1. Параметр ядра го задает монтирование корневой файловой системы в режиме "только чтение" (это нормально, поз- же она будет перемонтирована), тЫ - задает файл КатОгзк, а последний параметр ядра оше! задает "тихую" загрузку ядра, при которой будут выво- диться только самые важные сообщения.
Команда йпдЬгс? задает путь к файпу 1пО:гс1. Теперь рассмотрим файл /еСс/деТаиТЪ/дгиЬ (листинг 4.2) Листинг 4.2. Файл /е1с/йе^аи1УдгиЬ # После редактирования этого файла запустите команду 'ирйаЪе-дгиЬ' для # обновления файла /ЬооС/дгиЬ/дгиЬ.сГд. к Для получения полной информадии об этом файле введите команду # дпйо -I сгиЬ -п 'ЗтгсрХе сопйдигаЪдоп' # Загрузочный элемент (шепиепбгу пс умолчанию) 6КиВ_ОЕЕАПЪТ=0 # Таймаут СВ.УВ_Т1МЕОЦТ=5 # Задает название дистрибутива, не изменяйте эту строку ОК'РВ р!ЗТК1ВПТ0К='1зЬ_ге1еазе -1 -з 2> /беV/пи11 I I еспс ПеЬтап' # Параметры ядра Ыпих по умолчанию 6КПВ_СМОЫ№_Ы ШХ_ЙЕ ГАПЬТ="ди1е С" # Еще одна строка для задания параметров ядра СВПВ_СМЬЫНЕ _ЫНПХ="1пИ1г<1=/1пзЪа11/д11к/1п1йгд. дг" # Раскомментируйте эту строку, если вы хотите отключить графический режим #СКПВ_ТЕКМ1МАЬ=сопео1е # Разрешение в графическом режиме # Вы можете использовать только те режимы, которые ваши видеокарта # поддерживает через УВЕ. Просмотреть список # таких режимов можно с помощью команды 'ч’ое1пйо' # СКОВ_СГХМОЭЕ=640х48С # Раскомментируйте эту строку, если вы не хотите # использовать ППЮ-имена устройств # 6ВПВ_й I ЗАВ ЬЕ_Ы1ГОХ _0Ч 10=11 г це # Раскомментруйте, если хотите запретить генериров.ичис- меток восстановления #0В0В_С13АВЬЕ_КЕС0УГ.Н?="сгие" * Раскомментируйте, если хотите получить гудок при загрузке (5КПВ #СВДВ_ХЫХТ_ТиМЕ="480 440 1" Как видите, параметры из файла /е(с/(1еГаи11/§гиЬ понятны и не нуждаются б особых комментариях. Но в нем мы узнали о еще одной команде - ирс1и1е- §гиЬ Так какую из них использовать - ирс1а(е-§гиЬ или фтлЬ-тксоп^Ч
На самом деле это почти одна и та же команда. Дело в том, что команда §гиЪ- тксоп/19 по умолчанию выводит конфшурацию 6К.ЦВ2 на экран, поэтому, чтобы она записалась в файла /ЬооГ§гиЬ/§гиЬ.сГ$, запускать ее нужно так: зидо дгиЬ-шксопЕд > /Ьоок/дгиЬ/дгиЬ.сЬд Или же вы можете ввести команду ир<1а!е-§гиЬ, которая сделает то же са- мое. Дру] ими словами, команда ир<1аи -дгиЬ - это сценарий, который вызы- вает только что приведенную команду. Как по мне, то использовать команду ирс!а1е-§гиЬ удобнее. Так какую стратегию ОК.1Л32 использовать? Редактировать шаблоны и пара- метры или сразу конфигурационный файл? Если вы работаеге за компьюте- ром в гордом одиночестве и нет и не предвидится других администраторов, то тогда можете выбрать ту стратегию, которая вам больше нравится. Если же есть или планируются другие администраторы, то нужно редакти- ровать шаблоны и параметры вместо редактирования конфигурационного файла вручную. Дело в том, что если вы внесете изменения непосредствен- но в конфигурационный файл, а потом другой администратор захочет из- менить какой-то незначительный параметр, например, добавить гудок при загрузке 6В.ПВ2, то команда ир<1а1е-%гиЬ перезапишет все сделанные вами изменения. 4.3. Выбор метки по умолчанию Как правило, даже если у вас установлена одна только Ыпих, у вас будет несколько загрузочных меток (несколько записей тепиеШгу). Выбрать метку по умолчанию можно с помощью параметра 6ВПВ_ВЕЕА.ЦЫ. Нумерация меток начинается с 0, то есть первой метке соответствует значение 0. После того, как вы установите другой номер метки по умолчанию нужно ввести команду ирНсае-дгиЬ и перезагрузить систему. Другими словами, последовательность такая: редаю ируем файл /е1с/<1еГаи11/ §щЬ, изменяем значение параметра ОКИВ ПЕРАПЬТ и вводим команду ирс1а1е-&гиЬ. *
4.4. Загрузка ЛУтдстъ Как правило, если имеете дело с Ьгпих, то упор делается на серверы и прочее производственное применение Ыпих однако вдруг вы захотите установить Ыпих на домашний компьютер, скорее всего, ей придется "сожительство- вать" с ХУтбохув. Чтобы добавить возможность загрузки ХУгпёохуз из СК.ЦВ2, нужно отредак- тировать файл /егс/§гиЬ.(1/'40_си8Гот и добавить в него следующие строки: тепиеМгу "Итг.донз (оп /йеч/зсАа!) " { хпзгоод раг^_1г.зс1оз 1пзтос1 пг€з зеЪ гооЪ=' (М0,тзаоз1) ' зеагсЬ —по-йорру —€з-ии!с1 —зеЬ НОЮ дгхчетар -з (МО) $[госС} сИахпТоадег +1 } Здесь \У1п<1о^8 находится на /деу/зНа! и адрес этого раздела указывается в зе( гоо1. Значение 1ЛЛ1Э нужно заменить на ШЛО вашего Мпскимз-раздела. О том, как ‘‘вычислить" ШЛО раздела, мы поговорим, возможно, в другой главе. Остальные параметры можете оставить без изменения (еше не забудь- те исправить МО в дпуетар. если АУтЗохуя установлена нс на первом жест- ком диске). 4.5. Пароль загрузчика СК11В2 Загрузчик СКЦВ позволял только установить пароль или общий, или на загрузку определенной метки. Загрузчик ОК11В2 более гибкий в этом плане, поскольку вы можете настроить не только пароли, но и логины. Также есть минимальная система разграничения прав доступа. Итак, в С1ШВ2 есть суперпользователь, который может редактировать загрузочные метки. Существует возможность восстановить пароль гоо1 пу- тем передачи ядру параметра тИ Но .для этого нужно отредактировать кон- фигурацию 6К.ЫВ2. Если ьы установите пароль суперпользователя, то изме- нить конфигурацию загрузчика вы сможете только после ввода этого пароля.
Также в 0В.ПВ2 есть обычные пользователи, которые имеют право только выбирать загрузочную метку. Они не имеют права редактировать конфигу- рацию загрузчика. В принципе, можно обойтись одним паролем суперполь- зователя, но при желании СК.С1В2 может довольно гибко разграничить права пользователей. Давайте сначала добавим пароль суперпользователя. Для этого в файл /ею/ §гаЬ.Л/ОО_Ьеас1ег добавьте строки: вес 5иреги&егз="та1п_ас1т1п" раззмогд та1Н_ас1т1п 123456799 Первая команда задает суперпользователя таш абит, а вторая - задает для него пароль. Старайтесь избегать общепринятых имен вроде ас1тт, гоо1 и т.д. Так у злоумышленника, который хочет изменить конфигурацию ОК.ЦВ2 будет больше неизвестных данных. Пароль пока в незашифрованном виде и это не очень хорошо. Поскольку если загрузиться с ЫуеСП или 1л уеЪт8В, то его можно будет увидеть. Позже я покажу, как зашифровать пароль. Обычные пользователи задаются инструкцией раз^огй, например: раззиогс! те 12345 По сути тагпа^тгп - тоже был бы обычным пользователем, если бы не инструкция ьирегиьегз, которая делает его суперпользователем. Представим, что у нас есть следующие строки: зеР зир°гизегз="та1п ас1т1п" раззмогй та1п_ас1т.1п 123456789 раззмогд те 12345 Пользователь тат_а<1т1п может загружать операционные системы и редак- тировать конфигурацию 01ШВ2. Пользователь те может только загружать операционные системы. Если вы хотите, чтобы определенные метки могли захружать только опреде- ленные пользователи, добавьте к тпепиеп1гу параметр —и$ег$: Г»
тепиепкгу "Кгпс1омз" —изегз те { тпзтод рагГ_тзс1оз 1пзто<1 пЪГз зек гоок=' (Ьс10,тзс1оз1} ' зеагсЪ —г.о-Яорру —к’з-иихд —зек 001В Яггуетар -з (НоО) ${гоок} сЬа1п1оа<1ег +1 } Теперь зашифруем пароль. Введите команду дгиЬ ткраззи<1-рЬк<112 Программа запросит пароль, зашифрует его и выведет на экран его кэш. Вы увидите что-то подобное: дгиЬ.рЬЫГ2 . зЬа512.10000.9290Г727ЕО06С38ВА4549ЕЕ7ОЕ25СГ5642659 21137ЕС076Г2В27080136.887СЕЕ169ЕА83О5235О8004742АА7В6187А41Е31 87ОЕ0СЕ14Е256О85ЕО97А9790801гС.887еГГ169ЕА8335235О8004242АА7В6 187А41Е3187ВЕ0СЕ14Е256В85ЕВ97А97357ААА8ЕГ0А3871АВ9ЕЕГГ458392Г4 62Е49548/387Г685В7472ЕС6С29Е293Е0А0 Данный хэш нужно указать вместо пароля пользовагеля. Однако вместо ин- струкпиира$гюс1 нужно использоватьраззчеоп!_рЪксЦ2. Например: раззиогс1_рЬкс112 те дгиЬ.рЬксП:2 . зЪа512.10000.9290Г727ЕС06С38ВА4 549ЕЕ7ОЕ25СГ5642659211В7ЕС076Е2О27080136.887СЕЕ169ЕА83ОЬ235В80 04742АА7В6187А41Е3187ОР0СЕ14Е256В85ЕБ97А979080136.887СЕЕ169ЕА8 33523538004242АА7О6137А41Е3187ОЕ0СЕ14Е256О85ЕО97А97357ААА8ГГ0А 3871А39ЕЕГЕ458392Г462Е495487387Г685В/4/2ГС6С29Е293Е0А0 После изменения файлов из каталога /е!с/§гиЬ.д не забудьте ввести команду ирёгаНе-ёгиЬ для обновления основного файла конфигурации.
4.6. Установка загрузчика Команда установки загрузчика такая же, как и в случае с 6Й.ЦВ # /зЫп/дгиЬ-1пз*а11 <устрсйство> Например: # /зЫп/дгиЕ-1 г.зсаИ /деу/зс’а Поскольку 6К.ЫВ2 у вас уже установлен, вряд ли вам придется вводить эту команду. Исключение может составить разве что переустановка всей систе- мы. которая перезапишет загрузочный сектор своим загрузчиком. Поэтому вам придется загрузиться с 1луеСП, выполнить скгоо1 для вашей старой корневой системы и ввести команду %гиЪ-1п$(а11 для установки загрузчика СК.СВ2. 4.7. Система инициализации После своей загрузки ядро передает управление системе инициализации. Цель этой системы - выполнить дальнейшую инициализацию системы. Са- мая главная задача системы инициализации - запуск и управление систем- ными службами. Служба (сервис, демон) - специальная программа, выполняющаяся в фоно- вом режиме и предоставляющая определенные услуги (или, как говорят, сер- вис - отсюда и второе название). Что превращает обычный компьютер, скажем, в РТР-сервер? Правильно, за- пущенная служба РТР - тот же РгоРТРО или подобная. Вы можете устано- вить программу РгоРТРО и настроить ее на автоматический запуск системой инициализации. Тогда при каждой загрузке наш компьютер будет превра- щаться в РТР-сервер. Аналогично и с другими сервисами - достаточно уста- новить определенную программу, чтобы превратить компьютер в веб-сервер или почтовый сервер. Но стоит вам отключить ее и компьютер уже прекра-
щает предоставлять обеспечиваемые ьротраммой услуги, следовательно, превращается в самый обычный компьютер В мире Ыпих. существовало очень много разных систем инициализации - тй, ирз1аг1, шй-п§. Все их рассматривать уже пет смысла, поскольку в совре- менных дистрибутивах используется современная система инициализации 8у»1ет<1. 8у«1етй — подсистема инициализации и управления службами в Ыпих, фактически вытеснившая в 2010-е годы традиционную подсистему 1ПЙ. Основная особенность — интенсивное распараллеливание запуска служб в процессе загрузки системы, что позволяет существенно ускорить запуск операционной системы. Основная единица управления — модуль, одним из типов модулей являются ''службы" — аналог демонов — наборы процессов, запускаемые и управляемые средствами подсистемы и изолируемые контрольными группами. 4.7.1. Принцип работы Система инициализации используется во многих современных дис- трибутивах, в частности в Реаога, СЪипШ, СепгОЗ и орепЗС'ЗЕ. На данный момент - это самая быстрая система инициализации. Давайте подумаем, как можно ускорить запуск Ыпих? Можно пойти по пути ира1аг1 -параллельно запускать службы. Но параллельный запуск - не всегда хорошо. Нужно учитывать зависимости служб Например, сервис 4-Ьиы ну- жен многим другим сервисам. Пока сервис д-Ьиз не будет запущен, нельзя запускатг» сервисы, которые от него зависят. Если сначала запускать основные сервисы и ждать, пока они будут запуше- ны, а потом уже запускать службы, которые от них зависимы, особого выигрыша в производительности по сравнению с тй вы не увидите. Но если сервис (Мпзз (или любой другой, о г которого зависят какие-то другие серви- сы) запускается долго, то все остальные службы будут ждать его. Как обойти это ограничение? При своем запуске службы проверяют, запу- щена ли необходимая им служба, по наличию файла сокета. Например, в случае с б-Ьиз - это файл /уаг/гип/йЬия/зузЩпТ-Ьиз зоскеЕ Если мы создадим сокеты для всех служб, то мы можем запускать их параллельно, особо нс беспокоясь, что произойдет сбой какой-то службы при запуске из-за отсут- ствия службы, от которой они зависят. Даже если несколько служб, которым ы
нужен сервис 4-Ьиз, запустятся раньше, чем сам сервис б-Ьиз: ничего страш- ного. Каждая из этих служб отправит в сокет (главное, что он уже открыт!) сообщение, которое обработает сервис б-Ьиз после того, как он запустится. Вот и все. Но это не единственное "ухищрение", посредством которого осуществля- ется ускорение запуска компьютера, инициализацию которого производит зу81ет4. Эта система инициализации запускает только необходимые серви- сы. Остальные же будут запущены по мере необходимости Концепция от- ложенного запуска используется и в других операционных системах - например, в Мас ОЗ X ггам система инициализации называется 1анпсЬ(1) и в УУтбоууз (концепция отложенного запуска служб). Так что решение не очень новое, но зато проверенное Основными функциями зуз1етб являются: • Активация на основании сокетов - система инициализации зуз1ешб прослушивает сокеты всех системных служб. Сокеты передаются системным службам сразу после запуска сервисов. Благодаря этому осу- ществляется параллельный запуск сервисов. Также это позволяет переза- пускать сервисы без потери любых отправленных им сообщений, то есть пока сервис перезапускается, отправленные ему сообщения накаплива- ются, и он сможет их обработать после того, как будет запущен. • Активация на основании устройств - зу$1етё может запустить опреде- ленные службы, когда станет доступным определенный тип оборудова- ния. Например, вы подключили ЫиеЩоЛ-адаптер, может быть запущен сервис ЫиейэоЛ. • Активация на основании й-Ьиз - служба инициализации может за- пустить сервисы, которые используют б-Ьиз для межпроцессною взаимо- действия, например, когда клиентское приложение попытается связаться с системной службой. • Активация на основании путей - зузгетб может запустить службу, если изменится содержание каталога. • Управление точками монтирования и автоматическим монтирова- нием -система инициализации отслеживает и управляет точками монти- рования и автоматического монт ирования. • Снимки системных состояний - благодаря этой возможности зузХешб может сохранить состояние всех модулей и восстановить предыдущее состояние системы.
• Параллелиз&ция - «узТетб запускает системные службы параллельно благодаря активации на основании сокетов. Параллельная активация су- щественно сокращает время загрузки системы. • Обратная совместимость с БузУ - поддерживаются сценарии инициа- лизации 8узУ, что упрощает переход на зузТетб. Однако все устанавли- ваемые в современных дистрибутивах пакеты служб уже адаптированы под зуз1етб, поэтому не нужно надеяться, что во время установки пакета какого-то сервиса будут установлены ЗузУ-сценарии. Будут созданы фай- лы, необходимые для запуска сервиса посредством зуз1етб. 4.7.2, Конфигурационные файлы зуйетЛ Обилие различных конфигурационных файлов зуз1етб может ввести в сту- пор даже бывалого линуксоида, не говоря уже о пользователе, который впер- вые видит зу«1етб. Когда я впервые познакомился с зузХетб, у меня было только одно желание - снести ее и установить вместо нее шй. Но мы этого не будем делать. Чтобы разобраться со всеми файлами, нужно понимать, как работает эта система. В зузгетб используется концепция модулей (юнитов). Существующие типы модулей описаны в таблице 4.1 Таблица 4.1. Типы модулей системы инициализации $у$1ет<1 Тип Описание зеглсе Служба (сервис, демон), которую нужно запустить. Пример имени модуля: псзуогкзеппсс. Изначально зуз1етб поддер- живала сценарии 8узУ (чтобы управлять сервисами можно было, как при использовании тй), но в последнее время в кат алоге /е1с/тй.б систем, которые используют зуз^етб практически Iгусто (или вообще пусто), а управление серви- сами осуществляется только посредством зуь1етб
1аг§е( Цель. Используется для группировки модулей других ти- пов. В зуа^етс! нет уровней запуска, вместо них исполь- зуются цели. Например, цель тиЖ-изег.1аг§е1 описывает, какие модули должны быть запущены в многопользователь- ском режиме зпарз^о! Снимок. Используется для сохранения состояния зуайтй. Снимки могут использоваться для перевода системы из од- ного состояния в другое, например, в состояние сна и про- буждение тоип1 Точка монтирования, Предстанпяет точку монтирования. Система инициализации аузйяпд контролирует все точки монтирования. При использовании вуйетй файл /ею/Т^аЬ уже не главный, хотя все еще может использоваться для определения точек монтирования аШотоип! Автоматическая точка монтирования. Используется для монтирования сменных носителей - флешек, внешних жестких дисков, оптических дисков и т.д. воске! Сокет. Представляет сокет, находящийся в файловой си- стеме или в Интернете. Поддерживаются сокеты АР_1ЫЕ Г, АР_Е\ТЕТ6, АГ1ЛЧ1Х. Реализация довольно интересная. Например, если сервису 8еллсе1.8ег\тсе соответствует со- кет 8егУ1се1.зоске1, то при попытке установки соединения с 8сгУ1сс1.8оске1 будет запущен зетсе 1.Бегущее йемсе Устройство. Представляет устройство в дереве устройств, Работает вместе с тку: если устройство описано в виде правила ис1еу, то его можно представить в зузЩпм! в виде модуля <1епсе ратк Файл или каталог, созданный 1 де-то в файловой системе асоре Процесс, который создан извне ПИ
Ял|»О I 11111V Л.1ПИХ зКсе Управляв! системными процессами. Представляет собой группу иерархически организованных модулей З'л'ар Представляет область подкачки (раздел подкачки) или файл подкачки (свопа) Итег Представляет собой таймер системы инициализации зуз1ет<1 Модули хранятся в следующих каталогах: • /е1с/$уя1епк1/8у81;т/ обладает самым высоким приоритетом. Здесь со- держатся модули, которые созданы и управляются системным админи- стратором • /гип/зузЩппЕ'зуЫегт/ - модули, созданные во время выполнения. Приори- тет этою каталога ниже, чем каталога /е1с/8у81епк1/8у81ет/, но выше, чем у /и8г/11Ь/8у81егпс1/8у81ет. • /изг/ЕЬ/зузГетс^зузЬегп/ модули, которые установлены из пакетов. Типичный файл модуля тина зегуюе приведен в листинге 4.3. Листинг 4.3. Типичный файл модуля типа зегм/се [ЦПО-Ь] Ве5сг1рг1оп=0аетоп Со <1егес11 сгазЫпд аррз АЛ:ег=зуз1од.РагдеТ [Зегмтсе] Ехес5'1агР=/изг/зЫп/аЬгРд Туре=^огк1пд [ТпзГаИ] ИапРес1Ву=-ти11:1-изег. Сагден В секции Ппй содержится общая информация о сервисе. Эта секция есть и в других модулях, а не только в сервисах.
Секция Бегхтсе содержит информацию о сервисе. Параметр ЕхесЗТаЛ опи- сывает команду, которую нужно запустить. Параметр Туре указывает, как сервис будет уведомлять ъуь1ет<1 об окончании запуска. Секция 1п$1а11 содержит информацию о цели, в которой должен запускать ся сервис. В нашем случае видно, что сервис будет запущен при активации цели тиЖ-изегЛагце!.. Вы можете использовать эту ''болванку" для написания собственного серви- са, который потом нужно поместить в файл /'е1с/зуз1ет<1/5у81ет/'имя_сервиса. 8егу1‘се. После этого нужно перезапустить саму зуз1етй, чтобы она узнала о новом сервисе: . # яузЬетсМ Даетоп-ге1оаа 4.7.3. Цели Теперь поговорим о целях. Файлы целей *.1аг₽еТ предназначены для груп- пировки вместе других юнитов зуз1етЛ через цепочку зависимостей. Так, модуль цели §гарП1са1.1аг§е;, который используется для запуска графическо- го сеанса, запускает системные службы (ЮМ (файл §бт.8егу1се) и Ассоипй Бегучее (ассоилЬ-с1аетоп.8егу1се), а также активирует цель тиЖ-изег.гагйеб В свою очередь, цель тиШ изеглаг^ет запускаег другие системные службы, например, П-В из (сЮиз.зегуюе) и активирует другие цели вроде Ьаз1сдаг§е1. В 8уз1ет(1 имеются предопределенные цели, которые напоминают стандарт- ный набор уровней запуска. Некоторые цели называются гип1есе1?4Лагхег, чтобы упростить переход быв- ших пользователей тй на 8уз(ет<1, а именно; • ролуегойлаг^е! (гип1еуеЮЛаг§е1) - завершение работы и отключение системы; • гезсиеДаг§е1 (гип'.еуе11.1аг§е1) - однопользовательский режим, среда вос- становления; • ши1й изеглагёС1(пт1сус12Лаг§е1:, гш11еуе13 гаг§с1, гип1еуе14.1аг§е1) - много- пользовательский режим, без графического интерфейса;
• ргарл'.са! даго е1 (гип1еуе15 Лаг§е1) - многопользовательский режим с графи- ческим интерфейсом; • геЬооГЛаг§ег (гип1еуе16 Гаг%е:) - завершение работы и перезагрузка системы. Управление службами осуществляется с помощью программы зузсетей. Подробнее о службах мы, возможно, поговорим в другой главе, а пока раз- беремся, как использовать зузгешей для завершения работы системы: • зузТетсИ Ьак - останавливает систему; • ьуя1етс11 розуегой' выключает систему; • ьузТетсг! геЬоо: - перезагружает систему. Многим пользователям будет удобнее использовать старые команды Нак, ромего#и геЬоо1. Но все же теперь вы знаете, что есть альтернативные спо- собы завершения работы. 4.8. Управление сервисами при использовании $у$1епи1 При использовании системы инициализации зузтетд управление службами осуществляется посредством программы зуз1етсй. Команда зузСета! ис- пользуется для разных целей, поэтому в таблице 4.2 представлены не все ее параметры, а только те, которые имеют отношение к сервисам. Таблица 4.2. Параметры программы яуМетсй Параметр Описание зРп! <имя.зегу1се> Запускает сервис з1ор <имя.зегУ1се> Останавливает сервис
геэЬай <имя.8сгуюе> Перезапускает сервис 1гу-ге8таг1 <имя.8егс1се> Перезапуск сервиса только, если он запущен ге1оаб <имя.8егу1се> Перезагружает конфигурацию сервиса 81аП18 <имя.8егу(се> Отображает подробное состояние сервиса 18-асбуе <имя.8егУ1се> Отображает только строку асИуе (сервис за- пущен) или тасИме (остановлен) Ив^-ипйз —Туре вепйсе -а11 Выводит состояние всех сервисов епаЫе <имя.яеппсе> Включает сервис (обеспечивает его автомати- ческий запуск) слваЫе <имя.8епчсе> Отключает сервис (сервис не будет автомати- чески запускаться при запуске системы) геепаЫе <имя.зегу1се> Деактивирует сервис и сразу его использует ИаТ-ишТ-Шез —Туре зегуюе Выводит список всех сервисов и сообщает, какие из них активированы, а какие - нет Примеры. # зузЬетсЫ зГагЬ ЪТЬрсГ зегчтсе # зузЬетсЫ зЪор ЪЬЬрс! Первая команда запускает сервис Ьррд (веб-сервер), вторая - останавливает Обратите внимание, что ".зепчсе" можно не указывать. Бывалые пользователи Ыпих сразу заметят удобства. Ранее, чгобы отклю- чить службу на определенном уровне запуска, нужно было удалить ее сим- волическую ссылку из определенного каталога. Аналогично, чтобы служба запускалась на определенном уровне запуска (например, в графическом ре- жиме), нужно было создать символическую ссылку. Сейчас всего этого нет, а есть только команды епаЫе и (НзаЫе, что стало гораздо удобнее.
Глава 5. Как ядро управляет процессами
5.1. Что такое процесс Процесс - это код (программа), находящийся в состоянии выполнения. Также процесс - это не только исполняемый программный код, а еще и на- бор ресурсов (открытые файлы и сигналы, ожидающие обработки, вну< рен- ние данные ядра, один или несколько потоков выполнения (Дйгеабч оЕ ехеси- Йоп)), а также сегмент данных программы (4а1а зесбоп), который содержит глобальные переменные. Потоки выполнения кода, которые часто называют просто потоками (гйгеабз), представляют собой объекты, выполняющие определенные дей- ствия внутри процесса. В каждом из потоков содержатся уникальный счет- чик команд (рго§гат сошйег), стек процесса и набор регистров процессора. Планировщик ядра на самом деле управляет выполнением отдельных потоков, а не процессов. В традиционных Птх-подобных операционных системах каждый процесс содержал только один поток. Но в современных системах многопоточные программы (т.е. программы, в которых запускается более одного потока выполнения команд) используюгся довольно часто.
Процессы в современных ОС предусматривают наличие двух виртуальных ресурсов: виртуального процессора (УСРП) и виртуальной памяти (УКАМ). Благодаря УСРП для процесса создастся иллюзия, что они монопольно ис- пользуют весь компьютер, не смотря на то, что физический процессор могут использовать сотни других процессов. УНАМ позволяет процессу распреде- лять оперативную память компьютера и управлять ею так, как будто он один владеет всей памятью в системе. Сама по себе программа процессом не является. 11роцесс - это выполняюща- яся программа и набор ресурсов. Может существовать несколько процессов, выполняющих одну и ту же программу. Также несколько процессов могут совместно использовать одни и те же ресурсы, такие как открытые файлы или адресное пространство. Процесс начинает существовать с момента соз- дания. В операционной системе Ыпих существование процесса начинается с системного вызова Гогк(), который создает новый процесс путем полного копирования уже существующего. Процесс, вызвавший Гогк(), называется порождающим, или родительским (рагеп!), а новый процесс именуют по- рожденным. или дочерним (сЬПф. Родительский процесс после этого про- должает свое выполнение, а дочерний начинает выполняться с одного и того же места — с момента возврата из системной функции Гогк(). В результате возврат из системной функции Гогк() выполняется из ядра дважды: один раз в родительском процессе, а второй раз — в порожденном. Если в одном из процессов нужно выполнить другую программу (не поро- дить новый процесс этой программы, а именно вызвать другую программу), то нужно использовать функцию ехес(); которая создает новое адресное про- странство и загружает в него новую программу. В современных ядрах Ыпих функция Тогк() на самом деле реализована через вызов системной функции с1опе(). Выход из процесса осуществляется с помощью функции акй(), которая за- вершает выполнение процесса и освобождает все занятые им ресурсы. Роди- тельский процесс может выдать запрос о состоянии завершенных дочерних процессов с помощью вызова системной функции \чай4(). которая позволяет одному процессу подождать завершения другого указанного процесса. После завершения процесса он переводится в специальное состояние зомби (яотЬзс), которое используется для представления завершенного процесса до того момента, пока порождающий его процесс нс вызовет системную функцию зчай() или М'айркЦ).
5.2. Структуры, связанные с процессами 5.2.1. Список задач и структура процесса Список процессов хранится в ядре как двусвязный циклический список, ко- торый называется списком задач. Каждый элемент этого списка описывает один запушенный процесс и называется дескриптором процесса. Дескрип- тор процесса имеет тип 1азк_з1гис1, а сама структура определена в файле <11пих/зскеб±>, Структура довольно объемна и полное описание ее полей можно найти по адресу к11рз://(1осз.ки1коо.сот/(1оху^еп/Ипих/кег-пе1/3.7/81гис11азк_З1гис1.к1т1 Посмотрите на рис. 5.1. На нем показано, что представляет собой список задач (1азк Нз1). Это двусвязный циклический список, элементами которого являются структуры типа 1азк_з(П1с1. <*гис< 1в»к»»ис< ргосе»в 1М419‘ Ютц] МИо: ип«1дпе<11опд рейсу: 81лхЛ шк-Мисс 'рвгепС в&осг мы Ьадс рИЛрк»: И» км Рис. 5.1. Список задач Каждый процесс динамически размещает структуру з1гис11азк з1гис1 Мак- симальное количество процессов, которое может быть создано в Ыпих, огра- ничивается только объемом физической памяти и равно: Г 74 к____
пах РЬгеаЦз = тетрадез / (ТНКЕА0__512Е/РА5Е_312Е) / 2; что для архитектуры 1А32 означает, как правило, пиш_р11у$ра8е8/4. Например, на машине с 2СВ памяти, возможно создать 128к потоков. Кро- ме того, этот предел може т быть изменен в процессе исполнения, передачей значения КЕК.К МАХ ТНКЕАП8 в вызове 8узс11(2), или через интерфейс ргосй: # саъ /ргос/зуз/кегг.еГ/ЪЬгеадз-тах 32764 # есПо 100000 > /ргос/зуз/кегпе1/ЪЬтеа<18-тах # сак /ргос/зуз/кегг.еХ/ЪЦгеадз-тах 100000 # дйЬ -д чтИпих /ргос/ксоге Соге иаз депегакед Ьу 'ВООТ_1МАОЕ=240ао1:8 го гоок»-306 ч1аео=такгсх:чеза:0x118’. # 0 0x0 1п ?? () (дсЛЬ) р тах_кЪгеаоз $1 = 100000 Множество процессов в Ыпих-системе представляет собой совокупность структур $1гис11азк_&1гис1, которые взаимосвязаны двумя способами: 1, Как хеш-массив, хешированный по р1<1 2. Как кольцевой двусвязный список, в котором элементы ссылаются друг на друга посредством указателей р->пех1_1а$к ир->рг^_1ахк. Хеш-массив определен в 1пс1и<1е'1ш11х/8сЬе<1.Ь как ртбЬазЬ: Мейпе РЮНА5Н_32 (4096 » 2) ехкегп зггиск Разк_зсгиск *р1аЬазН[₽ЮНА8Н_32] ; #дейпе р1с_Ьаз11Гп (х) ( ( ( (х) » 8) Л (х) ) & (₽ЮНАЗН_52 - 1) ) Задачи хешируются по значению р'иЦ вышеприведенной хеш-функцией, которая равномерно распределяет элементы по диапазону от 0 до РГО МАХ- 1. Хеш-массив используется для быстрою поиска задачи по заданному р1с1 с помощью шНпе-функции йпб_ (азкЬу^йёО, определенной в шсктбе/Ппих/ зсЬесИт:
зЪаЫс ДпНпе зЬгисЬ Тазк_зЪгисЪ *йп<1_Ьазк_Ьу ргб (1пЬ р!с1) { зкгиск Газк_зЪгисЪ "р, “ЫаЫе = &р±с1Наз11 [р!с._Иаз11Гп (р±с!) ] ; {ог (р = *ЬЪаЫе; р && р->р1<1 != р!с1; р = р->р±с1ЬазЬ_пехй) ; геьогп р; Задачи в каждом хеш-списке (т.е. хешированные с тем же самым значением) связаны указателями р->р1СЪа«Ь пехГ/рМЬазЪ рргеу, которые используются функциями ЬазЪ-рМО и щй1азк__рк10 для добавления/удаления заданного процесса в/из хеш-массив. Делается это под блокировкой (зр1п1оск) 1азк1181_ 1оск, полученной на запись. Двусвязпый список задач организован таким образом, чтобы упростить на- вигацию по нему, используя указатели р->гех1_1а8к/ргеу_|а8к. Для прохож- дения всего списка задач, в системе предусмотрен макрос Гог_еасй_1а8к() из )Пс1исе/1 ших/зсЬеб .Ь: #йей.-.е ^ог_еасЪ_Тазк(р) \ ^ог (р = Лг.1е_Тазк ; (р = р->пекЬ_Ьазк) != &1п1Т_^азк ; ) Перед использованием Еог еагИ_1а?к() необходимо получить блокировку (азкН*1_1оск на чтение. Примечательно, что ГогеасЬгазкО использует 1ш1_ 1азк в качестве маркера начала (и конца) списка - благодаря тому, что задача с р1д=О всегда присутствует в системе. Функции, изменяющие хеш-массив и/или таблицу связей процессов, особенно Еогк(), ехп() и р1гасе(), должны получить блокировку (зрпйоск) 1азк11з1 1оск на ЗАПИСЬ. Что особенно ин- тересно - перед записью необходимо запрещать прерывания на локальном процессоре, по той причине, что функция веп<1_8цро0, при прохождении по списку задач, захватывает 1азкЕ81_1оск па ЧТЕНИЕ, и вызывается она из кШ ГазупсО в контексте прерывания. Однако если требуется доступ только для чтения, запрещать прерывания нег необходимости. Теперь, когда доста- точно понятно представлено как связаны между собой структуры 1азк зйшсг, можно перейти к рассмотрению полей Газк зГгисГ. В других версиях ЦЫIX информация о состоянии задачи разделяется на две части: • В одну часть выделяется информация о состоянии задачи (называется 'ргос зйцсШге', которая включает в себя состояние процесса, информацию планировщика и пр.) и постоянно размещается в памяти;
• Другая часть, необходима только во время работы процесса ('и агеа', кото- рая включает в себя таблицу дескрипторов, дисковые квоты и пр.). Единственная причина такого подхода - дефицит памяти. Современные опе- рационные системы (не только Ыпих, по и другие, современная ГгееВЗЭ например) не нуждаются в таком разделении и поэтому вся информация о состоянии процесса постоянно хранится в памяти. 5.2.2. Состояния процесса Поле $1а1е структуры 1а$к_$1гис1 объявлено как: Vо1аЪ^1е 1опд зга^е; /* -1 иг.гиппаЫе, 0 гипг.аЫе, >0 зТсрред */ #<Ш1пе ТАЗК_ХОЫЫ1М6 0 #ЙеЙпе ТАЗК_1ЦТЕККОРТ1ВЬЕ 1 #<5ейпе ТА5К_иЫ1НТЕККЦРТ1ВЬЕ 2 ♦йейпе ТА5К_2СМВТЕ 4 МеЯпе ТАЗК_ЗТ0₽РЕ0 8 #йейпе ТАЗК_ЕХСШЗ!УЕ 32 Спецификатор уо1аШе в объявлении р->яШе означает, что это поле может изменяться асинхронно (в обработчиках прерываний): • ТА8КК1ПЧМ1М} - указывает на то, что задача "вероятно" находится в очереди запущенных задач (гипциене). Причина, по которой задача мо- жет быть помечена как ТА8КК1ЖММО, но не помещена в гипциеие в том, что дометить задачу и вставить в очередь - не одно и го же. Если заполучить блокировку гипдиеие_1оск на чтение-запись и просмотреть гипдиеие, то можно увидеть, что все задачи в очереди имеют состояние ТА8К_В.ЕП'ПЧГ<0. Таким образом, утверждение "Вес задачи в гипциеие имеют состояние ТА8К К.ЦММШ6" не означает истинность обратного утверждения. Аналогично, драйверы могут отмечать себя (или контекст процесса, под которым они запущены) как ТАЗКПЧТЕККИРТТВЬЕ (или ТА8К ЦМ1\ТЕВЯЦРТ1ВЬЕ) и затем производить вызов 8сЬедд1е(), ко- торый удалит их из гшщиеие (исключая случай ожидания сигнала, тогда процесс остается в гипциеие).
• ТА8К1ХТЕКК.ЦРТ1ВЕЕ - задача в состоянии 'сна1', но может быть "раз- бужена" по сигналу или по истечении таймера. • ТА8К_Ш1НТЕККЦРТ1ВЕЕ - подобно ТА8К_Г\ТЕККЕ?Т1ВЕЕ, только задача не может быть "разбужена" • ТА8К_ХОМВ1Е - задача, завершившая работу, до того как родительский процесс ("естественный" или "приемный'') произвел системный вызов \уай(2). • ТА8К8ТОРРЕП - задача остановлена, либо по управляющему сигналу, либо в результате вызова рСгасе(2). • ТА8К_ЕХСЬЕ181УЕ - не имеет самостоятельного значения и исполь- зуется только совместно с ТА8К1МТЕКЯСРТ1ВЕЕ или с ТА8К_ ЦМ1.ЧТЕКК.ОРТ1ВЕЕ (по ОК.). При наличии этою флага, будет "раз- бужена" лишь эта задача, избегая тем самым порождения проблемы "гремящего стада1' при "пробуждении" всех "спящих" задач. Флаги за- дачи представляют не взаимоисключающую информацию о состоянии процесса: цпзгдпеб 1спд Дада; /* флаги процесса, определены чиже */ /* * Флаги процесса */ Шейпе РГ_АЫСНПАКЫ 0x00000001 /* Рг1пй аИдпгпепЬ иагпгпд тздз */ /★ Мо1: 1дпр1е1пепЬеП уей, оп1у йог 486*/ Шейпе РЕ_ЗТАКТ1МС 0x00000002 /* создание */ Шейпе РЕ_ЕХ1ТШб 0x00000004 /* завершение */ Шейпе РЕ_ ГОВ.КЫОЕХЕС 0x00000040 /* создан, но не запущен */ Шейпе РЕ_ЗОРЕКРВ1У 0x00000100 /* использует привилегии суперпользователя */ Шейпе ?Е_ООМРСОКЕ 0x00000260 /* выполнен дамп памяти */ Шейпе РЕ_31СЫАЬЕО 0x00000400 /* "убит" по сигналу */ Шейпе РГ_МЕМАЕЬОС 0x00000800 /* Распределение памяти */ Шейпе РЕ_УЕОКК 0x00001000 /* "Разбудить" родителя в тш_гс1еазе */ Шейпе РЕ_СЗЕОЕР'3 0x00100000 /* задача использует ГРО ЪЫз диапбит (ЗМР) */ Переход процесса из одного состояние в другое показан на рис. 5.2. В коде ядра часто необходимо изменять состояние процесса. Предпочти- тельнее всего для этой пели использовать функцию: зей._йазк_в1жЬе (йазк, зйаДе); /* Перевести задачу Чазк' в состояние ' зОайе' */
которая устанавливает указанное состояние для указанной задачи. По мере необходимости эта функция также гредоставляет барьер памяти (тетогу Ьагпег), чтобы гарантированно изменить состояние задачи на других про- цессорах. В остальных случаях это эквивалентно выражению: Ъазк->зЪа!:е = з^аТе; Рис. 5.2. Состояния проиесса Существует и другая функция, 8е1_снпеп1_8Ше(81а1с), вызов которой экви- валентен 8е1_1а8к 81а1е(еипеп1, 81а1е). Данная функция и другие, связанные с ней. описаны в файле <Г1пих/8с11е4.п>. 5.23. Дескриптор процесса Структура 1азк_з1гис1 выделяется с помощью распределителя 51 аб для обе стечения повторною использования объекте » и ' раскрашивания" кэша. В
ранних версиях ядра Ыпих (до версии 2.6) структура 1а$к $1гис1 хранилась в конце стека ядра каждого процесса. Это позволяло архитектурам с неболь- шим количеством регистров, таким как х86, вычислять местоположение дескриптора процесса с помощью указателя стека без использования допол- нительного регистра для хранения местоположения. В современных версиях, когда дескриптор процесса динамически создает- ся с помощью распределителя плит, была создана новая структура, $ггис1 1кгеас1_1п/о. Данная структура снова находится в нижней части стека (для стеков, которые растут вниз) и наверху стека (для стеков, которые растут вверх). Новая структура также упрощает вычисление смещения его значе- ний для использования в ассемблере. Ргосеав Кегле! 5!аск Ыфв м тетогу аОЛгевъ лк* 1Х-.11К. с«ггейг_г!»геаа_1пго о в^гисг 1Лгеай_Нгис1 • Имеет телкиу аЗД гевз 1Пге4й _Шо Оме ро)Шег 1о 1пе рпхме <1еесгр1ог I?» ргосеее1» втгчс! гавк_81гис1: Рис. 5.3. Дескриптор процесса и стек ядра Структура 1кгеа<1_т/о определена в <а8т'Шгеай тГо.Ь> и имеет вид: зТгисЪ ЪИгеад_1п^о {
зЬг-исХ Ъазк. зЪгиср зЪгисЪ ехес_с1с1г.а1п ипзхдпеР 1опд ипз1дг.ес! 1опд __и32 _з32 тт_зедтепТ_Ъ зЪгисЪ гезСагГ._Ыоск ипзддпес! 1опд с8 *Сазк; *ехес_с1ота1п; Яадз; «ЬаТиз/ сри; ргеетрр_соипр; асМг_11пиЛ; гезЪагР_Ысск; ргеу!о лз_езр; зирегу!зог_ зЪаск[0]; Структура 1кгеа<1_1п/о размещается в конце системного стека, выделенного для каждой задачи. В ней есть элемент (ахк, который указывает на реальную структуру дескриптора задачи (а$к_$1гис1. Система идентифицирует процессы нс значению уникального идентифика- тора процесса (ргосезз йепНбсаНоп, РГО). Идентификатор РГО — это целое число, представленное с помощью скрытого типа рЫ_1, который обычно соответствует целому типу со знаком /лГ. Одкакс для обратной совмести- мости со старыми версиями ОС Ишх и Ыпих максимальное значение этого параметра по умолчанию ограничено значением 32768 (что соответствует типу данных зкоП т1). По желанию его можно увеличить до 4 млн. Для этого нужно отредактировать файл <1тихЛЪгеааь.И>. Идентификатор процесса сохраняется ядром в поле р1а каждого дескриптора процесса. Это максимальное значение является важным, потому что оно определяет макси- мальное количество процессов, которые одновременно могут существовать в системе. Хотя значения 32768 вполне достаточно для офисного компьютера, для больших серверов может потребоваться запустить значительно больше про- цессов. Чем меньше это значение, тем скорее нумерация процессов будет на- чинаться сначала, что приводит к нарушению полезного свойства: бОлыпий номер процесса соответствует процессу, который запустился позже. Если обратная совместимость со старыми приложениями не нужна, то админи- стратор может увеличить максимальное значение идентификатора процес- са прямо во время работы системы, отредактировав файл /ргос/ауз/кете!/ рИ тах. Как правило, в ядре для идентификации задачи используется прямая ссылка на соответствующую структуру 1а$к_81гис1. По сути, в большей части кода
ядра, работающего с процессами, выполняется обращение прямо к полям структуры Ш8к_81гис1. Нам нужно иметь возможность быстро находить дескриптор процесса, выполняемого в данный момент. Специально для это- го создан макрос сиггеш. Конкретная реализация этого макроса зависит от используемой аппаратной платформы. В некоторых аппаратных платформах указатель на структуру 1азк_81гис1, соответствующую выполняемому в на- стоящий момент процессу, сохраняется в специальном регистре процессора, что намного ускоряет доступ к ней. В ряде других архигекгур, в частости х86, с ограниченным набором регистров процессора общего назначения ис- пользуется тот факт, что структура 1кгеай_т/о располагается в стеке. Это позволяет очень эффективно вычислить ее адрес и, соответственно, опреде- лить адрес структуры 1ахк_Цта. Чтобы получить адрес структуры 1кгсаа_т/о на платформе х86 и определить значение параметра сиггеп1, нужно замаскировать младшие 13 бит указателя стека. Для этой цели предусмотрена функция сиггспМЬгсаб шГо(). Соответ- ствующий код на языке ассемблера выглядит так: том! $-8192, %еах апс!1 %езр, %еах В этом фрагменте кода подразумевается, что размер стека составляет 8 Кбайт. Если размер стека составляет 4 Кбайт, вместо 8192 нужно использо- вать число 4096. Окончательно значение параметра сиггеп! получается пу- тем разыменования значения поля 1а$к полученной структуры 1кгеа(11п(о'. сиггепЪ_'ЬЪ.геасЗ_1пГо () ->Ьазк; 5.3. Контекст процесса Одной из самых важных частей процесса является исполняемый программ- ный код, который считывается из исполняемого файла (ехесШаЫе) и выпол- няется в адресном пространстве процесса. Обычке выполнение программы осуществляется в пространстве ггользовате?1я. Когда в программе выполня- ется вызов системной функции или возникает исключительная ситуация, программа входит в пространство ядра. *
С этого момента говорят, что ядро "выполняется от имени процесса" и все это происходит в контексте процесса. В контексте процесса макрос сиггеШ работает корректно. При выходе из режима ядра процесс продолжает выпол- нение в пространстве пользователя, если в это время не появляется готовый к выполнению более приоритетный процесс В таком случае управление передастся планировщику, который и выбирает для выполнения наиболее приоритетный процесс. Системные функции и обработчики исключительных ситуаций имеют в ядре строго определенный интерфейс. Процесс может начать выполнение в про- странстве ядра только посредством одного из этих интерфейсов — любые обращения к ядру возможны только через эти интерфейсы. 5.4. Создание нового процесса и его завершение В литературе можно встретить самые разные определения термина "про- цесс", начиная от "экземпляр исполняемой программы" и заканчивая "то, что является результатом работы системного вызова с!опс(2) шеи Гогк(2)" В Ыпих, существует три типа процессов: 1. Фоновые задачи; 2. Потеки ядра, 3. Пользовательские задачи. Потоки ядра порождаются с помощью функции кете1 ЙггеабО, которая де- лает системный вызов с1опс(2) в режиме ядра. Потоки ядра обычно не име- ют пользовательского адресного пространства, т.е. р->тш = МНЬЕ, поэто- му они явно вызывают ехй_гшп(), например, через функцию баетош2е(). Потоки ядра всегда имеют прямой доступ к адресном)7 пространству ядра. ПолучаютрШ из нижнего диапазона Работаю! в нулевом кольце защиты и, следовательно, имеют высший приоритет вс всех операциях ввода/вывода и имеют преимущество перед планировщиком задач. Пользовательские задачи создаются через системные вызовы с(опе(2) или 5эгк(2). И тот и другой обращаются к кегпе1/Гогк.с:с1о_Гогк(). р--------,
Давайте рассмотрим, что же происходит, когда пользовательский процесс де- лает системный вызов Гогк(2). Хотя Еогк(2) и является аппаратно-зависимым из-за различий в организации стека и регистров, тем не менее, основную часть действий выполняет функция до _&гк(), которая является переносимой и размещена в кегпе1/Еогк.с. При ветвлении процесса выполняются следующие действия: 1. Локальной переменной геп>а' присваивается значение -ЕЛОМЕМ, кото- рое возвращается в случае невозможности распределить память под но- вую структуру задачи. 2. Если установлен флаг СЕОЕчЕРЮ в параметре с1опетогда возвра- щается код ошибки (-ЕРЕКМ). Наличие этого флага допускается, только если до_Еогк() была вызвана из фонового потока (1 сНе гЬтеай), т.е. из зада- чи с рте! == 0 (только в процессе загрузки). Таким образом, пользователь- ские потоки не должны передавать флаг С1ХЖЕ_Р1О в с1опе(2), ибо этот номер все равно не "проскочит". 3. Инициализируется сигтегЬ>уЕогк_8ет (позднее будет очищен потомком). Он используется функцией 8у8_уЕогк() (системный вызов убогк(2), пере- дает с1опе_Яа§ь = СЬСЖЕ УЕОКК[СЕОКЕ_УМ|8ЮСНЕВ) для тою, что- бы "усыпить" родителя пока потомок не выполнит тт_ге1еа8е(), напри- мер, в результате исполнения ехес() или ехй(2). 4 В памяти размещается новая структура с помощью макроса аПос_(азк_ 8(гис1(). На х86 это производится с приоритетом ОЕР КЕКМЕЬ. Это главная причина, по которой системный вызов Еогк(2) может "заснуть". Если разместить структуру нс удалось, то возвращается код ошибки -ЕМОМЕМ. 5. Вес поля структуры текущего процесса копируются во вновь созданную структуру посредством присваивания *р = *сытеЩ. Позднее, в поля, ко- торые не наследуются потомком, будут записаны корректные значения. 6. Для сохранения реентерабельности кода, выполняется Ы§ кегпе11оск. 7. Если "родитель" является пользовательским ресурсом, то проверяется - не превышен ли предел КЕ1М1Т ЫРКОС, если превышен - тогда воз- вращается код ошибки -ЕАСА1К если нет - увеличивается счетчик про- цессов для заданного шд р->п8ег>соипЕ 8. Если превышено системное ограничение на общее число задач - тах Ейгеадз, возвращается код ошибки -ЕАСА1К
9. Если исполняемый формат программы принадлежит домену исполнения, поддерживаемому на уровне модуля, увеличивается счетчик ссылок соот- ветствующего модуля. 1 0.Если исполняемый формат программы принадлежит двоичному формату, поддерживаемому на уровне модуля, увеличивается счетчик ссылок соот- ветствующего модуля. 11 . Потомок помечается как Ъая по! ехесед' (р-><й(1_ехес = 0). 12 .Потомок помечается как 'по1-85УарраЫе' (р->з\уаррао1е = 0). 13 .Потомок переводится в состояние ТА8К_ЦК!МТЕККЦРТ1ВЬЕ, те. р->ята1е = ТА8КЦК1?4ТЕВ1ШРТ1ВЬЕ 14 Устанавливаются флаги потомка р->Яаун в соответствии с с1опев случае простого 1огк(2), это будет р->йа§$ = РГ_РОККХОЕХЕС. 15 .Вызовом функции, кете1/Готк.с:8ег_р1д(), реализующей быстрый алго- ритм поиска, находится рШ потомка (р->рк1). 16 .Далее инициализируется остальная часть структуры 1а$к_81гис1 потомка. В самом конце структура хешируется в таблицу ркШа^й и потомок ак- тивируется. Обратите внимание на установку р->ехй_81$па1 в значение с1опе_Яа{?5 & С81ОЫАЕ, которое для Гогк(2) может быть только 816СНЕО, и на установку р->р<1еаЙ1_81§га1 в 0. Сигнал рдеа1Ь_81§па1 используется, когда процесс лишается "родителя" (в случае его "смерти") и может быть получен/установлен посредством команд РВ_СЕТ/8ЕТ_РОЕАТН81С системного вызова ргс11(2) Задача создана Для завершения задачи имеется несколько способов. • Выполнить системный вызов ехИ(2); • Передать сигнал, приказывающий "умереть"; • Вынужденная "смерть" в результате возникновения некоторых исклю- чений; • Вызвать Ьс1Яи8й(2) с Гипс == 1 (эта особенность Ыпих оставлена для сохранения совместимости со старыми дистрибутивами, которые имели строку 'ирбаГе' в /еГс/йпйаЪ - на сегодняшний день эта работа выполняет- ся процессом ядра кир<1а1е).
Имена функций, реализующих системные вызовы, в Ыпих начинаются с префикса §ук , но они, как правило, ограничиваются только проверкой аргументов или платформо-зависимой передачей информации, а фактиче- ски всю работу выполняют функции с!о_. Это касается и зу8_ехй(), которая вызывает4о_ех1Ч() для выполнения необходимых действий. Хотя, в других частях ядра иногда встречается вызов вуз _ехй (), на самом деле вызывается бо ехйО из кете1/схй.с. Обычно уничтожение процесса инициируется самим процессом. Это проис- ходит, когда, в самом процессе вызывается системная функция ехй(). Причем это может произойти как я но, когда вся работа программы сделана и нужно завершить ее работу, так и неявно, при выполнении возврата из основной процедуры любой программы с именем тат(). Другими словами, компилятор языка С помещает вызов функции ехй() в код, который выполняется после возврата из процедуры тат(). Процесс также может быть завершен непреднамеренно. Так происходит, когда процесс по- лучает сигнал или возникает исключительная ситуация, которую тот не мо- жет обработать или проигнорировать. Независимо от того, каким образом завершается процесс, основную массу работы выполняет функция Ло ехкО, определенная в файле кете1/ехЛ.с. После окончания работы функции Ло ехй() дескриптор завершившегося процесса все еще существует в системе, но сам процесс находится в состоя- нии зомби и не может выполняться. Как уже говорилось выше, это позволяет сист еме получить информацию о дочернем процессе после его завершения. Следовательно, освобождение ресурсов после завершения процесса и уда- ление его дескриптора должны происходить в разные моменты времени. После того как родительский процесс получил информацию о завершенном дочернем процессе, либо уведомил ядро, что эта информация ему больше не нужна, структура 1азк_з1гис( дочернего процесса освобождается. Семейство функций м'ай() реализовано через единственную (и достаточно сложную) системную функцию \уай4(). Она выполняет стандартное дей- ствие — приостанавливает выполнение вызывающей задачи до завершения одного из ее дочерних процессов. При этом функция возвращает идентифи- катор РЮ завершенного дочернего процесса. При вызове функции хуай4() перелается указатель на область памяти, которая после возврата из функции будет содержать код завершения дочернего процесса. Когда приходит время окончагельно освободить дескриптор процесса, вызы- вается функция гс1еазе 1азк(), которая выполняет указанные ниже операции:
• Вызывается функция___ехйзщпаЦ), в которой затем вызывается функция _ипЬаз1т_ргосе58(). Из последней функции вызывается еще одна функция — скяас11_р1(1(), — которая удаляет процесс из хеш-таблицы идентифика- торов процессоврйИказк и сам процесс из списка задач. • В функции___ехй_81§па1() освобождаются абсолютно все ресурсы, кото- рые продолжают использоваться в завершившемся процессе, а также под- биваются статистические данные использования системных ресурсов. • Если завершившаяся задача была последним членом группы потоков, а ее лидер находится в состоянии зомби, то функция ге!са8е_1а8к() уведомляет родительский процесс лидера группы, находящегося в состоянии зомби. • Из функции ге1еазе_1а8к() вызывается функция риТ_1а8к 81гис1(), в которой освобождаются страницы памяти, содержащие системный стек процесса и структуру 1кгеас1_1п/о, а также освобождается блочная кеш-память, со- держащая структуру 1аик_з1гис1. 5.5. Потоки Благодаря потокам (йзгеабз) появляется возможность выполнения несколь- ких потоков команд в общем адресном пространстве памяти. Подоки также могут совместно использовать открытые файлы и другие ресурсы. Потоки позволяют реализовать режим одновременного выполнения программ (сопсиггегН рго^гаттт^) и обеспечить истинный параллелизм на многопро- цессорных системах. Реализация потоков в операционной системе Ыпих уникальна. С точки зре- ния ядра Ыпих не существует отдельной концепции потоков. В ядре Ыпих все потоки реализованы в виде стандартных процессов. В нем нет никакой особенной семантики для планирования выполнения потоков или каких-ли- бо особенных структур данных для представления потоков. Поток — это просто процесс, который использует некоторые ресурсы совместно с другими процессами. Каждый поток имеет свою структуру 1азк_з1гис1 и с точки зрения ядра явля- ется обычным процессом, который (так уж случилось!) совместно исполь- зует с другими процессами общие ресурсы, такие как адресное простран- ство.
В других операционных система, таких как ХУпмкмз, все немного иначе. В них существуют средства для явной поддержки потоков в ядре, ко- торые называют ргосезз (процессы с быстрым переключением контекста). Само название — процесс с быстрым переключением контек- ста — свидетельствует о разнице в философии, принятой в Стих и других операционных системах. В этих системах потоки — это абстракция, которая обеспечивает облегченные и более быстрые с точки зрения выполнения бло- ки кода, по сравнению с обычными тяжеловесными процессами Для опера- ционной системы 1лпих потоки — это просто способ совместного использо- вания ресурсов несколькими процессами, которые и так имеют достаточно малое время переключения контекста. Для создания потоков используется та же функция с1опе(), но ей передаются флаги, указывающие на то, какие ресурсы должны использоваться совместно- С1опе (СЬОЦЕ_уМ | СЪОЦЕ _ЕЗ | СЬОМЕ_ПЬЕЗ I СЬОМЕ_31СЕАЫО, 0) ; Результат выполнения этого кода будет таким же, как и при выполнении обычной функции Гогк(), за исключением того, что адресное пространство, ресурсы файловой системы, дескрипторы файлов и обработчики сигналов останутся обшими. Другими словами, и новая задача, и родительский про- цесс являются тем, что в пароде популярно называется потоками. Для сравнения вызов обычный функции &>гк() может быть реализован так: с!опе (51ССНШ, 0) ; Функцию уТ'огк() можно реализовать следующим образом С1опе (СЪОМЕ_УГОКК | СЬОМЕ_УМ | 31ССНШ, 0) ; Флаги, которые передаются системной функции с1опе(), указывают особен- ности поведения нового процесса и конкретизируют, какие именно ресурсы должны быть общими для родительского и дочернего процессов. Далее при- ведены флаги системной функции с1опе(), описанные в файле <1тих/ьсЬе4. Ь>, и вызываемый ими эффект:
• СЕОЫЕНЕЕ8 - родительский и дочерний процессы совместно исполь- зуют открытые файлы. • СЕОИЕЕ8 - информация о файловой системе будет использоваться совместно. • СЕОКЕ1ЛЕЕТА8К - установить значение Р1Л в О • СЕ(ЖЕ МЕХУ81^8 - создает новое пространства имен для дочерней за- дачи. • СЕОМЕРаКЕМТ родительский процесс для вызывающего процесса становится родительским для дочернего. • СЛОМЕ 8ЕТТ1Л - возвращаег значение идентификатора ТТЛ в простран- ство пользователя. • СЕОМЕ8ЕТТЛ8 - для дочернего процесса создать новую область ло- кальных данных потока. • СЕОМЕ8ЮИАМЛ - у родительского и дочернего процессов будут об- щие обработчики сигналов и сигналы блокирования. • СЛОМЕ 8У8У8ЕМ - общей будут семантика обработки флага 8ЕМ ЦМЛО. • СЕОМЕТНКЕАЛ - родительский и дочерний процессы будут принад- лежать одной группе потоков. • СЛОМЕУГОКК родительский процесс будет находиться в заморожен- ном состоянии, пока дочерний процесс не возобновит его работу. • СЛОМЕ ЦМТКАСЕЛ запретить трассирующему процессу использова- ние флага СЛОМЕРТКАСЕ для дочернего процесса. • СЛОМЕ 8ТОР - запустить процесс и перевести в состояние ТА8К_ 8ТОРРЕЛ. • СЛОМЕСНТЛЛС1 .ЕАКТ1Л - очистить идентификатор ТЮ для дочер- него процесса. • СЛОМЕСН1ЛЛ8ЕТТ1П - установить идентификатор ТТЛ для дочерне- го процесса. • СЛОМЕРАЙЕМТ8ЕТТЮ - установить идентификатор Т1Л для роди- тельского процесса. • СЛОМЕ УМ - у родительски го и дочернего процессов будет общее адрес- ное пространство.
Часто требуется выполнить в ядре некоторые операции в фоновом режиме. В ядре такая возможность реализована в виде потоков ядра (кегпе1 Изгеаб) — обычных процессов, которые выполняются исключительно в пространстве ядра. Существенным отличием между потоками ядра и обычными процес- сами является то. что потоки в ядре не имеют своего адресного пространства (значение указателя тт для них равно ЬПЛХ). Эти потоки работают только в пространстве ядра, и их контекст не переключается в пространство поль- зователя. Тем не менее, потоки ядра планируются и вытесняются так же, как и обычные процессы. Потоки ядра в Ыпих выполняют определенные задачи. Самые важные из них —^и$к и кзо/йгц(1. Чтобы увидеть список таких потоков в вашей систе- ме Ыпих, воспользуйтесь командойр$ -е}. Их довольно много* Потоки ядра создаются во время начальной загрузки системы другими такими же потока- ми. Это и понятно, поскольку поток ядра может быть создан только другим потоком ядра. В ядре эти потоки обрабатываются автоматически все новые потоки ядра разветвляются от специального процесса кйкгеаМ, запущенного в ядре. Интерфейс для порождения нового потока ядра из существующего описан в файле <1ти.х/кй1геа(1.Ь> и приведен ниже. Ъазк_5ЪгисЪ *кЪЪгеа<1_сгеаЪе (1пЪ (*ЩЪгеа<3^п) (УоЫ *3а1:а), уо1с1 *аа1:а, сопз1: сЬаг патеЕпЛ[] ) Новая задача создается процессом к1кгеа<1, запущенным в ядре, с помощью вызова системной функции с1опе(). В новом процессе будет выполнять- ся функция ЙзгеасИпО, которой передается аргумент с1а1а. Процессу будет присвоено имя, указанное в переменной папге/т1, а в списке аргументов переменной длины указываются параметры форматирования в стиле функ- ции рпп1Г() языка С. После создания процесс находится в незапущенном состоянии (ипгиппаЫе зШе). Для его запуска нужно явным образом вызвать функцию ц/аке ир ^госея8(). Чтобы создать процесс и сразу же отправить его на выполнение, можно воспользоваться единственной функ- цией к1кгеас1_гип:
зСгисГ. Ъазк_з-Ьгис1: *кЫзгеас1_гип (хпЪ (*'ЬЪгеас11п) (уо!с1 *<1аГа) , МаЪа, сопзк сЬаг патеГтУ[], . . .) Описанная выше процедура запуска процесса в ядре реализована в виде макроса, в котором вызываются обе функции, ктЬгеаЛ сгсаТе() и зуаке_ир_ ргосея&(), как показано ниже После запуска поток ядра продолжает выполняться до тех пор, пока в нем не будет вызвана функция с1о_ех11(), либо пока в какой-либо другой части ядра не будет вызвана функпиг иЬгеа<1_81орО. В качестве параметра этой функции передается адрес структуры типа 1а$к_з1гис1, возвращенной ранее функцией кАгеай сгея4е(): Ап* кГЬгеас!_зРор (зГгисЬ Сазк_зЪгисс *к) 5.6. Планировщик Работа планировщика заключается в разделении СРГ1 между несколькими процессами. Реализация планировщика размещена в файле кепкЯ/зсЬеб.с. Соответствующий заголовочный файл тсктйе/Нпих/ьсЬеи.й подключается (прямо или косвенно) фактически к каждому файлу с исходным текстом ядра. Поля 1азк_81гис1, которые используются планировщиком: • р->пеес1 ге$скес1 - это поле устанавливается если 8сЬе<1и1е() должна быть вызвана при 'первом удобном случае'. • р->соип1ег - число тактов системных часов, оставшихся до окончания выделенного кванта времени, уменьшается по таймеру. Когда значение этого поля становится меньше либо равно нулю, то в него запис ывается ноль и взводится флаг р->пеед гезсг.ед. Иногда это поле называют "дина- мическим приоритетом" ('оулапне рпогйу') процесса потому как он мо- жет меняться.
• р->рг1оп1у - статический приоритет процесса, может изменяться только через системные вызовы, такие как шсе(2), РО81Х.1Ь ясЬед яе1рагат(2) или А4В8О/8УК4 8ефпоп1у(2). • р->П_рпогИу - приоритет реального времени (геаНппе рпогйу). • р->роИсу - политика планирования, определяет класс планирования зада- чи. Класс планирования может быть изменен системным вызовом $сЬеб_ яеКсЬес1и1ег(2). Допустимые значения: 8СНЕО ОТНЕК (традиционные процессы ЦМХ), 8СНЕВ_НЕО (процессы реального времени РО81Х.1В НЮ) и 8СНЕЭ КК (процессы реального времени РО81Х тошкЕгоЫп). Допускается комбинирование любого из этих значении с 8СНЕЦУ1Е1Ю по ИЛИ (ОК.) чтобы показать, что процесс решил уступить СРП. напри- мер, при вызове 8сЕе<1_у1е1д(2). Процесс реального времени НРО будет работать до тех пор, пока не: а) запросит выполнение блоковой опера- ции ввода/вывода, Ь) явно не отдаст СРП или с) будет вытеснен другим процессом реального времени с более высоким приоритетом (значение в р->Л_рпоп1у) 8СНЕИ КЯ то же самое, что и 8СНЕП Р1РО, за исклю- чением тою, что по истечении выделенного кванта времени, процесс по мешается в конец очереди гипдиеие. Алгоритм планировщика достаточно прост, несмотря на очевидную слож- ность функции зсЬес!и1е(). Сложность функции объясняется реализацией трех алгоритмов планирования, а так же из-за учета особенностей 8МР (мультипроцессорной обработки) 5.7. Управление процессами из консоли 5.7.1. Команды р$, тсе и кН! Получение информации о процессе Современные операционные системы устроены так, что каждому процессу присваивается уникальный номер - РЮ (Ргоссзз Ю, ИД процесса), исполь- зуя который можно управлять процессом, например, можно тавершить про- цесс или изменить его приоритет.
Узнать РЮ можно с помощью команды рз. Команда рз, введенная без па- раметров, просто показывает список процессов, запущенных на текущем терминале. Видно, что сейчас запущен ЬазИ и сама команда рз (правда, на момент завершения вывода процесс с Ю 975 уже не будет существовать, но на момент самого вывода такой процесс существовал), см. рис. 5.4. 1I 1 од 1 п ' ггю1. Газ зыпгЛ: 1оу1П 'Пт Зер 1 .15'59 *>И ст I то 1.Р I пса I I ~ IИ рз РЮ ТГУ Т1МЕ СМ1) 954 ИИ:И0:И0 ЬакЪ 975 Пу1 ИИ-ИИ:ИИ р5 I то 101 оса 11. III Рис. 5.4. Команда рз Параметр -а позволяет вывести список всех процессов пользователя. Посмотрите на рис. 5.5 на консоли сг.уЗ запущена программа пало, на кон- соли Ы:у1 - программа рз. 1гоо1( Носа 1)юх1 111 рз й Г!» ПТ' Т1МГ ст 1И35 ицз ИИ ИИ ИИ па по 1И41 Иу1 ИИ:ИИ:ИИ рз I гсигЬУ1оса1Ьоз1 Рис. 5.5. Команда рз -а Если нужно вывести процессы какого-то определенного пользователя, тогда используйте параметр -и: $ рз -и гооГ.
Вывести абсолютно все процессы можно с помощью опции -А. Обратите внимание на регистр опции! Поскольку в системе процессов будет- очень много, лучше перенаправить вывод программы на команду 1езз для более удобного просмотра (рис. 5.6): $ рз -А | 1езз Рис. 5,6а. Команда рз -А | 1езз (начало вывода) НИ 1 $Н XI С I 1 - »<! 1 ? ИЯ.НО-ЙО хГ^-гпей.м 24» .и? ИИгИй'ВИ х?» |<ЦххчЬ>> ЦИ-ИИ-а* хГз-изГк1и:ккг2 ИЯ:ЯН ГГЗ хГглП<1х^«й 1. ЧГИЕГИН .хуЧсв* иг ЙНЧЖ-ЯИ 1 Ик: ИВПИ Ий •«». ЛЯ.ИИ.ИЗ -1«4см< ъ-и «ИМП:НЯ <нйН4 ' -к. Г ан Ж'Ш гхук!<яН г ИИ .НЯ .НВ ИО1ИИИ МР-. 1 «Н ИЯ Ид 1гяМ><нее 1-НО (Ж:НИ:ЙИ 4Ь<». 4<н.чяс>п 1.14 7 ОЙДЖ М! сЫтчий ' ИЯ ДМ: ИЙ шг<|». ИИ НВ ИЦ 1- Ь ч ВЙгМ ИЙ 41в1<*№1-1С1Ч(П4 НН-ЯИ НИ пЪгЫ ы М.М.НП ЦСМиЛЗегмьд! ь.И Ч 1№:вН- 1И х«й«юН4 ььэ Г ан ая в/ г;мам1Ы <1 ИЯ:К1.НН -1Г*-^г0Ж| нн а* не С-*К> ОЙ-вИ-ВЙ егчн.1 г ййнВ'йИ лкг14ия1»’Д||их’ 87 ? ИВ.НЯ.НО акг1 |Ьчч>-,Х>пт 614 ЙЙ:ЙЙ:№ 1<ч1п ?к: г оигяй он каид-иъма» 742 НН НН.ЙВ .»м ‘ 1 - - -г НН И11ДМ 4Ы НСТМ МП ПИ НИ «И •ин V НИ ИН-ВИ гм •м 11Ц1 ИН:НО.Н0 к«-ь '•Гл г июне ни кЫЭгкег/1:2Я 1М1ИГНИ 1<ч1п •т ИН ин Ив тукОтИ / ИИ ЯВ.Йв (5* ри») НМ9 ииЗ НЦ.(М-0И НеЛк 1ИГ> ПуЗ ВН:И1:ЯН мм> Ю, ИЯ;НИ-ИО -41.-1 Ц> нн:> ‘М НИ ИЫ к*юг1«ггЛ1:1 1*Ь7 1 УЙ.'УЯ'ЯЙ кмогм:г О./ ИВ ВВ.ЙО й-.гЪч-хиЗгП.Я !«И с иа-Я8;Ив кипгИт/1 -й й=й- (М -НСВН р* Мер ив:пв.ан м*к Рис. 5.66. Команда рз -А | 1езз (завершение вывода)
Примечание Для выхода из программы 1езз нажмите д на кла- виатуре. Листать вывод можно стрелками вверх и вниз. Команда оз сортирует процессы по РЮ. Колонка ТТУ - это терминал, к кото- рому привязан процесс. Если в этой колонке вы видите знак ?, значит, про- цесс не привязан ни к одному из терминалов. Как правило, это системные пропессы-службы. Они запускаются без привязки к терминалу. Чтобы отобразить только процессы без привязки к терминалу, используется опция -х (рис. 5.7). ГП) 1Г>' 1ОГ Пгв 1 ? « ИВ ✓изг'Ы) • ыН<:1к'Л г«яН чуч «1еы9г1а 11х«: 27< 1 X и ие 1 к! |>ге«<Ы 1 и ими (каоПН'чВ/а! 1 4 ? □ И-.‘.1 {кым-кег^ЬЧН V Й:ЦИ 1км«гкгг.'*:ЯП1 8 Й:«5 8 Т И:ИЙ (•ч п Ы.1 в Н:‘И 1п:иоч Ш ? В ЙН (плшЬ/Й 1 И Ч 8 й:И(1 (,т4дга1ипмН1 и т 5 8:ИЙ !.) ’ 3 ИНН (ши.Чийкр 11 И ? 8 И ИИ 1 И» ? 8 8:Я7 1кз<|Г1»гчД/Г( 18 1 л В:И5 «Ч ? Я И «И {гыиНм! 1 га ч Я В Я» (каемКфГ::! гл * 8< 8: ИЙ 22 '< 8ч И:И» 1ыг|геЫ>ск1 ЗИ Й;ЙВ (иаИ! 24 ? КМ НИИ Гк1н>дера9<^1) 2*. ? 8: МВ 1 гь 1 5. 8;В8 ) »<• В;8В 1Ыок«П1 га ? в 0В 1кЫосМ1 23 У 8< И ИЙ Ка1а_8Г1Г 1 Зв ? 8< 9: ИВ [шП И ? $<• И:«И 1 И<:мТчн| _ ИЦ 1 35 ? 0:1® 1кч.ыар<101 36 ? в:йв Гчне-гТаИ 6в ? 8 в:И1 'кыогкег/«1г851 гг т >’ ИИЙ (Юих»4Н1 те ? я< В:НВ {асрМЬы-хаНпт} та ч X «;Ж« 1м» 1 «>1.81 8» ’ 8< 8:80 1зс$1.ш_аз 01 ? ИОИ 1гя:»1..еМ1 иг ? ' 8;М (ясзГЛмГ .13 В4 ? 0-00 [крюмш^еИ) 86 т 8:00 [Ли.ЪуГ >осасЬеЗ « .* > 3' Й;0И 11]К)6„шМгсопС 3 В8 ? 5< ЩеГеп*13 те ? 5< 8 Ий П>3<гее1) 138 Ч 8 И:0й 1 ЗсаиеЗ 1Ы) 133 1 9:88 1кы»'ке1м|,:33 гя» ? 3< ввв ии».5нарЗ аг ч «:88 ГмрТ .роН.,,8 3 Рис. 5.7. Команда рз -х | 1езз Колонка зтат - это состояние, в котором находится процесс, Возможные значения для этой колонки приведены в таблице 5.1. Обратите внимание: колонка 5ТАТ есть только, когда программа запущена с параметром -х. Если программа запущена с другими параметрами, например, -А, вместо нее будет колонка Т1МЕ, которая сообщает занимаемое процессом процессорное время.
Таблица 5.1. Возможные состояния процесса Состояние Описание В Процесс в непрерывном сне (как правило, ожидает вво- да/вывода) Л Выполняется в данный момент 5 Ожидание (то есть процесс "спит'’ менее 20 секунд, по- сле чего он переходит или в состояние К. или в состоя- ние В) Т Процесс остановлен 1 То же, что и Т, но причина остановки - останов отлад- чиком Процесс в свопинге (подкачке) X Процесс мертв, вы его никогда не увидите 2 Процесс-зомби - он уже завершен, но не "похоронен" его родителем, го есть процесс-родитель еще не считал код завершения У команды рз есть несколько синтаксисов установки параметров. Мы ис- пользовали ВЗП-синтаксис. Например, для вывода всех процессов в стан- дартном синтаксисе используется команда -е, а в на:пем случае - -А. Вы вольны использовать любой синтаксис, но в случае с В ЗВ -синтаксисом про- грамма рз выводит дополнительное состояние процесса (работает подобно программе рз в системе В8В). Дополнительное состояние процесса описа- но в таблице 5.2. Таблица 5.2. Дополнительное состояние процесса (В8В-синтаксис) Состояние Описание < Высокий приоритет
ы Низкий приоритет ь У процесса есть страницы, заблокированные в памяти 5 Это лидер сессии / Процесс является многопотоковым + Находится на первом плане в группе процессов Последняя колонка вывода рз - это см0- Она содержит команду, которой был запущен процесс. Не просто название исполнимого файла, но путь (если он был указан в команде) и переданные программе параметры. Если программа была запущена без указания полного пути к исполнимому файлу, и вы хотите знать, где он находится, введите команду иЫсИ, напри- мер: $ мЫсЪ папе /Ып/папо Если вам нужно узнать РЮ определенного процесса, но вам не хочется про- сматривать длинный список системных процессов, используйте команду дгер, как фильтр. Например, следующая команда позволит нам узнать РЮ процесса (это 58н-сервер): # рз -А | дгер ззЬс! Если такой процесс не запущен, вывод будет пуст. Или же вы получите вы- вод вроде этого’ 929 ? 00:00:00 ззМ Изменение приоритета процесса Когда мы знаем РЮ процесса, мы можем изменить его приоритет. В неко- торых случаях полезно изменить приоритет процесса. Например, можно
повысить приоритет процесса, выполняющего резервное копирование, что- бы прозрамма успела за ночь создать все необходимые резервные копии и чтобы этот процесс утром уже не мешал нормальной работе сервера. Запустить программу с определенным приоритетом можно командой п!се: # п1се —п <нриоритет> команда аргументы Здесь приоритет задается от -20 (максимальный приоритет) до 19 (мини- мальный). Если процесс уже был запущен, и вы не можете его прерывать, но повысить приоритет нужно, используйте команду гетсе'. ♦ гегхее -а <приоритет> -р Р1Р Аварийное завершение процесса Если процесс завис и его нельзя завершить, как обычно, тогда для его два рийного завершения используется команда кШ. Формат вызова этой ко- манды следующий: $ кШ [опции] Р1Б Конечно, перед этим нужно узнать РЮ процесса. На рис. 5 8 изображена команда <Ш в действии: сначала я вывел список процессов, чтобы узнать РЮ процесса пало (1035), затем я ввел команду к!11 1035, чтобы "убить" этот процесс. Наконец, я вывел список процессов еще раз. чтобы убедиться, что процесс папо завершен. Используя параметры программы, можно по-разному завершить процесс. Самый эффективный сигнал 9 (К ИХ) - означаез аварийное завершение про- цесса Программа не может игнорировать или как-либо обработать этот про- цесс. Если нужно попытагься корректно завершить работу программы, ей отправ- ;гяют сигнал 15 (ТЕЕМ), означающий, что программа должна освободить все запятые ресурсы, сохранись все данные. Вот только если проз рамма за-
висла и не отвечаег на запросы пользователя, этот сигнал мало чем поможет, но попытаться стоит. I гоо 1.01 оса Пю~И ИГ рз -а РЮ ТГУ Т1МЕ СИЛ 1035 ПуЗ 00:00:00 папо 1125 11у1 00:00:00 рз [гооКИосаIЪозС “I# ЫН 1035 [ гооГМоса I Ьоз! ~ 1Я Рис. 5.8. Использование команды кШ Сигнал 19 (8Т0Р) позволяет временно приостановить работу прохраммы, а сигнал 18 (СОЫТ) - возобновить приостановленный ранее процесс. Для сетевых служб полезен сигнал 1 (НЦР), означающий, что процесс дол- жен перезапуститься и перечитать файл конфигурации. Полезно, когда вы изменили файл конфигурации и хотите, чтобы демон был перезапущен (хотя для этого правильнее использовать команду зепльсе). Обычная программа при получении сигнала 7 завершает работу. Пример отправки сигнала: $ кШ -9 1С35 Лели вам лень получать РЮ процесса, можно завершить его и по имени, ис- пользуя команду к111а11, например: $ кШаН папо
Вот только если в вашей системе есть два процесса с именем папо, например, один на консоли ДДу2, а другой - на йу4, то будут завершены оба процес- са. Если это то, что вам нужно, используйте в противном случае лучше использовать команду Ш1 для завершения именно того процесса, который можно завершить. Еще есть команда хкШ, позволяющая "убить" прорамму, имеющую гра- фический интерфейс. Такие программы можно завершить и командой кШ, но программа хкШ предоставляет графический метод завершения. После ввода этой команды указатель мыши примет вид черепа. Для завершения программы нужно щелкнуть по ее окну. 5.7.2. Команда 1ор Как было отмечено ранее, программа рз по умолчанию сортирует процессы по колонке РЮ, а не по колонке Т1МЕ. Конечно, можно использовагь раз- личные параметры программы, чтобы добиться нужного нам вывода, но все равно программа не будет показывать ситуацию в реальном времени. Если же вам нужно знагь, что происходит с вашими процессами в реальном вре- мени, вам нужно использовать программу Тор (рис. 5.9). Рис. 5.9. Команда Ьор
Назначение колонок программы описано в таблице 5.3. Таблица 5.3. Колонки программы 1ор Колонка Описание РЮ РЮ процесса И8ЕК Владелец процесса (пользователь, запустивший про- ]рамму) РК. Приоритет процесса М Значение шее VI КТ Виртуальная память, которая используется процессом КЕ8 Размер процесса, который не перемещается в область подкачки 8НК Разделяемая память, используемая процессом 8 Состояние процесса %СРИ Процессорное время, занимаемое процессом в данный момент %МЕМ 11амять, используемая процессом Т1МЕ+ Процессорное время, которое было потрачено с момен- та запуска процесса СОММАТЮ Команда запуска процесса При просмотре списка программы Ъср вы можете управлять сортировкой процессов с помощью нажатия клавиши I7. которая изменяет колонку, по ко- торой сортируется список процессов (рис. 5 10). По умолчанию сортировка выполняется но колонке %СРО. пн
Рис. 5.10. Выбор колонки, по которой осуществляется сортировка Нажатие клавиши <Ц> показывает только процессы определенного пользо- вателя. После нажатия <11> нужно будет ввести имя пользователя, процессы которого вы хотите просмотреть, или нажать Еп(ег, чтобы просмотреть про- цессы всех пользователей. 5.7.3. Информация об использовании памяти и дискового пространства Хотя управление памятью и дисковым пространством не совсем относит- ся к управлению процессами, но эти самые процессы активно "поедают", как память, гак и дисковое пространство, поэтому иногда полезно знать, как просмотреть информацию об использовании памяти (команда Егее) и дис- кового пространства (команда с1Г), см. рис. 5.11.
И» 1 . «ь-г 1 Ггее збагеЛ Ьи< Гхс,и;||е ачл11 ЬлЫс Нем 2039768 1 1/')И0 1* .82496 816 324372 1720744 ДЛЦ» 1 2096124 Я 2096124 1 гооКЛоса 1 Ноз 1 “|ц аг ь 1 11сзу81ет 31ге Лма 1 1 Изей МоипГеН он нс*ЛшрГ$ 987М 0 987М Их хйем ЬтрГ з 996М 0 996М 0х хЛемхзйт 1 трГ з 99611 80вК 996М 12 хгин мр('з 996М 0 996*1 Их ХзукхГ ьхедгиир Лгмхзйа! 18С» 1 36 176 7х X ' шрГз 996М 8. ИК 996М 1х х1тр 1мрГн 2ИИМ 0 20ЙМ Их ХгнпхизегхИ 1 тр Г к 2ИЙГ1 И 2ИИП Их хгипхнзегх1ИЙЙ 1гоо1И1оса 1ЬояС " 1Я Рис. 5.11. Команды Ргее и -Я Программа -гее выводит информацию об использовании памяти (Мет) и подкачки (Зиар). Колонка РоЪаХ - это общее количество памяти в килобай- тах, изед - использованное количество памяти (тоже в килобайтах), Хгее - свободно памяти, зИагед - разделяемая память, Ьий/сасИе - размер кэша, амаИаЫе - общий объем доступной памяти. Параметр -//команды сИ означает вывод информации об объеме в удобных для восприятия человеком единицах, то есть в мегабайтах и гигабайтах. Обратите внимание на значение ЬиС/сасЪе в выводе команды Гтее. Оно показывает сколько памяти задействовано под буфер ввода/вывода и кэш. В нашем случае (рис. 5.11)- примерно 323 Мб. На реальном сервере это зна- чение будет гораздо выше. Немного освободить память можно, очистив кэш. Для этого введите команду: зупс; есЬо 3 > /ргос/зуз/ллп/йгор саскез Сначала мы командой зупс сбрасываем содержимое буферов иа диск, а за- тем уничтожаем кэш. Если просмогреть затем информацию об использова- нии памяти, то вы увидите, что размер кэша был уменьшен почти в три раза (рис. 5.12). Однако помните, что эта команда может негативно отразиться
на стабильности системы и на скорости ее работы. Нс всегда очистка кэша таким вот варварским образом - это хорошо 111 Н# I о С<( Пюх1 1й 1 ГС’Е 1о1а 1 и$еД Г гее зЪагеД ЬцГГ/г.асЬе ама> 1аЫе 2.033768 132900 15824% 816 324372 1729744 2096124 0 2096124 го«181осаПюй1 "18 ДГ -Ь 1(езуз^ем 51ге УзеД Ама И 11$еи Моип1ей оп 1е\ЛтрГ 8 %?м 0 987М 0И /Дем 1трГз 996М 0 996М 0Х /Деи/зЪт 1тр?к 996И 888К 996М 17. /гип 1мрГ 8 996М 0 9%М 0Х /хуз/Рх/сдгоир 'Дем/зДа1 188 1.36 176 77. / ^трГз 996М 8.0К 996Г1 17 /1тр ЬтрГ 8 200М 0 2ЙЙМ 0Х /го/и8ег/0 ЬтрСз 208М 0 200М 07 /гип/и5ег/1000 [гоо!Р1еса1Ьо$Ь "18 купе; ес!ю 3 > /ргос/ху&/мш/Дгор_сасЬе8 [ гооПЛ оса Пюз! ~3# Г гее 1о6а! и$еД Г гее зЬагеД ЬиГГ/сасЬе амаИаЫе 2039768 117852 1808844 816 113872 1771460 2096124 0 2096124 гоо101осаНюх1 ”18 Рис. 5.12. До и после ввода команды зупс; есЬо 3 > /ргос/зуз/ут/ (1гор сзсЪез 5.7.4. Команда /ичег Команда Еизег позволяет узнать, какой процесс открыл тот или иной ресурс, например, файл или сетевой порт. Примеры использования программы; Еиаег ^а 23/Ъср €изег ^а /сЪгооС/еЪс/гезо^. сопЕ В первом случае мы получим идентификатор процесса, открывшего ТСР- порт 23, во втором - идентификатор процесса, открывшего файл /сЬгоой'е1с/ гезок.сопГ. Что делать далее - решать вам, например, можно "убить" этот процесс командой к! 11.
В этой важной главе мы разобрались, как ядро управляет процессами из- нутри и как управлять процессами из командной оболочки.
Глава 6. Обработка прерываний
6.1. Чго такое прерывания Прерывания позволяю! аппаратным устройствам взаимодействовать с про- цессором. Например, при наборе на клавиатуре контроллер клавиатуры (или другое устройство, которое обслуживает клавиатуру) генерирует прерыва- ние, чтобы объявить операционной системе о том, что произошли нажатия клавиш. Прерывания — это специальные электрические сигналы, которые аппаратные устройства посылают процессору. Процессор получает преры- вание и дает сигнал операционной системе о том, что ОС может обработать новые данные. Аппаратные устройства генерируют прерывания асинхрон- но по отношению к тактовому генератору процессора — прерывания могут возникать непредсказуемо, в любой момент времени. Следовательно, работа ядра может быть прервана в любой момент для того, чтобы обработать пре- рывания. Физически прерывания производятся электрическими сигналами, которые создаются устройствами и направляются на входные контакты микросхемы контроллера прерываний. Контроллер прерываний в свою очередь отправ- ляет сигнал процессору. Процессор выполняет детектирование сигнала и прерывает выполнение работы для того, чтобы обработать прерывание. [ НН ]
После этого процессор извещает операционную систему о том, что произо- шло прерывание и операционная система может соответствующим образом это прерывание обработать. Различные устройства связаны со своими прерываниями с помощью уни- кальных числовых значений, соответствующих каждому прерыванию. От- сюда следует, что прерывания, поступившие от клавиатуры, отличаются от прерываний, поступивших от жесткого диска. Это позволяет операционной системе различать прерывания и иметь информацию о том, какое аппаратное устройство произвело данное прерывание. Поэтому операционная система может обслуживать каждое прерывание с помощью своего уникального об- работчика. Идентификаторы, соответствующие прерываниям, часто называются лини- ями запросов на прерывание (т1еггир1 гециеы Ипез, Нпсз). Обычно это некоторые числа. Например, для платформы ₽С значение 1К.р, равное 0, — это прерывание таймера, а 1КО, равное 1, прерывание клавиатуры. Одна- ко не все номера прерываний жестко определены. Прерывания, связанные с устройствами шины РС1, например, назначаются динамически. Другие плаз формы, которые не поддерживают стандарт РС1, имеют аналогичные функции динамического назначения номеров прерываний Основная идея состоит в том, что определенные прерывания связаны с определенными устройствами, и у ядра есть вся эта информация. Аппаратное обеспечение, чтобы привлечь внимание ядра, генерирует прерывание вроде "Была нажата клавиша' Ее нужно обработать". 6.2. Обработчики прерывания 6.2.1. 41 о такое обработ чик прерывания? Обработчиком прерывания (1п1еггир1 капсИег; называется функция, кото- рую вызывает ядро в ответ на поступление определенного прерывания. Каждому устройству, которое может генерировать прерывания, в ядре соот- ветствует свой обработчик прерывания. Например, одна функция обрабаты- вает прерывание от системного таймера, а другая — прерывания, сгенериро- ванные клавиатурой Обработчик прерывания для определенного устройства
является частью драйвера этого устройства — кода ядра, который управляет устройством. В Ыпих обработчиком прерывания является обычная функция, написанная на языке С - ничего фантастического в обработчике прерывания нет. Все функции-обработчики должны соответствовать определенному прототипу, чтобы ядро могло стандартным образом передавать информацию обработ- чику, а во всем остальном - это обычные функции. Обработчики прерываний вызываются в специальном контексте, который называется контекстом прерывания (пйегги.р1 сэп'сех!). В этом контексте код не может быть блокирован. Прерывание может возникнуть в любой момент времени, поэтому обработ- чик прерывания может быть вызван когда угодно. Крайне важно, чтобы об- работчик прерывания выполнялся очень быстро и возобновлял управление прерванного кода как можно скорее. Поэтому, хотя для аппаратного обеспе- чения и важно, чтобы прерывание обслуживалось немедленно, для осталь- ной системы важно, чтобы обработчик прерывания выполнялся в течение максимально короткого промежутка времени. Обработчик прерывания, как минимум, должен отправить подтверждение устройству, что прерывание получено. Конечно, в реальной жизни обработ- чик прерывания выполняет гораздо более сложную работу. Например, об- работчик прерывания сетевой карты должен скопировать пакеты из памяти сетевого адаптера в память компьютера и обработать их. Как видите, это гораздо больше, чем просто отправить подтверждение, что прерывание по- гучено. 6.2.2. Регистрация обработчика прерывания Как уже было отмечено, обработчик прерывания является частью драйвера устройства, который управляет аппаратным устройством. С каждым устрой- ством связан свой драйвер и если устройство использует прерывания (в большинстве случаев это так), драйвер должен зарегистрировать обработ- чик прерывания. Регистрация обработчика осуществляется с помощью функции гедие81_пц(), определенной в НпихйшеггирГЬ: ♦
/* гедиез1:_1гд: занимает указанную линию 1К0 */ апЪ гедиезЪ_1гд(ипзтдпеД тпЪ тгд, т.гд_Ьапс11ег_Ь Ьапс11ег, ипзадпед 1опд Падз, сопзТ сЬаг *пате, \7о1с1 *с1еу) Первый параметр - это номер прерывания. Для некоторых устройств вроде клавиатуры, таймера, номер прерывания жестко закреплен. Для большин- ства других устройств это значение определяется динамическим путем. Второй параметр - указатель на функцию обработчика прерывания. Эта функция вызывается операционной системой в момент получения сигнала прерывания. Следует обратить внимание на специфический прототип функ- ции-обработчика. ЪурейеГ 1гдгеЪигп_Ь (*1гд_Ьап<11ег_Ь) (1пЪ, моГд *) ; Обратите внимание на специфический прототип этой функции. Ей переда- ются два параметра, а сна возвращает значение типа Ш}ге1ит_1. Эту функ- цию мы рассмотрим чуть позже. Третий параметр, может быть равен 0 или содержать битовую маску флагов, представленных в заголовочном файле Ппих/йИегшрГй. Рассмотрим некоторые из флагов: • 11<рр ОГЕаВЬЕО - если данный флаг установлен, то во время выпол- нения обработчика прерываний все прерывания будут запрещены. Если флаг не установлен, то при выполнении обработчика прерываний все другие прерывания, кроме собственного, разрешены. В большинстве об- работчиков прерываний данный флаг не устанавливается, поскольку запрещать все прерывания — это плохая идея. Данный флаг используется для критичных по времени обработчиков прерываний, которые должны выполняться очень быстро. • 1КРР_8АМРЬЕ_К - этот флаг указывает, что прерывания, сгене- рированные данным устройством, должны вносить вклад в пул энтропии ядра. Последний обеспечивает’ генерацию истинно случайных чисел на основе различных случайных событий. Если этот флаг указан, то момен- ты времени, когда приходят прерывания, заносятся в пул в виде энтропии.
Этот флаг нельзя устанавливать, если устройство генерирует прерывания в предсказуемые моменты времени (как, например, системный таймер) или на устройство может повлиять внешний злоумышленник (как, напри- мер, сетевое устройство). • 1К9Р Т1МЕК. - этот флаг указывает, что данный обработчик п рерывания обслуживает системный таймер. • 1В.рГ_ЗНАВ.ЕВ - этот флаг указывает, что данный номер 1В.() может совместно использоваться несколькими обработчиками прерываний. Его нужно использовать при регистрации обработчика прерываний, если по- следний использует одну и ту же линию 1В.р с другими обработчиками прерываний. Если флаг сброшен, то для одной линии 1К() может суще- ствовать только один обработчик прерывания. Четвертый параметр (пате) содержит АЗСП-строку, описывающую устрой- ство, связанное с данным обработчиком прерывания. Например, для обра- ботчика прерывания клавиатуры персонального компьютера данный пара- метр содержит строку "кеуЬоатб". Текстовые имена устройств используются дтя взаимодействия с пользователями с помощью интерфейсов /ргос/пр и / ртос/1п1е1гирг8. Пятый параметр (беу) используется в обработчиках прерываний, обслужи- вающих общие линии 1К(). При освобождении обработчика (этот процесс будет рассмотрен ниже) в параметре с!еу указывается уникальный иденти- фикатор, который позволяет удалить только требуемый обработчик из задан- ной линии 1К.0 Без этого параметра ядро нс смогло бы определить, какой именно обработчик прерывания следует удалить с данной линии Жф. Если линия 1ЯО используется монопольно, то в качестве парамера с1су указыва- ется значение М1ЛХ. Если линия 1КР используется совместно несколькими обработчиками прерываний, то вы должны указать для каждого из них уни- кальный идентификатор. В случае успеха функция гсцисз!1тц() возвращает нулевое значение. Если ненулевое - есть ошибка. В случае ошибки обработчик не регистрируется. Чаще всего возвращается значение Е ВИЗУ, указывающее на то, что выбранная линия 1В.() используется в друюм обработчике прерывания и либо вы, либо автор другого драйвера забыл указать флаг 1К.рГ ЗН АВ ЕВ. Пример захвата прерывания:
II (гедиеа(-_1гс(1гчг.ит, тЪНпсИг, 1КйГ__ЗНР_ЧЕЭ, "зотедЗеч^се", зоте_аеШ) { ргГгАк (КЕРМ- ЕКК "зоте_с1ет1се: саппоЪ гедГзЪег 1Р0 %<3\п", хгдп) ; гегигп -ЕЮ; } В этом примере в параметре '.гдпит указывается запрашиваемый номер Ж(). Параметр йикпсПг определяет обработчик этой линии ЖР, которая может совместно использоваться, поскольку указан флаг Ж0Г8НАКЕО. Имя устройства — "зотпебсугсе’', а в параметре $оте_с1еу передается значение идентификатора устройства Леу В случае ошибки мы пишем в лог ядра сообщение об ошибке. При выгрузке драйвера устройства из памяти компьютера необходимо от- менить регистрацию обработчика прерывания и по возможности заблокиро- вать линию Жр. Для этого вызывается следующая функция: УО1<1 €гее_1гд (ипзгдпед тпЕ 1гд, мо1с! *с!еч) Если указанная линия Жр используется монопольно, то эта функция уда- ляет обработчик прерывания и блокирует линию Жр, Если линия ЖР ис- пользуется совместно с другими обработчиками прерываний, то удаляется обработчик, соответствующий параметру с1еу. Линия Жр блокируется толь- ко тогда, когда будет удален последний обработчик прерывания При совместном использовании линии ЖО уникальный идентификатор требует- ся для того, чтобы отличать друг от друга различные обработчики, связан- ные с одним и тем же номером ЖР Эго позволяет в функции &се 1гд() уда- лять нужный обработчик. В любом случае (совместного или монопольною использования линии ЖО), если параметр не равен значении» ИШЬ, то он должен соответствовать тому обработчику, который удаляется. Вызов функции (гее 1гц() должен выполняться из контекста процесса. 6.3. Пишем собственный обработчик прерывания Как вы догадались, самое сложное - это не зарегистрировать обработчик, а написать его. Прототип функции-обработчика прерывания выглядит так: Г из
зЪа^хс 1гдгеЪигп_Ь 1пЪЬпа1г(1п^ 1гд, уоЫ *с1еч) Описание функции соответствует прототипу второго аргумента КапсЧег, ко- торый передается функции гедиеЫ йцО- В первом параметре. 1гц, задается числовое значение номера линии запроса на прерывание, которую будет обслуживать обработчик. Несмотря на то, что это значение передается об- работчику прерываний, оно используется очень редко, в основном в диагно- стических сообщениях, выводимых в системный журнал. Второй параметр является уникальным идентификатором устройства, он должен совпадать с параметром который передан функции гедиея! йц() при регистрации обработчика прерывания. Функция-обработчик может возвращать одно из двух значений типа 1г({ге1игп'. 1КД МОХЕ и ШрНАХВЕЕО. Первое - если обработчик преры- вания обнаружил, что устройство, которое он обслуживает, не является ис- точником прерывания Второе - если обработчик вызван правильно Также можно использовать макрос 1В.О_В.ЕТУАЦуа1). Если значение параметра ус/ не равно нулю, то макрос возвращает значение 1В.р_НАХОЕЕП, ина- че возвращается значение, равное 1КР_ХОХЕ. Эти специальные значения позволяют проинформировать ядро о том, генерирует ли устройство пара- зитные (т.е. необрабатываемые) прерывания. Если все обработчики пре- рывания, которые обслуживают данную линию 1К.С), возвращают значение Ж0_ХОХЕ, то ядро может обнаружить проблему. Заметим, что этот стран- ный тип возвращаемого значения, 1гцге1игп_1, просто соответствует типу 1п1. Подстановка типа используется для того, чтобы обеспечить совместимость с более ранними версиями ядра, у которых не было подоб- ной возможности. Настал момент истины: попробуем написать настоящий обработчик преры- вания, который используется в драйвере часов реальною времени (геа1-Нте с1оск, ЕТС). Это самый простой пример обработчика прерывания для кон- кретного устройства. Код, рассмотренный далее, находится, как правило, в файле сЬзуетз/сйаг/Лс.с. При загрузке драйвера ЕТС вызывается функция йс_пн1(), которая инициа- лизирует драйвер. Также ока регистрирует обработчик прерывания, как по- казано далее:
/* Регистрация обработчика гЪс_1г.Ъегхир-с на гСс_1гц */ II (гедиезб_1гд(гЪс_1гд, гкс_1пСеггир1:, 1В0Г_ЗЕАКЕС, "г^с", (уо1с1 *) &гт.с_рогр)) { рг1пкк(КЕкМ_ЕВК "гСс: саппоЬ гедгзСег 1Н2 грс_1гд) ; геЬигп -ЕЮ; } Номер прерывания хранится в переменной Пс)гд и зависит от конкретной аппаратной платформы. Для РС - это 8 Второй параметр указывает обра- ботчик прерывания г1с_т1еггир1. Благодаря установке флага 1В.рр_8Е АКЕВ этот обработчик, по мере необходимости, может совместно с другими обра- ботчиками использовать общую линию 1К.0. Значение четвертого параметра определяет имя устройства — "тТс". Поскольку устройство КТС может ис- пользовать общую линию 1К-0, в пятом параметре передается уникальное для устройства значение параметра <1еу. Обработчик прерывания выглядит так: зкаПс 1гдгебигп_1: г1:с_1п'1еггир'С (1пС 1гд, уо!с1 *с!еу) { зр±п_1оск(&г11с_1оск) ; г1:с_1 гд_<1аСа += 0x100; гСс_1 гд_с!аСа &= ~0хй; гбс_1гд_йаса | = (СМОЗ_КЕАО (КТС_1ЫТВ._ЕЪАСЗ) & ОхЕО) ; (гЪс_зСакиз & НТС_Т1МЕВ_ОК) той—Ытег (&гРс_1гд_Ытег, ]1Шез + Н2/гСс_^гед + 2*Н2/100); зр!п_ип1оск(&гкс_1оск); зр1п_1оск({<гкс_Сазк_1оск) ; И (гСс_са11Ьаск) гкс_са11Ьаск->Гипс (гкс_са11Ьаск->рг1уаг.е_с1а'1:а) ; зр1п_ип1оск(4<гкс_казк_1оск) ; ыаке_ир_1пкАггирШЫе (&г1с_^атС) ; кШ_1азупс (&грс_азупс диеие, 31610, РОЬЬ_1Ы) ; гекигп 1К0_НАКОЬЕО; Данная функция вызывается всякий раз, когда наша система получает пре- рывание от устройства ВТ С Обратите внимание на вызовы функций спин- блокировок. Первая группа вызовов гарантирует, что к переменной Нс_1гц с1а1а не будет конкурентных обращений со стороны других процессоров на
многопроцессорной машине. Вторая группа вызовов защищает в аналогич- ной ситуации поля структуры г1с_са11Ъаск. У переменной Пс_1гд Дспа тип ипзцгпес! 1оп§. В ней будет храниться информация об устройстве В.ТС, которая обновляется при поступлении каждого прерывания и отражает состояние прерывания. Далее, если запу- щен генератор периодических сигналов, обновляется значение системного гаймсра с помощью функции тоб1_Нтег(). Таймеры будут описаны в сле- дующей главе. Во второй части кода, которая отделена пустой строкой, запускается функ- ция обратного вызова, если таковая была установлена. Драйвер КТ С позво- ляет устанавливать данную функцию, которая может быть зарегистрирована извне. В результате она будет запускаться при каждом прерывании, которое приходит от устройства КТС. Функция-обработчик возвращает значение 1В.р_НАМГ>ЕЕО, чтобы указать, что прерывание от данного устройства корректно обработано. 6.4. АР1 драйверов высокого уровня Ранее мы рассмотрели функции геоиеаМтцО и йгее тгд() - это основные функции для обработки прерывания. Первая из них запрашивает установ- ку обработчика прерывания с заданным номером, вторая - освобождает об- работчик. Кроме этих функций в таблице 6 1. приведены другие функции, которые мотут вам понадобится. Описание всех этих функций можно найти по адресу: йПрт./Лгиди кете!. ог§Мос/Ыт1М. 12/соге-арИкете1-ар1. Н1т1 Таблица 6.1. Дополнительные АР1 высокого уровня Функция Описание сИваЫеДнД) Отключает выбранную линию прерывания. Вклю- чения и отключения являются вложенными. Эта функция ожидает завершения всех ожидающих обработчиков 1Кр для этого прерывания перед возвратом. Если вы используете эту функцию, удерживая ресурс, который может понадобиться обработчику 1КО, вы попадете в мертвую блоки- ровку (беабктск)
епаЫе_1гц() Включает выбранную линию прерывания <И8аЫе_1гц_позупс() (только 8МР) Отключает линию прерывания без ожидания. Функция должна вызываться из контекста преры- вания яупскготге_1гц() (только 8МР) Ждать ожидающих обработчиков 1К.0 (на других процессорах) ггд зегргц 1уре() Устанавливает тип триггера прерывания для задан- ного 1кр 1гц _8е1_1гдрл'аке() Включаег/выключает режим управления питани- ем при пробуждении, по умолчанию этот режим отключен. Включение данного режима позволяет указанному прерыванию пробуждать систему из состояния сна 1гд _8е1_кап<Иег_ (1а1а() Устанавливает данные обработчика прерывания для заданного прерывания 1гц_8е[_сЫр0 Устанавливает чип для заданного прерывания 1гд_8е1_Мр йа1а() Устанавливает данные чипа для заданного преры- вания 6.5. Контекст прерывания При выполнении обработчика прерывания ядро находится в контексте пре- рывания. Напомним, что контекст процесса — это режим, в котором ра- ботает ядро, выполняя работу от имени процесса, например, выполнение вызова системной функции или потока ядра.
В контексте процесса макрос сиггеп! возвращает указатель на связанную с ним задачу. Более того, поскольку при вызове функций ядра не происходит переключение контекста процесса, система может приостановить выполне - ние текущей задачи и переключиться на выполнение другой. В отличие от контекста процесса контекст прерывания не связан ни с од- ним процессом. Поэтому макрос сиггеп! не имеет особого смысла, хотя он и возвращает указатель на процесс, выполнение которого было прервано. Поскольку в контексте прерывания нет сопровождающего его процесса, этот контекст нельзя перевести в состояние ожидания. Дело в том, что тогда бы нарушилась работа системного планировщика: нельзя перепланировать кон- текст в котором нет задачи. Поэтому некоторые Функции ядра не могут быть вызваны из контекста прерывания. Если функция может переводить процесс в состояние ожидания, то ее нельзя вызывать ь обработчике прерывания, а это, в свою очередь, О1ранпчивает набор функций, которые можно использо- вать в обработчиках прерываний. Контекст прерывания является критичным ко времени выполнения, посколь ку на время обработки прерывания выполнение некоторого программного кода прекращается. Код же самого обработчика прерывания должен быть простой и быстрый. Использование в нем циклов проверки состояния чего- либо (Базу 1оор) крайне нежелательно, хотя и возможно. Это очень важный момент. Всегда следует помнить, что обработчик прерывания прерывает ра- боту некоторого кода. В связи со своей асинхронной природой обработчики прерываний должны быть как можно более быстрыми и простыми. Макси- мально возможную часть работы необходимо изъять из обработчика преры- вания и переложить на его нижнюю половину, которая выполняется в более подходящее время. Во время конфигурации системы можно определить размер стека обработ- чика прерывания. Исторически так сложилось, что обработчик прерывания не имел собственного стека. Вместо этого он должен был использовать стек ядра прерванного процесса. Стандартный размер стека ядра составляет две страницы памяти, что обычно соответствует 16 Кбайт — для 64-разрядных. Поскольку подразумевается, что обработчики прерываний используют об- щий стек, они должны очень экономно расходовать память в этом стеке. Ко- нечно, размер стека ядра будет всегда ограничен, поэтому при разработке любого кода ядра следует веет да иметь это в виду. Чтя ХДЯгЖУЯ
6.6. Функция йо _1Ж?0 Рассмотрим весь процесс обработки прерывания: 1. Первым делом устройство инициирует прерывание путем отправки элек- трического сигнала контроллеру прерываний по аппаратной шине. Если нужная линия запроса на прерывание нс запрещена, контроллер преры- ваний отправляет сигнал прерывания процессору. В большинстве аппа- ратных платформ это происходит путем подачи сигнала на специальный вход микросхемы центрального процессора. 2. Если прерывания в процессоре разрешены (иногда они могут быть запре- щены). процессор завершает выполнение текущей машинной команды, запрещает прием новых прерываний, осуществляет переход на специаль- ный адрес в памяти и начинает выполнять программный код, который на- ходится по данному адресу. Сей заранее предопределенный адрес памяти был заранее сконфигурирован ядром и является точкой входа в обработ- чики прерываний. 3. Вход в систему обработки прерываний в ядре начинается со строго опре- деленной точки, так же, как и при вызове системных функций, вход в ядро выполняется через преопределенный обработчик исключительных ситуаций. Для каждой линии 1К.Р в памяти машины предусмотрена своя уникальная точка входа, куда и переходит процессор, после чего он на- чинает выполнять расположенный там код. Именно таким образом ядро узнает о номере 1К0 произошедшего прерывания. В точке входа сначала сохраняется в стеке значение номера прерывания и значения всех реги- стров процессора, которые относились к прерванной задаче. После этого ядро вызывает функцию <1о_1К.О(). 4. Функция до_1К.Р() определяет, задан ли обработчик д.1я данной линии 1КХ)? Если нет, тогда вызывается функция ге1_Ггот_)п1т() и происходит возврат к выполнению прерванного кода 5. Если обрабогчик прерывания задан, тогда вызывается функция ЬапЛе_ 1В.Р_ еусп1(), которая выполнит все обработчики для заданной линии 1ВХ}, а затем выполнит функцию геф &от т&О для выхода из прерывания и возвращения к выполнению прерванного кода.
Функция до_[К.р() определена так: ипзхдпес! хгД До_1К0(зЦгисС рЪ_гедз гедз) Поскольку соглашение о вызовах функций в. языке С предусматривает раз- мещение их аргументов в вершине стека, первоначальные значения всех ре- гистров процессора, которые были сохранены ассемблерной программой в точке входа, передаются в функцию До ДКР() через структуру р1_ге&. Так как в этой структуре также сохраняется значение номера прерывания, функ- ция с1о_1КО() может его легко извлечь. После вычисления значения номера 1К.р функция <1о_1Р0() отправляет уведомление о получении прерывания и запрещает тенерирование прерываний по данной линии. Для обычных ма- шин платформы РС эти действия выполняются с помощью функции главк алб аск 8295А(). Далее в функции 4о 1К.()() выполняется проверка, что для данной линии 1К.() зарегистрирован корректный обработчик прерывания, что этот обработчик разрешен и не выполняется в данный момент. Если все эти условия выпол- няются, то вызывается функция Ьап(11е_1К.0_еуепЦ), определенная в файле кете1/1гц/кап<11е.с. которая запускает установленные для данной линии 1КХ} обработчики прерывания. Код этой функции следующей: 1гдге^игп_Т Иапс11е_1гд_еуепЪ (з^гисЦ 1гд_с1езс *<1езс) { 1гдгеЦигп_Ъ геС; Цезс->1зТаТе &= ~1К<25_РЕНР1ЦС; 1гдс1 зеЪ (&аезс->1гд_<1аТа, 1К0О_1К0_ТЦРКО6КЕ83); гаи_ зр1п_Ш11оск. (^с!езс->1оск) ; геЪ = Ьаг.с11е_1гд еVепV_ре^сри (г!езс); гаи_зр1п_1оск (&с1езс->1оск) ; 1гдс1_с1еаг (&с1езс->1гд_6аСа, 1КОО_1КО_1МРКОСКЕ55); гетигп геТ; }
Поскольку сегодня машины, в основном, являются многопроцессорными, то сама функция йап<11е_1гц_еуеп1() передает управление функции Ьап<11е_1го_ еуеп1_регсри(), которая, в свою очередь, возвращает значение, сгенерирован- ное функцией____ЬагкИепц еуеп1регсри(), которая и делает.' всю основную работу: 1гцге1:игп_Ъ йапсН е_1гя_еуепЬ_регсои(зЬгисЬ 1гд__<1езс Мезе) { 1гдгесигп_1: геЪща1; гема! = ____Иа‘пс11е_1гд_е'7епЬ_регсри (с!езс); адд_1пЪеггирЪ_гапс1отпезз (Йезс->1гд_с1а1:а. 1гд) ; 1Г (! 1гд_зеЬР±пд5_по_с1еЬид (с1езс) ) по1.е_1п1:еггирЪ (йезс, геМа!); геЬигп геЬуа!; } 1гдге11игп_Ь ___Иапс11е_1гд_ещеп1:_регсри (зЪгисР 1гд_с1езс Мезе) { 1гдт.еЪигп_Ъ геЪуа! = 1В0_ЧОЫЕ; ипзздпей 1пГ хгд = <1езс->1гд_с1а1:а. д.гд; зЪгисГ. ггдасМоп *асг1оп; гесога_1гд_Ъ1те (Цезс) ; 1ог_еасп_асЪ1оп_оГ_с1езс (<1езс, асМоп) { 1гдге1:игп_Ъ гез; /* * Если это 1К<2 будет передано под Тогсе_1гдМгеас15, отметить его соответствующим образом. */ 1Г (1гд_зе111:1пдз_сап_11Й1еа<1(дезс) && ! (асИоп->11адз & (1К0Г_К0_ ТНКЕАО | 1К0Е_РЕКСР0 1К0Г-0ЫЕЗН0Т))) 1оскс1ер_Ьагс11гд_М1геа<1ес1 () ; ^гасе_1гд_Ьапд]ег_епЬгу(ггд, асЪГоп); гез = асЪ1оп->Ьапс11ег (ггд, асС.1оп-><1ещ_1с1) ; 1:гасе_1гд_11апШ ег_ех1Д (тгд, асЫоп, гез) ; 1Г (ИАЧЫ ОЫСЕ (11гдз_с11заЫес1 () , "ггд %и ЬапбТег %рЗ епаЫес! тпЪеггирСзХп", 1гд, асЪ1оп->Ьапс11ег) ) 1оса1_1гд_Ц1заЬте();
зм1ЪсЬ (гез) { сззе 1К0 ИЛКЕ ТНКЕАБ: /* Перехватывать драйверы, возвращающие таКЕ_ТНКЕАЬ, но не настроившие функции потока */ (ипПкету (!асЫоп->ЬЪгеаа_Гп)) { магп_по_СЪгеай(1гр, асЫоп); Ьгеак; } __з.гд_юаке_Ы1геас1 (г!езс, асС1оп) ; Ьгеак; йеЕаи1Ь: Ьгеак; геЬуа! |= гез; геьигп геЬуа!; Функция ге1_Ггот 1п1г() и код входа в прерывание написаны на языке ас- семблера. В этой функции проверяется, есть ли ожидающий запрос на пере- планирование процессов. 6.7. Интерфейс /ргос/шГеггир(8 Файловая система ргосй — это виртуальная файловая система, которая существует только в памяти ядра и обычно монтируется на каталог /ргос. Чтение или запись файлов в файловой системе ргосй приводит к вызовам функций ядра, которые имитируют чтение или запись обычных файлов. Ха- рактерный пример — файл /ргос/1п1еггир1з, который содержит статистику, связанную с прерываниями в системе. Ниже приведен пример вывода из этого файла на однопроцессорном персо- нальном компьютере с двумя процессорами.
СРОО СРО1 1: 9 0 ТО-АРТС 1-едде 18042 б: 3 0 ТО-АРТС 6-еаде йорру 8: 0 0 ТО-АРТС 8-еДде г5.с0 9: 0 0 ТО-АРТС 9-1:аз5.ео1 аср! 10: С 0 ТО-АРТС Ю-ТазРеох у1гЫо2 11: 32 0 ТО-АРТС 11-г’азеео1 иУ1с±_г.сО: изЫ 12: 0 15 ТО-АРТС 12-е<Зде 18С42 14: 0 0 Ю-АРТС 14-ейде аЪа_рИх 15: 0 0 ТО-АРТС 15-ейде аЪа_рИх 24: 0 0 РСТ-МЗТ 65536-ейде у!гС1о1-сопйд 25: 36586 12308 РСТ-МЗТ 65537-ейде т!гЫо1--лг^диэиез 26: 0 0 РС1-М31 4 9152-ес1де ухг'ЬюО-сспЙд 27: 17773575 22966247 РСТ-М31 49153-едде х’ХгГ.ХоО-Хпри-ь. 0 28: 8537896 3567412 РСТ-МЗТ 4 9154-есХде V^^Ь^оС-ои‘.ри'Ь.0 29: 0 0 РСТ-МЗТ 98304-еДде ’/ггРюЗ-сопйд 30: 0 20576365 РСТ-МЗТ 98305-еДде уХгРхоЗ-гед.0 ЫМТ: 0 0 Ыог.-тазкаЫе Хпгеггир!з ЬОС: 1019558061 1070751773 Ьоса1 Мтег ТпЪеггирйз ЗРЦ: 0 0 Зригхоиз ХпОеггирРз РМТ: 0 0 РегГогтапсе тсп1Рог1пд ТпСеггар-Ьз ТИТ: 199664 251886 1К0 могк 1п5еггир5з НТК: 0 0 АРТС ТОК геаД геРгХез РЕЗ: 43403577 36422980 КнзсНеДиНпд 1пЬеггир5з С АТ.: 7991667 1712248 ЕипсЫоп са11 хпЬеггирйз ТЬЗ: 402860 409492 ТЬВ зЪооЬаоипз ТРИ: 0 0 ТЪегта! еVеп5 1п5.егхирЪз ТНК: 0 0 ТИгезХ1о1<1 АРТС гпЪеггир'Оз РЕК: 0 0 ОеТеггес! Еггог АРТС ТпОеггирГз МСЕ: 0 0 МасПгпе скеск ехсер'Ыопз МСР: 30468 30468 МасМпе с.Ъсск ро!1з ЕКК: 0 МТЗ: 0 РТЫ: еVеп1: 0 0 РозЪей-хпОеггирО поН&аЫоп ЫРТ: 0 0 МезОес! розЬесТ-ТпОеггир!: еVеп11 РХН: 0 0 РозГесЫпОеггирО макеир еVеп'^ Первый столбец содержит номер линии 1Вр. Линии 1Ж) для когорт не установлен обработчик, не отображаются. Во втором столбце указывается общее количество полученных прерываний по данной линии ПУ}. На много- процессорных платформах здесь будет отображено несколько столбцов (по
числу процессоров), в которых указывается общее количество прерываний для каждого процессора. 61еЫагаие1Л1р гоо1@85.193.вО.19222 - ВПукеЛегт- гооф916661 -са9321& ~ — □ X 1ов1п: 5ип Зап 22 14:3© :50 В коо±091б661-са93216:~# сак ргос/1п1еггир15 СРО0 СРУ1 1: 9 0 10-АРК 1-едке 18042 1 6: 3 0 10-АРК 6-едЕе Порру И 8: 0 0 10-АРК З-ед^е Г1С0 9: © 0 10-АРК 9--Ра51еог аср! 10: © 0 10-АРК 10-Ра51ео1 У1гк1о2 11: 32 0 10-АРК 11-Га51ео1 иЪс1_Ксд:и5Ы 12: © 15 10-АРК 12-едде 18042 14: 0 0 10-АРК 14-едве ака_рНх 15: 0 0 10-АРК 15-едве а1а_рИх 24: е 0 РС1-М51 65536-ед^е у1г11о1-соп-€1в 25: 36586 12308 РС1-М51 65537-едве ц1г11о1-ц1гкриеие5 26: 0 0 РС1-М51 49152-едее ухгИое-солНе 27: 17773575 22967364 РС1-М51 49153-е^ве У1гкхо0-1при'к .0 28: 8537912 3567447 РС1-М51 49154-едве V1 г! 1 о0 - оиХ ри 1.0 29: 0 0 РС1-М51 98304-ед^е ухШоЗ-соптхв 30: 0 20576646 РС1-М51 98305-еаве ухг’кхоЗ-пер.б 0 0 Ыоп-таекаЫе хп^еггиркз Я ЮС: 1019570773 1070787425 коса! Итег 1п1еггир1$ И 5РЬ: 0 8 Зригхоиз хпкегпиркз РМ1: 0 0 РвгЕогтапсе топИогдпв хпкепгиркз Я ХЫ1: 199664 251895 182 «огк 1п1еггирк5 КТН: 0 0 АР1С КЯ геай гекгхез Я ЙЕ5: 43404346 36423512 КезсНейиНпв хпкеггирка 1 СА1: 7991794 1712248 ЕипсНоп са!1 хпкеггиркз 1 Г1В: 402861 409510 ТкВ зНоокдо^пз там. 0 0 ТНепта! ецепк 1п1еггир15 Я ТНК: 0 0 ТКге$Ъо!д АР1С хпкеггиркз Я ОРК: 0 0 Ое'бегпед Еггоп АР1С 1п1егпир15 Я ЧСЕ: 0 0 МасЫпе сНеск ехсергхопз Я ИСР г 30469 30469 МасЫпе сЬеск ро11з ЕРЯ: 0 Рис. 6.1. Интерфейс /ргос/1п1еггирШ В следующем столбце (номер столбца зависит от количества процессоров, если процессор один, то это 3-ий столбец, если два - 4-ый и т.д.) указы- вается контроллер прерываний, обрабатывающий данное прерывание. Зна- чение ХТ-Р1С соответствует стандартному программируемому контроллеру прерываний компьютера 1ВМ РС. Для систем, оснащенных устройством 1/0 АР1С, для большинства прерываний в качестве контроллера прерываний бу- дет указано значение Ю-АР1С-1еуе1 или Ю-АР1С-ей§е. И, наконец, в послед- нем столбце отображается имя устройства, связанного с прерыванием. Это имя передается в виде параметра деупате функции гециез! 1гц(), как гово- рилось выше. Если какая-то из линий 1К0 совместно используется несколь-
кими устройствами (как 1Кр4 в нашем примере), то в последнем столбце будут перечислены имена всех зарегистрированных для данной линии 1Кр устройств.
Глава 7. Таймеры и отслеживание хода времени
7.1. Учет времени в ядре Ядро помимо всего прочего, занимается также и учетом времени. Причем учет времени является одной из важнейших функций ядра, поскольку в ядре есть множество функций, которые запускаются но сигналам времени, а не по событиям. Другими словами, есть функции, которые запускаются, если произошло какое-то событие. А есть функции, которые вызываются по жест- кому графику, например, 100 раз в секунду. Ядро может запланировать ра- боту на выполнение в момент времени, который наступит спустя 1 секунду относительно текущего момента. Говоря о планировании времени, нужно разделять понятия абсолютного и относительного времени. Если нужно выполнить некоторую работу в буду- щем, скажем, спустя 1 минуту относительно текущего момента учет абсо- лютною времени не нужно, только относительного, то есть относительно текущего момента нужно отсчитать 60 секунд. А вот если нужно выполнить работу в определенное время, например, в 23:00, тогда нужен учет абсолют- ного времени.
Имеются отличия в реализации обработчиков событий, возникающих пери- одически, и тех, которые планируются на выполнение ядром в некоторый фиксированный момент времени в будущем. События, возникающие пе- риодически (скажем, каждые 50 мс), генерируются системным таймером. Последний представляет собой программируемое аппаратное устройство, которое генерирует аппаратные прерывания с фиксированной частотой. В обработчике этого прерывания, которое называется прерыванием от тайме- ра (пшег шсеггирТ), обновляется значение системного времени и выполняют- ся периодические действия. Системный таймер и его прерывания являются основной движущей силой, отвечающий за работу операционной системы Ыпих. Также мы поговорим о динамических таймерах (дупаппс пшегз) — средствах, позволяющих планировать события, которые выполняются один раз, после истечения некоторого интервала времени. С точки зрения компьютера концепция времени является неопределенной. Чтобы получать информацию о текущей дате и управлять системным вре- менем, ядро должно взаимодействовать с системным аппаратным обеспече- нием. Данное "железо" содержит системный таймер, используемый ядром для измерения прошедшею времени. Внутри системною таймера находит- ся кварцевый резонатор, обеспечивающий очень точное значение периода вырабатываемых импульсов. Такой же резонатор используется в цифровых электронных часах или тактовом генераторе процессора. Системный тай- мер вырабатывает эти импульсы с заранее заданной частотой, на- зываемой частотой импульсов. Как только истекает период очередного импульса, процессору посылается прерывание от таймера, в результате чего вызывается специальны]! обработчик прерывания. Ядру известна частота импульсов системного таймера, поэтому оно может вычислить интервал времени, прошедший между двумя прерываниями от таймера. Данный интервал времени между двумя импульсами системного таймера называется периодом следования импульсов и измеряется в долях секунды и равен обратному значению частоты системного таймера. Абсо- лютное значение времени соответствует текущему значению времени суток и очень важно для работы пользовательских приложений. Ядро в состоянии отследить это время просто потому, что оно обрабатывает прерывания от таймера. В ядре предусмотрено семейство системных функций, позволяю- щих пользовательским приложениям получать информацию о дате и време- ни дня. Время непрерывной работы системы (зузтет ирНте) является относитель- ным и отсчитывается от момента последней перезагрузки системы. Оно
используется как в системных, так и в пользовательских приложениях. Во многих программах требуется знать интервал времени, прошедший между двумя событиями. Проще всего его измерить как разность между двумя зна- чениями времени непрерывной работы системы, считанными в нужные мо- менты. Прерывания от таймера очень важны для управления работой всей опера- ционной системой. Существует большое количество функций ядра, которые система запускает в зависимости от хода воемени. Также ряд функций запу- скается периодически по сигналу прерывания от таймера, например, обнов- ление значений времени, обновление абсолютного значения времени, запуск обработчиков всех динамических таймеров и т.д. Многие из этих функций выполняются при каждом прерывании таймера, то есть работа делается с частотой системного таймера. 7.2. Таймеры ядра Когда нам нужно запланировать действия на позднее время без блокирова- ния текущего процесса до наступления момента времени, лучшим инстру- ментом являются таймеры ядра. Такие таймеры используются для планиро- вания выполнения функции в определенное время в будущем, основываясь на тактовых тиках, и могут использоваться для различных задач - напри- мер, опрос устройства путем проверки его состояния через регулярные про- межутки времени, когда оборудование не может генерировать прерывания. Другим типичным использованием таймеров ядра является отключение двигателя НОЕ или завершение другой длительной операции выключения. В таких случаях задержка возвращения из с1ояе создала бы ненужные (и неожиданные) трудности для прикладной программы. Наконец, само ядро использует таймеры в ряде ситуаций, включая реализацию зскес1и1е_Итеои1. Таймер ядра является структурой данных, которая инструктирует ядро для выполнения заданных пользователем функций с заданным пользователем аргументом в заданное пользователем время. Реализация находится в <1ших/ итег.й> и кете1/йтстс и более подробно поговорим об этом далее в этой главе. Функции, которые были запланированы для запуска, почти наверняка не ра- ботают, пока выполняется процесс, который их регистрирует. Вместо этого, они лапускакнся асинхронно. До сих пор все, что мы сделали в наших при- •
мерах драйверов - это работа в контексте процесса, выполняющего систем- ные вызовы. Когда запущен таймер, процесс, который запланировал его, мо- жет спать, выполняться на другом процессоре, или, что вполне возможно, вообще завершиться. Такое асинхронное выполнение напоминает то, что происходит, когда зы- полняется аппаратное прерывание В самом деле, таймеры ядра работают как результат "программного прерывания". При запуске в атомарном кон- тексте этого рода на ваш код налагается ряд ограничений Функции таймера должны быть атомарными всеми способами, но есть некоторые дополни- тельные вопросы, вызванные отсутствием контекста процесса. Теперь мы введем эти ограничения: они будут рассматриваться снова в нескольких местах в последующих главах Повторение делается потому, что правила для атомарных контекстов должны усердно соблюдаться, или система окажется в тяжелом положении. Некоторые действия гребуют для выполнения кон- текст процесса. Когда вы находитесь за пределами контекста процесса (то есть в контексте прерывания), нужно соблюдать следующие правила: • Не разрешен доступ к пользовательскому пространству. Поскольку от- сутствует контекст процесса, нет пути к пользовательскому пространству, связанному с любым определенным процессом. • Указатель сигтеп1 не имеет смысла в атомарном режиме и не может быть использован, поскольку соответствующий код не имеет связи с процес- сом, который был прерван. • Не может быть выполнено засыпание или переключение. Атомарный код не может вызвать зскеМе или какую-то из форм мейгвуеш и не может вызвать любые другие функции, которые могли бы заснуть Например, вызов кта11сс(.., СЕР КЕЯМкк) идет против правил. Семафоры также не должны быть использованы, поскольку они могут спать. Код ядра может понять, работает ли он в контексте прерывания, вызовом функции ш т1еггир!( ), которая не имеет параметров и возвращает ненуле- вое значение, если процессор в настоящее время оаботает в контексте пре- рывания, аппаратного или программного. Функцией, связанной с 1п_ 1п1еггпр1(), является т_а1о1Г1с(). Она возвращает ненулевое значение, когда переключение не допускается; это включает в себя аппаратный и программ- ный контексты прерывания, а также любое время, когда удерживается
спин-блокировка. В последнем случае, сиггеш может быть действительным, но доступ к пользовательскому пространству запрещен, поскольку это мо- жет привести к переключению. Каждый раз, когда вы используете т_ш1ег- гир1(), следует рассмотреть вопрос, не является ли щ_аЮт1С() тем, что вы действительно имеете в виду. Обе функции объявлены в <а8т/?1агс11гц.И>. Еще одной важной особенностью таймеров ядра является то, что задача мо- жет перерегистрировать себя для запуска снова в более позднее время. Это возможно, потому что каждая структура Итег_11в1 не связана со списком ак- тивных таймеров перед запуском и, следовательно, может быть немедленно перекомпонована где угодно. Хотя переключение на одну и ту же задачу сно- ва и снова может показаться бессмысленной операцией, иногда это бывает полезно. Например, зто может быть использовано для реализации опроса устройств. Кроме того, стоит знать, что в многопроцессорных системах таймерная функция (функция, запускаемая таймером) выполняется тем же процессо- ром, который ее зарегистрировал для достижения лучшего расположения кзша, когда это возможно. Поэтому таймер, козорый перерегистрирует себя, всегда запускается на том же процессоре. 7.3. АР1 таймера Ядро предоставляет драйверам ряд функций для декларации, регистрации и удаления таймеров ядра. Ниже приводится фрагмент кода, показывающий основные стандартные блоки: #1пс1ис1е <Ипих/Ытег .Ь> зЪгисТ СдлеГ—ИзТ { /* ... */ иг.зтдпед 1опд ехртгез; 7о1д (*ТипсЫоп) (ип$1дпе<1 1опд) ; илзТдпес! 1опд дат.а; }; уозс! 1пИ:_Ъ1тег (зЪгисТ Т1тег_11зТ *Ъ1тег); зЪгисТ Т1тег_11зЬ ”1МЕК_1\’1Т1АЫ2ЕК(_ТипсТ1оп, _ехр±гез, _даТа) ; алоШ асИ_Ытег (зТгисЕ. Т1тег_11зЪ * Тгтег) ; тпЬ с:е1_Ыте1 (зТгисС Ъ1те1_Из'Ь * Ъгтег) ;
Структура данных включает в себя больше полей, чем показано в нашем фрагменте, но продемонстрированные три поля предназначены для доступа снаружи кодом таймера. Поле ехрггез представляет значениекоторое таймер ожидает для запуска, в это время функция йшейоп вызывается с данными (1ша в качестве аргумента. Если нужно передать много объектов в аргументе, можно собрать их в единую структуру данных и передать указа- тель, приведя к ипхцгпее! 1оп§. это безопасная практика на всех поддержива- емых архитектурах а она довольно распространена в управлении памятью. Значение ехрггев не является типом рШея_64, поскольку не ожидается, что таймер сработает очень далеко в будущем и па 32-х разрядных платформах 64-х разрядные операции медленны. Структуры должны быть проинициализированы перед использованием. Данный шаг гарантирует, что все поля правильно настроены, в том числе те, которые не видимы для вызывающего. Инициализация структуры может быть осуществлена с помощью вызова тИ_Итег или присвоением Т1МЕК_ 1МТ1АЫ2ЕК статической структуре, в соответствии с вашими потреб- ностями. После инициализации, но перед вызовом асИйтегО, можно из- менить три открытых поля. Чтобы отключить зарегистрированный таймер до его истечения, вызовите функцию <1е1_бтег(). Модуль включает файл примера, /ргос/рйшег (для "только по таймеру"), который возвращает стро- ку заголовка и шесть строк данных. Строки данных показывают текущее окружение, где выполняется код; первая создается файловой операцией геас!, остальные - по таймеру. Следующий вывод был записан во время компиля ции ядра: саГ /ргос/]Штег Ше сЗеХГа 1п1гд р!а сри ссгтапс! 33565837 0 0 1269 0 саГ 33563847 10 1 1271 0 зЪ 33565857 10 1 1273 0 сррО 33565867 10 1 1273 0 сррО 33565877 10 1 1274 0 СС1 33565887 10 1 1274 0 сс1 В этом выводе, поле 1те является значением р$1ех, когда код запускается, (1е1(а является изменением относительно предыдущей строки, тгд — это логическое значение, возвращаемое 1п_гп1еггир1, р1а и соттапй относят
ся к текущему процессу и сри является номером используемого процессора (всегда 0 на однопроцессорных системах). Если вы прочитаете /ргос/рбшег при выгрузке системы, вы обнаружите, что контекстом таймера является процесс 0, задача простоя (1б1е), которая назы- вается "зучаррег" (‘'планировщик свопиинга") в основном по историческим причинам Таймер используется для генерации данных /ргос/рбтпег по умолчанию каж- дые 10 тиков, но при загрузке модуля можно изменить значение, установив параметр и1е1ау (бтег бе1ау, задержка таймера). Следующий отрывок кода показывает часть связанную с таймером рИтег. Когда процесс пытается прочитать наш файл, мы устанавливаем тай- мер следующим образом: ипзЕдпесЗ 1опд ; = ;1йез; /* заполняем данные для нашей таймерной функции */ ДаРа->ргеч^йез = 5; йаТа->ЬиГ = ЬиГ2; Дах:а->] оорз = ЛТ_А5УЫС_ЬООР5; /* регистрируем таймер */ СаРг.->Г1тег. оаЬа = (ипзтдпеД 1опд)с1аСа; ДаЪа-ХАтег. ЕипсЫоп = з1Р_С1тег_^п; <ЗаЪа->е1п1ег.ехртгез = з + ТДе1ау; /* параметр */ айд_Ы.тег (&Дага->г.1п'.ег) ; /* ждем заполнения буфера */ ма1р_еуеп'1:_1пЬеггирС1Ые (<1аТа->на1Т, !<АаЪа->1оорз) ; АР1 таймера включает в себя несколько больше функций, чем те, которые введены выше. Следующий набор завершает список предложения ядра: 1Пр т6Л_Мтег (зСгисЪ Ъ1тег_11зр *Р1тег, ипзгдпес! 1опд ехрхгез); Данная функция осущесхвляет обновление времени истечения срока тай- мера. Функция тоб_йтег() может быть вызвана при неактивных таймерах, также, как обычно используется абб йшег(). Рассмотрим следующую функцию
1пг Це1_Ытег_зуле (зСгисЪ С1гсег_11зГ *Ытег) ; Работает как и <1е1_йтег(), но также гарантирует, что когда она вернется, таймерная функция не запущена на каксм-то процессоре, Данная функция используется, чтобы избежать состояний состязания на многопроцессор- ных системах, и аналогична бе1_йтег() па однопроцессорных ядрах. Этой функции в большинстве ситуаций следует отдавать предпочтение перед йе1_ Нтег(). Эна может "заснуть", если вызывается из неатомарного контекста, но находится в активном ожидании в других ситуациях. Будьте очень осторожны, вызывая де1_итег_8упс() при удержании блоки- ровок, - если таймеэная функция попытается получить ту же блокировку, система может заблокироваться. Если эта таймерная функция перере) истри- рует себя, вызывающий должен сначала убедиться, что эта перерегистрация не произошла; обычно это достигается установкой флага "зЬшйпз бомгп" ("выключить"), который проверяется таймерной функцией. Следующая функция. - Пшет_ретПпз(): Т1тег_репс11пд(сопзс зСгисЬ С1тег_11зС * Штег) ; Возвращает истину или ложь, чтобы показать, будет ли таймер в настоящее тремя запланирован для запуска, чтением одной из скрытых полей струк- туры. 7.4. Реализация таймеров ядра Обычно вам не нужно знать, как реализованы таймеры ядра, чтобы их ис- пользовать Но их реализация интересна и стоит посмотреть на их внутрен- ности. Реализация счетчиков была разработана, чтобы соответствовать следующим требованиям и предположениям: • Управление таймером должно быть максимально легким.
• Конструкция должна позволять увеличивать количество активных тай- меров. • Большинство таймеров истекают в течение нескольких секунд или, самое большее, минус, в го время как таймеры с длительными задержками до- вольно редки. • Таймер должен работать на том же процессоре, который его зарегистри- ровал. Решение, созданное разработчиками ядра, основано на копии структуры данных для каждого процессора. Структура Итег 1й1 включает в себя ука- затель на такую структуру данных в своем поле Ьазе. Если Ьазе является ЫЦЬЕ, таймер не запланирован для запуска, в противном случае, указатель говорит, какая структура данных (и, следовательно, какой процессор) за- пускает его. Всякий раз, когда код ядра регистрирует таймер (через аМ_Итег или то<Л_ Птег), операции в конечном итоге выполняются т1егпа1_аМ_Итег (в кете!/ йтсг.с), когорая, в свою очередь, добавляет новый таймер в двусвязный спи- сок таймеров в рамках "каскадной таблицы", связанной с текущим процес- сором. Каскадные таблицы работают так: если таймер истекает в следующих тиках от 0 до 255, он добавляется в один из 256 списков, посвященных таймерам малого диапазона, используя самые младшие биты поля ехр1гез. Если он истекает дальше в будущем (но до 16384 тиков), он добавляется в один из 64 списков на основе битов 9-14 поля ехрггез. Д.гя таймеров истека- ющих еще позже, тот же прием используется для битов 15-20, 21-26 и 27- 31. Таймеры с полем времени окончания еще дальше в будущем (что может случиться только на 64-х разрядных платформах) делятся на задержки со значением ОхйНйК и таймеры с ехрггез в прошлом планируются для запуска в следующем гике таймера (таймер, который уже истек, иногда может быть зарегистрирован в ситуациях высокой нагрузки, особенно если вы работаете с вытесняющим ядром). После запуска__гип бтегз, он запускает все отложенные таймеры на теку- щий гик таймера. Еслив настоящее время является кратной 256, функ- ция также заново делит один из списков таймеров следующего уровня на 256 списков короткого диапазона, возможно каскадируя один или несколь- ких других уровней также в соответствии с битовым представлениемрДьез. Вб ]
Это подход, хотя и чрезвычайно сложный на первый взгляд, выполняется очень хорошо как с несколькими таймерами, так и с большим их числом. Время, которое необходимо для управления каждым активным таймером, не зависит от количества уже зарегистрированных таймеров и ограничено несколькими логическими операциями над двоичным предел явлением ноля ехрггеа. Накладным расходом, связанным с этой реализацией, является па- мять для 512 заголовков листов (256 краткосрочных списков и 4 группы из 64 списков более длительных диапазонов), то есть 4 Кб памяти Функция тип йгпега, как показано /ргос-)штег, будет запущена в атомар ном контексте. Кроме уже описанных отраничений, это приносит интерес- ную особенность: таймер истекает только в заданное время, даже если вы не работаете на вытесняющем ядре и процессор занят в пространстве ядра. Вы можете видеть, что происходит, когда вы читаете /ргос/рйшзу в фоновом режиме и /ргос/рГтег с высоким приоритетом. Хотя система кажется прочно заблокированной системным вызовом с активным ожиданием, таймеры ядра все же работают нормально. Таймер ядра далек от совершенства, он страдает от дрожания и других арте- фактов, вносимых аппаратными прерываниями, а также другими таймерами и другими асинхронными задачами. Хотя таймер, связанный с простым циф- ровым вводом/выводом, может быть достаточен для таких простых задач, как запуск шагового двигателя или другой любительской электроники, это обычно не подходит для производственных систем в промышленных усло- виях. Для выполнения таких задач вам, скорее всею, придегся прибегнуть к расширению ядра для реального времени.
Глава 8. Управление памятью
Подсистема работы с оперативной памятью в Ыпих - достаточно много]ран- ная конструкция. Чтобы разобраться в се деталях, нужно целенаправленно погрузиться в тему, с обязательным чтением исходников ядра, но это нужно не каждому. Для разработки и эксплуатации серверного программного обеспечения важно иметь хотя бы базовое представление о том, как она ра- ботает. но, как показывает практика, не многие администраторы и разработ- чики обладаю! подобными знаниями. 8.1. Какая бывает память? 8.1.1. Физическая и виртуальная Начнем с самих азов. Представим, что у нас есть сервер (без разницы - физический или УВ8), скажем, с 16 Гб оперативной памяти. Что это значит? Именно столько в нем есть физической памяти. Для тех, кто забыл: физи- ческая память [или "ОЗУ1", "КАМ2", "оперативка") — это энергозависимая память, установленная в компьютере. Для ее работы требуется непрерывный поток электричества. Перебои с электропитанием или внезапное выключе- 1 2 Оперативное зап оминающее устройство Капйот Ассем Метогу
ние компьютера метут привести к стиранию хранящихся в ней данных. Кро- ме того, эта память является линейно адресуемой. Другими словами, зна- чения адресов памяти увеличиваются линейным образом. На физическом компьютере оперативная память представляет собой набор модулей (1 или более) памяти, установленных в слоты на материнской плате компьютера (рис. 8.1), Рис. 8.1. Оперативная память Задача распределения доступных ресурсов между исполняемым лро1рамм- ным обеспечением, в том числе и физической памяти, лежит на плечах операционной системы, в нашем случае Ьтих. Для обеспечения иллюзии полной независимости, она предоставляет каждой из программ свое неза- висимое виртуальное адресное пространство и низкоуровневый интерфейс работы с ним. Такая схема избавляет их от необходимости знать друг о дру- ге, размере доступной физической памяти и текущей ее занятости. Адреса в виртуальном пространстве процессов называют логическими. Дтя отслеживания соответствия между физической и виртуальной памятью ядро Ыпих использует иерархический набор структур данных в своей слу- жебном области физической памяти (только оно работает с ней напрямую), а также специализированные аппаратные контуры, которые в совокупности называют ММЪ\ На рис. 8.2 показано место МКШ в структуре управления памяти. Аббревиазура ТЬВ на данном рисунке - это буфер преобразований (ТгапзЫюп Еооказзде Вийег), О нем мы еще поговорим. 3 Мепюгу Мапа^етепЗ ЦпИ
ОЗУ Рис. 8.2. ММ С и физическая память Следить за каждым байтом памяти в отдельности было бы накладно, поэтому ядро оперирует достаточно большими блоками памяти - страница- ми, типовой размер которых составляет 4 килобайта (4096 байт). На аппаратном уровне, как правило, есть поддержка дополнительного уров- ня абстракции в виде 'сегментов" оперативной намята, с помощью которых можно разделять программы на части. В отличие от других операционных систем, в Ыпих она практически не используется - логический адрес всегда совпадает с линейным (адресом внутри сегмента, который сконфигурирован фиксированным образом) Физическая память разделяется на отдельные фрагменты, называемые страницы (ра§е). Практически вся внутренняя системная обработка памяти производится на постраничной основе. Размер страницы зависит от исполь- зуемой архитектуры. Обычно размер страницы равен 4096 байт или 4 Кб В азт/раде Ь определена констанга РАСЕ 817Е, задающая размер страницы для используемой архитектуры. Для 64-битных систем нужно заглянуть в файл ра§е_64.1т. Если посмотреть на адрес памяти (без разницы какой - виртуальный или фи- зический), можно увидеть, что он делится на номер страницы и смещение внутри этой страницы. Например, если используются страницы по 4096 байт, 112 младших значащих бит являются смещением, а остальные, старшие биты, указывают номер страницы. Если отказаться от смещения и сдвинуть оставшуюся часть адреса вправо, результат называют номером страничного
блока (ра&с &ате питЬег, РЕК). Сдвиг битов для конвертации между но- мером страничного блока и адресами является довольно распространенной операцией; макрос РАСЕ 81ПРТ сообщает, сколько битов должны быть сме- щены для выполнения этого преобразования, 8.1.2. Файловая и анонимная У приложений существует много способов выделить себе память для тех или иных нужд. Высокоуровневые языки программирования и библиотеки часто прячут от разработчиков, какой из них в реальности использовался и другие детали (хотя их всегда можно это узнать с помощью $ 1гасе) Если углубляться в особенности каждого доступного варианта, можно написать книгу только по управлению памятью. Вместо этого предлагаем разделить их на две, на мой взгляд, крайне важные группы по тому, какую память они выделяют, • Файловой памяти однозначно соответствует какой-либо файл или его часть в файловой системе. Первым делом в ней находится исполняемый код самой программы. Для прикладных задач можно запросить отобра- жение файла в виртуальное адресное пространство процесса с помо- щью системного вызова тшар() - после чего с ним можно работать как с любой другой областью памяти без явного чтения/записи. Что будет при этом происходить с данными в файловой системе и что будут видеть дру- гие процессы "отобразившие" этот же файл зависит от настроек. • Любую другую выделенную память называют анонимной, так как ей не соответствует никакой файл. Сюда понадают как переменные в стеке, так и области, выделенные с помошью функций вроде та11ос (к слову, за сце- ной для выделения больших блоков памяти они обычно тоже используют ттар с особым набором настроек, а для всего остального - Ьгк/зЬгк или выдают ранее освобожденную память). I На первый взгляд отличия не выглядят чем-то особенным, но тот факт, что области файловой памяти именованы, позволяет операционной системе эко- номить физическую память, порой очень значительно, сопоставляя вирту- альные адреса нескольких процессов, работающих с одним и гем же фай- лом, одной физической странице в памяти. Это работает прозрачно, начиная
от кода запущенных нескольких копий приложений, заканчивая специально сконструированными под эту оптимизацию систем. 8.1.3. Вытесняемая и невытесняемая память Суммарный объем используемой виртуальной памяти всех программ запросто может превышать объем доступной физической памяти. При этом в каждый конкретный момент времени приложениями может использовать- ся лишь небольшое подмножество хранимых по виртуальным адресам дан- ных. Это означает, что операционная система может откладывать не исполь- зуемые в данный момент данные из оперативной памяти на жесткий диск ("вытесняя"" их из памяти), а затем при попытке к этим данным обратиться - скопировать обратно в физическую оперативную память. Этот механизм официально называется пицог ра&е/аик, но под (фосто ра%е/аик как прави ло подразумевают тоже его, так как ттог ра§е /аик мало кого заботит (от- личие в том, что в случае т1пог ядру удается найти запрашиваемые данные уже загруженными в памят ь с какой-то другой целью и обращения к диску итоге не происходит). На время восстановления запрашиваемых приложением данных его выпол- нение прерывается и управление передается ядру для выполнения соот- ветствующей процедуры. Время, которое потребуется, чтобы приложение смогло продолжить свою работу, напрямую зависит от типа используемого жесткого диска: • Прочитать 4 Кб данных с обычного серверного жесткого диска 7200грш занимает порядка 10 мс, при хорошем стечении обстоятельств чуть мень- ше. Если вытесненных страниц оказывается много, запросто могут на- бегать заметные доли секунда (как условным пользователям, гак и на внутренних приборах, в зависимости от задачи). Особенно опасны ци- клические ра§е/аи1ги, когда есть две или более регулярно используемые области памяти, которые вместе не помещаются в физическую память, поэтому бесконечно вытесняют друг друга туда-обратно. При этом диск вынужден делать честный зеек, что само по себе тоже может быть некста- ти. Например, если с этим же диском работает какая-либо база данных. • Если используется 880, то ситуация несколько более радужная - из-за отсутствия механического движения аналогичная операция занимает примерно на порядок меньше, около 1 мс или ее доли, в зависимости от
типа и конкретной модели диска. Но годы идут, а 880 так и остаются нишевым, компромиссным продуктом по цене-объему. Если настольные варианты 880 стали дешевле, то пены на серверные дешевле не стали. Да и нужно учитывать не только цену одного гигабайга хранимой информа- ции, но и ресурс. Примечание. Для сравнения если бы страница уже была в па- мяти, то при обращении к ней счет шел бы на сотни наносекунд Это почти на 4 порядка быстрее, чем радеГаиН, даже на 850. Примечание о ресурсе 380 В своем распоряжении автор этой книги имеет два ноутбука Первый покупался очень давно и с целью повышения производительности на него был установлен 880 от К1пдз1оп на 480 Гб. Думаю, по размеру вы догадались, что стоил он тогда, наверное, дороже, чем весь ноутбук. Так вот этот 880 проработал чуть болое года. На втором ноутбуке был изначально установлен 880 Загпвипд Еуо, который честно проработал свои 3 4 года, а потом при запуске система начала "ругаться", что его срок вышел. Никаких ошибок 8.М.АК.Т. не показывал, просто один из счетчиков - количество отработан- ных часов - превысил запрограммированное значение Видимо, даже сам производитель не ожидал, что он столько проработает. Пришлось заменить его новый во избежание потерь информа- ции. К слову, оригинальный жесткий диск на первом ноутбуке до сих пор отлично работает. Вот и посчитайте стоимость не только гигабайта информации при покупке нового устройства, но и то, что за один и тот же срок 880 вы поменяете несколько раз, а НОО будет работать. Поэтому далеко не все администраторы на серверах спешат переходить на 880 (хотя на дворе уже 2023 год), а предпочитают проверенные и более ресурсные НОО Тем более, если речь идет о сервере, где частота обращений к диску в разы выше, чем на пользовательском ноутбуке. Стоит отметить, что с точки зрения приложения все это прозрачно и являет- ся внешним воздействием, то есть может происходить в самый не подходя- щий, с точки зрения решаемой им задачи, момент Думаю, понятно, что приложения, которым важна высокая производитель- ность и стабильное время отклика, должны избегать ра§еГаи1Гов всеми доступными методами, к ним и перейдем.
8.1.4. Разные типы адресов ОС Ыпих, как уже было отмечено, является системой с виртуальной памя- тью, а что означает, что адреса, видимые пользовательскими прозраммами, не соответствуют напрямую физическим адресам, используемым оборудо- ванием Виртуальная память вводит слой абстракции, позволяющий ряд приятных вещей. Так, при использовании виртуальной памяти программы, выполняю- щиеся в системе, могут выделить гораздо больше памяти, чем доступно фи- зически; более того, даже один процесс может иметь виртуальное адресное пространство больше физической памяти системы, виртуальная память по- зволяет также программе использовать разные ухищрения с адресным про- странством процесса, в том числе отображение памяти прохраммы в намять устройства. ОС Ыпих имеет дело с несколькими типами адресов, каждый со своей соб- ственной семантикой. К сожалению, в коде ядра не всегда четко понятно, ка- кой именно тип адреса используется в каждой ситуации, так что разработчик должен быть осторожным. Разберемся, какие типы адресов используется в Ыпих: • Пользовательские виртуальные адреса - обычные адреса, видимые программами пространства пользователя. Такие адреса могут быть 32 или 64 разрядными, в зависимости от архитектуры (не стоит забывать, что Ыпих может запускаться на разнообразных мини-компьютерах, встроенном оборудовании, которое все еше 32-битное, в отличие от пер- сональных компьют еров и серверов, которые уже давно стали 64-битны ми). Каждый процесс имеет свое виртуальное адресное пространство. • Физические адреса - адреса, которые используются между процессо- ром и памятью системы. В зависимости о г архитек гуры, они также могут быть 32 или 64 разрядными. • Адреса шин - адреса, используемые между периферийными шинами и памятью. Зачастую они такие же, как физические адреса, используемые процессором, но это не обязательно так. Некоторые архитектуры мо- гут предоставить блок управления памятью ввода/вывода (1/0 тетогу тапа§етеп1 ипй, ЮММ13), который переназначает адреса между шиной и оперативной памятью. 1ОММ11 может сделать жизнь легче несколькими способами (например, делая разбросанный в памяти буфер выглядящим [ 146 " к____
непрерывным для устройства), но программирование ЮММЪТ является дополнительным шагом, который необходимо выполнить при настройке В МА операций. Конечно, адреса шин сильно зависят от архитектуры. • Логические адреса - составляют обычное адресное пространство ядра. Такие адреса отображают какую-то часть основной памяти и часто рас- сматриваются как физические адреса. В большинстве архитектур логиче- ские адреса и связанные с ними физические адреса отличаются только на постоянное смещение. Логические адреса обычно хранятся в перемен- ных типа ипя^пей 1оп§ или уой! *. Память, возвращаемая ктаИос, имеет логический адрес ядра. • Виртуальные адреса - похожи на логические адреса тем, что они явля- ются отображением адреса пространства ядра на физический адрес. Сто- ит отметить, что виртуальные адреса ядра не всегда имеют линейную, взаимно-однозначную связь с физическими адресами, характеризующую логическое адресное пространство. Все логические адреса являются вир- туальными адресами ядра, но многие виртуальные адреса ялра не явля- ются логическими адресами. Так, например, память, выделенная утаИос, имеет виртуальный адрес (но без прямого физическою отображения). Функция ктар (описываемая далее в этой главе) также возвращает вир- туальные адреса. Виртуальные адреса обычно хранятся в переменных указателей. На рис. 8.3 показаны типы адресов, используемые в Ппих. При этом не окра- шена область физической памяти, а стрелки показывают отображение стра- ницы. Рис. 8.3. Типы адресов в Ыпих
8.2. Методы управления подсистемой памяти 8.2.1. Подкачка и невытесияемая память Для работы с памятью в Ыпих (как и в других ЦЪМХ-подобных системах) ха- рактерно такое явление как "страничный обмен" (ра§т§). Оно заключается в том, что ядро выделяет процессам столько памяти, сколько им необходимо. В том смысле, чтобы ее (памяти) всегда хватало. Это достигается за счет расширения физической памяти за счет виртуальной, т. е. "подкачки". По- скольку выполнение процессов должно происходить в реальной физической памяти, то ядро постоянно перемещает страницы памяти процессов между физической и виртуальной памятью. Забегая вперед, следует отметить, что в виртуальной памяти хранятся "неактивные" страницы, которые не задей- ствованы процессом в данный момент, но необходимые ему для полноцен- ной работы впоследствии. С файловой памятью все просто: если данные в ней не менялись, то для ее вытеснения делать особо ничего не нужно - просто перетираешь, а затем всегда можно восстановить из файловой системы. С анонимной памятью такой трюк не рабогаег: ей не соответствует никакой файл, поэтому чтобы данные не пропали безвозвратно., их нужно положить куда-то еще. Для этого можно использовать так называемый "8хуар"-раздел или файл. Можно, но на практике не нужно. Если жар выключен, то ано- нимная память становится невытесняемой, что делает время обращения к ней предсказуемым. Может показаться минусом выключенного что, например, если у при- ложения утекает память, то оно будет гарантированно зря держать физиче- скую память (утекшая не сможет быть вытеснена). Но на подобные вещи скорее стоит смотреть с той точки зрения, что это наоборот поможет раньше обнаружит ь и устранить ошибку. 8.2.2. Системный вызов т1оск() По умолчанию вся файловая память является вытесняемой, ко ядро Ыпих предоставляет возможность запрещать ее вытеснение с точностью не только до файлов, по и до страниц внутри файла.
Для этого используется системный вызов т!оск() на области виртуальной памяти, полученной с помощью татар. Если спускаться до уровня систем- ных вызовов не хочется, рекомендую посмотреть в сторону консольной ути- литы ушСоисЬ, которая делает ровно то же самое, но снаружи относительно приложения. Несколько примеров, когда это может быть целесообразно: • У приложения большой исполняемый файл с большим количеством вет- влений, некоторые из которых срабатывают редко, но регулярно. Такого стоит избегать и по другим причинам, но если иначе никак, то, чтобы не ждать лишнего на этих редких ветках кода, можно запретить им вытес- няться. • Индексы в базах данных часто физически представляю? собой именно файл, с которым работают через татар, а т!оск нужен чтобы минимизи- ровать задержки и число операций ввода-вывода на и без того нагружен- ном диске(- ах). • Приложение использует какой-то статический словарь, например, с соот- ветствием подсетей 1Р-адресов и стран, к которым они относятся. Вдвой- не актуально, если на одном сервере запущено несколько процессов, ра- ботающих с этим словарем. 8.2.3. ООМ кП1ег Перестаравшись с невытесняемой памятью, нетрудно загнать операцион- ную систему в ситуацию, когда физическая память кончилась, а вытеснять ничего нельзя. Безысходной она выглядит лишь на первый взгляд: вместо вытеснения память можно освободить. Происходит это достаточно радикальными методами: послуживший назва- нием данного раздела механизм выбирает по определенному алгоритму про- цесс, которым наиболее целесообразно в текущий момент пожертвовать - с остановкой процесса освобождается использовавшаяся им память, которую можно перераспределить между выжившими. Основной критерий для выбо- ра: текущее потребление физической памяти и других ресурсов, плюс есть возможность вмешаться и вручную пометить процессы как более или менее ценные, а также вовсе исключить из рассмотрения. Если отключит] > ООМ
к1 Пег полностью, го системе, в случае полного дефицита, ничего не останет- ся, как перезагрузиться. 8.2.4. с§гоир$ По умолчанию все пользовательские процессы наравне претендуют на поч- ти всю физически доступную память в рамках одного сервера. Это поведе- ние редко является приемлемым. Даже если сер: юр у словно-однозадачный, например, только отдает статические файлы по НТТР с помошью п^пх, всегда есть какие-то служебные процессы вроде зуз1о§ или какой-то вре- менной команды, запущенной человеком. Если же на сервере одновременно работает несколько ртобисбоп-кроцессов, например, популярный вариант - подсадить к веб-серверу тетсаскес1, крайне желательно чтобы они не могли начать "воевать" друг с другом за память в случае ее дефицита. Для изоляции важных процессов в современных ядрах существует механизм с^гоир$, с его помощью можно разделить процессы на логические группы и статически сконфигурировать для каждой из 1рупп сколько физической памяти может быть ей выделено. После чего для каждой группы создается сзоя почти независимая подсистема памяти, со своим отслеживанием вы- теснения, ООМ кй1ег и прочими радостями. Механизм ецгоирк намного обширнее, чем просто контроль за потреблени- ем памяти. С его помощью можно распределять вычислительные ресурсы, "прибивать" группы к ядрам процессора, ограничивать ввод-вывод и многое другое. Сами группы могут быть организованы в иерархию и вообще на ос- нове с^гоирк работают многие системы "легкой" виртуализации и нынче модные Воскет-контейнеры. Но, на мой взгляд, именно контроль за потреблением памяти - самый необходимый минимум, который определенно стоит настроить, остальное уже по желанию/необходимости. 8.2.5. М11МА В многопроцессорных системах не вся память одинакова. Если на материн- ской плате предусмотрено процессоров (например, 2 или 4), то обычно все слоты для оперативной памяти физически разделены на К групп так, что ।?<» -*.Лг.-••.'у
каждая из них располагается ближе к соответствующему ей процессору - такую схему называю!' 1ЧЪТМА4. Таким образом, каждый процессор может обращаться к определенной 1/14 части физической памяти быстрее (примерно раза в полтора), чем к остав- шимся (14-1)/К. Ядро Ыпих самостоятельно умеет это все определять и по умолчанию достаточно разумным образом учитывать при планировании выполнения процессоров и выделении им памяти. Посмотреть, как это все выглядит и подкорректировать можно с помощью утилиты питасИ и ряда доступных системных вызовов, в частности §е1_тегароНсу/яе( тетроПсу. 8.3. Механизм распределения ЬКИ Ядро старается управлять памятью таким образом, чтобы недавно исполь- зуемые процессом страницы находились в физической памяти. И в свою очередь, "неактивные" или редко используемые страницы перемещаются и хранятся в виртуальной памяти в области "подкачки". Такой механизм рас- пределения памяти называется ЬКО (1еаз1 гесеп11у изес!) — замещение наиболее редко используемых страниц. Вторым важнейшим аспектом в работе памяти является использование кэш- буфера страниц. Это вытекает из работы алгоритма ЫШ, который доволь- но сложен в своей реализации. Поскольку следить за всеми обращениями к страницам — это в некоторых случаях, довольно ощутимые потери в про- изводительности системы. Использование же страничного кэш-буфера куда проше в своей реализации при тех же самых результатах, К тому же данный подход имеет огромный модернизационный потенциал (в отличие от 1ЛШ) и алгоритмы анализа содержимого кэш-буфера (для определения, какие стра- ницы должны быть перемещены из виртуальной памяти) постоянно совер- шенствуются. Что заметно сказывается на производительности и эффектив- ности управления памятью. Когда процессу не хватает памяти, то ядро начинает искать "занятые" стра- ницы, которые можно использовать для "голодающего" процесса. Обычно такими страницами являются те, что давно не были использованы. Ядро проверяет их на предмет модификации каким-либо процессом. Для этого существуют определенные признаки, при последнем обращении и если из- 4 Ыоп-ЦтГогт Метогу Асееве, неравномерный доступ к памяти ЕНЕ
менения были, го такие страницы помечаются ядром как "грязные" (биту), т.е. такие, которые еше нужны процессам. Для повторного использования памяти такие страницы сначала обязательно переносятся в виртуальную па- мять. Все же остальные страницы являются "чистыми". И поэтому ядро их использует для предоставления другим или "голодающим" процессам. Когда происходит обращение к страницам памяти, которые некоторое или долгое время нс использонались, т. е. к "неактивным" страницам, ядро вы- полняет с ними несколько важных задач: • Возвращает ссылки на эти страницы в соответствующей таблице страниц; • Сбрасывает в нулевое значение время "неиспользования’' этих страниц; • Помечает эти страницы как 'активные". Со страницами, находящимися в виртуальной памяти не все так однозначно. Дело в том, что для того, чтобы "активизировать" такие страницы, они долж- ны быть предварительно прочитаны с диска. Системное ядро комплектуется специализированными модулями, которые содержат алгоритмы и даже целые технологии. Посредством данных тех- нологий система довольно эффективно "предсказывает", сколько может по- требоваться памяти при разной степени активности и загруженности про- цессов. Данные алгоритмы имеют своей целью обеспечение процессов свободной памятью с максимальной эффективностью, т е. так, чтобы про- цессам как можно реже приходилось простаивать в "ожидании" выгрузки очередной страницы в свободную память. Таким образом, наблюдая за состоянием страничного обмена во время рабочей нагрузки системы, можно делать выводы о том, нужна ли ей дополнительная память. Если страничный об'мен интенсивный — то однозначно следует установить дополнительные модули ОЗУ Если же происходит так, что процессам не хватает ни реальной физической, ни виртуальной памяти, т.е. когда память полностью исчерпана, система на- чинает завершать (а точнее уничтожать) целые процессы. Либо запрещает создание новых. Конечно, в этом случае в первую очередь уничтожаются наиболее "безболезненные" для системы процессы. Однако в таких случаях даже "на глаз" и по собственным ощущениям видно, что она большую часть времени тратит на управление памятью, а не на выполнение рабочих задач.
В Ыпих можно настроить параметр, который задает, насколько быстро ядро должно "отбирать" страницы памяти у процессов, которым они менее нуж- ны - для процессов, которым они на данный момент необходимы. Этот па- раметр содержится в файле /ргос/вувАт/вхуарртезз и по умолчанию равен 60. Если задать его меньшим значением (например, 0), то ядро будет заби- рать страницы процесса в самую последнюю очередь, используя вместо это- го любые другие варианты. Если это значение в пределах между 60 и 100, то страницы будут отбираться у процессов с более высокой вероятностью. Вариант с изменением данною параметра на самом деле юворит о том, что необходимо либо снизить нагрузку на систему, адаптировав ее для других, менее производительных задач, либо увеличить объем ОЗУ. 8.4. Дополнительные сведения об управлении памятью в Ыпих Управление памятью в 1лпих представляет собой сложную систему, которая развивалась с годами и включала все больше и больше функций для под- держки различных систем, от микроконтроллеров без ММЕГ до .суперком- пьютеров Управление памятью для систем без ММЪ’ называется попили, и оно определенно заслуживает отдельной книги, которая, надеемся, в конеч- ном итоге будет написана. Тем не менее, хотя некоторые концепции одинако- вы, здесь мы предполагаем, что ММ15 доступен, и СРП может преобразовать виртуальный адрес в физический адрес. 8.4.1. Снова о виртуальной памяти Физическая память является ограниченным ресурсом, и даже для систем, поддерживающих горячее подключение памяти, существует жесткое ограни- чение на объем устанавливаемой памяти. Физическая память не обязательно непрерывна - она может быть доступна как набор отдельных диапазонов адпесов. Кроме того, разные архитектуры СР11 и даже разные реализации одной и той же архитектуры имеют разные представления о том, как опреде- тяются эти диапазоны адресов.
Все это делает непосредственную работу с физической памятью довольно сложной, и чтобы избежать этой сложности, была разработана концепция виртуальной памяти. Виртуальная память абстрагирует детали физической памяти от приклад- ного программного обеспечения, позволяет хранить в физической памяти только необходимую информацию (подкачка по запросу) и обеспечивает ме- ханизм защиты и контролируемого обмена данными между процессами. С виртуальной памятью каждый доступ к памяти использует виртуальный адрес. Когда СР11 декодирует инструкцию, которая читает (или записывает) из (или в) системную память, он транслирует вир 1уальный адрес, закоди- рованный в этой инструкции, в физический адрес, который может понять контроллер памяти. Физическая системная намять разделена на страничные фреймы или страни- цы. Размер каждой страницы зависит от архитектуры. Некоторые архитек- туры позволяют выбирать размер страницы из нескольких поддерживаемых значений - этот выбор выполняется во время сборки ядра путем установки соответствующей опции конфигурации ядра. Каждая страница физической памяти может отображаться как одна или несколько виртуальных страниц. Эти сопоставления описываются табли- цами страниц, позволяющими выполнять преобразование виртуального адреса, используемого программами, в адрес физической памяти. Таблицы страниц организованы иерархически. Таблицы на самом низком уровне иерархии содержат физические адреса фактических страниц, используемых программным обеспечением. Табли- цы более высоких уровней содержат физические адреса страниц, принад- лежащих более низким уровням. Указатель на таблицу страниц верхнего уровня находится в регистре. Когда процессор выполняет трансляцию адресов, он использует этот регистр для доступа к таблице страниц верх- него уровня. Старшие биты виртуального адреса используются для ин- дексации записи в таблице страниц верхнего уровня. Эга запись затем ис- пользуется для доступа к следующему уровню в иерархии со следующими битами виртуального адреса в качестве индекса к таблице страниц этого уровня. Младшие биты виртуального адреса определяют смещение внутри фактической страницы.
8.4.2. Большие ст раницы Преобразование адресов требует нескольких обращений к памяти, а обра- щения к памяти медленны относительно скорости процессора. Чтобы не тратить драгоценные циклы процессора на преобразование адресов, про- цессоры поддерживают кэш таких преобразований, называемый буфером преобразования (или Тгап&1айоп Ьооказхёе ВиЙег, ТЬВ). Обычно ТЬВ явля- ется довольно дефицитным ресурсом, и приложения с большим рабочим на- бором памяти будут испытывать снижение производительности из-за про- махов ТЬВ. Многие современные архитектуры СРП позволяют отображать страницы памяти непосредственно па более высокие уровни в таблице страниц. Например, иа х86 можно отображать страницы размером 2М и даже 10, ис- пользуя записи в таблицах страниц второго и третьего уровня. В Ыпих такие страницы называются большими (Ьи§е ра^ез). Использование больших стра- ниц значительно снижает нагрузку на ТЬВ, повышает частоту попаданий ТЬВ и, таким образом, повышает общую производительность системы. В ОС Ыпих есть два механизма, которые позволяют сопоставлять физи- ческую память с большими страницами. Первый — это файловая система НидеТЬВ, или Ьи^еНЬЬ. Эго псевдо файловая система, которая использует оперативную память в качестве резервного хранилища. Для файлов, создан- ных в этой файловой системе, данные находятся в памяти и отображаются с использованием больших страниц. Другой, более современный механизм, позволяющий использовать боль- шие страницы, называется ТгапчрагегП Ни§еРа§ез или ТНР. В отличие от Ьи^сЙЬГз, который требует от пользователей и/или системных администра- торов настройки того, какие части системной памяти должны и могут быть отображены большими страницами, ТНР управляет такими сопоставления- ми прозрачно для пользователя и, следовательно, для имени. 8.4.3. Зоны Зачастую оборудование накладывает ограничения на доступ к различным диапазонам физической памяти. В некоторых случаях устройства не могут выполнять прямой доступ к памяти (ОМА, 01гес( Метогу Ассекз) для всей
адресуемой памяти В других случаях размер физической памяти превыша- ет максимальный адресуемый размер виртуальной памяти, и для доступа к частям памяти требуются специальные действия. ОС Ыпих группирует страницы памяти в зоны в соответствии с их возмож- ным использованием. Например, ХОМЕ р.МА будет содержать память, кото рая может использоваться устройствами для ЭМА, ХОКЕ НЮНМЕМ будет содержать память, которая не отображается постоянно в адресное простран- ство ядра, а ХОКЕ МОКМАЬ будет содержать страницы с обычной адреса- цией. Фактическое расположение зон памяти зависит от аппаратного обеспечения, поскольку не все архитектуры определяю! все зоны, а требования к прямому доступу к памяти различаются для разных платформ. 8.4.4. Узлы Мно1ие многопроцессорные машины являются системами КЦМА (Коп- ит Готт Метогу Ассезз) В таких системах память организована в банки, ко- торые имеют разную латентность доступа в зависимости от "удаленности" от процессора. Каждый банк называется узлом, и для каждого узла Ыпих создает независимую подсистему управления памятью У узла есть свой на- бор зон, списки свободных и используемых страниц и различные счегчики статистики. 8.4.5. Кэш страницы Физическая память энергозависима, и обычным случаем получения данных в память является их чтение из файлов. Всякий раз, когда файл читается, данные помещаются в кэш страниц во избежание "дорогостоящего" (по фак- ту - длительного) доступа к диску при последующих чтениях. Точно так же, как когда кто-то записывает в файл, данные помещаются в кэш страниц и, в конечном итоге, попадают на резервное запоминающее устройство. Запи- санные страницы помечаются как грязные, и когда ядро Ыпих решает повторно использовать их для других целей, оно обязательно синхронизиру- ет содержимое файла на устройстве с обновленными данными. Г >561
8.4.6. Анонимная память Анонимная память или анонимные сопоставления представляют собой па- мять, которая не поддерживается файловой системой. Такие отображения создаются неявно для стека и программ или явными вызовами системного вызова гшпарО. Обычно анонимные сопоставления определяют только обла- сти виртуальной памяти, к которым программе разрешен доступ. Доступ для чтения приведет к созданию записи в таблице страниц, которая ссылается на специальную физическую страницу, заполненную нулями. Когда программа выполняет -запись, для хранения записанных данных выделяется обычная физическая страница. Страница будет помечена как грязная, и если ядро ре- шит перепрофилировать ее, грязная страница будет заменена. 8.4.7. Освобождение На протяжении всего жизненного цикла системы физическая страница мо- жет использоваться для хранения различных типов данных. Это могут быть внутренние структуры данных ядра, буферы с поддержкой ЭМА для исполь- зования драйверами устройств, данные, считанные из файловой системы, память, выделенная процессами пользовательского пространства и т д. В зависимости от использования страницы управление памятью Глпих об- рабатывает ее по-разному, Страницы, которые могут быть освобождены в любое время либо, потому, что они кэшируют данные, доступные в другом месте, например, на жестком диске, либо потому, что их можно выгрузить, опять же, на жесткий диск, называются восстанавливаемыми. Наиболее за- метными категориями восстанавливаемых страниц являются кэш страниц и анонимная намять. В большинстве случаев страницы, содержащие внутренние данные ядра и используемые в качестве буферов ЭМА, не могут быть переназначены, и они остаются закрепленными до тех пор, пока их не освободит пользова- тель. Такие страницы называются невосстановимыми. Однако при опреде- ленных обстоятельствах могут быть освобождены даже страницы, занятые структурами данных ядра. Например, кэши метаданных файловой системы в памяти могут быть повторно прочитаны с устройства хранения и, следо- вательно, их можно удалить из основной памяти, когда система испытывает нехватку памяти.
Процесс освобождения восстанавливаемых страниц физической памяти и их перепрофилирования называется освобождением (гесЫт) ОС Ыпих может освобождать страницы либо асинхронно, либо синхрон- но, в зависимости от состояния системы. Когда система не загружена, большая часть памяти свободна, и запросы на выделение будут немед- ленно удовлетворены за счет наличия свободных страниц. По мере уве- личения нагрузки количество свободных страниц уменьшается, и когда оно достигает определенного порога (нижний водяной знак), запрос на выделение пробуждает демон кзумгрс!. Он будет асинхронно сканировать страницы памяти и либо просто освобождать их, если данные, которые они содержат, доступны в другом месте, либо вытеснять их на резервное устройство хранения (помните эти грязные страницы?). По мере того, как использование памяти увеличивается еще больше и достигает дру- гого порога — минимального водяного знака — выделение инициирует прямое восстановление В этом случае выделение останавливается до тех пор. пока не будет высвобождено достаточное количество страниц памя- ти для удовлетворения запроса. 8.4.8. Уплотнение (сжатие) По мере работы системы, задачи выделяют и освобождают память, и она становится фрагментированной. Хотя с помощью виртуальной памяти мож- но представить разрозненные физические страницы как виртуально непре- рывный диапазон, иногда необходимо выделить большие, физически непре- рывные области памяти. Такая необходимость может возникнуть, например, когда драйверу устройства требуется большой буфер для СМА, или когда ТНР выделяет большую страницу. Сжатие памяти решает проблему фраг- ментации. Этот механизм перемещает занятые страницы из нижней части зоны памяти в свободные страницы в верхней части зоны. По завершении сканирования с уплотнением свободные страницы группируются вместе в начале зоны, и становится возможным выделение больших физически смеж- ных областей. Как и операция гес1ат, сжатие может происходить асинхронно в демоне ксотрас1а или синхронно в результате запроса на выделение памяти.
8.5. Большие страницы. Более подробно 8.5.1. Общая информация Как уже отмечалось ранее, ядро Ыпих поддерживает большие страницы (Ьи§е11Ь). Эта поддержка построена на основе поддержки нескольких раз- меров страницы, которая обеспечивается большинством современных архи- тектур. Например, процессоры х86 обычно поддерживаю! размеры страниц 4К и 2М (10, если поддерживается архитектурой), архитектура 1а64 под- держивает несколько размеров страниц: 4К, 8К, 64К, 256К, 1М, 4М, 16М, 256М, а ррс64 поддерживает 4К и 16М. ТЬВ — это кэш преобразований виртуального в физическое. Как правило, на подобные преобразования тратится достаточно ресурсов процессора, поэтому кэш просто необходим. Операционные системы пытаются наилуч- шим образом использовать ограниченное количество ресурсов ТЬВ. Данная оптимизация становится все более важной сейчас, поскольку все больше и больше физической памяти становится все более доступнее. Пользователи могут использовать поддержку больших страниц в ядре Ыпих, используя системный вызов пл шар или стандартные системные вызовы с общей памятью 8У8У (8Йш§е1, зйпШ). Сначала необходимо собрать ядро Ыпих с параметрами конфигурации СОНЕЮНЛОЕТЬВЕЗ (находится в разделе "ЕПе зув^еша") и С(ЖГ1О_ НИСтЕГЬВРАСЕ (выбирается автоматически при выборе СОМНСт НЪСтЕТЬВГЗ). Файл /ргос/тепйпГо предоставляет информацию об общем количестве постоянных страниц ки^е11Ь в пуле больших страниц ядра. Он также отобра- жает размер большой страницы по умолчанию и информацию о количестве свободных, зарезервированных и избыточных больших страниц в пуле боль- ших страниц размера по умолчанию. Указание размера большой страницы необходимо для создания правильного выравнивания и размера аргументов для системных вызовов, которые отображают области больших страниц. Вывод са1 /ргос/тетшГо будет примерно следующим: НидеРадез_ТоТа1: иии НидеРадез_Егее: VVV Ниде Раде з_Вйус1: иии
НидеРадез_Зигр: ххх Нидерадез1ге: ууу ИЗ НидеМЬ; 22г кВ Где: • НиееРа§е8_Тои! - это размер пула больших страниц. • Ни§еРа§ез_Ргее - это количество больших страниц в пуле, которые еще не выделены. • НиёеРа8ез_К.8У<1 - является сокращением от "зарезервировано" и пред- ставляет' собой количество больших страниц, для кот орых было принято обязательство о выделении из пула, но еще не было выделено. Зарезерви- рованные большие страницы гарантируют, что приложение сможет вы- делить большую страницу из пула больших страниц в случае сбоя. * НиёеРа§е8_$игр - является сокращением от "избыточный" и представля- ет собой количество больших страниц в пуле, превышающее значение в /ргос/зуз/ут/пТ-Ьидерадез. Максимальное количество избыточных боль- ших страниц контролируется /ргос/ 8у8/ут/пг_оуегсотт11 1га$ера§е8. Если включена функция освобождения неиспользуемых страниц итеттар, связанных с каждой страницей пи^е11Ь. количество избыточных больших страниц может временно превышать максимальное количество избыточ- ных больших страниц, когда система испытывает нехватку памяти. • Ни^ера§е8)ге - это размер большой страницы по умолчанию (в килобай- тах) • НщдеЯЬ - общий объем памяти (в килобайтах), потребляемый большими страницами всех размеров. Если используются большие страницы разно- го размера, это число превысит Ни§еРа§е8_То1а1 * Ниёера§С81ге. Чтобы получить более подробную информацию, обратитесь к /вуз/кегпектш/ Ии§ера§е8. Файл /ргос/й1е8у81еп18 также должен показывать файловую систему типа "йи^еЯЬй", сконфигурированную в ядре. Файл /ргос/8у8/ут/пг_йи§ераёе8 указывает текущее количество "постоян- ных" больших страниц в пуле больших страниц ядра. "Постоянные" боль- шие страницы будут возвращены в пул страниц при задаче освобождения памяти. Пользователь с привилегиями гоо( может динамически выделять
больше или освобождать некоторые постоянные большие страницы, увели- чивая или уменьшая значение пг ки%ера%е$. Страницы, которые используются как большие (Иц^е), зарезервированы вну- три ядра и не могут использоваться для других целей. Большие страницы нс могуг быть выгружены из-за нехватки памяти. Как только несколько больших страниц были предварительно выделены в пул больших страниц ядра, пользователь с соответствующими правами мо- жет использовать либо системный вызов ттар(), либо системные вызовы с общей памятью для использования больших страниц. Администратор может выделить постоянные Ьи§е-страницы, используя параметр ядра "Ьпзера^ез-К'1, где "К" = количество запрошенных йпде- страниц. Это самый надежный метод выделения больших страниц, так как память еще не стала фрагментированной. Некоторые платформы поддерживают несколько больших размеров страниц. Чтобы выделить большие страницы определенного размера, перед параме- трами команды загрузки больших страниц необходимо указать параметр вы- бора размера большой страницы "Ьи§ера§е5г=<размср>". <размер> должен быть указан в байтах с необязательным суффиксом масштаба [кКтМ§С}|. Размер Ьиде страницы по умолчанию можно выбрать с помощью параметра ядра ''беЕаик_Ьи2ера8е52=<размер>". Семантика параметра командной строки загрузки НидебЬ: • ки§ера§ез2 Указывает размер Ьи^е-страницы. Используется в сочетании с параметром ки§ера^ез для предварительного выделения ряда больших страниц указан- ного размера. Следовательно, параметры ядра ки^&ра^езг и ки§ера§е указы- ваются парами: Ъисерадез2«2М Нидерадез~512 Параметр ки^ера^езг можно указать только один раз в командной строке. До- пустимый размер таких страниц зависит от архитекьуры.
Я три I тпи\ А.1ПМХ • ки%ера%е8 Укажите количество больших страниц для предварительного выделения. Обычно он указывается после параметра ки^ера^еаг или ^е/аик^гирера^е^г. Однако если кирера^ез является первым или единственным параметром ко- мандной строки пи§е11Ь, он неявно указывает количество больших страниц с размером по умолчанию, которые будут выделены. Если количество страниц размера по умолчанию указано неявно, оно не мо- жет быть перезаписано парой параметров ки^ера^е^г.ки^ера^ез для размера по умолчанию. • <1е/аиЦ_ ки§ера§е8х- Задает размер по умолчанию для больших страниц. Данный параметр мож но указать только один раз в командной строке. За с1е/аи11_кщ'ера%е8г может дополнительно следовать параметр ки§ера§ез, чтобы предварительно вы- делить определенное количество больших страниц размера по умолчанию. Количество больших страниц размера по умолчанию для предварительною выделения также может быть неявно указано, как указано в разделе о боль- ших страницах ранее. Следовательно, на архитектуре с размером большой страницы в 2 Мб конфигурация: Ьидерадез=256 с!еГаи1С_Ь.‘ддерадез2=2М Нидерадез=256 Ъидерадез=256 с!е 1аи1С_Ъидерадез2=2М приведет к выделению 256 больших страниц по 2М. Допустимый размер большой страницы по умолчанию зависит от архитектуры. • ки§е(1ЬУгее_утеттар Когда опция ядра СО.МР1ОДП)СЕТ1.Б_РАСЕОРТ1М17Е_УМЕММАР установлена (она устанавливается при компиляции ядра), это включает оп- тимизацию На^еТЬВ Ушештар (НУО).
Когда поддерживаются несколько больших страниц, файл /ргос/зуя/ут/пг_ Ьи§ера§е8 указывает текущее количество предварительно выделенных боль- ших страниц размера по умолчанию. Таким образом, можно использовать следующую команду для динамического выделения/освобождения постоян- ных больших страниц по умолчанию: есбо 20 > /ргос/зуз/ут/пг_Ъидерадез Эта команда попытается установить количество больших страниц с разме- ром по умолчанию в пуле страниц до 20, выделяя или освобождая большие страницы по мере необходимости. На платформе МЦМА ядро попытается распределить пул больших страниц по всему набору разрешенных узлов, указанному в политике памяти ЪШМА задачи, изменяющей пг_ки%ера%е8. Разрешенные узлы с недостаточной доступной непрерывной памятью для большой страницы будут автомати- чески пропущены при выделении постоянных больших страниц. Успех выделения больших страниц зависит от объема физически непрерыв- ной памяти, которая присутствует в системе во время попытки выделения Если ядро не может выделить большие страницы для некоторых узлов в системе МЦМА, оно попытается компенсировать разницу, выделив допол- нительные страницы на других узлах с достаточным количеством доступной непрерывной памяти, если таковая имеется. Системные администраторы могут захотеть поместить эту команду в один из локальных файлов инициализации гс. Это позволит ядру выделять боль- шие страницы в начале процесса загрузки, когда вероятность получения фи- зических смежных страниц все еще очень высока. Администраторы могут проверить количество фактически выделенных больших страниц, проверив файл зузсН или теготГо. Чтобы проверить распределение больших страниц по узлам в системе Ы11МА, используйте; саТ /зуз/деу! сез/зузТет/поае/поЦе*/1г.ет1п^о | Гдгер Ниде Файл /ргос/зуз/ут/пг оуегсоттй_йи§ераце5 указывает, насколько большим может стать пул больших страниц, если приложения запрашивают больше страниц, чем /ргос/зуз/ут/пг йиёера^ез. Запись любого ненулевого значения в этот файл указывает на то, что подсистеме ки^е(1Ъ разрешено пытаться
получить это количество "избыточных11 бо.':ьших страниц из обычною пула страниц ядра, если постоянный пул больших страниц исчерпан. Когда эти лишние большие страницы становятся неиспользуемыми, они возвращают- ся в обычный пул страниц ядра. При увеличении размера пула больших страниц с помощью пг_ки%ера%ез любые существующие избыточные страницы сначала будут преобра юваны в постоянные большие страницы. Затем, если это необходимо и возможно, будут выделены дополнительные большие страницы, чтобы заполнить но- вый постоянный размер пула больших страниц. Администратор может уменьшить пул постоянных больших страниц, уста- новив зузей пг_ки§ера§ез в меньшее значение. Ядро попытается сбаланси- ровать освобождение больших страниц на всех узлах в политике памяти за- дачи, изменяющей пг_ки§ера%ез. Любые свободные большие страницы на выбранных узлах будут возвращены в обычный пул страниц ядра. Внимание! Сокращение г остоянного пула больших страниц с по- мощью пг_кидерадеь так, что он станет меньше, чем количество используемых больших страниц, приведет к преобразованию баланса используемых больших страниц в избыточные большие страницы. Это произойдет, даже если количество избыточных страниц превысит значение оуегсоттН. Пока выполняется это условие, то есть пока пг_кидарадаа+пг_оуегсоттИ_11идарада5 не будет увеличено п достаточной степени или лишние большие страницы не выйдут из использования и не будут освобождены, система больше не разрешит выделять дополнительные боль- шие страницы. Благодаря поддержке нескольких пулов больших страниц во время выпол- нения большая часть интерфейса пользовательского пространства больших страниц в /ргос/зуз/угп дублируется в зузй. Обсуждавшиеся выше интерфей- сы /ргос были сохранены для обратной совместимости. Корневой каталог управления большими страницами в зузй: /зуз/кегпе1/тт/Нидерадез Для каждого размера большой страницы, поддерживаемого работающим ядром, будет существовать подкаталог в форме:
Ъидерадез-$ (зз.хе 1 кЕ Внутри каждого из этих каталогов будет существовать набор файлов, содер- жащихся в /ргос. Кроме того, могут существовать два дополнительных ин- терфейса для понижения уровня больших страниц: бето ье бетоЬе зтге пг_Ьадерадез пг_Ьидеоадез_тетроИсу п г_ о Vе г с отш! Т_Ьидерад е з Ггеэ_Ьидерадез гез^кидерадез зигр!из_Ъидерадез Интерфейсы понижения уровня предоставляют возможность разбить боль- шую страницу на более мелкие большие страницы. Например, архитектура х86 поддерживает большие страницы размером 1 ГБ и 2 МБ. Большую стра- ницу размером 1 ГБ можно разделить на 512 больших страниц по 2 МБ. По- нижение интерфейсов недоступно для самых маленьких больших страниц. Интерфейсы понижения приведены ниже: • дспийе 81/е - размер пониженных страниц. Когда уровень страницы бу- дет понижен, будет создано соответствующее количество больших стра- ниц (1ето1е_я12е. По умолчанию для параметра йетоге81хе установлен следующий меньший размер большой страницы. Если существует несколько меньших больших размеров страниц, для параметра бешо1е 812.е можно установить любой из этих меньших размеров. Допускаются только те размеры больших страниц, которые меньше текущего размера больших страниц. • йетпоТе - используется для понижения ряда больших страниц. Пользо- ватель с привилегиями гоо! может писать в этот файл. Возможно, будет невозможно понизить запрошенное количество больших страниц Чтобы определить, сколько страниц было фактически понижено, сравните зна- чение пг_Ии%ера%ез до и после записи в интерфейс понижения Интер- фейс <1етоге поддерживает только запись.
8.5.2. Взаимодействие политики памяти задач с выделением/ освобождением больших страниц Независимо от того, выделяются и освобождаются ли больших страницы через интерфейс /ргос или интерфейс /зузГз с использованием атрибута пг_ки§ара^ез_тетроИсу, узлы ЫЦМА, из которых выделяются или осво- бождаются большие страницы, контролируются политикой памяти М7МА задачи, которая изменяет зузсг! или атрибут пг_ки§ера^ех_тетроПсу. Когда используется атрибут пг_ки§ера§ез, тетроНсу игнорируется. Рекомендуемый метод для выделения или освобождения больших страниц в/из пула больших страниц ядра, используя приведенный выше пример пг_ки§ера§е5\ питает! —тпТегЛеа^е ссписок узлов> еспо 20 \ >/ргос/зуз/ут/пг_Ьидерадез_шетро11су или, более кратко: питасМ -т <список-узлов> еспо 20 >/ргос/зуз/-7т/пг_Ьидерадез_тетро11су Эго выделит или освободит аЬз(20 - пг_Ьи§ераёе&) для узлов, указанных в <список-узлов>, или из них, в зависимости от того, изначально ли количе- ство постоянных больших страниц меньше или больше 20 соответственно. Большие страницы не будут выделены или освобождены ни на одном узле, не включенном в указанный <список-узлов>. При настройке постоянного количества больших страниц с помощью пг_ки^ера^ез_тетроИсу можно использовать любой режим политики памя- ти — привязку, предпочтительный, локальный или чередование. 8.5.3. Атрибуты больших страниц для каждого узла Подмножество содержимого корневого каталога управления большими страницами в зузГз, описанного выше, будет реплицировано под каждым системным устройством каждою узла Ы1/МА с памятью в
/зуз/аеухсез/вузЪегс/поде/пойе[0-9]*/Ьидерадез/ В этом каталоге подкаталог для каждого поддерживаемого большого разме- ра страницы содержит следующие файлы атрибутов: пг_Ьидерадез Егее_Иидерадез зигр1из_Ъидерадез Файлы атрибутов Ггее_* и 8шр1из_* доступны только для чтения. Они воз- вращают количество свободных и избыточных больших страниц соответ- ственно на родительском узле. Атрибут пг ки^ера§еа возвращает общее количество больших страниц на указанном узле. Когда этот атрибут записан, количество постоянных боль- ших страниц на родительском узле будет скорректировано до указанного значения если существует достаточно ресурсов, независимо от ограничений памяти задачи или набора процессоров. Обратите внимание, что количество избыточных и резервных страниц оста- ется глобальными величинами, поскольку мы не знаем до момента сбоя, ког- да применяется мемполитика сбойной задачи, с какого узла будет предпри- нята попытка выделения большой страницы 8.5.4. Использование больших страниц Если пользовательские приложения будут запрашивать большие страницы с помощью системного вызова пппар(), то нужно, чтобы системный админи- стратор смонтировал файловую систему тина тоиттЬ -С 1шдеЪ1ЬГз \ -о и!с1=<та1ие>, д!д=<^а 1 ие>, тоде=<уа!ие>, радез!ге=<уа1ие>, зхге—<та1ие>, \ тап_з12е=<уа1ие>,пг_1пос1ез=<уа1ие> попе /тпе/Ъиде
Эта команда монтирует (псевдо) файловую систему типа ки^ейЪ/з в каталог /тШ/Ьияе. Любой файл, созданный в /тЩ/Ьи^е, использует большие страни- цы. Параметры ий! и задают владельца и группу корня файловой системы. По умолчанию берутся ий! и текущею процесса. Опция то<1е устанавливает режим корня файловой системы на значение &01777. Это значение задается в восьмеричном формате. По умолчанию выбрано значение 0755 Если платформа поддерживает несколько размеров больших страниц, па- раметр ра&емге можно использовать для указания размера большой стра- ницы и связанного пула. Данный параметр указывается в байтах Если раз- мер страницы не указан, будет использоваться размер большой страницы по умолчанию и соответствующий пул. Параметр иге устанавливает максимальное значение памяти, разрешенное для этой файловой системы (/тгП/Ьи^е). Размер памяти может быть указан в байтах или в процентах от указанного пула больших страниц (пг_Иицера§ея). Размер округляется до границы НРА6Е 812.Е. Параметр пйп яле устанавливает минимальное значение памяти, ра решен- ное для файловой системы. Параметр тйгз&е можно указать так же. как и размер; либо в байтах, либо в процентах от пула больших страниц. Во время монтирования количество больших страниц, указанное в параметре пйп ягге, зарезервировано для использования файловой системой. Если сво- бодных больших страниц недостаточно, монтирование не удастся. Когда большие страницы выделяются в файловой системе и освобождаются, счет- чик резервов корректируется так, чтобы сумма выделенных и зарезервиро- ванных больших страниц всегда была нс меньше тт_зае. Опция пг тоНез устанавливает максимальное количество инодов, которые может использовать /тп1/Ьи§е. Если параметры з1ге, ттше или пг_тос1е8 не указаны в командной строке, ограничения не устанавливакнся. Для параметров ра^езпе, з1ге, т1н_з1ге и пг_1по4ез вы можете использовать [0|§]/[М|т]/[К|к] для представления гига'мега/кило. Например, зые=2К имеет то же значение, что и ыяе- 2648. В то время как системные вызовы чтения поддерживаются для файлов, на- ходящихся в файловых системах ки^е11Ь, системные вызовы записи — нет.
Обычные комавды ском>п, ск$гр и скто<1 (с соответствующими разрешения- ми) можно использовать для изменения атрибутов файла на ки^ейЬ/з. Кроме того, важно отметить, что такая команда монтирования не требует- ся, если приложения будут использовать только системные вызовы зЬпта!/ 8кт§с1 или ттар с МАРНТЮЕТЬВ. Для примера того, как использовать пппар с МАР НПОЕТЬВ, посмотрите на тар_ки§е11Ъ ниже Пользователи, которые хотят использовать память ки§еиЪ через сегмент об- щей памяти, должны быть членами дополнительной группы, а системный администратор должен настроить этот в /ргос/зуа/упт/Ьи^еЙЬзЬт дгоир. Для одаИх и тех же или разных приложений можно использовать любую комбинацию вызовов пппарз и збт*. хотя для использования вызовов ттар без МАР ННОЕТЪВ потребуется монтирование файловой системы. Системные вызовы, работающие с памятью, поддерживаемой страницами ки§ейЪ, имеют только длину, соответствующую собственному размеру стра- ницы процессора; они обычно не будут работах ь, если для егто установлено значение ЕЛЧУАЬ или будут исключены из страницы ки%е11Ь, выходящие за пределы длины, если они не выровнены по большой странице. Например, тишпарО завершится ошибкой, если память поддерживается страницей ки§е11Ъ, а ее длина меньше, чем размер ки§ера#е. 8.6. Практикум администратора 8.6.1. Полезные команды оболочки Файл /ргос/теттГо Файл /ргос/тсттГо содержит всю информацию, связанную с памятью. Для просмотра данного файла используйте команду саГ. $ саГ /ргос/тетхп^о
1 .Г Л п '«ЦП • и, 1ВН .2 1 ' >Ь?п । т4*Ьо:.1 1 с гЛ б сл1 /ргос т»'т1п<о о! Я1 41185488 кВ ЧетГгее: 2502960 кВ ЧетАуаИнЫ е: 21836708 кВ Ни 1Гег 2619536 кВ 1 асКес!: 14572736 кР эиарСасЬес!; 144 кВ ЦсОуе: 24048464 кВ ТласНуе: 11518540 кВ *сЦус(апоп): 17722008 кВ 1пас11уе(апоп) 648228 кВ АсН*е(Ше); 6326456 кВ 1пас11уе(Т11е) 10870312 кВ МпемтсГаЫе: 10892 кВ МХоскед; 10892 кВ 5нарТога1: 20804600 кВ ззмарргее: 20797564 кВ О1г1у: 6824 кВ 4г1ГеЬаск: 0 кВ АпопРадеа; 18385340 кВ Марред: 121028 кВ ЗЬшет: 2504 кВ р!аЬ: 2833816 кВ 5йес1а1таЫе• 2651380 кВ &0пгес1а1т: 182436 кВ Кегпе15таск: 6448 кВ Ра&еТаЫеъ: 51192 кВ ИР5_ил51аЫе: 0 кВ Вайнсе: 0 кВ |4гхгеЬаскТтр: 0 кВ СоттхИхшИ: 41397344 кВ Сошт111ед_А5: 20696720 кВ Ута11осТо1а1: 34359738367 кВ УтаИосОБес!. 0 кВ Рис. 8.4. Вывод команды (частично) са1 /ргос/тетт/о Данная команда выводит множество параметров, связанных с памятью. Что- бы получить информацию о физической памяти из файла /ргос/тешт1о, ис- пользуйте: $ дгер МетТоЪа! /ргос/тет1п1о МетТоЪаХ: 41185488 кВ Чт обы получить информацию о виртуальной памяти из файла /ргос/теттЕо, используйте: $ дгер Ута11осТоЪа1 /ргсс/тетхгЛо УтаИосТоЪа!: 34359738367 кВ Команда Юр и ее улучшенный вариант кюр Команда 1ор позволяет отслеживать процессы и использование системных ресурсов в Ыпих в режиме реального времени. Когда вы запустите команду,
то заметите, что значения в выходных данных продолжают изменяться с не- которым небольшим интервалом (рис. 8.5). :ор 11:57:00 ир 13 4ау$, 16:29, 1 ивег, 1оай ауегце: 2.12, 2.72, З.О4 Гаакз: 233 <о1а1, б гиплгпя, 142 51еер1г»8, 0 гЛоррей, 0 голЫе Хри(5): 18.2 ив, 2.3 ьу, 0.0 п1, 79.4 тй, 6.0 ша, 0.0 Ы, 0.1 51, 0.0 .г :1В Мет • 41185488 3805992 Ь’са, 19019640 изей, 18359856 Ьи«/сасКе !>8 5шар: 20804600 10*11, 20797564 <г«е, 7036 иввй . 21649348 ауаН Мет р РЮ и$Е* РЯ У1ЙТ ЙЕ5 5НЯ а %СРЦ *МЕМ Т1МЕ + С ОММАИ Р 57365 нин-йаеж 20 е 454600 145528 21888 5 51.8 0.4 0:53.28 р6р-Трт7.2 57184 шии-йа1га ге в 505176 196500 22436 5 49.2 0 5 1:46.51 рЪр--рр«7.2 |57182 ннн-йаТа 20 0 493760 183532 21196 5 47.5 0.4 1:34.10 рЬр 6рт7.2 5031 туад! 20 6 23.3028 0.0161 17440 5 43.2 41.7 4501 30 ту5д14 57185 иин-йа*а 20 0 515512 205512 22260 Й 32.9 0.5 1:38.72 рЬр--Ере»7.2 57183 нин-йаТа 20 0 442032 133752 22912 к 12.0 0.3 1:37.78 рНр—Ерт7.2 57366 нни-йа*а 20 0 556824 240244 21400 й 10.0 0.6 0:59.89 рНр--Ерч»7.2 |12733 ыын-йа*а 20 0 53288 11816 5656 5 1.3 0.0 37:05.91 П81пх 8 ГООГ 20 0 0 0 0 I 0.3 0.0 19:24.34 гси_зсЬей 57678 йеп? 5 20 0 42948 4112 3352 й 0.3 0.0 0:00.04 гор 1 гоо* 20 0 225492 9000 6420 5 0.0 0.0 3:04.56 аузТетд 2 госЛ 20 0 0 0 0 5 0.0 0.0 0:00.15 к*Ъгеайй 3 гооТ 20 0 0 0 0 I 0.0 0.0 0:35.68 кногкег/0:0 4 ГО<Л 0 -20 0 0 0 I 0.0 0.0 0:00.00 кногкег/0:0Н 6 ГООТ 0 -20 0 0 0 I 0.0 0.0 0:00.00 тт_регсри_нц 7 ГСО* 20 0 8 0 0 5 0 0 0.0 0:48.73 к8о€*1гдй/0 9 ТОО* 20 0 0 0 0 I 0.0 0.0 0:00.00 гси_ЬЬ 10 ГСО* гг 0 0 0 0 5 0.0 0.0 0:00.34 тз.<га11оп/0 11 ГОО1 г* 0 0 0 0 5 0.0 0.0 0:01.96 на*сЪйов/0 12 гор* 20 0 0 0 0 5 0.0 0.0 0:00.00 сриЪр/9 13 ООО* 20 0 0 0 0 5 0.0 0.0 0:00.00 сриЬр/1 14 гоое Г* 0 0 0 0 5 0.0 0.0 0:02.15 ачгёсЬйо?/! 15 ГОО* Г* 0 0 0 0 5 0.0 0.0 0:00.76 тхегагхрп/! 16 ГОО1 20 0 0 0 0 5 0.0 0.0 0:28.19 кзоЕМгдй/! 18 гоо* 0 -20 0 0 0 I 0.0 0.0 0:00.00 киогкег/1:0Н 19 гоо* 20 8 В 0 0 5 0.0 0.0 0:00.00 сриНр/2 20 гоо* ге 0 0 0 0 5 0.0 0.0 0:02.19 иа!сНйов/2 0 0 ‘.О 0.0 т1<гае1оп/2 Рис. 8.5. Команда 1ор На рис. 8.6 приводится более продвинутый ее вариант - команда Ыор. По- мимо всей информации, выводимой 1ор. данная команда выводит загрузку процессора по ядрам, а также выводит график используемой памяти. 1 [ л] 4 (1 7 [ ] 10 [ 2 [| О%] 5 [II1 8 [ '] 11 [. 3 [| ШН1НН98.0%] 6 [ 9 [ О ] 12 [ Мет[ | Н1ННПН1Н1111 Ц||I1118.46/39. Тазка: 86,. 105 еЬг; 4 гипгилц 5ир[ Юай а«ега8.е: 3.16 3.24 3 31 ЦрНше 13 йауз, 16:59:54 РЮ Р5ЕЙ РЙ1 141 У1ЙТ ЙЕ5 5НЙ 5 СР1Л МЕМХ Т1МЕ+ Соттапй 5031 дуед! 20 В 23.36 16.46 17440 5 111. 41.8 75Ъ25:49 /ивг/вЫп/аувдХй --Йаетоп12е 5938 т_. ,д] 20 0 1 с-. 17440 ₽ 99.8 41.8 13-10.91 /иаг/вЫл/тухдтй - -Йаетопие ••• 59308 гео* 20 0 4Б1М 1984 22512 5 10.6 0.5 0:05.13 /О5г/Ь1п/рЬ₽7.2 !уаг/нии/«ни/Ь1п/так< 5928 ну с’ 20 0 16 4и 7440 9.3 41.8 13:55.33 /ивг/йЬтл/пувдХй - Йаел’оптге -- -р.14-1. 59076 ии»-4аха 26 0 499М 189М 21144 Й 4.7 0.5 1:16.96 рЬр-брт; роо! иуа-, 59032 <тэ 2© 6 489М 188М 21868 5 4.0 0.5 2:10.50 рЪр-^рт: роо1 ’лулч 69075 20 0 471М 168М 264 « 3.3 0.4 1:30.41 рЬр-^рт: роо1 ини 21163 тут.01 20 0 17440 5 2.0 41.8 46:14.24 , и«г/&Ып/ту - Йэетсл12е -• •р1Й в . 69164 20 е 479М 178М 21196 5 2.0 0.4 0:53.19 рЬр--Ерт: роо1 иии 59352 йепхз 20 0 32220 4772 3920 Й 0.7 0.0 0:00.05 Н1ор 5054 -л - Г 20 0 1 7440 $ 0.7 41.8 24:54 24 /и5г/1Ь1п/ч1увр1й йаегаоехге РТР--* 5056 .ту «11 20 0 17440 5 0.7 41.8 9:29.63 /и»г.'вЫп.'ту$с,14 -- -йяетогЛге - • Р1в-Т г 1 'ООГ 20 0 220М ?000 6420 $ 0.0 0.0 3:04.86 /вЫп/1П11 тауЬе-иЫдихеу 526 19 160М 68548 56000 5 0.0 0.2 2:05.19 /11Ь/2у51ет<1/зу5еепк1-зоигпа1с1 548 20 0 97712 1716 1544 5 0.0 0.0 0:00.00 /вЬап/1мте1ас1 -Т 559 ™ : 20 0 45848 4488 3004 5 9.0 0 0 0:15.72 /11Ь/&у 51етй / 5 у 5Сетд - ийе ус! 861 20 0 138М 3084 2648 5 0.0 0.0 0:00 00 / 11Ь. $у 5еетй/ тузтвтй -1 Йяьугсс! 797 ’-л/‘.*е!_чк1-± 20 0 138М 3084 2648 5 0.0 0.0 0-01.73 / ИЬ/зувТагай/ гувеетй - 11тевупс4 863 20 0 79920 4708 4192 5 0.0 0.0 0:51.85 /ИЬ/вувгетй/зузгетй-пееыогкй 878 20 0 70604 5684 5084 5 0.0 0.0 0:04.17 /11Ь/5ув1елк1/зуаеетй-гезо!еед 990 6 20 0 261М 4876 3464 5 0.0 0.0 0:09.73 . Т5Г-' лЫп/г5ув1сЕй “П 991 е 20 0 261М 4876 3464 5 0.0 0.0 0:00.00 /ивг/зЫт/гвух!^^0 -п 992 8 20 0 261М 4876 3464 5 0-0 0.0 0:09.35 /ивг/вЫп/гвув1оеа -О 961 :0$ 20 0 261М 4876 3464 5 0.0 0.0 0:19.15 / ивг / зЫп/гзу 51080 -п 1060 20 6 279М 6760 5704 В-0 0.0 0:24.37 / и 5г/< 5Ь/а с соигтвзег'.-дсе-ассояпед -яа-» X1 1е1р [®5ееир [ ^«агсНЩГ11еепщ7гее 2 р' •г-евущ игисе -2^ тсс Рис. 8.6. Команда кЮр
Во всем эта программа лучше, но ее нужно установить отдельно (например, командой зис1о ар( 1п$1а11 к1ор в ВеЬкап-лодобных системах). Команда /гее Информация об используемой памяти выводится командами (ор и к(ор по- мимо всего прочего. Но если вам нужно вывести информацию только об использовании памяти, тогда используйте команду /гее. По умолчанию зна- чения для каждого поля указана в килобайтах, чтобы не пересчитывать в уме в мегабайты, используйте ключ -к для более удобного формата вывода. Д -ох Е1еп15^по5С1п8- Гее *-ъ: - Т:оГа1 изед ^гее зЬагеЗ ЬоН7сасЬе ауаИаЫе г'еш: 336 176 3.66 2.9М 176 206 Биар 196 6.9Н 196 Рис. 8.7. Команда /гее -й На рис. 8.7 показано, что всего установлено 39 Гб физической памяти (у нас виртуальный сервер, поэтому объем памяти не является стелены») 2, как обычно), из них 17 используется (азеф, еще 17 Гб отведено под буферы и кэш (эту память также можно считать свободной, поскольку в случае необходимости система будет выделять память из этой области) и 3.6 Гб полностью свободна. Также есть область подкачки (8\уар) размером 19 Гб, из них используется 6.9 Мб, поэтому можно считать, что все 19 Гб подкачки свободно.
Для сброса области буферов и кэша можно использовать команду: зидо есЬо 1 > /ргос/зуз/’лп/с!гор_сас11ез Результат выполнения этой команды показан на рис. 8.8. Если до этого у нас было свободно (&ее) 3.4 Гб. а для кэша было отведено 17 Гб, го после выпол- нения указанной команды для кэша используется всего 846 Мб, а свободно уже ?0 Гб. Рис. 8.8. Сброс буферов и кэша в действии Команда бт$1а1 Команда утМай — это инструмент мониторинга производительности в Ыпих, который предоставляет полезную информацию о процессах, памяти, операциях ввода-вывода, подкачке, диске и планировании процессора, а так- же приводит статистику виртуальной памяти вашей системы. $ ™зЬаЪ
8.6.2. Интерфейс СМА Интерфейс отладки СМА полезен для извлечения базовой информации из различных областей СМА и для проверки выделения/освобождения в каж- дой из областей. Каждая область СМА представляет каталог в <беЬи§^8>/ста/', представлен- ный своим именем СМА, как показано ниже: <с1еЬидГз>/сгпа/<'ста_пате> Структура файлов, со зданных в этом каталоге, выглядит следующим обра- зом: • [КО] Ъа$е_рй1: базовый РРИ (номер страницы кадра) зоны. • [КО] соип1: объем памяти в области СМА. • [КО] ог<1ег_рег_ЬН: порядок страниц, представленный одним битом. • [КО] Ьйтар: битмап состояний страниц в зоне. • [\УО] аПос: выделить К страниц из этой области СМА. Например, ко- манда: есЬо 5 > <деЬид^з>/ста/<ста_паше>/а11ос попытается выделить 5 страниц из области ста пате. • [ХУО] Ггсс. бесплатные И страниц из этой области СМА, как описано выше. Примечание. \АЮ означает "только для записи”, КО - только для чтения. 8.6.3. Добавление файла подкачки Как правило, раздел подкачки создается при установке системы и не вссхда удобно менять структуру разделов уже после того, как система установле-
на. Однако, если вам понадобилось дополнительное пространство подкачки, выход есть - можно создать файл подкачки. Его производительность будет чуть ниже, чем у раздела подкачки, но как временный вариант (пока не уве- личите размер ОЗУ) такая мера вполне сойдет. Первым делом нужно создать собственно сам файл подкачки (в данном при- мере мы создаем ею размером 2 Гб. вы можете добавить больше подкачки, если есть свободное место на диске): $ зийо с!с1 1С=/с1еу/2его о^=/зиар-й1е соипр=2 Ьз=1С1В Затем установим права доступа и настроим область подкачки (команда ткзмар): $ зайо сЬтой -V 0600 /зиар-й1е $ зийо сЪомп -V гооР:гооЪ /зиар-й!е $ зисЮ ткзиар /зиар-й1е Осталось только активировать файл подкачки: $ зийо з^ароп /зиар-й1е Чтобы убедиться, что новый файл подкачки используется, введите команду: $ змароп -зиттагу Осталось только добавить информацию о нем в файл /е1с/Т51аЪ, чтобы систе- ма не "потеряла" его после перезатрузки. Откройте файл 'еТс/йЯаЬ в любом текстовом редакторе и добавьте строку (редактор нужно запускать через команду ьис1о. например, кидо ,ое /е1с/Гз1аЬ - мало ли, вдруг вы об этом за- были): /змар-й1е знар зиар йеГаи1Тз 0 0
Глава 9.
9.1. Виргуальная файловая система Ыпих Поскольку эта книга посвящена ядру, го в главе, посвященной файловой системе, мы рассмотрим как все устроено изнутри вместо рассмотрения ко- манд для работы с файловой системой. Виртуальная файловая система (УР8, У1г1иа1 ГИе 8уз1ет) — это программ- ный уровень в ядре, который обеспечивает интерфейс файловой системы для программ пользовательского пространства. Он также обеспечивает абстракцию внутри ядра, которая позволяет сосу- ществовать различным реализациям файловой системы. Другими словами, ядро поддерживает множество самых разных файловых систем - ехй, ех13, ех;4, ХР8, 2Н8 и т.д. Чтобы пользователь мог использовать одни и те же ко- манды (ср, ту, са1 и т.д.), а программист одни и те же системные вызовы для работы со всеми файловыми системами, как раз и нужна виртуальная фай- ловая система В противном случае пришлось бы реализовывать отдельные команды для работы с каждой файловой системой, например, для работы с ХР8 команда копирования могла бы называться хй ер, а команда перемеще- ния - хГьту. ф
Системные вызовы УР8 ореп(2), 81а1(2), геай(2), \уп1е(2), сЬто<1(2) и г. д. вы- зываются из контекста процесса. Это также благодаря УР8, иначе пришлось бы создавать разные методы для работы с файлами, в зависимости от фай- ловой системы. Настоящее бы веселье началось, когда нужно было скопи- ровать файл из раздела, отформатированною как ех14 в ХР8-раздел, то есть когда файловые системы на разделах не совпадают. Какую тогда команду использовать сх(4 ср или хГз ср? В общем, чтобы всех этих сложностей не было, как раз и был добавлен уровень абстракции, называемый виртуальной файловой системой. УГ8 реализует ореп(2), §Ш(2), сЬто<1(2) и аналогичные системные вызовы. Передаваемый им аргумент райтате используется УР8 для поиска в кэше записей каталога (также известном как кэш <Летгу или йсасйе). Он обеспе- чивает очень быстрый механизм поиска для преобразования имени пути (имени файла) в определенный деп^гу. Кэш "живет" в оперативной памяти и никогда не сохраняется на диск: он существуют только для повышения про- изводительности. Кэш <1еп1гу предназначен для просмотра всего вашего файлового простран- ства. Поскольку большинство компьютеров не могут одновременно разме- стить все записи кэша в ОЗУ, некоторые биты кэша отсутствуют, Чтобы пре- образовать ваше имя пути в <1еп1гу, УР8, возможно, придется прибегнуть к созданию аеп1гу по пути, а затем загрузить тоде. Это делается путем поиска 1пос1е. Отдельный деп1гу обычно имеет указатель на индексный дескриптор (икод, тойе) Иноды — это объекты файловой системы, такие как обычные файлы, каталоги, Р1РО и др. Они размещаются либо на диске (для файловых систем блочных устройств), либо в памяти (для псевдофайловых систем). Индекс- ные дескрипторы, находящиеся на диске, при необходимости копируются в память, а изменения в индексных дескрипторах записываются обратно на диск. На один индексный дескриптор могут указывать несколько депРу (например, это делают жесткие ссылки). Для поиска индекса нужно, чтобы УР8 вызвала метод 1оокир() индекса роди- тельского каталога. Данный метод устанавливается конкретной реализацией файловой системы, в коюрой находится индексный дескриптор. Как только у УР8 есть требуемый с1еп1гу (и, следовательно, индексный дескриптор), мы можем делать все эти скучные вещи, такие как ореп(2) или §Ш(2). * л™.
Операция уГа1(2) довольно проста: как только УР8 получает <1еп1гу, она 1гро- сматривает данные 1по4е и передает часть их обратно в пространство поль- зователя. Для открытия файла требуется еще одна операция: выделение файловой структуры (зто реализация файловых дескрипторов на стороне ядра). Только что выделенная файловая структура инициализируется указателем на аетгу и набором функций-членов файловой операции. Они взяты из данных шик. Затем вызывается файловый метод ореп(), чтобы конкретная реализация файловой системы мо1ла выполнять свою работу. Бы можете видеть, что это еще одно переключение, выполняемое УЕ8. Файловая структура помешает- ся в таблицу файловых дескрипторов процесса. Чтение, запись и закрытие файлов (и другие операции УР8) выполняются с использованием файлового дескриптора пользовательского пространства для захвата соответствующей файловой структуры, а затем вызова требуе- мого метода файловой структуры для выполнения всего, что требуется. Пока файл открыт, ои использует Лепггу, что, в свою очередь, означает, что индекс- ный дескриптор УЕ8 все еще используется 9.2, Регистрация и монтирование файловой системы Следующие системные вызовы используются для регистрации и отмены ре- гистрации файловой системы: #1пс1ис1е <Ипих/€з.И> ехЪегп тгЩ гед1зг.ег_й.1езузЪеш (зЪгисЪ й1е_зузЪет_1.уре *) ; ехГегп 1пЬ ипгед1зЪег_й1езузТет (зЬгисТ й1е_вузЬет_Ьуре *); Переданная структура $’е $у51ет_1уре описывает вашу файловую систему. Когда делается запрос на монтирование файловой системы в каталог в ва- шем пространстве имен, УГ8 вызывает соответствующий метод шоип1() для конкретной файловой системы. Новый уГзшоип!, ссылающийся на дерево, возвращаемое вызовом ->тоип!(), будет присоединен к точке монтирования, так что при обращении к точке монтирования она будет указывать на ко-
рснь этого уЕзтоипГ Все то же самое, как при монтировании через команд- ную строку. Например, вы монтируете к /тп1/ы1а2 (это точка монтирования) устройство /<1еу/зс1а2. После монтирования каталог /шпРзс1а2 будет предо- ставлять доступ к корню файловой системы, размещенной на /<1еу/5(1а2. Файл /ргос/й’езузЮтз содержит все файловые системы, поддерживаемые ядром. Структура/Ие_зуз1ет_1уре описывает файловую систему. В ней определены следующие члены: з'Ьгис^ Й1е_зуз1:ет_1:уре { сопзк сЬаг *пате; 1пк Гз_йадз; зйгиск йепкгу *(*тоип1:) (зйгиск Й1е_зуз1:е!г._1:уре *, 1пй, сопзт: сйаг *, уотс! *) ; Vо^<^ (*кИ.1_зЬ) (зкгиск зирег_Ыоск *); зТгиск тос!и1е *омпег; зг.гиск П1е_зуз1:ет_1:уре * пехЪ; зЪгиск Изк Ьеас! Гз_зирегз; зкгиск 1оск_с1азз_кеу з_1оск_кеу; зТгиск 1оск_с1азз_кеу з_итоипЬ_кеу; } ; Описание членов структуры приведено в табл. 9.1. Таблица 9.1. Описание членов структуры /Ие_зуз1ет_1уре Член структуры Описание пате Имя типа файловой системы, например, "х14", "13О9660”, "хйз" и т. д. Различные флаги вроде Р8 КЕ0ЫКЕ8_ПЕУ, Р8_ МОБСАСНЕ и т.д тоипТ Метод, вызываемый при монтировании нового эк- земпляра этой файловой системы кШ зЬ Метод, вызываемый при закрытии экземпляра фай- ловой системы
ол>пег Для внутреннего использования УР8: в большинстве случаев вы должны инициализировать его значением ТН15МО1>иЪЕ пех( Для внутреннего использования УР8: вы должны инициализировать это значение №Л_Е /з_зирег5 Для внутреннего использования $_1оск_кву Зависит от блокировки 5_итопп1_кеу Зависит от блокировки Аргументы метода тоип1() приведены в табл. 9.2. Таблица 9,2. Аргументы метода тоип1() Аргумент Описание $1гис1 /Ие_8}'81ет_Гуре */з_1уре Структура типа Шс зузЩт Гуре (см. табл 9.1) йи Флаги монтирования соп81 скаг *с1еу_пате Имя монтированного устройства чой! Произвольные параметры монтирова- ния, обычно представляют собой стро- ку А8СП Метод тоип1() должен возвращать корневую структуру дерева, запрошен- ную вызывающей стороной. Активная ссылка на его супсрблок должна быть получена, а суперблок должен быть заблокирован. В случае ошибки он дол- жен вернуть ЕВВ РТЯ Аргументы совпадают с аргументами шоип!(2), и их интерпретация зави- сит от типа файловой системы. Например, для блочных файловых систем с1ег пате интерпретируется как имя блочного устройства, это устройство 182 ____
открывается, и если оно содержит подходящий образ файловой системы, ме- тод соответственно создает и инициализирует структуру Мгис1 зирег_Ыоск, возвращая его корневой йепггу вызывающей стороне. Метод ->тоип1() может вернугь поддерево существующей файловой систе- мы — ему не нужно создавать новое. Основной результат с точки зрения вы- зывающей стороны — ссылка на с1еп1гу в корне дерева для присоединения; создание нового суперблока является обычным побочным эффектом. Наиболее интересным элементом структуры суперблока, который заполня- ет метод тоип1(), является поле "в ор". Это указатель на "структуру зирег_ орегабопз", которая описывает следующий уровень реализации файловой системы. Обычно файловая система использует одну из общих реализаций тоип1() и вместо этого предоставляет обратный вызов Н11_зирег(). Общие варианты: • тоип1_Ьс1еу - смонтировать файловую систему, находящуюся на блочном устройстве. • тоип1_поЛеу - смонтировать файловую систему, которая не поддержива- ется устройством • гпоип1_$т%1е - смонтирова ть файловую систему, которая раздела ет экзем пляр между всеми монтируемыми. Реализация обратного вызова ЯП зирег() имеет следующие аргументы: • МгисГ хирегЫоск. *зЬ - структура суперблока. Обратный вызов должен инициализировать ее наллежап'.им образом. • уо1(1 *(1а1а - произвольные параметры монтирования, обычно представля- ют собой строку А8С11 • 1п1 иИеп1 - нужно ли "молчать" об ошибке (1) или нет (0) 9.3. Объект суперблока Объект суперблока представляет смонтированную файловую систему.
93.1. Структура 51гис1 аирегорегабопя Описывает, как именно может манипулировать суперблоком в вашей файловой системе В ней определены следующие члены: зйгисГ. яирег_орегаТ1опз { зЪгисЪ 1пос1е *(*а11ос_1поде)(зЪгисЪ зирег_Ыоск *зЬ) ; уо1д (*□езЪгоу_1поде)(зкгиск 1поде *); 7О1Й (*<Иг1.у_1пог1е) (зТтисЪ 1пос1е *, 1пЪ йадз); 1ПЪ (*мг11.е_1пос1е) (зРгиск хпойе *, 1пЪ) ; т?о1с! (*<3гор_1поае) (зТгиск 1поае *) ; Vо^д (*се1еЪе_1пос1е) (зкгисТ гпосе *) ; VО^а (*риЪ_зирег) (зТгисЪ зирег_.Ыоск *); 1пР (*зупс_Гз)(зРгисС зирег_Ыоск *зЬ, 1пЪ маГЬ); 1пк (’'^геехе_^з) (зкгиск зирег_Ыоск *) ; 1пк (*ип€гее7.е_€з) (зЬгиск зирег_Ыоск *) ; 1пЪ (*зГ.аЪЕз) (зТгиск сЗепкгу *, зкгиск кзкаЪ^з *) ; 1пЪ (*ге1г.оип1:_Гз) (зРгисЪ зирег_Ыоск *, хпк *, сЪаг *); Vо^<^ (*с1еаг_1поае) (зГгиск тпоае *) ; Vо^<^ (*итоипР_Ьед1п) (зЪгисЪ зирег_Ыоск *) ; 1пк (*зЬои оркдопз) (зкгисЪ зед Й1е *, зкгисР дег.кгу *) ; зз1ге_Ъ (*диоЪа_геас!) (зЪгисР зирег_Ыоск *, 1пЪ, спаг *, з1ге_1:,- 1ой к); зз1хе_к (*диоЪа_иг!ке)(зЪгиск зирег_Ъ1оск *, 1пЪ, сопзЬ сЪаг *, з1хе_к, 1сЙ_к) ; 1Пк (*пг_сасЪе<Л_оЬ]ескз) (зкгиск зирег_Ыоск *) ; уот.с1 (*Ггее_саскес1_ок^ес1:з) (зкгиск зирег_Ыоск *, 1пк) ; }; Все методы вызываются без каких-либо блокировок, если не указано иное Эго означает, что большинство методов можно безопасно блокировать. Все методы вызываются только из контекста процесса (т.е. не из обработчика прерывания или ею нижней половины). Методы объекта сутерблска при- ведены в табл. 9.3. Таблица 9.3. Методы объекта суперблока
Метод Описание аИостойе Данный метод вызывается а11ос_тобе() для выде- ления памяти для структуры 1пос1е и ее инициализа- ции, Если эта функция не определена, выделяется простой "81гис1 тобе" Обычно аПосшобе использу- ется для выделения более крупной структуры, кото- рая содержит встроенный в нее ’Уйшс! тобе'' с!е$1гоу_1пос1е Данный метод вызывается бе81гоу_тобе() для ос- вобождения ресурсов, выделенных для $1гис1 йюс1е. Это нужно только в том случае, если была определе- на функция ->а11ос_тобе, и она просто отменяет все действия, сделанные функцией ->а11ос шобе <11г1у_1пос1е Данный метод вызывается виртуальной файловой системой, когда индексный дескриптор помечен как грязный. Обратите внимание: как грязный помеча- ется сам инод, а не его данные. Если обновление должно быть сохранено с помощью Гба1а$упс(), тог- да 1О1ЯТУЭЛТА8У ЫС будет установлен в аргу- менте флагов. 1_О1ЯТУ Т1МЕ будет установлено во флагах в случае, если включено отложенное время, и з1гис11по<1е имеет время обновления с момента по- следнего вызова ->бп1у_тобс укгИе_т<>с1е Метод вызывается, когда необходимо записать индексный дескрип гор на диск. Второй параметр указывает, должна ли запись быть синхронной или нет, не все файловые системы проверяют этот флаг с1гор_1пос!е Вызывается, когда последний доступ к индекс- ному узлу отбрасывается с удерживаемой спин- блокировкой тэбе->1_1оск. Этот метод должен быть либо №)И (нормальная семантика файловой системы ШЧ1Х), либо "2ег.епс_бе1е1:е_тобе" (для файловых систем, которые не хотят кэшировать индексные дескрипторы, что приводит к тому, что "бе1е1е_тобе" всегда вызывается независимо от зна- чения 1_п1тк)
(1е1е1в_1пос1е Вызывается, когда УР8 хочет удалить индекс ри1_зирег Вызывается, когда УР8 хочет освободить суперблок (т.е. размонтировать). Обычно вызывается при удер- живаемой блокировке суперблока зупсу$ Вызывается, когда У]'8 записывает все грязные данные, связанные с суперблоком. Второй параметр указывав ., должен ли метод ожидать завершения за- писи. Необязательный метод /гееге_/з Вызывается, когда УР8 блокирует Файловую систе- му и переводит ее в согласованное состояние. Этот метод в настоящее время используется диспетчером логических томов (ЬУМ) ип/гееге_/з Вызывается, когда УР8 разблокирует файловую си- стему и снова делает ее доступной для записи $1а1/з Вызывается, когда УЕ8 необходимо получить стати- стику файловой системы гетоип!/з Вызывается при перемонтировании файловой систе- мы. Метод вызывается с удерживаемой блокировкой ядра с1еаг_тос1е Если вызывается, то УР8 очищает индексный дескриптор. Необязательный метод итоип1_Ье§т Вызывается, когда УР8 размонтирует файловую систему зИом>_ор1юпз Вызывается УР8 для отображения параметров мон- тирования для /ргос/<р1<1>/тоиШ8 циогагеси! Вызывается УР8 для чтения из файла квоты файло- вой системы
дио(а_уугНе Вызывав гея УЕ8 для записи в файл квоты файловой системы пг_саскед оЪ]ес1з Вызывается функцией сокращения кэша аЪ для фай- ловой системы, чтобы вернуть количество содер- жащихся в ней свободных кэшированных объектов. Необязательный метод /гее саске_оЪ]ес1з Вызывается функцией сокращения кзша зЬ для файловой системы, чтобы сканировать указанное количество объектов, чтобы попытаться их освобо- дить. Необязательно, но любая файловая система, реализующая этот метод, должна также реализовать ->пг сасИеб оЬ]есГ$, чтобы он вызывался правильно. Мы ничего не можем сделать с ошибками, с которы- ми может столкнуться файловая система, отсюда и возвращаемый тип хои!. Реализации должны включать условные вызовы повторного планирования внутри любого выпол- няемого цикла сканирования. Это позволяет УР8 определять подходящие размеры пакетов сканирова- ния, нс беспокоясь о том, не вызовут ли реализации проблемы задержки из-за больших размеров пакетов сканирования 9.3.2. Структура $1гис1 хаНг кагкНегз В файловых системах, поддерживающих расширенные атрибуты (хайтз). поле суперблока 8_хайг указывает на массив обработчиков хаПг, оканчива- ющийся кулем. Расширенные атрибуты — это пары имя значение: пате — указывает, что обработчик сопоставляет атрибуты с указанным именем (например, "8у81ет.р081х_ас1_ассе88"); поле префикса должно быть кньь.
• рге/Ьс - указывает, что обработчик сопоставляет все атрибуты с указанным префиксом имени (например, "ивег”); поле имени должно быть ЫЦЪЬ. • Их1 — определяет, должны ли атрибуты, соответствующие этому обработ- чику хайг, быть перечислены для определенного с1епйу. Используется не- которыми реализациями 1181хайг, такими как §епепс_118гхайг. • §е1 - вызывается УР8 для получения значения определенного расширен- ного атрибута. Этот метод вызывается системным вызовом §е1хайг(2). • зе1 - вызывается \Т8 для установки значения определенного расширен- ного атрибута. Когда новое значение равно ЫЦЬЬ, вызывается для уда- ления определенного расширенного атрибута. Этот метод вызывается системными вызовами §е1хайг(2) и гешоуехаМг(2). 9.4. Объект инода Объект инода представляет собой объект внутри файловой системы. Струк- тура з1гис1 тойе орегаПопз описывает, как именно УР8 может манипулиро- вать инодами в файловой системе. Структура описана так: зггисе 1пос1е_срехаТ1опз { 1пе (*сгеаГе) (зЪгисЬ изег_патезрасе *, з-ИгисЬ 1поде *,зТгисТ депггу *, игоо<4е_Ь, Ьоо1) ; зТгисТ с1еп(: г у * (*1оокир) (зТгисТ ±по<3е *,в^гисЬ депТгу *, ипзхдпеб 1ПЁ) ; 1пЪ (*Ппк) (з!:гисс депЪгу *,зЪгисТ 1по<3е *,зРгис1: Пепкгу *) ; 1пТ (*ип11пк) (зЪгисЬ Хподе *,зРгис11 депЪгу *); 1пЪ (*зутПпк) (зТгисТ изег_пашезрасе *, зТгисЬ .тподе *,зсгисЪ де." 1г у *,сопзТ сЬаг *); 1ПЬ (*ткдл) (зЪгисЪ изег_патезрасе *, зТгисС 1поде *,зЬгисТ депТгу *,итоае_Ь) ; 1пЪ (*гтдГг) (зЬгис'к Гподе *,зсгисЪ НепЬгу *); 1пР (*ткпод) (зЬгисЬ изег_патезраое *, зТгиоЪ хподе *,зЬгисТ депТгу *, ито<1е_11, деу_С) ; 1П1: (*гепате) (зРгисТ изег_патезрасе *, зЪгисЬ 1поде *, зТгисТ де:Лгу * г зЪгисР 1по<1е *, зЬгисЪ <3еп1:гу *, ипзГдпеД Лпк) ; 1пЪ (*геадПпк) (зЪгисЬ сТепЪгу *, сЬаг ______изег *,1пР); сопзТ сЬаг * (*деЬ_11пк) (зЪгисЪ ДепТгу *, з'Сгис'Ь Гподе *, зСгисЬ де1ауед_са11 *); (*регт1зз±оп) (зЬгис!: изег_патезрасе *, зСгисЬ Гподе *, 1пИ) ; З'Ьгиск роз1х_ас1 * (*дек_1поде_ас1) (зИгиск 1пос1е *, 1пЪ, Роо1) ; 1пИ (*зеЪаЪ11Г) (зкгисТ изег патезрасе *, эТгисГ. «ЗепЪгу *, зРгисЪ ГаЪЪг *);
тгЛ (*декаккг) (зкгиск изег_патебрасе *, сопзк зкгиск ракк. *, зкгиск кзкак *, и32, ипз1дпес! 1пк); зз1ге_к (*ИзЪхаЪГг) (зСгиск Йег.кгу *, скаг *, 51ге_Ъ); ^го1с! (*ирйаке_Ыте) (зСгиск тпо^е *, зкгиск Ытезрес *, 1пС) ; 1111: (*акали.с_ореп) (зкгисТ. хг.оае *, зкгиск Депкгу *, зкгиск П1е *, иг.з1дпес1 ореп_Пад, итобе_к сгеаке_тс<5е); 1лк (*лтрД1е) (зкгиск изег_патезр.:се *, зкгиск гподе *, зкгиск Й1е *, ито<5е_к) ; зкгиск роз1х_ас! * (’де1:_ас1) (зкгиск изег_патезрасе *, зкгиск депкгу *, 1пк); 1Пк (*зек_ас1)(зкгиск изег_пагаезрасе *, зкгиск Депкгу *, зкгиск роз1х_ас1 *, хпк.) ; 1пк (*й1еаккг_зек)(зкгиск изег_патезра=е *тпк_ияегпз, зкгиск Йепкгу *с1опкгу, зкгиск Я1еа1Хг *Га) ; 1пЪ (*й1еаЪЪг_дек) (зкгиск депкгу *йепкгу, зкгиск Н1еаккг *1’а) ; }; Нужно отметить, что все методы (табл 9.4) могут вызываться без каких- либо блокировок. Таблица 9.4. Методы объекта инодов Метод Описание сгеа1е Вызывается системными вызовами ореп(2) и сгеа1(2). Требует- ся только в том случае, если вы хотите поддерживать обычные файлы. Записи йепду, которые вы получаете, не должны иметь индекса (то есть это должен быть отрицательный депггу) Здесь вы, вероятно, вызовете д_ш81апНаТе() с 4еппу и только что соз- данным индексным дескриптором 1ооЫр Вызывается, когда УЕ8 необходимо найти индексный дескрип- тор в родительском каталоге. Имя, которое нужно искать, на- ходится в с1еп1гу. Этот метод должен вызвать б_а<1д(), чтобы вставить найденный тойе в 4епГгу. Поле "1 ссигЦ" в структуре то<1е должно быть увеличено. Если указанный то4е не суще- ствует, в 4еп(гу следует вставить МЬТЫ тобе (это называется отрицательным 4еп1гу). Возврат кеда ошибки из этой лодпро граммы должен выполняться только при реальной ошибке, иначе создание то4е с помощью системных вызовов, таких как сгеа4е(2), ткпоб(2), тк<11г(2) и т. д., не удастся. Если вы хотите перегрузить методы <1еп1гу, вам следует инициали- зировать поле "б_дор" в депТгу; это указатель на структуру "<1епПу_орега1?опз" Этот мет од вызывается с удерживаемым семафором индексного дескриптора каталога
Инк Вызывается системным вызовом Бпк(2). Требуется только в том случае, если вы хотите поддерживать жесткие ссылки. Вам. вероятно, потребуется вызвать <1_ш81апба1е() так же, как в методе сгеа1е0 ипНпк Вызывается системным вызовом ип1тк(2). Требуется только в том случае, если вы хотите поддерживать удаление инодов зутНпк Вызывается системным вызовом 8ут1шк(2). Требуется только в том случае, если вы хотите поддерживать символические •ссылки. Вам, вероятно, потребуется вызвать д_т81апба1е() так же, как в методе стеа^е() тксИг Вызывается системным вызовом тк<Нг(2). Требуется только в том случае, если вы хотите поддерживать создание подкатало- гов. Вам, вероятно, потребуется вызвать <1_т81апНа1е() так же, как в методе сгеа1е() гпиИг Вызывается системным вызовом гтсНг(2). Требуется только в том случае, если вы хотите поддерживать удаление подкаталогов ткпой Вызывается системным вызовом ткпо<1(2) для создания иоде устройства (сНаг, Ыоск), именованного канала (ЛЕО) или со- кета. Требуется только в том случае, если вы хотите поддержи- вать создание этих типов лнодов. Вам, вероятно, потребуется вызвать д_)П8(апба1е() так же, как в методе сгеа1с() гепате Вызывается системным вызовом гепыпе(2) для переименова- ния объекта, чтобы родитель и имя были заданы вторым ин- дексным узлом и с1еШгу. Файловая система должка возвращать -ЕПЧУАЬ для любых не- поддерживаемых или неизвестных флагов В настоящее время реализованы следующие флаги: (1) ВЕМАМЕ_М)КЕРЬАСЕ: этот флаг указывает, что если цель переименования существу- ет, переименование должно завершаться с сшибкой -ЕЕХ18Т вместо замены цели. УРЗ уже проверяет существование, по- этому для локальных файловых систем реализация КР^ЛМЕ_ МОКЕРТ АСЕ эквивалентна простому переименованию. (2) КЕКАМЕЕХСНАКОЕ: обмен источником и целью. Оба должны существовать; это проверяется УРЗ. В отличие от про- стого переименования, источник и цель могут быть разных типов
§е1_Ппк Вызывается УГ8 для перехода по символической ссылке к индексному узлу, на который он указывает. Требуется только в гом случае, если вы хотите поддерживать символические ссылки геадИпк Теперь это просто переопределение для использования геайНпк(2) в случаях, когда ->§е1_Нпк использует пс^шг.р 1тк() или объект на самом деле не является символической ссылкой. Обычно файловые системы должны реализовывать ->уе1_1шк только для символических ссылок, и -еа<1Нпк(2) бу- дет использовать это автоматически регпйззюп Вызывается УЕ8 для проверки прав доступа к РО8ГХ- подобной файловой системе. Если возникает ситуация, кото- рук, гси-\уа1к не может обработать, верните -ЕСНГЫ), и он снова будет вызван в режиме геГ-\ча1к $е.1аЯг Вызывается УЕ8 для установки атрибутов файла. Этот метод вы- зывается сЬпю<1(2) и соответствующими системными вызовами §ви>11г Вызывается УЕ8 дтя получения атрибутов файла. Этот метод вызывается з1а1(2) и соответствующими системными вызовами НзвсаНг Вь зошзетс- УЕ8 дтя отображения всех расширенных атрибутов дан - ного файла. Этот метод вызывается системным вызовом ыЛхачЯ2) 1-.рйа1е_Ите Вызывается УГ8 для обновления определенного времени или 1_уег81сп индексного дескриптора. Если это не определено, УЕ8 сама обновит индекс и вызовег шагк_то<1е_й1Пу_8упс актйсареп Вызывается последний открытый компонент. Используя этот необязательный метод, файловая система может искать, воз- можно, создавать и открывать файл за одну атомарную опе- рацию. Если оп хочет оставить фактическое открытие дтя вызывающей стороны (например, если файл оказался симво- лической ссылкой, устройством или просто чем-то, ди чего фай. I свая система не будет выполнять атомарное открытие), он может сигнализировать об этом, возвращая йшвЬ по рреп(й1е, йеп1гу). Этот метод вызывается только в том случае, если по- следний компонент отрицателен или нуждается в поиске. Кэшированные положительные 1аписи <1еп1гу по-прежнему обрабатываются Г_ор->ореп(). Если файл был создан, флаг ЕМОЛЕ СВЕЛТЕЭ должен быть установлен в файл->Г гпойе. В случае 0 ЕХСЬ метод должен быть успешным только в том случае, если файл не существует, и, следовательно, ЕМ01>Е_ СКЕАГЕВ всегда должен бьпь установлен в случае успеха
тр^1е Вызывается н конце О_ТМРР1ЬЕ ореп(). Необязательно, экви- валентно атомарному созданию, открытию и удалению файла в заданном каталоге. Б случае успеха необходимо вернуться с уже открытым файлом; это можно сделать, вызвав йгнзЬ ореп_ 51тр1е() прямо в конце Вызывается в юсГ.(Е8_1ОС_СЕТЕ1 АО8) и юсЙ(Г8_1ОС_ Е8ОЕТХАТТВ.) для получения различных флагов и атрибутов файлов. Также вызывается перед соответствующей операцией 8ЕТ, чтобы проверить, что изменяется (в данном случае с за- блокированным эксклюзивным 1 пузегп). Если не установлено, вернитесь к Г_ор->юс:1() /Иеа11г_зс1 Вызывается в ;ос11(Т8_1ОС_8Ет ЕЬАС8) и юсй(Г8_ЮС_ Г88ЕТХАТТК) для изменения флагог. и атрибутов различных файлов. Вызывающие удерживают эксклюзивный 1_пУ8еш. Если не установлено, вернитесь к 1_ор->юсЙ() 9.5. Объект адресного пространства 9.5.1. Общая информация Объект адресного пространства используется дтя 1руппировки и управле- ния страницами в кэше страниц. Его можно использовать для отслеживания страниц в файле (или чего-либо еще), а также для отслеживания отображе- ния разделов файла в адресные пространства процесса. Существует ряд различных, но связанных между собой услуг, которые мо- жет предоставлять адресное пространство. К ним относятся сообщение о нехватке памяти, поиск страниц по адресу и отслеживание страниц, поме- ченных как "грязные" (сПпу) или "обратная запись" (дулГеЬаск). Первый можно использовать независимо от остальных. ВМ может попы- таться либо записать грязные страницы, чтобы очистить их, либо выпустить чистые страницы, чтобы использовать их повторно. Дтя этого он может вы- зывать метод ->\упсера§е для грязных страниц и ->ге1еа8е_йэНо для чистых фолиантов (ГоНоз) с установленным флагом рггиак. Чистые страницы без Ра§еРпуа1е и без внешних ссылок будут выпущены без уведомления в адрес ном пространстве.
Примечание. Фолианты (Го1юз) памяти Ыпих предназначены для того, чтобы файловые системы и кэш страниц могли управ- лять памятью фрагментами, превышающими размер страницы по умолчанию. Для достижения этой функциональности страницы должны быть помещены в ЫШ с 1ги_саске_аск1, а тагк _ра%е_асИуе должен вызываться всякий раз, когда страница используется. Страницы Обычно хранятся в индексе системы счисления с помощью ->пк1ех. Это дерево поддерживав” информацию о статусе РО_ЭкПу и РО_ХУпГеЬаск каждой страницы, так что страницы с любым из этих флагов можно быстро найти. Тег ЭцСу в основном используется трра§е_у^гНера§е5 — методом по умол- чанию ->5М1 Неравен Он использует тег для поиска грязных страниц для вызова ->у/п Герате. Если тра§е_\угйера$е&() не используется (т. е. адрес предоставляет свой собственный — >мтйера§е8), тег РА6ЕСАСНЕ_ТА0_ П1КТУ практически не используется. \мгйе 1поде_поу/ и 8упс_1по<1е ис- пользуют его (через___8упс_81пя1е_1поЛе), чтобы проверить, удалось ли ->5мгйера§е8 записать все адресное пространство а<1с!геах_8расе. Тег обратной записи используется функциями Шетар*\уак* и 8упс_ра§е* через /Петар_/Иа1а^аИ_гап§е для ожидания завершения всей обратной за- писи. Обработчик адресного пространства может прикреплять к странице до- полнительную информацию, обычно используя поле "рпуаГе" на "странице структуры". Если такая информация прикреплена, должен быть установлен флагРО РтаГе. Это заставит различные подпрограммы вирту,шьной маши- ны делать дополни тельные вызовы обработчику аННгеззярасе для обработ- ки этих данных. Адресное пространство действует как промежуточное звено между храни- лищем и приложением. Данные считываются в адресное пространство по целой странице за раз и предоставляю 1ся приложению либо путем копиро- вания страницы, либо путем отображения страницы в памяти. Данные за- писываются в адресное пространство приложением, а затем записываются обратно в хранилище, как правило, целыми страницами, однако адресное пространство аМгезззрасе имеет более точный контроль над размерами за- писи.
Процесс чтения по существу требует только "геайГойо". Процесс записи бо- лее сложен и использует м>гИе_Ье§1п/^гИе_еп^ или (Иг1у^оНо для записи дан- ных в адресное пространство аМгезззрасе, а также ит1ера§е и иггИера^ез для обратной записи данных в хранилище. Добавление и удаление страниц в/из адресного пространства защищено 1_ тшех индексного дескриптора Когда данные записываются на страницу, должен быть установлен флаг РО П1г1у. Обычно он остается установленным до тех пор, пока и>гНера$е не попросит ею записать. Это должно очистить Р(л_Вп1у и установить РС АУгйеЬаск. На самом деле его можно записать в любой момент после очистки Р6 ЭйДу. Как только становится известно, что он безопасен, РО ^’гйеЬаск очищается. Обратная запись использует структуру м^гИеЪаск_соп1го1 для управления операциями. Эго дает операциям игИера^е и и>п1ера§ез некоторую инфор- мацию о характере и причине запроса обрат пой записи, а также об ограни- чениях, при которых они выполняются. 9.5.2. Обработка ошибок во время обратной записи Большинство приложений, выполняющих буферизованный ввод-вывод, периодически используют вызов синхронизации файлов (Гзупс, йШаяупс, тзупс или нуле Й1е гагще), чтобы убедиться, что записанные данные попали в резервное хранилище. Когда возникает ошибка во время обратной записи, они ожидают, что об этой ошибке будет сообщено при выполнении запроса на синхронизацию файлов. После получения сообщения об ошибке в одном запросе последующие запросы к тому же файловому’ дескриптору должны возвращать 0, если только после предыдущей синхронизации файлов не воз- никло новых ошибок обратной записи. В идеале ядро будет сообщать об сшибках только в тех описаниях файлов, в которых были выполнены записи, которые впоследствии не удалось записать обратно. Однако универсальная инфраструктура кэша страниц не отслеживает описания файлов, которые загрязнили каждую отдельную страницу, поэтому определить, какие файловые дескрипторы должны воз- вращать ошибку, невозможно.
Вместо этого универсальная инфраструктура отслеживания ошибок с обрат- ной записью в ядре разрешает сообщать об ошибках в /чупс для всех опи- саний файлов, которые были открыты во время возникновения ошибки. В ситуации с несколькими модулями записи все они пернут ошибку при после- дующей /зупс, даже если все записи, выполненные через этот конкретный файловый дескриптор, завершились успешно (или даже если записи в этот файловый дескриптор вообще не производились). Файловые системы, которые хотят использовать эту инфраструктуру, долж- ны вызывать функцию тар _ре1_еггог для записи ошибки в адресном про- странстве, когда она возникает. Затем, после обратной записи данных из кэша страниц в операции Ше->&упс, они должны вызвать /Не_скеск_ ап(1_ а<3\>апсе_уЛ_егг, чтобы убедиться, что курсор сшибки файла структуры пе- реместился в правильную точку в потоке ошибок, выдаваемых поддержива- ющим устройством (устройствами). 9.5.3. Структура хи(гис1 айс1ге$8_8расе орегапопь Данная структура описывает, как УГ5 может манипулировать сопоставлени- ем файла с кэшем страниц в вашей файловой системе Содержит следующие члены: зЬгисГ ас1дгез8_зрасе_орегаС1опз { 1гЛ (*иг1Ьераде)(зСгисС раде "раде, зГгисГ иг1^еЬаск_сэпСгэ1 *мЬс); 1пС (*геа<1_Гс11о) (зСгисЬ П1е *, гСгисГ ГоПо •); 1гЛ (*иг1Серадез)(зСгиск асИгез&_зраое *, зСгисЛ иг1СеЬаск_сопРго1 *); Ьсо! (*сИгСу_Го11о) (зЪгисЪ аД<1гезз_зрасе *, зРгисС Ыхо *) ; Vо^<^ (*геа<1апеа<1) (зЪгисС геа<1апеас1_сопРго1 *); 1пС (*иг1(:е_Ьед1п) (зСгист Л1е *, зСгисС аадгезз_зрасе ’таррхпд, 1оЙ_Г роз, ипзтдпеД 1еп, зСгисС раде **радер, Vо^<^ **ГзДаСа); (*иг1Се епа)(зГгисС П1е *, зЪгисС аа<1генз_зрасе *тарр!пд, 1ой_С роз, ипзГдпеб 1еп, ипзхдпед сортед, зРгисС раде *раде, Vо^с^ *ГзйаСа); зесСоГ-Ь (*Ьтар)(зСгисС адс1гезз_зрасе *, зесСог_Р); уод.с1 (*1луа±1<1а1:е_1:о11о) (зСгисС ГоНо *, з1®е_С зСагС, з1ге_С 1ег.); Ьоо1 (*ге1еазе _ГоПо) (зЪгисЪ Го21о *, дГр_С); уо1<1 (*Ггее_ГоПо) (зСгисс ГоНо *) ; зз1хе_С (*<НгесР_ 10) (зЪгисС к±осо *, зРгисС 1о'^_1Сег *1Ъег) ; (*т1дгаГе_Ео11.о) (зСгисС тарргпд *, зСгисЪ ГоНо Мзр, зЪгисС ГоПо *згс, епит т1дгаСе_тоае) ;
1пЬ (*1аипс1ег _ЕсИо) (зСгисе Ы1о *); Ьоо! (*1з_раге1а11у_ирСос1аее) (зсгисС Го11о *, з12е_С {гот, з1ге_{ соипс); уо!с1 (*1з_с11г{у_нг1*еЬаск.) (з^гисС 1о11о *, Ьоо! *, Ьоо1 *); 1пС (*еггог_гатоуе_раде) (»Ъгис1: тарр!пд *тарр!пд, зРгисГ раде *раде); 1гЛ (*зиар_агЛ1уа{е) (зсгисЬ зиар_1п{о_з1:гисЬ *318, з^гисЪ Ш.е *{, зесРог_€ *зрап) 1ПР (’8«ар_с1еасС1уаРе) (й-СгисР Й1е *); 1пС (*3иар_гм)(зргиср к!осЬ *1осЬ, зРгисР 1ОУ_1Рег *1Рег); }; Таблица 9.5. Члены структуры аМге$8_8расе_орега11оп$ Член структуры Описание \уп(ера>>е Вызывается виртуальной машиной для записи грязной страницы в резервное хранилище. Это может произойти из соображений целостности данных (например, "син- хронизации") или для освобождения памяти (сброс). Раз- ницу можно увидеть в хмЬс->8упс_тоде. Флаг РС ВпХу снят, а значение Ра§еЪоске<1 равно йие. зутНера^е должен начать запись, должен установить РО МгНсЬаск и убе- диться, что страница разблокирована, либо синхронно, либо асинхронно, когда операция записи завершится. Если ч?Ьс->зупс_ тобе равен \Х’В 8УЫС КОМЕ, ->адтйераве не нужно слишком стараться, если есть проблемы, и может выбрать запись других страниц из сопоставления, если это проще (например, из-за вну- тренних зависимостей). Если он решит не начинать за- пись, он должен верпуть АОР_ХУМТЕРАС?Е_АСТГУАТЕ, чтобы виртуальная машина не продолжала вызывать ->\уп1сра2е на этой странице
геа<Л_/оИо Вызывается кзшем страниц для чтения фолианта из ре- зервного хранилища. Аргумент "файл" предоставляет информацию дтя аутентификации в сетевых файловых системах и обычно не используется блочными файловы- ми системами. Он может быть равен МПЬЬ, если у вызы- вающей стороны нет открытого файла (например, если ядро выполняет чтение для себя, а не от имени процесса пользовательского пространства с открытым файлом). Если сопоставление не поддерживает большие фолиан- ты, фолиант будет содержать одну страницу. Фолиант будет заблокирован при вызове геас Гойо. Если чтение завершает ся успешно, фолио должно быть помечено как актуальное. Файловая система должка разблокировать фолио после завершения чтения, независимо от того, было ли оно успешным или нет. Файловой системе не нужно изменять счётчик ссылок на фолио; кэш страницы содержит счегчик ссылок, и он нс будет выпущен, пока фолио не будет разблокировано. Файловые системы могут реализовывать ->геа<1 Го1ю() синхронно. При нормальной работе фолианты читаются с помощью метода ->геабайеа(1(). Только в случае не- удачи или если вызывающей стороне нужно дождаться завершения чтения, кэш страницы вызовет ->геа<1_Го1ю(). Файловые системы не должны пытаться выполнить соб- ственное упреждающее чтение в операции ->геа<1_Го11о(). Если файловая система не может выполнить чтение в данный момент, она может разблокировать фолиант, выполнить любое действие, необходимое для обеспе- чения успешного чтения в будущем, и вернуть АОР_ ТКЦПСАТЕО- РАСЕ, В этом случае вызывающая сто- рона должна найти фолиант, заблокировать его и снова вызвать ->геа<1_Го11о. Вызывающие могут вызывать метод ->геай ГоНо() напря- мую, но использование геабтаррдщГоНоО позаботится о блокировке, ожидании завершения чтения и обработке таких случаев, как АОР ТКЦХСАТЕВ РАОЕ
чп-Иера^ев Вызывается виртуальной машиной для записи страниц, связанных с объектом адФезз красе. Если мЪс->зупс_ тобе равен УУВЗУМС АЕЬ, то лтйеЬаск сопСго! укажет диапазон страниц, которые должны быть записаны. Если это У/В 8УМСКОКЕ. то дается пг_1о уугИе и, по воз- можности, должно быть записано столько страниц. Если параметр ^зугйсра^ез не указан, вместо нею использу- ется тра§е_\уп1ера^еь. Он выберет страницы из адрес- ного пространства, помеченные как О1КТУ, и передаст их ->'лтперайе сИг1у_/оИо Вызывается виртуальной машиной, чтобы пометить фолиант как грязный. Это особенно необходимо, если адресное пространство связывает личные данные с фо- лио, и эти данные необходимо обновлять, когда фолиант "загрязняется'1. Он вызывается, например, при измене- нии отображаемой страницы памяти. Если он определен, он должен установить флаг Шйу фолианта и метку поис- ка РАОЕСАСНЕ_ТАО О1КТУ в Грачев геаЛикеас! Вызывается виртуальной машиной для чтения страниц, связанных с объектом аййгезз зрасе. Страницы расположены последовательно в кэше страниц и заблокированы. Реализация должна уменьшать счетчик ссылок на страницу после запуска ввода- вывода на каждой странице. Обычно страница будет разблокирована обработчиком завершения ввода- вывода. Набор страниц делится на несколько страниц синхронизации, за которыми следуют несколько асинхронных страниц, член гас->га->азупс_812е дает количество асинхронных страниц. Файловая система должна попытаться прочитать все страницы синхронизации, по может решить остановиться, как только достигнет асинхронных страниц. Если будет решено прекратить попытки ввода-вывода, можно просто выполнить гсШгп. Вызывающий удалит оставшиеся страницы из адресного пространства, разблокирует их и уменьшит счетчик ссылок (геЕсовШ) на страницы. Установите Ра^еЕрюбаЮ, если звод-вывод завершился успешно. Установка РацеЕггог на любой странице будет проигнорирована; просто разблокируйте страницу, если произойдет ошибка ввода-вывода
м/гИе Ье&п Вызывается общим кодом буферизованной записи, чтобы попросить файловую систему подготовиться к записи длинных байтов по заданному смещению в файле. А<1- бгезазрасс должен проверять возможность завершения записи, выделяя пространство, если это необходимо, и выполняя любые другие внутренние операции. Если запись будет обновлять частя любых базовых блоков в хранилище, то эти блоки должны быть предварительно прочитаны (если они еще нс были прочитаны), чтобы обновленные блоки можно было правильно записать. Файловая система должна возвращать заблокированную страницу кэша страниц для указанного смещения в *ра§ер, чгобы вызывающая сторона могла выполнять запись. Возвращает 0 в случае успеха; < 0 в случае сбоя (это код ошибки), и в этом случае 'лтПеезб не вызывается мгИеепс! После успешного выполнения миле..Ье^ш и копирования данных необходимо вызвать ттТе_епд. 1еп — это исход- ная длина, переданная в тмгйе_Ье8Ш, а сор!еЛ — это раз- мер, который удалось скопировать. Файловая система должна позаботиться о разблокировке страницы и освобождении ее геГсоигИ, а также об обнов- лении 1_81хе. Возвращает < 0 в случае ошибки, в противном случае количество байтов (<= "скопировано"), которые удалось скопировать в кзш страниц Ьтар Вызывается виртуальной файловой системой для сопо- ставления смещения логического блока внутри объекта с номером физического блока. Этот метод используется 1ОС11НВМАР и для работы с 85мар-файлами. Чтобы мож- но было переключиться на файл, файл должен иметь ста- бильное сопоставление с блочным устройством. Система подкачки не проходит через файловую систему, а вместо этого использует Ьтар, чтобы узнать, где находятся бло- ки в файле, и напрямую использует эти адреса
1пуаН(1а1е_/оПо Если фолиант содержит приватные данные, тогда будет вызываться 1гуаИса(е_ГоИо, когда часть или весь фолиант должен быть удален из адресною пространства. Обычно это соответствует усечению, г.ерфсрации или полному аннулированию адресной) пространства (в последнем случае "смещение” всеща будет равно 0, а "длина" — Го11о_$12еО). Любые личные данные, связанные с фоли- антом, должны быть обновлены, чтобы отразить эго усе- чение. Если смещение равно 0, а длина равна ^оНс_»12е(), то личные данные должны быть освобождены, потому что фолиант должен быть полностью отброшен. Эго можно сделать, вызвав функцию ->ге1еазе_&Но, но в этом случае выпуск ДОЛЖ ЕН завершиться успешно ге!еазе_/о11о Вызывается для фолианта с закрытыми данными, чтобы сообщить файловой системе, что фолиант будет осво- божден. Метод ->ге1еазс_ ГоНо должен удалить все лич- ные данные из фолианта и снять флажок "приватный". Если функция ге1еазе ГоИо() завершается ошибкой, она должна возвращать значение 1а1зе. ге1еа8е_Го1ю() исполь- зуется в двух разных, но связанных случаях. Во- первых, когда виртуальная машина хочет освободить чистый фолиант без активных пользователей. В случае успеха >ге1еа5е_ГоНо фолиант будет удален из афбгезз зрасе и освобожден Второй случай — ко)да был сделан запрос на аннули- рование некоторых или всех фолиантов в аббгезз зрасе. Если файловая система делает такой вызов, она должна быть уверена, что все фолианты признаны недействи- тельными /гееУоПо Вызывается, когда фолиант больше не отображается в кэше страниц, чтобы разрешить очистку любых личных данных сНгес! Ю Вызывается общими процедурами чтения/записи для выполнения ёпес: Ю — то есть запросов ввода вывода, которые обходят кэш страниц и передают данные непо- средствеь но между хранилищем и адресным простран- ством приложения
т1^га1еУоИо Используется для сокращения использования физиче- ской памяти. Если виртуальная машина хочет переме- стить фолиант (возможно, с запоминающего устройства, сигнализирующего о неизбежном сбое), она передаст этой функции новый фолиан г и старый фолиант. Метод пн§га1е ГоНо должен передавать любые личные данные и обновлять все имеющиеся у нет ссылки на фолиант 1аиш1ег^6Но Вызывается перед освобождением фолианта - для об- ратной записи "грязного" фолианта Фолиант остается заблокированный на протяжении всей операции й_рагИа11у_ир1ос1а1е Вызывается виртуальной машиной при чтении файла из кэша страниц, когда базовый размер блока меньше раз- мера фолианта. Если требуемый блок актуален, то чте- ние может завершиться без необходимости ввода-вывода для обновления всей страницы 18_<Иг1у_\\>теЬиск Вызывается виртуальной машиней при попытке вос- становить фолиант. Виртуальная машина использует "грязную" информацию и информацию обратной записи, чтобы определить, нужно ли ей останавливаться, чтобы дагь очистителям шанс завершить некоторые операции ввода-вывода. Обычно она может использовать ГоНо_ 1ея1 сНгСу и ГоНо 1еа1_змп1еЬаск, но некоторые файловые системы имеют более сложное состояние (нестабильные фолианты в ХГ8 предотвращают восстановление) или не устанавливают эти флаги из-за проблем с блокиров- кой. Этол обратный вызов позволяет файловой системе указать виртуальной машине, следует ли рассматривать фолиант как грязный пли с обратной записью в целях приостановки еггог_геторе_ра%е Обычно устанавливается в §епепс_еггог гетоуе_ раде, если усечение допустимо для этого адресною пространства, Используется для обработки сбоев памяти
$у>ар_асНуа1е Вызывается для подготовки данного файла к обмену. Он должен выполнять любую проверку и подготовку, необ- ходимые для обеспечения того, чтобы запись могла вы- полняться с минимальным выделением памяти. Он дол- жен вызывать аск18\уар ехгепЦ) или вспомогательную функцию ютар_зтрй1е_ас11уаТеО и возвращать коли- чество добавленных экстентов. Если ввод-вывод должен быть отправлен через ->85Уар_пк(), он доджей устано - вить 8^Р_Г8 ОР8, иначе введ-вывод будет отправлен непосредственно на блочное устройство 818->Меу чц’ар с!еасЦуа1е Вызывается во время 8\уароГГ для файлов, где 8^ар_ асйуаТе был успешным $м,>ар Вызывается для чтения или записи страниц подкачки, когда установлен 8ХУР Е8 ОР8 9.6. Объект ГПе Файловый объект представляет собой файл, открытый процессом. Структу- ра ^1е_орегаИопз описывает, как УР8 может манипулировать открытым фай- лом. Содержимое структуры: зегисС Н1е_орегаЕ1ОПЗ { зДгисР тодиТе *с«пег; 1ой_Д (*11зеек) (зРгисД Д1е *, 1оД_Ъ, тпД); зз1ге_Ъ (*геад) (зЪгисД Д1е *, сЬаг изег *, з12е_Ь1 1оД_Д *); зз1ге_Ъ (*игаЛе) (зЪгисД Л1е *, сопзЪ сНаг изег *, з±ге_Ъ, 1оД_С ♦); зз!хе_Ъ (*геад_1Дег) (зДгисД ктосЬ *, зРгисТ 1ОУ_1Сег *); зз1хе_Ъ (*иг1Ъе_1Ъег) (зЪгисЪ кхосЬ *, зЪгисД 1оу_11:ег *); л-пй. (*1оро11) (зГгисг кхосЬ *к.1осЬ, Ьоо! зрхп); хпе (*1Ъега1:е) (зсгисД Д1е *, зДгисЬ <Иг_сопеехТ. *); 1пе (*1Дега'Ье_з11агес1) (з1_гис* 111 е *, зЪгисС сНГ-СОпДехД *); __ро11_Д (*ро11) (зЬгисР Н1е *, зкгисЪ ро!1_РаЫе _зсгисР *); 1ог.д (*ип1оске<1_1осМ) (зТгисС Д1е *, игзХдпеб. 1пЬ, ипзтдпед 1опд); 1опд (*сотраЪ_1осМ) (зДгисС Й.1е *, ипзхдпеД 1пС, ипзтдпеа 1опд) ; хпЪ (’ттар) (зДгисЬ Д1е *, зРгисС Vт_а^еа_з^^^^сЛ *); 1пр (*ореп) (зДгисЪ хпсДе *, зДгисЪ Й1е *); 1пД (*ПизЬ) (зДгисг Д]е *, Д_о^пег_Ъ 1Д); 1ПР (*ге1еазе) (з!гисД хподе *, зРгисД Д1е *);
тпй (*4зупс) (зйгисЪ Й1е *, 1ой_Ь, 1ой_Ь, 1пЪ с1аТ.аяупс) ; 1пС (*Газупс) (1ПЪ, з^гисй Й1е *, 1пС) ; 1ПЬ (*1оск) (зйгисТ: Й1е *, 1пй, зЪгисЬ Й1е_1сск *); зз1ге_Т (*зепдраде) (зйгисЪ Й1е *, зйгисС раде *, 1пЬ, з1ге_С, 1оЙ_Ь *, 1пЪ); ипзхдпеЛ 1опд (*дей_иг.тарреа_агеа) (зЪгисй Й1е *, ипэхдпес! 1опд, ипзтдпей 1опд, ипзтдпед 1опд, ипзтдг.ес! 1опд); 1пЪ (*сйеск_Йадз) (1пЪ); л-пЪ (*Йоск) (зЪгисй Й1е *, 1пЪ, зЪгисй Й1е_1оск *); зз12е_Ъ (*зрИсе_иг1Ъе) (зЪгисС р1ре_1пос1е_1пГо *, зйгисй Й1е *, 1ой_й *, З12е_г, ипзтдпед 1пЪ); зз1ге_й (*зрИсе_геай) (зТгисй Й1с *, 1оЙ_Ь. *, зйгисЪ р!ре 1пойе_1пГо *, 31ге_Ъ, ипзГдпес! хпЪ); 1п<? (‘зе-Цеаье) (зЬгисй Й1е *, 1опд, зйгисй Й1е_1оск **, уохй **); 1опд (*1а11оса(‘.е) (зйгисй Й1е *й1е, 1п1: тойе, 1ой_Ь ойзег, 1ой_Ь 1еп) ; \го1с1 (*з1юи_^<Ип^с) (зЬгисг зед_й!е *т, зЪгисй й!е *^) ; НГпйеГ СОЫГКЗ- ММи ипзгдпед (*тптар_сараЫИЪ1ез) (зйгисй Й1е *); #еп<Ш 1 зз1ге_Ъ (*сору_й1е_гапде)(зйгисй Й1е *, 1ой_Ь, зйгисй Й1е *, 1ой_Ъ, з1ге_Ъ, ипзхдпей 1пЪ); 1ой_Ь (*гетар_й1е_гапде)(зйгисЛ й!е *й1е_1п, 1ой_й роз_1п, зйгисЪ Й1е *й1е_оий, 1ой_й рсз_оиг, 1ой_й 1еп, ипзХдпед 1пЪ г₽гаар_йадз) ; 1ПЪ (*ГасГу1зе) (зйгисй Й1е *, 1ой_й, 1ой_Ъ, 1пЪ) ; }; Описание членов структуры приведено в табл. 9.6. Все методы мотут быть вызваны без блокировок. Таблица 9.6. Члены структуры/11е_ореги11оп5 Метод Описание Изеек Вызывается, когда \Т8 необходимо переместить индекс позиции файла геа<1 Вызывается геад(2) и связанными системными вы- зовами геай_Иег Осуществляет асинхронное чтение с юу_Нег в каче- стве назначения
тмгИе Вызывается мгп1е(2) и связанными системными вы- зовами умгИеИег Используется для асинхронной записи с юу йег юро11 Вызывается, когда аю нужно опросить завершение наюсЬз Н1РК1 Нега1е Вызывается, когда \Т8 необходимо прочитать со- держимое каталога Иега1е зкагес! Вызывается, когда УВ8 необходимо прочитать со держимое каталога, когда файловая система под- держивает параллельные итераторы каталогов роП Вызывается УР8. когда процесс хочет проверить, есть ли активность в этом файле, и (необязательно) перейти в спящий режим, пока не будет активно- сти. Вызывается системными вызовами зе1ес1(2) и ро11(2) сотра1_юс11 Вызывается системным вызовом юс11(2), когда 32-битные системные вызовы используется на 64-бил 1ых ядрах ттар Вызывается системным вызовом ттар(2) ореп Вызывается \Т8, когда индексный дескриптор должен быть огкрыт. Когда УЕ8 открывает файл, он создает новый "файл структуры". Затем он вы- зывает метод ореп для вновь выделенной файловой структуры. Вы можете подумать, что метод ореп действительно относится к «1гис1 тоае_орега- йопз, и вы можете быть правы. Я думаю, что это сделано так, потому что это упрощает реализацию файловых систем. Метод ореп() — хорошее место для инициализации члена рпуа1е с!а(а в файловой структуре, если вы хогите указать на структуру устройства
У7млЛ Вызывается системным вызовом с1озе(2) для очист- ки файла ге1еазе Вызывается, когда закрываегся последняя ссылка на открытый файл /зупс Вызывается системным вызовом Г§упс(2) /азупс Вызывается системным вызовом Гспб(2), когда для файла включен асинхронный (неблокирующий) режим 1оск Вызывается системным вызовом Гсп11(2) для команд РОЕТЬК, Р_8ЕТЬК и Р _8ЕТЬКШ §е1_иптарррД_агеа Вызывается системным вызовом ттар(2) скеек^1а§з Вызывается системным вызовом Гсп€1(2) для коман- ды Р_8ЕТРЬ /1оск Вызывается системным вызовом Доск(2) зрНсе_у\>гИе Вызывается УР8 для объединения данных из кана- ла в файл. Этот метод используется системным вы- зовом 8рНсе(2) зрПсе_геы1 Вызывается УР8 для объединения данных из файла в канал. Этот метод используется системным вы- зовом 8рбсе(2) зейеазе Вызывается УГ8 для установки или освобождения аренды блокировки файла. Реализации зейеазе должны вызывать %епег1с_зе11еазе для записи или удаления аренды в йюс1е после ес установки /аИосте Вызывается УН 8 для предварительного выделения блоков или пробивания отверстий
сору^1е_гап§е Вызывается системным вызовом сору_й!е_гап§е(2) гетар_]Ие_гап§е Вызывается системным вызовом юсН(2) для команд Р1СЬ(ЖЕКАТ4СЕ, РТСЬСЖЕ и РЮЕЦЪ'РЕКАКОЕ для переназначения диапазонов файлов. Реализация должна переназначить байты 1еп вроз_1п исходно- го файла в файл назначения в роз_ои1. Реализации должны обрабатывать вызовы, передающие 1еп == 0; это означает "переназначить в конец исходно- го файла". Возвращаемое значение должно быть числом переназначенных байтов или обычным отрицательным кодом ошибки, если ошибки про- изошли до того, как какие-либо байты были пере- назначены. Параметр гетар принимает флаги КЕМАР_Р1ЬЕ_*. Если КЕМ АР_Р1ЕЕ_ОЕО1)Р уста- новлен, то реализация должна переназначать только в том случае, если запрошенные диапазоны файлов имеют идентичное содержимое. Если КЕМЛР ГП.Е_С/Ш 8НОКТГ^ установлен, вызывающая сторона не возражает против того, чтобы реализа- ция сокращала длину запроса для удовлетворения требований выравнивания или ЕОР (или по любой другой причине) /ас&йче Вызывается системным вызовом ГасМьеб4() Обратите внимание, что файловые операции реализуются конкрегной фай- ловой системой, в которой находится индексный дескриптор. При открытии узла устройства (специального символьного или блочного) большинство файловых систем вызывают специальные процедуры поддержки в УГ8, ко- торые находят необходимую информацию о драйвере устройства. Этй под- про1раммы поддержки заменяют файловые операции файловой системы операциями для драйвера устройства, а затем продолжают вызывать новый метод ореп() для файла. Именно так открытие файла устройства в файловой системе в конечном итоге приводит к вызову метода ореп() драйвера устрой- ства.
9.7. Кэш записей каталога (йсасйе) 9.7.1. Структура йеп1гу орегаИопз Структура с1еп1гу орегаИопи описывает, как файловая система может пере- грузить стандартные операции <1еп1гу Записи ИепПтез и бсаспе являют- ся областью УР8 и отдельных реализаций файловой системы. Драйверы устройств здесь ни причем. Этим методам может быть присвоено значение И1Л.Т., так как они либо являются необязательными, либо УР8 использует значение по умолчанию. Начиная с ядра 2.6.22 (по текущую версию ядра), определены следующие члены: зеуисЬ депЪгу_орегаТ1оп8 { 1пТ (*а геуаИда^е) (вЪгисЪ <1япегу *, ипзтдпес! 1пЪ) ; 1пЪ (*й Vеак_^еVа1^с;а'Се) (зЪгисС депЬгу *, ипзддпес! дпЪ); 1пЬ (*д_ЬазЬ) (сопз1: зЪгисЪ депЪгу *, зТгисЪ дзГг *); 1пТ (*д_сотраге)(сспзЪ зЪгисЪ депТгу *, длз!с|Пе<1 1п1_, сог.зТ сЪаг *, сопзТ: ЕТгисТ дзТг *); 1П1: (*<1_с1еДеЬе) (сопзЪ зЪгисЬ депЪгу *); 1пЪ (зЪгисЪ <1еп1:гу *); уодй (*с!_ге1еазе) (зЪгисЬ сЗепЪгу *); ^7О1с1 (*с!_1рие) (зЪгисГ депЪгу *, зЪгис!: дподе *); сЬаг * (*д_с1пате) (з1:гисЬ деп^гу *, сИаг *, Гпе) ; зЪгисЪ уТзгг.оипЪ * (*<1_аиЪотоипЪ) (зЪгисЪ раЪЪ *); 1пк (*д_тападе)(сопзЪ зЪгиСЪ раЪИ *, Ьоо1); зЪгисС йепЬгу *(*<3_геа1)(зЪгисЬ депЬгу *, сопз! зЪгисЬ дподе *); }; Описание членов структуры приводится в табл. 9.7.
Таблица 9.7. Описание членов структуры йеп1гу_орегаНопз Метод Описание <1 геуаИйаге Вызывается, когда УР8 необходимо перепроверить с1еп1гу. Это вызывается всякий раз, когда поиск имени находит <1еп1гу в бсасйе. Большинство локальных фай- ловых систем оставляют это значение равным Ы( 1ЬЬ, потому что вес их бепйтеБ в бсасЬе действительны. Сетевые файловые системы отличаются тем, что что- то может измениться на сервере без ведома клиента. Эта функция должна возвращать положительное значение, если (1еп1гу все еще действительна, и ноль (если недействительна) или отрицательный код ошиб- ки, если это не чак ыеак гечаНскИе Вызывается, когда УГ8 необходимо повторно прове- рить "перепрыгнувший" <Леп1гу. Это вызывается, когда обход дуги закапчивается па <1еп1гу, который не был получен путем поиска в родительском каталоге. Эго включает в себя "." и а также символические ссылки в стиле ргоей и обход точки монтирования. В этом случае нас заботит не столько правильность <1еп1гу, сколько то, что индекс по-прежнему действи- телен. Как и в случае с (1_геуаПс1а1е, большинство локальных файловых систем установит его в Ы1ЛХ, поскольку их записи в бсасйе всегда действительны. Эха функция имеет- ту же семантику кода возврата, что и с1 геуаИс1а1е <1 кахк Вызывается, когда УБ8 добавляет с1еп1гу в хеш- таблицу. Первый <1еп1гу, переданный в йказк. являет- ся родительским каталогом, в который должно быть хешировано имя. Те же правила блокировки и син- хронизации, что и в Лсотраге, в отношении того, что безопасно для разыменования и т.д. л
Лсотраге Вызывается для сравнения имени <1еп1гу с заданным именем. Первый с!еп(гу является родителем сравни- ваемого с1еп1гу, второй — дочерним <1еп1гу. Параме- тры 1еп и пате яв^ьяются свойствами сравниваемого <1еп1гу. Ц81т — это имя, с которым ею нужно сравнить. Должен быть постоянным и идемпотентным, не должен по возможности блокироваться и не должен сохраняться в ЛепТгу. Не следует без особой осторож- ности разыменовывать указа) ели за пределами (1еп1гу (например, не следует использовать <1_рагеп1, (1 тойе, йпате) <1_с1е1е1е Вызывается, когда последняя ссылка па <1еп1гу от- брасывается, и йсасЬе решает, кэшировать ее или нет. Возвращает 1 для немедленною уда ления или 0 для кэширования <1еп1гу (1_тИ Вызывается при выделении <1еп1гу с1 ге1еазе Вызывается, когда <1еп1гу действительно освобожда- ется с1 1ри1 Вызывается, когда с1еп1гу теряет свой тоНе (непосред- ственно перед его освобождением). По умолчанию, когда это значение равно М(ЛХ, УЕ8 вызывает <риг(). Если вы определяете этот метод, вы должны сами вы- звать гри1()
йапате Вызывается, когда должно быть сгенерировано имя пути к с1еп1гу. Полезно для некоторых псевдо файло- вых систем (яоскГз, р1реЙ5, ...) для задержки создания пути. Реальные файловые системы, вероятно, не хотят его использовать, потому что их с1еп1г1ез присутствуют в глобальном хэше (каске, поэтому их хэш должен быть инвариантом. Поскольку блокировка не удержи- вается, функция (1_(1пате0 не должна пытаться моди- фицировать сам >1еп1гу, если только нс используется соответствующая безопасность 8МР ВНИМАНИЕ: ло1 ика (1 ра1Ь() довольно сложна. Правильный спо- соб вернуть, например, "Не11о'' — поместить его в конец буфера и вернуть указатель на первый символ. Для этого предусмотрена вспомогательная функция <1у патк_ (1пат е(). Пример зЬаЪ1с сЬаг *р!ре^з_с!пате (зЪгисЪ сЛепЪгу *с1епС, сЬаг *Ьийег, тпЪ Ьийеп) { геТит <3упапйс_с1папе(бепргу, ЬиЙег, ЬиПен, "раре: [%1и]", <1епСгу->с1_1пос1е->1 1по) ; } <1 аиютоип! Вызывается, когда необходимо пройти через автомон- тирование с1еп1гу (необязательно). Это должно создать новую запись монтирования УР8 и вернуть запись вызывающей стороне. Вызывающий объект получает параметр пути, задающий каталог автомонтирования для описания цели автомонтирования и родительскую запись монтирования УР8 для обеспечения наследуе- мых параметров монтирования. Значение 1\1ЛХ воз- вращается, если кому-то другому удалось выполнить автомонтирование первым. Если создание ур$тоип1 не удалось, должен быть возвращен код ошибки. Если возвращается -Е18Э1К, то каталог будет рассматри- ваться, как обычный каталог и возвращен в раЛхха!к для продолжения обхода
Глава 9. Файловая система и я дро (1_тапа^е Вызывается, чтобы позволить файловой системе управлять переходом от с1гп1гу (необязат ельно) Это позволяет аиЮГз, например, задерживать клиентов, позволяя демону автомонгирования пройти мимо и построить там поддерево. Значение 0 возвращается, чтобы продолжить вызывающий процесс. Значение -Е18О1К во сражается, чтобы сказать ра1й'уа1к ис- пользовать этот каталог как обычный каталог и игно- рировать все, что смонтировано в нем; и не проверять флат аьгомонтирования. Любой другой код ошибки полностью прервет путь с1_геа1 Файловые системы типа оуег1ау/ишоп реализуют этот метод для возврата одного из базовых с1еп1гу, скрытых оверлеем Помните, что каждый <1еп1гу имеет указатель на его родительский <1еп1гу, а также хеш-список дочерних Лешгу. Дочерние записи в основном похожи на файлы в каталоге. 9.7.2. АР1 кэша записей каталогов Определен ряд функций, которые позволяют файловой системе манипули- ровать с1еп1пе8\ • с1#е1 - позволяет открыть новый дескриптор для существующего с!еп1гу (увеличивает счетчик использования) • <1ри1 - закрывает дескриптор для <1еп1гу (уменьшает счетчик использо- вания, член 1_соип1). Если счетчик использования падает до 0, а (1еп1гу все еще находится в хэше своего родителя, вызывается метод "(1_с1е1е1е'', чтобы проверить, следует ли его кэшировать. Если его не нужно кэши- ровать или если с1еп1гу не хешируется, он удаляется. В противном случае кэшированные йеп1гу помещаются в список ЬКП для восстановления при нехватке памяти. Ф
• Д_Дгор - удаляет Депйу из списка хэшей его родителей. Последующий вызов <1рЩ() освободит Деп(гу, если счетчик использования упадет до 0. • ДДе1е1е - удаляет Деп1гу. Если нет других открытых ссылок на Деппу, то Деп&у превращается в отрицательную Деп1гу (вызывается метод <1_1ри1()). Если есть другие ссылки, то вызывается д_дгор(). • Д_аДД - позволяет добавить Деп1гу в список хэшей его родителей, а затем вызвать д_т81апНа1е(). • Д_тз1апИа1е -1 юзволяет добавить ДепЬу в список хэшей псевдонимов для индексного дескриптора и обновить элемент "<1 тоде". Член "1_соип1" в структуре 1поДе должен быть установлен/увеличеп. Если указатель тоДе равен ЬШЬЬ, Деп1гу называв гея "отрицательной Деп1гу”. Данная функ- ция обычно вызывается, когда создается индексный дескриптор для су- ществующей отрицательной Деппу. • Д 1оокир - поиск Деп1гу по данным его родителя и комп онента имени пути. Он ищет дочерний элемент с заданным именем из хеш-таблицы бсасЬе. Если он найден, счетчик ссылок увеличивается и возвращается ДепПу. Вызывающий должен использовать с!ри1() для освобождения ДепПу после завершения его использования.
Глава 10. Псевдофайловые системы
10.1. Назначение Псевдофайловые системы зузй> (каталог /зуз) и ргос (каталог /ргос) исполь- зуются для настройки системы и получения различной информации о системе и процессах. Свое название псевдофайловые системы получили из- за того, что они работают на уровне виртуальной файловой системы. В ито- ге оба эти средства (назовем их так) для конечных пользователей выглядят как обычная файловая система - вы можете зайти как в каталог /зуз, так и в каталог /ргос. В обоих этих каталогах будут файлы, вы можете просмотреть эти файлы и даже изменить их содержимое Содержимое многих файлов псевдофайловой системы /ргос формируется "на лету". Обратите внимание на размер любого файла в каталоге /ргос - он равен нулю, но если открыть файл, то информация в нем будет. Например, в файле /ргос/уегзюп находится информация о версии Елпих. Монхирование файловых систем зузГз и ргос осуществляется или в сценари- ях инициализации системы, или через /е1с/(з1аЪ. В последнем случае записи монтирования псевдофайловых систем выглядят так:
зуз Сз ргос /зуз /ргос зузГз ;1еГаи1Ьз 0 0 ргос с!е^аи1Ьз 0 0 10.2. Псевдофайловая система 8уф Файловая система зузГз /каталог /зуз) предоставляет пользователю инфор- мацию о ядре 1лпох, об имеющихся в системе устройствах и драйверах этих устройств. На рис. 10.1 представлено содержание каталога /зуз. В нем вы найдете следующие подкаталоги: • Моск - содержит каталоги для всех блочных устройств, которые есть в вашей системе в настоящее время. Здесь под устройством подразумевает- ся наличие физического устройства и его драйвера. Если вы подключите внешний жесткий диск, то в каталоге /зузМечгсез появится новее устрой- ство, но в каталоге /зуз/Ыоск оно появится только, если в системе есть драйвер для работы с этим устройством или же драйвер (модуль) встроен в само ядро. • Ьиз - здесь находится список шин, которые поддерживает ваше ядро. Зап1янув в этот каталог, вы обнаружите подкаталогирсг, рсг_ехргез$, зсз1 и т.д. В каждом из этих каталогов будут подкаталоги Лелчсеь и с1г1уег$. В первом находится информация об устройствах, подключенных к данной шине, во втором - информация о драйверах устройств. • с!а88 - позволяет понять, как устройства фор мируются в классы. Для каж- дою класса есть отдельный подкаталог в каталоге с1аз». • <1еу1се8 - содержит дерево устройств ядра, точнее структуру файлов и ка- талогов, которая полностью соответствует внутреннему дереву устройств ядра. • йгпвтаге - содержит интерфейсы, предназначенные для просмот ра и ма- нипулирования йппхуаге-специфичными объектами и их параметрами. • Ге - информация о файловых системах, которые поддерживает ваше ядро. • кегле! - общая информация о ядре. • шойи!е - здесь вы найдете подкаталоги для каждого загруженного мо- дуля ядра. Имя подкаталога соответствует имени модуля. В каждом из подкаталогов модулей вы найдете подкаталог рагате1егз, содержащий специфичные для модуля параметры.
• роххег - позволяет управлять параметрами питания, а также переводить систему из одного состояния питания в другое. Далее будет показано несколько примеров. Ь1оск |Н18 с1ав8 <Й>* с1еу1се« Пгтшаге Те кегпе! то<1и1е роме г Рис. 10.1. Содержание каталога /хув Довольно интересен с практической точки зрения каталог /зуз/рохмег. В файле Ма1е находится состояние питания. Изменив должным образом со- держимое этого файла, можно изменить состояние питания. Например, вот как можно перевести систему в состояние 'Ъизреш! 1о КАМ", когда питание процессора отключается, но питание на память подается, благодаря чему ее содержимое не уничтожается; $ зис!о есЬо -п тет > /зуз/ронег/зЪаЬе При желании можно отправить систему в состояние "Зизрепд 1о Р1зк", когда содержимое памяти будет записано на жесткий диск, после чего питание будет отключено: $ зидо есЬо -п с11зк > /зуз/ромег/зьаЪе 10.3. Псевдофайловая система ргос Файловая система ргос позволяет отправлять информацию ядру, модулям и процессам. Вы можете не только получать информацию о процессах, но из-
менять параметры ядра и системы "на лету". Эта файловая система интерес- на тем, что позволяет изменять такие параметры ядра, которые невозможно изменить другим способом, к тому же вносимые изменения вступают в силу сразу же. Некоторые файлы в /ргос доступны только для чтения - вы можете только просмотреть их. А некоторые вы можете изменять, и эти изменения сразу же отразятся на работе системы. Просмотреть файлы из /ргос можно любой программой для просмотра файлов, проще всего в консоли использовать ко- манду саГ. саЬ /ргос/<название файла> Записать информацию в файл можно с помощью команды еско, как уже было показано выше: зи<1о есЬо "информация" > /ргос/<наэвание файла> В каталоге /ртос очень много файлов и рассмотреть их все мы не сможем. Прежде, чем мы приступим к самым интересным с моей точки зрения фай- лам, нужно понять, что означают каталоги с числами. Эти каталоги содержат информацию о запущенных процессах. Итак, самые полезные информационные файлы: • /ргос/сгп(11те - содержит параметры, переданные ядру при загрузке. • /ргос/сршпГо - содержит информацию о процессоре, откройте этот файл, думаю, вам будет интересно. Кроме общей информации о процессоре вроде модели и частоты, здесь выводится точная частота, размер кэша и псевдорейтинг производительности, выраженный в ВоцоМ1Р8. Значе- ние Во§оМ1Р8 показывает "сколько миллионов раГз в секунду компьютер может абсолютно ничего не делась". Способ измерения производитель- ности пусть и не самый удачный, но от него до сих пор не отказались, а "на дворе" уже 3-я версия ядра. • /ргос/ёезчсез - список устройств • /ргос/й1езу81ет8 - полный список поддерживаемых вашим ядром файло- вых систем
• /ргосЛшсттирТз - информация по прерываниям, • /ргос/юрог18 - информация о портах ввода/вывсда. • /ргос/тештГо - полная информация об использовании оперативкой па- мяти. Как по мне, вывод этого файла более понятен и удобен, чем вывод команды /гее. • /ргос/тошйя - содержит список подмонтированных файловых систем. • /ргос/тпосЫез - список засуженных модулей и их параметры. • /ртос/ззуарз - содержит список ак!ивных разделов и файлов подкачки. • /ртос/усгзюп - здесь находится • срсия ядра. Используя /ргос можно не только получить информацию о системе, но и из- менить ее Например, в файлах /ргос/8у8/кете1/Ьо81пате и /ргос/зуз/кете!/ ботатпате содержится информация об имени компьютера и домена Вы можете не только просмотреть, но и изменить содержимое этих файлов, из- менив, соответственно, имя узла и имя домена. Хотя практика изменения доменных имен через /ргос/зуз практикуется не часто, никто не мешает вам это сделать: зидо есЬо "зегуег" > /ргос/зуз/кегпеХ/ЬозЪпате зидо есИо "ехатр1е.сот" > /ргос/зуз/кегпеТ/дотатппат.е Файл /ргос/зуз/кетеЕсШ-ак-бе! позволяет регулировать тип перезагрузки системы при нажатии комбинации клавиш С1г1-гА114-Г)е1. По умолчанию в этом файле содержится значение 0. что означает так называемую "мягкую перезагрузку" (вой геЬооТ). Если же вы внесете в этот файл значение 1, то при нажатии С1г1+Ак+Ое1 эффект будет такой же, как при нажатии кнопки Яезе! на корпусе компьютера: зийо есЬо "1" > /ргос/зуз/кегпе1/скг1-а1к-с!е1 Файл /ргос/8ув/кете1/рпп1к позволяет задать, какие сообщения ядра будут выведены на консоль, а какие - попадут в журнал демона 8уз1о^. По умолча- нию в этом файле содержатся значения 4 417. Сообщения с приоритетом 4 и ниже (первая четверка) будут выводиться на консоль. Вторая четверка - это
уровень приоритета по умолчанию. Если для сообщения не задан уровень приоритета, то считается, что его приоритет будет равен 4. Третье значение определяет номер самого максимального приоритета. Последнее значение - это уровень приоритета по умолчанию для первого значения. В большинстве случаев изменяют только первое значение, позволяющее определить, будет ли сообщения с указанным уровнем приоритета выво- диться на консоль или нет. Остальные параметры оставляют без изменения. В файле /ргос/8уз/пе1/соге/пеСдеу шах_Ьаск1о§ содержится максимальное число пакетов в очереди. Значение по умолчанию - 1000 Файл /ргос/зуз/Гз/Шс-тах позволяет изменить максимальное количество за- головков файлов, которое может быть одновременно открыто. Другими сло- вами, этот файл задает, сколько одновременно может быть открыто файлов. Значение по умолчанию для ядра 3.16 и файловой системы ЫгГз - 73054. Чтобы сохранить внесенные "на тету" изменения, и чтобы их не пришлось снова вводить при следующей перезагрузке сервера, нужно отредактировать файл ,'с1с/8узс11.сопГ. Представим, что вы изменили значение из файла /ргос/ зуз/Гз/Ые-тах. Тогда в файл /еЮ/зуясЕ.сопГ нужно добавить строку: Ез.й1е-тах = 16 384 Принцип прост: /ргос,'зуз/ отбрасывается совсем, а в оставшейся строке все слеши заменяются точками. Само же значение указывается через знак равенства. Если нужно указать несколько значений, то они указываются че- рез пробел.
Глава 11.
11.1. Введение в учетные записи Ыпих Для того, чтобы эффективнее работать с ядром Ыпих, нужно хорошо раз- бираться в особенностях учетных записей и группах пользователей Ыпих. Операционная система Ыпих поддерживает регистрацию и одновременную работу множества пользователей. Обратите внимание: именно одновремен- ную работу Раньше, еще во времена ОМХ, были компьютеры, к которым подключалось несколько мониторов и клавиатур. Каждый комплект монитор + клавиатура назывался терминалом и представлял собой от- дельное рабочее место пользователя. Пользователь входил в систему, а его рабочее место в системе отображалось как с€уМ, где М — номер рабочего места. Сегодня такие компьютеры уже более не востребованы, их вытеснили персо- нальные компьютеры, которые и стали называться персональными, посколь- ку предполагают подключение только одного рабочего места. Мониторов можно подключить несколько, а устройство ввода - клавиатура будет одна. Но даже на таких компьютерах возможна одновременная работа несколь ких пользователей. Например, вы можете ьойти в систему как обычно — посредством графического интерфейса. Другие пользователи смогут войти через 8вЬ или Г ГР. И все вы будете работать с системой одновременно 88Н- пользователи смогут выполнять команды и получать результат их выполне- ния, РТР-пользователи — обмениваться с вашим компьютером файлами.
Все учетные записи можно разделить на три вида учетные записи обычных пользователей, учетные записи системных служб и учетная запись гоо1. С учетными записями обычных пользователей все ясно — они имеюг право входить в систему разными способами (если тот или иной способ не запре- щен настройками системы), для них определен домашний каталог (обычно /1юте/<имя пользователя >), пароль и командная оболочка (как правило, в последнее время используется /Ып/Ьазй) Права обычных учетных записей: • Право на вход в систему — по умолчанию обычный пользователь мо- жет войти в систему самыми разными способами, если это не ограничено настройками системы (например, модулями РАМ). Пользователь может войти локально — через консоль или в графическом режиме через дисплей-менеджер вроде ^йт. Также никто не запрещает (опять-таки по умолчанию) удаленный вход, например, по 88Н или ЕТР, если на компьютере, в который осуществляется вход, установлены соответству- ющие службы. • Право на запуск программ, не требующих для своего выполнения прав гоо1 — как правило, такие программы находятся в каталогах /Ып и / изг/Ып А вот из каталога /зЫп запустить программу может только супер- пользователь. Программы, действие которых распространяется на всю систему, например программы изменения сетевых интерфейсов, программы разметки диска, находятся в кагалоге /зЬш (зирег-Ып). Что- бы запустить >ти программы, пользователю нужно получить полномочия гоо1. О том, как это сделать, будет сказано в следующем разделе. • Обычный пользователь может создавать, удалять, читать, изменять, запускать, устанавливать права и выполнять другие операции над фай- лами, которые находятся в его домашнем каталоге. Как правило, это ка- талог /Ъоте/<имя_пользователя>. Хотя администратор может назначить пользователю любой другой катало!. хоть /изегз/Ьа^па, как правило, этого никто не делает Каталог /йоте может находиться физически на одном разделе, что и корневая файловая система, а может находиться и на дру- гом разделе и даже на другом диске. На крупных серверах, как правило, под /1юше отводят целый диск или даже создают К АТ О-массивы дисков. • Право па чтение файлов — обычный пользователь может читать боль- шую часть файлов за пределами домашнею каталога. Исключения раз- ве что составляют домашние каталоги других пользователей (если эти другие пользователи явно не разрешили этому пользователю читать их
файлы) и некоторые файлы/каталоги в /еГс. Например, файл /ею/раззАУд могут читать все пользователи, а вот файл /е1с/вЬа<1о\у — только гоо1. • Пользователь не имеет право вносить изменения в конфигурацию всей системы, то есть устанавливать программы, изменять глобальные настройки устройств, параметры ядра, параметры загрузчика и т.д. • Пользователь имеет право изменить свои пользовательские параме- тры, например, обои рабочего стола, некоторые переменные окружения, которые будут влиять только на его работу и т.д. • Право на изменение своего пароля, но обычный пользователь не имеет право изменять пароль других пользователей. Учетные записи системных служб не имеют право входить в систему. Для них не задан ни пароль, ни домашний каталог, а в качестве оболочки исполь- зуется /ЫпЛгие или /Ып/Гаке - - чтобы пользователь, используя учетную за- пись службы, не мог войти в систему через консоль, От имени таких учетных записей выполняются различные службы, например, от имени пользователя улу\у-ба(а выполняется веб-сервер, — учетная запись для (ЭЬЮМЕ О1зр1ау Мапа§ег и т.д. Пользователь то/ — пользователь с максимальными правами, он может делать все: • Право на изменение любого файла — гоо/ может читать, записывать, удалять любые файлы, в том числе и файлы в домашних каталогах других пользователей. • Право на изменение конфигурации системы — пользователь гоо1 мо- жет изменять конфигурацию системы посредством редактирования фай- лов в каталоге /с1с, /ргос, запуска конфигураторов системы. • Право на запуск любых программ — гоо1 может запустить любую программу, в каком бы каталоге она ни находилась. • Право на создание, удаление, изменение (в том числе изменение паро- ля) других учетных записей. • Право на установку и удаление программ.
Власть пользователя гоо1 неограниченна. Так было до определенного мо- мента, пока не появились системы принудительного контроля доступа вроде ЗЕЬтих, ЬГО8, Тотоуо, которые могут ограничить даже самого гоог. Вот только беда в том, что ЗЕЬших, ЫЛ8, Тотоуо и другие подобные системы по умолчанию неактивны или даже не установлены, поэтому пока их не ак- тивировать, пользователь гоо( будет все равно самым главным. Примечание. Напомним, сто когда у вас привилегии пользова- теля гос1, приглашение командной о роки заканчивается симво- лом а когда вы работаете как обычный пользова1ель — $. 11.2. Получение полномочий гоо1 Самый простой способ получить права гоог — это войти как гоо1. То есть при входе в систему вы указываете имя пользователя гоо1 и пароль, указан- ный при установке. Проблема в том, что не во всех дистрибутивах этот трюк сработает. Учитывая всю опасность, которую несет использование учетной записи гоо1, во многих дистрибутивах учетная запись гоо( отключена, а пхед как гоог ограничен самыми разными способами. Включать учетную запись гоо1 не рекомендуется — ведь злоумышленник знает, что учетка гоо1 есть везде и ему не придется угадывать имя пользователя, останется только по- добрать пароль ,оо/. А так вы исключаете даже саму возможность входа как гоог Тем более права гоо( можно получить другим образом, о котором мы поговорим далее. А пока рассмотрим способы блокировки входа (кроме отключения учетной записи) гоо1. Часто вход как гоо1 ограничен на уровне менеджера дисплея. В дистрибути- вах, где используется графическая среда КЛЕ и менеджер экрана КОМ (К Л1зр1ау Мапа§ег), нужно отредактировать файл /е1с/а11етаЪуе5/к±п4-сопй§. В нем нужно найти директиву А11оугКоо1Ьо§1П и присвоить ей значение 1гие, чем вы разрешите вход как гоог в графическом режиме. При использовании ОЛМ (Опсше Л1зр1ау Мападег) вход как гоо( ограничен не столько конфигурацией самого ОЛМ, а столько РАМ-модупями. Нужно открыть /егс/рат.д/ёдт-раяя^оп! и найти строку, отвечающую за запрет вхо- да как гоо! Она может выглядеть, например, так: аи€Ь гедитгед раго_ зиссеес1_1^.8о изег != гооЬ дигеЪ Г-----
Некоторые дистрибутивы разрешают заходить как гоо1 даже в графическом режиме. Просто они отображают предупреждение о том, что работать как гоог небезопасно. Пример такого дистрибутива - СепЮ8. В Ьтих используется оболочка Г1у, конфигурационные файлы которой хра- нятся в каталоге /е(с/йу. Это собственная разработка, которую нс встретить в других дистрибутивах. За графический вход в систему отвечает Яу-агп (Р1у П18р1ау Мапагег), конфигурационные файлы которого находятся в ката- логе .егс/ХН/Йу-йш. Основной файл конфигурации — йу-йтге. Самое ин- тересное, что вход как гоог в Ыпих по умолчанию разрешен — параметр А1кнуВ.оо!Ы>йй1 установлен в 1гие (рис. 11.1). Поэтому если вам очень силь- но хочется войти как гоо1 в графический режим, вы можете это сделать, но сначала вам нужно изменить пароль самого пользователя гоо1 — как это сде- лать, будет показано далее. Пока нужно отметить, что вход как гоо1 что в графическом, что в настольном режиме — очень опасная штука. Поэтому если вы за безопасность, выключите данный параметр (значение/а 1зё), а для временною получения полномочий гоо1 используйте команду чиНо (будет показано далее). Иайл Правка Настройка Справа* •ь & ® В < У*•ёи1: 15 /игг /1 сса 1 - ЬI * /Пэг /ей с: /й >й вНюггРаИт т 1ле РЮН: тег ЗеЪзй УХвПир е1с. ч аИ&ий /(а "Лиг ;Сса;/5э:вт/и?г/1сса1/Ып:/и5г/зЫп:/мзг/Ь(п /ввит:/б1п'’ з 1пе йз’вии 1 Ы ’/ЫпАзвйЯ’' «Ь’у з -.сшзГе 11-/Ь:г»7Ьйв& н кпеге *б РЫ изег е Х-аегуёг -зММОга-Ййр' 1’Не ь? -? ХаиМну-Ии сэнлох Ъё сгеа'ей л Оегёур. Ы 71рр‘ 1 I? (гие. -л 11 Йе иеей угйжпйИ йпаНу ]Цо*ссизсгНигНцг'1гие н 14йЙ6®г (о у гейХаг( &ёз:йоо& Х-мг-мег сга-бег п Ноге (ад ей&Нпд (п;з с (гсыиадпИл? {-аЕгейч 1эсйг9 о’Иег ДМЙ- ч Р Ш рнё Ы (а!се чЫгс1зс1п-га1зЕ « йием гйй: 1одю5 « 1,-??аиВ: 13 п, ^Ьеп ъзек Ьа& тлх ап ейэ.гц авёаисгй? Н 0»'аи1* 13 1гис ч Нос Ни! 1Раз'3&(Гг-#а1.&е нетям •етдйл • лжзмм» .етимв 'Ивам /щщан «жшии ваааавюаммн Рис. 1}.1. Файл конфигурацииф1у-йтгс
Настоятельно рекомендуется работать в системе как обычный пользователь, а максимальные права получать только тогда, когда они вам действительно нужны. Например, когда понадобится запустить какую-то программу, требу- ющую права гоо1. При этом вам особо ничего не придется делать, кроме как ввести пароль. Рассмотрим пример Вы установили, например Л81га Ъших, и при установке создали учетную запись тагк и задали пароль. По умолчанию инсталлятор создаст первую учетную запись так, что она вносится в группу зис1о — членам этой группы можно выполнять команды с привилегиями гоо1. Други- ми словами, созданный во время установки пользователь уже является гоо1, только с некоторыми оговорками. Настройки, позволяющие группе зиЛо выполнять команды от имени гоо1, хранятся в файле /е1с/8Н(1оег8. В этом файле указываются все учетные записи, имеющие право выполнять административные задачи. Когда вы по- пытаетесь выполнить одну из таких задач, например, добавить нового поль- зователя, графический интерфейс автоматически запросит у вас ваш пароль. Аналогично, когда вы будете пытаться запустить командную оболочку (ко- манда зи<1о Ъазк) с правами гоо(. Это будет не пароль гоо1, а ваш пароль, то есть пароль пользователя тагк (рис. 11.2). Ему разрешено выполнять адми- нистративные задачи, просто система пытается убедиться, что вы — это вы, а не некто, кто оказался за вашим компьютером во время вашего отсутствия. Рис. 11.2. Запуск командной оболочки с правами гоо1 — команда зиЛо Ьазй. Нуж- но ввести пароль пользователя тагк, а не гоо1!
Когда же вам нужна командная строка с правами гоо(, не обязательно даже переключаться в консоль. Достаточно открыть терминал и ввести команду 5и. Она попросит вас ввести пароль гоо1. После ввода пароля вы получаете терминал с правами гоо1. Это означает, что все команды, которые вы будете вводить после ввода команды хи и успешной аутентификации, будут выпол- няться с правами гоо1. Примечание. Если учетная запись гоо1 отключена, то вы не смо- жете использовать команду зийо, так как она предполагает ввод пароля гоо(. а вы его не знаете. Когда вы — единственный администратор, команда хи — идеальный вари- ант. Но когда администраторов несколько, команда хи — не выход, посколь- ку пароль гоо1 нужно будет сообщить всем остальным администраторам Если потом возникнет нестандартная ситуация, выяснить, кто виноват, будет сложнее. На этот случай у пользователя гоо1 могут быть доверенные лица. Это может быть помощник администратора, его заместитель — называйте, как хотите. Есть лица, которым разрешено получать права гоо1. Такие лица вносятся в файл /е1с/зи(1оег8 (если вам не лень прописывать каждого отдельно) либо в группу кш1о (так правильнее). Рис. 11.3. Редактирование файла /е1с/хидоегх
Редактировать файл /е1с/зидоегз можно только через команду уйшк> (рис 11.3): ехрогЪ ЕВ1Т0К=папо зидо ттзидо Первая команда устанавливает переменную окружения ЕИ1Т0К, задающую удобный текстовый редактор, который будет использован для /ей/зпбоегз. Вторая команда вызывает утилиту для редактирования файла /еЩ/зидоегз. Представим, что у нас есть пользователь 1>а§1га, которому нужно разрешить делать все, что можно пользователю гоо1. Для этого нужно добавить в /е1с/ зидоегз запись вида: ЬадГга АП-(АЬЬ:АЬЬ) АЬЬ Можно также добавить запись: %зис!о АЬЬ=(АЬЬ:АЬЬ) АЬЬ Она означает, что членам группы зийо можно делать все, что можно делать пользователю гоо1. Тогда всех администраторов-помощников нужно доба- вить в группу 811(10 (далее будет показано, как это сделать;. Сохраните файл и выйдите из редактора. Войдите как пользователь, которо- му вы предоставили право зидо. В нашем случае — это пользователь Ъа&га. Далее введите команду, которая требует нрав гоо1 через команду зи&г. зийс <команда> Например: зидо ЬазЬ Обратите внимание: система запрашивает пароль пользователя, а не пароль гост Пользователь указывает свой пароль, а система знает, что ему разрешено получать права гоо1. В итоге наши помощники не знают пароль
гоог и смогут выполнять определенные действия с правами гоог под своим именем. Как правило, вам не нужно вообще редактировать файл /е1с/$ис1оег8. Приве- денная информация о его формате — только для общею развития. На прак- тике вам нужно просто добавить пользователя в группу $ис1о, чтобы у него появилась возможность получать права гоог: зеДо изегтос! -а -С зи<1о Ьад±га Данная команда изменяет 1руппу для пользователя Ьа§1га, добавляя (-а) в список групп пользователя группу (-0) зийо. Контролировать получение прав зийо можно командой'-: # Ьа11 /уаг/Тод/аисН.1од I дгер зидо Посмотрите на рис. 11.4. Для примера, 6 июля 2022 года в 7.16 пользователь тагк пытался выполнить команду зийо для выполнения команды Ьазк. То есть з журнале отображаются не только попытки использования зийо, но и журналируются даже вводимые пользователями команды. Рис. 11.4. Журнал аутентификации аигкЛо^ 1 В некоторых дистрибутивах журнал аутентификации называется зесиге, а не зиСЬ.10^.
Если вам нужно получить некоторый аналог команды $и, чтобы вы могли вводить сразу неограниченное количество команд с максимальными нрава- ми без приставки ,?и<7о, используйте следующий трюк — запустите с макси- мальными правами оболочку Ъахк. Все команды, вводимые в этой оболочке, будут выполнены с максимальными правами: яидо ЬазЬ Закрыть такой сеанс можно командой ехН. Прежде чем перейти к следующему разделу, разберемся, как сменить пароль пользователя гоог. Для этого нужно просто задать пароль: зидо развод гооЪ Сначала нужно ввести ваш пароль, затем новый пароль для гоо1, после этого — подтвердить пароль. После этого вы сможете войти в систему как гоо1 в консоли. Для входа в графическом режиме нужно редактировать файл, отно- сящийся к РАМ, как было сказано ранее. Отметим, что активация пользова- теля гоо1 — занятие небезопасное, гораздо правильнее использовать коман- ду зи<1о. На личном компьютере еще такое мероприятие допускается, но на сервере — такое делать воспрещено. 11.3. Управление учетными записями пользователей 11.3.1. Создание учетной записи пользователя Создать новую учетную запись пользователя можно командой асШизег. Пример: зидо аддизег еVд * Г“
В большинстве случаев иМизег просто добавляет в файл /е1с/ра88\у<1 учетную запись пользователя. Но в Ыпих данная команда запрашивает нс только имя пользователя (которое передается команде в качестве первого параметра), по и пароль пользователя. Также есть возможность ввести дополнительную информацию о пользователе, если есть такая необхо- димость (см. рис. 11.5). Рис. 11.5. Создание нового пользователя в Ыпих Если при создании пароль задан неверно (вы задали слишком прост ой или слишком сложный пароль и хотите его изменить), можно сменить пароль с помощью командырахзм>4'. зийо разз^с! имя_пользователя Напсмню, что для добавления учетной записи пользователя нужны права госи. который пользователь может получить через зи или зискз, если он вне- сен в /еЩ/зибоегь и ему разрешена операция добавления пользователя. В Ыпих есть т акже графический конфигуратор и создать пользователя мож- но не только с помощью команды аМизег. Чтобы открыть графический кон- фигуратор и создать пользователя, выполните следующие действия-
1. Откройте Панель управления. 2. Перейдите в раздел Безопасность и запустите Управление политикой безопасности. 3. Перейдите в раздел пользователя и нажмите кнопку + на панели инстру- ментов. 4. Заполните информацию о пользователе и нажмите зеленую галку на па- нели инструментов для сохранения пользователя (рис. 11 6). Рис. 11.6. Создание пользователя, графический метод 11.3.2. Файлы /е1с/ра$$уус1 и /еСс/вЬайоз? При добавлении учетной записи происходят следующие действия (вкратце): • Добавляется запись в файл -еЗс/раьаж! — это небольшая база данных о пользователях в текстовом формате. Этот файл могут просмотреть все пользователи. • Если при создании учетной записи утилита запрашивает пароль, то он будет внесен в файл /еЗс/ьЬабозу. Пароли в этом файле хранятся в зашиф- рованном виде, а доступ имеет только то1. Команда раззий <имя>, из- меняющая пароль пользователя, вносит изменения как раз в этот файл.
• Создается домашний каталог /Ъоте/<имя>, и в него копируется содержи- мое каталога 'еЩ/зке!. • Создается почтовый ящик пользователя в каталоге /уаг/зроо1/та11. • Владельцем каталога /Ьошс/<имя> и всех файлов и каталогов в нем назначается создаваемый пользователь. Рассмотрим формат файла /е^с/раязчч!: имя_пользователя:пароль: 0Ю: 010:полное_имя:домашний_каталог:оболочка Вот фрагмент этого файла: еуд :х: 1000 :1000 : еVд: /коте/е^д: /Ып/ЬазЬ тагк:х: 1001:1001: : /Иотс/тагк: /Ып/ЬазЪ Формат файла ?етс/ра88\у<1 приведен в таблице 11.1. Таблица 11.1. Формат файла /е1с/рамн>й Номер поля Название Описание 1 Имя пользователя Имя, использующееся при входе в систему 2 Пароль Поскольку пароль пользователя хра- нится в файле /еЬс/зИасклу. то в файле / е1с/ра88\у<1 вместо пароля просто ука- зывается символ ’х* 3 СЮ Идентификатор пользователя 4 его Идентификатор группы пользователя
5 Полное имя поль- зователя Устанавливается администратором и ни на что не влияет. В крупных орга- низациях имя пользователя помогает установить контакт с пользователем. Это поле может также содержать номер телефона, номер комнаты и прочую информацию, кот орую запра- шивает аМихег яри создании пользо- вателя 6 Домашний ката- лог пользователя Обычно это /Ьоте/<имя пользовате- ля> 7 Оболочка Программа, которая будет запущена при входе пользователя в систему из консоли (для графического режима это поле не имеет значения). Список доступных оболочек хранится в файле ЛЯс/зЬеПз В файле /етс/зкаЛоху полей больше, чем в /е1с/ра?8\у<1 Как и в случае с /е€с/ развей, поля разделяются двоеточиями: 1. Имя пользователя. Совпадает с именем пользователя в файле /е1с/раь§\у4. 2. Зашифрованный пароль. Позже мы поговорим о том, как распознать алго- ритм шифрования, которым был зашифрован пароль. 3. Количество дней (с 1 января 1970 года), когда пароль был сменен в последний раз. 4. Число дней до смены пароля. Если в этом поле 0, то пароль может быть сменен в любой момент. 5. Количество дней, после которых пароль должен быть сменен. Обычно здесь значение 999999, которое показывает, что пользователь может ни- когда нс менять свой пароль.
6 Число дней, в течение которых пользователь получает предупреждение о необходимости изменить пароль. Обычно такие предупреждения пользо- ватель получает за неделю (7 дней) до часа "X". 7. Число дней после окончания действия пароля, когда еще пользователь может работать со старым паролем. Если после этого срока пользователь не сменит пароль, учетная запись будет заблокирована. 8. Число дней, начиная с 1 января 1970, после которых пароль будет забло- кирован. 9. Не используется. Обычно последние три поля не используются. По зашифрованному паролю можно понять, какой алгоритм шифрования использует система. Посмотри- те на начало зашифрованного паро.тя. • $1$ — МО5. Ранее часто использовался, сейчас чаш,е используется ЯНА- 512, поскольку в МП5 обнаружились математические уязвимости. • $2$, $2а$ — В1отуйзЬ. Чаще используется в ГгееВЯП/ОрспВЯЭ, чем в Ыпих. • $5$ — 8НА-256. • $6$ — 8НА-512. Используется з современных дистрибутивах. Форматы файлов /еЩ/раззхчб и /егс/аЬаткпу были приведены "для общего раз- вития", чтобы вы понимали, что происходит. Модифицировать учет ную за- пись пользователя правильнее с помощью команды изеппос1, а не с помощью редактирования файла /егс/раяйхчд. Конечно, можно внести небольшие изме- нения, например, изменить полное имя пользователя. А вот для изменения остальных параметров, например, домашнею каталога, правильнее исполь- зовать изеппоЛ, чтобы потом не делать мною ручной работы. 11.3,3. Изменение и удаление учетных записей Как было отмечено, ранее для модификации учетной записи пользователя нужно использовать команду изегты!, но прежде поюворим об изменении
пароля, так как изменение пароля — это тоже, по сути, изменение учетной записи. Для установки и изменения пароля пользователя используезся команда равней # раззмд <имя> Если пользователь хочет изменить собственный пароль, то указывать имя не нужно: $ раззиН А вот теперь можно приступить к рассмотрению команды и$егто(1 Формат вызова этой команды следующий: # изегтод [параметры] учетная запись Параметры команды и^егто<1 описаны в таблице 11.2. Таблица 11.2. Параметры команды ихегтой Параметр Описание -а, -аррепс! Добавляет пользователя в дополнительную группу. Используется только с параметром -(3 -с, —соттегН комментарий Добавляет комментарий для учетной записи пользователя -с1, —коте каталог Задает новый домашний каталог пользовате- ля. Если указать параметр -т, то текущий до- машний каталог пользователя будет перене- сен в новый домашний каталог, который будет создан, если не существует Ф.................. «-а
-е, —ехрйе^аТе дата Указывает дату устаревания учетной записи пользователя. По достижении этой даты учет- ная запись пользователя будет заблокирована. Дата указывается в формате ГГГГ-ММ-ДД. Пели дату не указывать, то устаревание учет- ной записи будет отключено -/, —тасОме дни После указанного числа дней, которые прой- ду] после устаревания пароля, учетная запись будет заблокирована. Значение -1 означает, что эта возможность нс используется, а 0 — запись будет заблокирована сразу же после устаревания пароля §, - §М группа Указывает имя или 61Г) первичкой группы пользователя Группа с таким именемАИО должна существовать. Бее файлы в домашнем каталоге пользователя, которые принадлежа- ли бывшей первичной группе, теперь будут принадлежать новой группе -С, —уоирз группа![, группа2,..., группам/ Список дополнительных групп, в кото- рых находится пользователь. Перечисление групп осуществляется через запятую без дополнительных пробелов. Например, -О ёгоир1,ёгодр2 -1, —1о§1п новое_имя Изменяет имя пользователя на новое имя. -Ь, —1оск Блокирует учетную запись пользователя. Нельзя использовать этот параметр с -р или -I -т, -тоуе-коте Перемещает домашний каталог Используется вместе с параметром -д -о, -поп-итдие При использовании с -и позволяет указать не уникальный 1111) (идентификатор пользовате- ля) я.“-.г4з чг'.«,Т Утл
-р, -ра^люгс! пароль Шифрованное значение пароля, которое воз- вращает функция сгур1. Использовать этот параметр не рекомендуется, поскольку дру- гие пользователи увидят незашифрованный пароль в списке процессов -К, -гоо1 скгоо( Выполняет изменения в каталоге сйгоо! и ис- пользует файлы конфигурации из этого ката- лога -5, —зкеИ оболочка Задает оболочку для пользователя. Если обо- лочка не указана, то будет использована обо- лочка по умолчанию -и, —ий!1)Ю Задает новый 1ЛГ) пользователя, который дол- жен быть уникальным -1}, —ип1оск Разблокирует учетную запись пользователя -7, -хеИпих-изег 8Е1/ЯЕК. Новый пользователь ЗЕЫпих дзя пользова- тельского входа Рассмотрим несколько примеров: # изегтод -д /Ьоте/пем_1юте ~т тагк # изегтой -Ь тагк # изегтод -С асЗпйпз, зис!о тагк Первая команда задает новый каталог для пользователя тагк. Теперь он бу- дел называться /йоше/пем- Ноте. Старые файлы (из каталога /Ьоте/иЬипШ) будут перемещены в новый домашний катало!’. Вторая команда блокирует учетную запись пользователя тагк. Третья ко- манда вносит пользователя тагк в группы айпипь и зийо. Теперь рассмотрим команду изег<1е1 (см. табл 11.3): # изегае! [параметры] пользователь Ф
Таблица 11.3. Параметры команды изегйе! Параметр Описание ~/огсе Удаляет учетную запись, даже если пользователь работает в системе Также будет удален домашний каталог и почтовый ящик, даже если другой пользо- ватель использует тот же домашний каталог. Если в файле /е1с/1о§»п.с1е#$ параметр С8ЕКСгКО11Р8_ЕКАВ равен уез, то будет удалена и первичная хруппа поль зовате;ы, даже если она является первичной и для другого пользователя. Довольно опасный параметр, который может привести систему в нерабочее состо- яние -г, —гетоке Удаляет домашний каталог пользователя и почто- вый ящик. Файлы этою пользователя, созданные на других файловых системах, нужно искать и удалять вручную -К, —гоо1 скгоо! Выполняет изменения в каталоге сЬгоо! и использует файлы конфигурации из этого каталога -2, -зеИпих-изег Удаляет все пользовательские сопоставления 8Е1лпих для учетной записи пользоват еля Пример удаления учетной записи иЪипШ, домашний каталог и почтовый ящик также будут удалены: # изегде! -г иЬипСи 11.3.4. Группы пользователей Для более простого управления пользователями их можно объединять в группы. Например, можно задать ограничения ресурсов для группы пользе-
вателей. Тогда они будут распространяться на всех пользователей, входящих в группу, и вам не придется их устанавливать для каждого пользователя от- дельно. Но, прежде чем устанавливать права для группы, нужно эту группу создать. Добавить группу можно командой руоираМ, однако ничего плохого не слу- чится, если вы просто отредактируете файл /еТс/^гоир (не ^гоирз, а именно §гоир!) и добавите группу вручную. При добавлении группы следите, чтобы Ю группы был уникальным. Если же вы нс хотите ни за чей следить, тогда просто введите команду хгоираМ'. # дгоърадд [параметры] имя_группы С параметрами команды ^гоираМ можно ознакомиться в справочной систе- ме — шап ^гоирадс!. 11.4. Модули РАМ Подключаемые модули аутентификации РАМ (Р1и§§аЫе АиШепбсабоп МосЫез) предоставляют администраторам дополнительные методы под- тверждения подлинности пользователя. Модули РАМ — это не новинка в мире Ыпих. Они были разработаны очень давно, но до сих пор есть даже в самых современных дистрибутивах Ыпих, поскольку заменить их, по сути, нечем. Модули РАМ позволяют использовать несколько схем аутентификации. Большинство приложений, которые нуждаются в проверке подлинности пользователя, используют РАМ. Модули РАМ позволяют реализовать аль- тернативную аутентификацию, например, по отпечаткам пальцев или но сет- чатке глаз, но для этого необходимо дополнительное оборудование, напри- мер, сканер отпечатко з. В этой книге мы рассмотрим традиционный вариант использования РАМ — когда аутентификация происходит посредством вво- да пароля с клавиатуры. Основной файл конфигурации называется /еЮ/раш.сспГ В каталоге /е!с/ раите!/ находится конфигурация для разных сервисов, которые поддержива- ют РАМ, например, в /егс/рапг.Ф'аьйб находится конфшурация РАМ-модулей для 88Н, в /е!с/рат, б/йу-бт — конфигурация пароля для менеджера дисплея
Р1у Б18р1ау Мапа§ег и т.д. В каталоге /еЮ/яеспгПу также есть файлы конфигу- рации, относящиеся к РАМ, например, файл ассезз.сопйуправляет доступом в систему. Безопасность вашей системы зависит от используемых вами модулей. Модули хранятся в каталоге /НЪ/зесигйу или /11Ьб4/ьеситу (для 64-битных систем), однако некоторые дистрибутивы не следуют этому стандарту. К примеру, в некоторых системах модули можно найти в каталоге /ивг/НЬ/ зесигйу. При желании можно написать и собственные модули, но для начала следует разобраться с уже имеющимися. Ниже приведен список наиболее часто используемых модулей. Больше информации по каждому из них мож- но получить, набрав тап модуль, к примеру, тап рат_рюскеск. Обратите внимание, что нет "стандартного списка" модулей. Их состав варьируется от дистрибутива к дистрибутиву. • рат_ассе$8 — разрешает или запрещает доступ, в зависимости от 1Р- адреса, имени пользователя, имени хоста или доменного имени и т.п. По умолчанию правила доступа определены в файле /еЮ/зесипТу/ассезз.сопГ. Когда пользователь входит, проверяются правила доступа до первого совпадения, и принимается решение, разрешить или запретить доступ. Также смотрите модуль рат йте — там другие ограничения. • рат сгаскИЬ и ратргускеск — предоставляют функции проверки прочности пароля (проверки на легкость угадывания или повторяемость). У пользователя спрашивают пароль, и если он проходит предустановлен- ные правила и считается прочным, тогда нужно ввести его еще раз для проверки правильности ввода. • ратЦепу — безусловно запрещает доступ. Этот модуль можно исполь- зовать для блокирования пользователей как политику по умолчанию (см также рат_реппй). • рат_ес1ю — выводит предустановленное текстовое сообщение. См. так- же ратптоМ. • рат _епу — позволяет присвоение значений переменным окружения. Правила по умолчанию берутся из файла /е1с/8есип1у/рат_епу.соп€ • рат_ехес — вызывает внешнюю программу. • рат_1а$гкщ — выводит дату и время последнего входа в систему.
• рат Нтйз — устанавливает ограничения на системные ресурсы, ис- пользуемые пользователем. Ограничения по умолчанию берутся из фай- ла /е^с/ьесигйу/НппЬ.сопГ. • рат К$№1е — разрешает или запрещает сервис в зависимости от значе- ний в файле. К примеру, если вы хотите открыть РТР-доступ лишь для не- которых пользователей, перечень которых указан в файле /еЩ/йривеге ок, нужно добавить строку аи1И гецшге<1рат_Н$1/11е.8О йет=ияег&ег.зе~а11о^ ^1е=/еГс//1ри8ег8_ок опегг-/аИ в файл е1с/рат д/йрб (см. также модуль рат_по]о§:п;. • рат_таП — сообщает пользователю о наличии свежей электронной почты. • раттккотесПг — создает домашний каталог пользователя, если он не существует на локальной машине. Таким образом, можно использовать централизованную авторизацию (к примеру, в К18 или ЬВАР) и создавать домашние каталоги лишь при необходимости. • рат тоШ — выводит "сообщение дня". См. также модуль рат есЪо • рат_по1о§1п —- запрещает доступ, когда существует файл ^с/поЬ^ш. • ра1П_регп1к — безусловно разрешает доступ — очень небезопасно! (см. также модуль раш бепу). • рат_гоо{ок — разрешает доступ для пользователя гост без дополнитель- ных проверок. Обычно этот модуль используется в /е1с/рат.с1/8и, чтобы пользователь гоо1 мог войти под любым другим пользователем даже без ввода пароля. Файл должен содержать следующие строки (обратите вни- мание на вторую строку, см. модуль ратмЖее!): аиСЪ зийсхепЬ рат_гоо1;ок. зо аиЪИ гедиггес! рат_иЬен!. зо аиЬИ гедиггед рат_иг.1х. зо • ратзиссеебИ — проверяет некоторые характеристики учетной записи, к примеру, принадлежность к определенной группе, значение (Л В и т.п. • рат _йте — запрещает доступ к службе в зависимости от дня недели и времени дня По умолчанию правила берутся из файла еЩ/зесипту/Нте. сопГ. Однако запрет накладывается лишь на момент входа в систему. Спо- соба принудительно заставить пользователя выйти из системы нет.
• рагпитахк — устапаниивает Vаску создания файлов. • ратишх или рат_итк2 — классическая аутентификация в ЦМХ- стилс, основана на файлах /си/раззж! и /е1с/$Ьас1о\у (см. также модуль ратизешЬ) • ратизегбЬ — аутентифицирует пользователя с помощью базы данных (см. также модуль раш шнх). • рашххагп — заносит название службы, номер терминала, пользователя и другие данные в системный журнал. Модуль можно использовать везде, он не влияет на процесс аутентификации. • ратхуйее! — позволяет гоЩ-доступ лишь для членов группы \УЙее1. Часто этот модуль используется для $и, чтобы лишь избранные пользова- тели могли пользоваться этой программой. Пример использования можно найти в описании модуля раш гоо^ок. Если книга не посвящена отдельно РАМ, лучше всего рассматривать РАМ на отдельных примерах. 11.4.1. Ограничиваем доступ к системе по 1Р-адресу Файл /еЩ/зесипГу/ассезз.сопГ используется модулем раш ассезз.зо, чтобы определить, каким пользователям позволено входить в систему и с каких 1Р-адресов. Если открыть файл ассезз.сопГ, то в нем будет достаточно много различных примеров, которые хорошо прокомментированы. Если вы знаете английский язык, то не составит особого труда во всем разобраться самостоятельно Формат этого файла следующий: разрешения : пользователи : источники Разрешение может начинаться с символа "+" (доступ разрешен) или (доступ запрещен). Если нужно указать несколько пользователей, то их име-
на разделяют пробелом. Если нужно сделать исключение для некоторых пользователей, то перед их именами указывают служебное слово ЕХСЕРТ Третье поле может содержать список из одного или более имен консолей (йу) — для несетевого доступа к системе, имен узлов (для сетевого досту- па), доменных имен (начинаются с "."), 1Р-адресов узлов, 1Р-адресов сетей (заканчиваются "."). Также можно указать все источники (АЬЬ), ни один из источников (МОКЕ) или только локальные источники фОСАЬ). Теперь несколько примеров- -:АЬЬ ЕХСЕРТ гоог:ТТу1 Первая консоль — это только консоль гооС Другим пользователям запреще- но ее занимать. Мы запрещаем доступ (-) всем пользователям (АЬЬ) кроме (ЕХСЕРТ) пользователя гоо( на консоли йу1. Следующий пример — разрешение регистрации как юо( с определенных 1Р- адресов: + : хооН : 192.168.1.1 192.168.1.4 192.168.1.9 + : гооС : 127.0.0.1 Если нужно разрешить регистрацию гоо1 со всей подсети 192.168.1.0, тогда укажите адрес этой подсети, указав точку вместо 0: + : гооЪ : 192.168.1. Самый жесткий пример — запрещаем то( вообще входить в систему: - : гооЪ : АШ Примечание. Обратите внимание, что комментарии в этом фай- ле начинаююя с #, если вы хотите использовать один из приме- ров, приведенных в файле, убедитесь, что вы раскомментирова- ли нужную вам строку. Г 1 245 -
Чуть выше мы разрешили вход пользователя гоо1 с определенных 1Р-адресов. К сожалению, одного только редактирования ассезь.сопГ будет недостаточ- но. Нужно еще отредактировать соответствующие файлы в /е1с/рат.<1. Нас интересует регистрация по 88Н (1е1пе1 уже не используется, поэтому вы бу- дете регистрироваться по 88Н) и обычная регистрация в системе. Поэтому нам нужно отредактировать файлы 'еХс/рат.д/взМ и /еЩ/рат.б/чучГет-аигЬ. В этих файлах вам нужно добавить строчку: ассоипЪ гедиггеЦ /ИЬ64/зссиг1Ту/рап1 ассезз.зо Если у вас 32 разрядная система, тогда нужно добавить немного друтую строку: ассоипЪ гедиггей /11Ь/зесиг±'Ьу/рат_ассезз. зо 11,4.2. Ограничиваем время входа в систему Безопасностью системы лучше управлять, когда вы бодрствуете. Поэтому имеет смысл разрешить регистрацию только в это время, например, с 8:00 до 19:00 (вдруг кто-то немного задержится на работе). Откройте файл /е^с/кесигйу/йте.сопГ и добавьте в него строку: 1од1п;1_ру* & 'ТГур*; ! гооЬ & аскпгп & ; 1А10800-19С0 Здесь мы разрешаем пользователям регистрироваться только с 8:00 по 19:00. На пользователей гоо1 и ас1тт это правило не распространяется. Также ч файле бте.соп! вы найдете еще несколько примеров. Как и в случае с предыдущим файлом, вам нужно изменить файлы /е!с/ рат.сЕьзЬб и /е1с/рат.(1/8у8(ет-аЩЬ, в которые нужно добавить строку: ассоипЪ гедитгеЦ /ПЬ64/зесиг11;у/рат_(11те. зс или строку (для 32-разрядкой системы):
ассоипъ гедитгес! /ИЬ/зесигИ:у/рат_Мте. зо 11,4.3. Ограничение системных ресурсов с помощью РАМ С помощью РАМ-модулей можно ограничить системные ресурсы, что по- лезно для защиты системы от ЭоЗ-атаки. Принцип По8-атаки заключается в том, что злоумышленник узурпирует все ресурсы системы, б результате обычным пользователям ничего не остается. Ограничив системные ресурсы, вы можете смягчить последствия ЭоЗ-атаки на ваш сервер. Конечно, полной защиты этот способ не даст, но все равно ваш сервер будет продолжать рабо тать, хоть и медленно. Все же это лучше, чем ничего Ограничить системные ресурсы можно с помощью /е1с/8есиН1у/НтЙ8.сонГ Формат записей в этом файле такой: домен тип ресурс значение В качестве домена указывается или имя пользователя, или имя группы поль- зователей (@имя). Также можно указать звездочку (*), если шраничение должно распространяться на всех пользователей. Ограничения бывают мягкими («ой) и жесткими (Иагб). Мягкое ограничение можно незначительно превысить, жест кое превысить нельзя. Возможные значения третьего поля задают тип ограничиваемого ресурса и предст авлены в таблице 11.4. Таблица 11.4. Ресурсы, которые можно ограничить с помощью Нпй1з.соп/ Элемент Описание соге Позволяет ограничить размер (Ьайла ядра (в килобайтах) сри Задает максимальное процессорное время (в минутах) (Ша Определяет максимальный размер сегмента данных (в ки- лобайтах)
Позволяет указать максимальный размер файла (в килобай- тах) тах1н§1П8 Определяет- максимальное количество параллельных реги- страций пользователя. По умолчанию пользователю раз- решается войти неограниченное количество раз разными способами — по 88Н, РТР, с разных консолей и т.д. П(1й1е Задает максимальное число одновременно открытых фай- лов пргос Определяет' число процессов, которые может запустить пользователь рпогйу Задает приоритет, с которым будут выполняться процессы пользователя или группы 5 Гаск Максимальный размер стека (в килобайтах) Последнее поле определяет значение лимита. Теперь несколько примеров: @ззЬ_изегз @ззп_изегз ЬагР тах1од!пз 3 ЬагР пргос 5 Нагй ±812в 24576 В первом случае мы О1раничиваем число одновременных регистраций поль- зователей до 3 (консоль, XII, если есть и 88Н — этого более чем достаточ- но). Во взором пользователям из группы ззЬияегз мы разрешаем запускать не более 5 процессов одновременно. Также 8811-пользователям не разреша- ется создавать файлы размером более 24 Мб. Обратите внимание: здесь мы просто задаем лимит на максимальный раз- мер файла. В принципе. 24 Мб вполне достаточно даже для хранения фото-, графий с зеркальной камеры и больших документов \Уог<1, содержащих изо- бражения и другие объемные объекты. А видео и файлы большею размера пусть пользователи хранят или на своих компьютерах, или входят иным спо- собом, например, по РТР, где можно более качественно ограничить опера- ции с файлами.
После редактирования /е1с/8есип!у/НтЙ8.сопГ никакие другие файлы редак- тировать не нужно. Но описанные вами изменения будут действовать для новых сеансов пользователей, поэтому желательно перезагрузить систему, чтобы изменения действовали сразу для всех пользователей. Если вам нужна дополнительная информация о РАМ, предлагаем ознако- миться с официальной документацией, доступной по адресу: кирз ://ш1ггогз. еаре. кете1. ог§/риЬ/Нпих/ИЬз/рат/
Глава 12. Блочный ввод/вывод
12.1. Блочные устройства Блочные устройства - это физические устройства компьютера, позволя- ющие выполнять произвольный (а не последовательный) доступ к участкам данных, называемых блоками. Примеры блочных устройств - жесткий диск ОУП-накопитель, флешка. Как правило, блочное устройство содержит файловую систему и прежде, чем получить доступ к данным, пам нужно смонтировать файловую систему. Поэтому можно сказать, что файловая система - это инструмент для "обще- ния" с блочными устройствами. Кроме блочных устройств в Ыпих также есть и символьные устройства — это устройства с посимвольным вводом-выводом данных. Пример: кла- виатура, последовательный порт. Поручается, что если доступ к данным устройства выполняется в виде потока данных, оно относится к классу сим- вольных. Вся разница между этими двумя типами устройств - в возможности выпол- нения произвольного доступа к данным, то есть в возможности устройства выполнить поиск данных, переходя из одной позиции в другую. Взять ту же клавиатуру. Она тоже выдает поток данных. Если вы наберете на клавиату- ре слово квИо, то драйвер клавиатуры вернет поток из этих пяти символов,
расположенных в том порядке, в каюром вы их ввели. При этом считывание символов в другом порядке не только невозможно, но и не имеег смысла. Жесткий диск работает совсем иначе. Драйвер жесткого диска может потребовать прочитать содержимое определенного блока, а затем содержи- мое друюго блока, причем эти блоки не обязательно должны следовать друг за другом. Поэтому доступ к данным жесткого диска может выполняться произвольным образом, а не в виде последовательного потока. Таким обра- зом, жесткий диск относится к блочным устройствам. По сравнению с символьными устройствами при управлении блочными устройствами в ядре им требуется уделять больше внимания, а также вы- полнять дополнительную подготовку. Связано это с тем, что символьные устройства имеют всего одну позицию для считывания данных, причем она всегда текущая. В отличие от него блочные устройства могут переме- щаться в любую позицию на физическом носителе информации. В самом деле, не нужно создавать в ядре целую подсистему для обслуживания сим- вольных устройств, тогда как для блочных устройств это просто необ- ходимо. Такая подсистема необходима отчасти из-за сложности блочных устройств. Однако основная причина такой мощной поддержки в ядре со- стоит в том, что скорость работы блочных устройств напрямую зависит от скорости их обслуживания со стороны процессора. Действительно, выжать максимум производительности из жесткого диска значительно важнее, чем получить некоторое увеличение скорости при работе с клавиатурой. Более того, как будет показано ниже, сложность блочных устройств обеспечивает большой простор для таких оптимизаций. Далее будет показано, как ядро управляет работой блочных устройств и запросами к этим устройствам. Рассматриваемая часть ядра называется уровнем блочного ввода-вывода (Ыоск 1/0 1ауег). 12.2. Структура блочного устройства Наименьший адресуемый элемент блочного устройства называется секторам Сектора могут иметь разный размер, который кратен 2п, однако чаще всего размер сектора равен 512 байтам. Размер сектора определяется физически- ми параметрами устройства. Сектор является основным элементом любо- го блочного устройства. Устройства не могут обращаться к блокам данных,
размер которых меньше размера сектора, однако большинство блочных устройств при выполнении одной команды позволяет оперировать несколь- кими секторами сразу. Хотя большинство блочных устройств и имеет раз- мер сектора, равный 512 байтам, все же существуют и другие стандартные размеры сектора (например, у большинства накопителей на компакт-дисках размер сектора составляет 2 Кбайт) Примечание. Сектор и блок - это разные вещи Сектор - это физическая единица. Блок - логическая В одном блоке может быть несколько секторов. При разработке программного обеспечения преследуются разные цели, ис- ходя из которых выбирается минимально адресуемая единица данных, кото- рая называется блоком. Блок — это абстракция файловой системы, т.е. все обращения к файловым системам мотут выполняться только с данными, кратными размеру блока. Несмотря на то, что физические устройства сами по себе работают на уровне секторов, ядро выполняет все дисковые операции на уровне блоков. Так как наименьший возможный адресуемый элемент — эго сектор, размер блока не может быть меньше размера одного сектора и должен быть кратен размеру сектора. Более того, для ядра (так же как и для "железа" в случае секторов) необходимо, чтобы размер блока был кратен 2”. Ядро также требует, чтобы максимальный размер блока не превышал размер страницы памяти. Поэто- му размер блока равен размеру сектора, умноженному на число, кратное 2П. и не может быть больше размера страницы. Чаще всего используются размеры блоков 512 байтов, 1 и 4 Кбайт. 12.3. Буферы При сохранении блока в памяти, скажем, после выполнения операций чте- ния или отложенной записи, он записывается е буфер (Ьи$ег). В каждый буфер записывается только один блок. По сути, буфер играет роль объекта, представляющего дисковый блок в оперативной памяти. Напомним : блок состоит из одного или нескольких секторов и по размеру не может быть больше одной страницы памяти.
Поэтому в одной странице памяти может находиться один или несколько блоков. Поскольку для ядра требуется некоторая управляющая информация, свя данная с данными (например, какому блочному устройству и какому бло- ку соответствует буфер), то с каждым буфером связан свой дескриптор. Этот дескриптор называется заголовком буфера (Ьийег Ьсаб) и представляется с помощью струыуры Ьцфег_Иеас1, которая определена в файле <Нпих/Ьийет Ьеа<1.к>. В ней содержится вся информация, которая необходима ядру для управления буферами; зЬгисЪ ЬийеГ—Иеаа { ипзТдпес! 1опд Ь_яеаЬе; зЪгисЪ Ьийег_Иеас1 *Ь_еЫз_раде; зегисЪ раде *Ь_раде; зесеоГ—Ь Ь_Ь1оскпг; з12.е_Ь Ь_з12е; сЬаг *Ь_йаРа; ейгией Ыоск_с1еч1се *Ь_Ьбеч; Ы1_епД_1о_Ъ *Ь_епб_1о; чохе! *Ь_рг1уаЪе; зЪгисб Изе_кеаД Ь_аззос_ЬиЙегз; зЪгисе ас!с1гезз_зрасе *Ь_аззос_тар; а1:от1с_е Ь_соипб; /* Флаги состояния буфера */ /* Список буферов, находящихся в текущей странице памяти */ /* Ссылка на страницу памяти */ /* Начальный номер блока */ /* Размер отображения */ /* Указатель на данные внутри страницы */ /* Связанное блочное устройство */ /* Метод завершения ввода-выве да */ /* Зарезервировано для Ь_епс1_1о ★/ /* Список связанных отображений */ /* список связанных адресных пространств */ /* Счетчик использования */ Поле Ъ_у1а1е хранит состояние буфера, а состояния могут быть следующими: • ВН ПрюоаГе - буфер содержит корректные данные. • ВН_П1гГу - буфер изменен (содержимое буфера новее соответствующих данных на диске и поэтому буфер.' в конечном счете, должен быть записан на диск). • ВН Ьоск - для буфера выполняется операция ввода/вывода с дисково- го устройства, поэтому он заблокирован для доступа со стороны других процессов. • ВН Кец - буфер включен в запрос на выполнение операции 1/0. • ВН Маррсб - буфер содержит корректные данные и отображен на дис- ковый блок. • ВП_Ме\у - буфер только что отображен с помощью функции §еГ_Ыоск()
• ВН Азупс Кеад - для буфера выполняется асинхронная операция чтения с помощью функции епс1_Ьийег_ азупс_ геаб() • ВН_Азупс_\Угйе - для буфера выполняется асинхронная операция запи- си с помощью функции епй Ьийег азупс мтйеО • ВН_Ве1ау - с буфером не связан дисковый блок. • ВНВоипёзгу - буфер является последним в последовательности смеж- ных блоков. • ВН ^п1е_ЕЮ - при записи буфера произошла ошибка ввода/вывода. • ВН Огдегео - упорядоченная запись. • ВНЕорпоТзирр - операция на заданном буфере не поддерживается • ВНЕГпмгпйеп - место под данные буфера было выделено на устройстве, но сами данные еще не записаны. • ВН ршет - подавить ошибки при выполнении операций ввода-вывода для этого буфера. В поле Ь_соип( хранится счетчик использования буфера. Значение этого поля увеличивается и уменьшается с помощью двух встраиваемых функции, которые определены в файле <1ших/Ьий'ег_пеа(1.к>, как показано ниже. зЪа'Ыс 1пИпе уо1с1 деЪ_Ъа (зегисЬ Ьойег_Ьеас1 *Ы1) { аЪоггп.с_1пс (&ЬЪ->Ь_соип1:); } зраЫс хпИпе уо1с! риЪ_ЬЬ (з(гис1: Ьийег_кеад *ЬЬ) { а1:опис_с1ес (4оЪ->Ь_соипЪ); ) Перед тем как обращаться к полям заголовка буфера, необходимо увели- чить значение счетчика использования с помощью функции &ет_Ы1(). Это гарантирует, что во время работы с буфером он не будет освобожден другим процессом. Когда работа с заголовком буфера будет закончена, необходимо уменьшить значение счетчика ссылок с помощью функции рц1_Ы1(). Данному буферу соответствует физический блок с логическим номером Ь Ыоскпг, который находится на устройстве Ь Ъскгу. " 2Я6 Ь._____I - ’__ Г'______1 ’ \ ~___ - ~ ' ч
В поле Ь_ра§е хранится указатель на физическую страницу памяти, в ко- торой располагаются данные буфера. В поле Ь_с1а1а хранится указатель на данные блока, расположенные на странице памяти Ъ_ра&е, размер блока хранится в поле Ь рлге. Следовательно, блок хранится в памяти, начиная с адреса Ь_(1а1а и заканчивая адресом (Ь <1а1а + Ь 81хе). Заголовок буфера предназначен для описания соответствия между дисковым блоком и буфером, находящимся в оперативной памяти компьютера и пред- ставляющим собой последовательность байте а, которые расположены в ука- занной странице памяти. Единственное назначение этой структуры данных ядра — выполнение роли дескрип гора отображения "буфер-блок". 12.4. Планировщики ввода/вывода Ожидающие события ввода-вывода планируются или сортируются с помо- щью алгоритма постаноаки в очередь, также называемого лифтом (е1еуа- 1ог), поскольку аналогичные алгоритмы можно использовать для наиболее эффективного планирования лифтов. Не существует единого лучшего алго- ритма, выбор зависит от вашего оборудования и от рабочей нагрузки. Настройка выполняется по диску, а не по разделу, поэтому, если на первом диске есть разделы, содержащие /, /Ьоо: и /Ьоо1/ей, все три файловые систе- мы должны обрабатываться одинаково. Поскольку вещи в /Ьоог нужны лишь изредка после загрузки, если вообще когда-либо, то рассмотрите возмож- ность использования вашего корневого раздела для выбора алгоритма для всего Меу/ы1а. Настройка выполняется с помощью объекта ядра /8у8/Ыоск/84*/циепе/бсЬе<1- и!ег. Вы можете прочитать его текущее содержимое с помощью команды са1. В выходных данных перечислены все алгоритмы организации очередей, поддерживаемые ядром. Используемый в настоящее время, заключен в квадратные скобки: # дгер . /зуя/Ыоск/з<1*/диеие/зсЬе<1и1ег /зуз/Ыоск/зда/диеие/зсЪедиГег:поор сТеасШпе [сГд] /зуз/Ыоск/з<1Ь/диеие/зсЬе<1и1ег:поор <1еасШпе [сСд] /зуз/Ыоск/зс!с/диеае/зсЬ.ес1и1ег:поор «ЗеасШпе [с^д] /зуз/Ыоск/зй<1/диеие/зскес1и1ег:поор (ТеадИпе [с€д]
Вы можете изменить содержимое объекта ядра и выбрать друзой алгоритм с помощью ееко-. # сак /йуз/Ыоск/зсИ/диеие/зсГ1еаи1ег поор йеадИпе [с^д] # есЬо «ЗеасШпе > /зуз/Ыоск/зсЩ/диеие/зскеаиХег # сак /зуз/Ыоск/зскА/диеие/зсЬейиТег поор [аеадИпе] скд Если вам лень читать дальше, то можем вкратце сказать следующее: исполь- зуйте <1еас1Нле для интерактивных систем (рабочие станции, персональные компьютеры) и поор для автоматических вычислений. Далее мы разберемся с планировщиками ввода/вывода более подробно. 12.4.1. Алгоритм ЛеайНпе Алгоритм крайнего срока (ЦеасПше) пытается ограничить максимальную задержку и сделать людей счастливыми. Каждому запросу ввода-вывода назначается свой крайний срок, и он должен быть выполнен до истечения этого таймера. Для каждого устройства поддерживаются две очереди, одна сортируется по секторам, а другая по крайнему сроку. Пока сроки не истекли, запросы <во- да-вывода выполняются в порядке секторов, чтобы свести к минимуму дви- жение головки и обеспечить наилучшую пропускную способность. Данный алгоритм подойдет в следующих случаях: 1. Ваша система используется интерактивно. В вашей рабочей нагрузке преобладаю! интерактивные приложения или пользователи жалуются на низкую производительность работы диска. 2. У вас есть база данных с большим количеством операций ввода/вывода. 3. Операции чтения выполняются значительно чаще, чем операции запи- си, поскольку приложения чаще блокируются в ожидании именно чтения данных.
4 Ваше оборудование для хранения данных представляет собой массив 8АМ (ЗТога^е Агса Ме!мюгк, сеть хранения данных) или массив КАЮ с большими буферами ввода/вывода. 12.4.2. Алгоритм СЕО Алгоритм СЕО (Сотр1е!с1у Раи риешп§) или полностью справедливой организации очередей сначала делит процессы на три класса: в режиме реального времени, с максимальной эффективностью (Вез! ЕйоП) и бездей- ствия (1с11с). Процессы реального времени обслуживаются раныпе процес- сов максимальной эффективности, которые, в свою очередь, обслуживаются раньше процессов бездействия. Внутри каждого класса ядро пытается предоставить каждому потоку одина- ковое количество временных интервалов. Процессы по умолчанию относят- ся к классу Вез( ЕйоЛ, и вы можете изменить приоритет ввода-вывода для процесса с помощью команды ютсе. Ядро использует последние шаблоны ввода-вывода, чтобы предвидеть, будет ли приложение выдавать больше за- просов в ближайшем будущем, и если ожидается больше ввода-вывода, ядро будет ждать, даже если другие процессы имеют ожидающие ввода-вывода. Алгоритм СЕР может улучшить пропускную способность за счет уменьше- ния задержки. Пользователи чувствительны к задержке, и им не понравится результат, когда их приложения связаны СРр. Кому подойдет данный алгоритм: • Пользователи не используют систему в интерактивном режим е, во всяком случае регулярно. • Вы не используете файловую систему ХЕ8, поскольку СЕр подавляет большую часть параллелизма в ХЕ8. 12.4.3. Алгоритм МООР Планировщик МООР ничего не делает для изменения порядка или приори- тета, он просто обрабатывает запросы в том порядке, в котором они были отправлены.
Эта может обеспечить наилучшую пропускную способность, особенно в подсистемах хранения, которые обеспечивают собственную организацию очередей, таких как твердотельные накопители, интеллектуальные контрол- леры НАГО с собственным буфером и кэшем, а также в сетях хранения дан- ных. Обычно это приводит к наибольшей задержке, поэтому это плохой выбор для интерактивного использования. Причины использования планировщика поор: • Ваша главная забота — пропускная способность, задержка вас не волну- ет. Пользователи не используют систему интерактивно. • Ваша рабочая нагрузка связана с процессором: большую часть времени мы ждем, пока процессор что-то завершит, события ввода-вывода отно- сительно малы и широко разнесены. Оба они предполагают, что вы выполняете высокопроизводительные авто- матические задания, такие как интеллектуальный анализ данных, научные высокопроизводительные вычисления или рендеринг. 12.4.4. Настройка планировщиков Настройка планировщиков ввода'вывода заключается нс только в выборе нужного планировщика. У каждого планировщика есть свои параметры, ко- торые можно изменить с помощью файловой системы зувГз. Различные файлы (атрибуты) появляются в подкаталоге (объекте) онене/ ювсЬес! при изменении содержимого (настройки) файла (атрибута) сисис/ 8сЪе4и1ег. Проше увидеть, чем объяснить. Сами каталоги дисков содержат одинаковые файлы и подкаталоги, включая файл диеие/8сйе<1и1ег и подката- лог диеис юьсйес!/: # 1з -Г /зуя/Ыоск/зс!Ь/ а11дггпепе_ойзее дд.зсагс1_а11дптепе Ъо1сегз/ гепи>уаЫе зъае ЬД1@ еVеп^з 1пТ11дЫ: го зпЬеузеет@ сараьШЪу еггепГз_азупс роиег/ зс1Ы/ Ъгасе/ < ^еV еVеп^з_ро11_тзесз диеие/ з1ее иеуепЪ < ^еV^се@ ехкгапде гапде з1аVез/
# 1з -Г /зуз/Ыоск/здЬ'диеие а<3<1_гапс1от тах_Ьм_зес1:огз_кЬ оре1та1_1о_з12 е <Изсагс1_дгапи 1аг1 йу тах_1 пеедг1еу_зед.т.еп1.з ркуз1са1_Ыоск_з12е й1зсаг<1_тах_Ьу1:ез тах_зесеогз_кЬ геас1_алеас1_кЬ сИзсагс!_2егоез_с1а(:а тах_зедтепе_з12е гоеаЪ1опа1 11и_з е сЪ о г_з 1 х е тах_зедтептз гд_айп1еу 1озсЬеЯ/ т1п1ти!г_1о_з 12е зсЪес!и1ег гезбаСз потегдез игЫ;е_запе_тах_Ьуеез 1од1са1_Ыоск_з1хе пг_гедиезе Давайте назначим три разных планировщика и посмотрим, какие настраива- емые параметры появляются в их подкаталогах циеиеЛоьсЬеб: # есЬо сТд > /зуз/Ыоск/зсЗЬ/аиеие/зсЬедиТег 1 еско <Зеа<Шпе > /зуз/Ыоск/зйс/диеие/зсЬейиХег # еско поор > /зуз/Ыоск/яНа/риеие/зсЬАбиГег # 1з -Г /зуз/Ыоск/з<1[Ьс<3]/диеие/тозсЬес!/ /зуз/Ыоск/зЦЬ/диеие/юзсЪес!/: Ьаск_зеек_тах Н1о_ехр1ге_зупс даапЪит Ьаск_зеек_репа1ку дгоир_1<11е зИсе_азупс йГо_ехр±ге_азупс 1ох_1а1енсу з11се_азупс_гд /зуз/Ыоск/зс!с/диеие/1озсЪеё/: йГо_Ьаеск Ггопй_тегдез геас1_ехр1ге игдЛе_ехр.1 ге зИсе_1<11е зИсе_зупс Ъагде1__1а Сенсу игДез аЪагуед /зуз/Ыоск/зск1/диеие/1.озс11ес1/: Планировщик сГц имеет двенадцать читаемых и настраиваемых параметров, планировщик крайнего срока—пять, а планировщик пэор — ни одного (что логично, поскольку это не планировщик вообще). Настройка планировщика СЕР В таблице 12.1 приводится описание настраиваемых параметров планиров- щика СРр. Не все параметры полезны, поэтому в таблице 12.1 приводятся только те, которые вам, может быть, придется изменить на практике.
Таблица 12.1. Параметры планировщика СЕ() Атрибут Описание ^/о _ехр1ге_ азу пс Количество миллисекунд, в течение которого асин- хронный запрос (буферизованная запись) может оста- ваться необсл уженным. Если требуется более низкая задержка буферизован- ной записи, уменьшите значение по умолчанию до 250 мс или рассмотрите возможность переключения на планировщик деасМпе /'/о_ехр1ге_зупс Количество миллисекунд, в течение которых син- хронный запрос (чтение или небуферизовапная за- пись О_П1ЯЕСТ) может оставаться необслуживае- мым. Если требуется более низкая задержка чтения, умень- шите ее со 125 мс по умолчанию или рассмотрите возможность перехода на планировщик ЛеасШпе 1о\у_1а1епсу 0 = отключено задержка игнорируется, каждому про- цессу предоставляется полный квант времени. 1=включено справедливость пропускной способ- ности, установите максимальное время ожидания 300 миллисекунд для каждого процесса, выдающего запросы ввода-вывода для устройства. Подойдет для потоковой передачи мультимедиа-данных в реальном времени диап1ит Количество запросов ввода-вывода, отправляемых на устройство одновременно, что ограничивает глубину очереди. Увеличьте это значение, чтобы повысить пропускную способность оборудования для хранения данных с собственным глубоким буфером ввода- вывода, такого как 8АК и КАЮ за счет увеличения задержки
Время в миллисекундах, в течение которого сГц будет простаивать в ожидании дальнейших запросов. Установите 0 для твердотельных накопителей или зИсе_1<Л1е для внешнего КАЮ с собственным кэшем. Оставьте значение по умолчанию 8 миллисекунд для внутрен- него хранилища без КАТО, чтобы уменьшить количе- ство операций поиска Настройка планировщика АеайИпе Таблица 12.2 содержит параметры планировщика с1еас1Ипе, мы сейчас их и рассмотрим. Таблица 12.2. Параметры планировщика АеасШпе Атрибут Описание /1/о_ Ьа1ск Количество операций чтения или записи, выполняемых в одном пакете. Более низкие значения могут дополнительно умень- шить задержку. Более высокие значения могут увеличить пропускную способность на вращающихся механических дисках (ТЮО), но за счет меньшей задержки. Зы выбрали планировщик с1еаЛНпе чтобы ограничить задержку, поэтому, вероятно, не хотите ее увеличивать геа<1_ехр1ге Количество миллисекунд, в течение которых должен быть обслужен запрос на чтение. Уменьшите это значение с 500 по умолчанию до 100 в системе с инте- рактивными нользовате.1ями. Помните, что задержка выше 100 мс будет раздражать пользователей
м>гИе_ехр1ге Количество миллисекунд, в течение кот орых должен быть обслужен запрос на запись. Оставьте значение по умолчанию 5000, пусть операции записи выполняются асинхронно в фоновом режиме, если ваше приложение не использует много синхронных операций записи м>гИе$_81ап>ес1 Число пакетов чтения, которые могут быть обработаны перед обработкой пакета записи. Увеличьте это значе- ние по умолчанию, равное 2, чтобы дать более высо- кий приоритет операциям чтения 12.5. Настройка общих параметров блочного ввода/вывода В /зуз/Ыоск/зсН/диеие вы можете настроить параметры, представленные в таблице 12.3. Таблица 12.3. Общие параметры блочного 1/0 Атрибут Описание Максимально до)1устимый размер запроса ввода/вы- зода в килобайтах, который должен находиться в еле- тах_зес1ог8_кЬ дующих пределах: Минимальное значение = гпах(1, 1о§1са1_Ыоск_ 812е/1024) Максимальное значение = тах_й\у_5ес1ог8_кЬ
пг_гецие$1з Максимальное количество запросов на чтение и за- пись, которые могут быть поставлены в очередь одно- временно, прежде чем следующий процесс, запраши- вающий чтение или запись, будет переведен в спящий режим. Значение по умолчанию 128 означает, что 128 запросов на чтение и 128 запросов на запись могут быть поставлены в очередь одновременно. Большие значения могут увеличить пропускную способность для рабочих ншрузок. записывающих множество небольших файлов, меньшие значения увеличивают пропускную способность при больших операциях ввода-вывода. Вы можете уменьшить это значение, если используете приложения, чувствительные к задержке орйта1 юте Если он не равен нулю, устройство храпения само со- . общило о своем собственном оптимальном размере ввода-вывода. Если вы разрабатываете свои собственные приложе- ния, делайте его запросы ввода-вывода кратными это- му размеру, если это возможно геас1_акеас1 кЬ Количество килобайт, которое ядро будет читать впе- ред во время операции последовательного чтения 128 кбайт по умолчанию, если диск используется с 1УМ, сопоставитсль устройств может использовать более высокое значение. Если ваша рабочая нагрузка вы- полняет много больших потоковых операций чтения, большие значения могут повысить производитель- ность го1аИопа! Должно быть 0 ,щя твердотельных дисков, но некото- рые из них неправильно сообщают о своем состоянии ядру. Если неправильно установлено значение 1 для 88В, установите его на 0, чт обы отключить ненужную ло- 1 ику планировщика, предназначенную для уменьше- ния количества операций поиска
Глава 13. Механизмы кэширования чтения и записи ядра Ыпих
13.1. Дисковый кэш и отложенная запись Когда заканчивается физическая оперативная память, неиспользуемые в текущий момент данные могут быть перемещены на диск в область подкачки (об этом мы поговорим отдельно). Освобожденная область памя- ти будет использоваться для хранения данных и кода, необходимый систе- ме в данный момент времени. Когда данные, сброшенные в область под- качки (вхуар, своп), снова понадобятся системе, в своп будут вьпружспы другие ненужные прямо сейчас системе данные, а эти будут загружены во вновь освободившееся пространство. Понятно, что такой механизм су- щественно замедляет обработку данных, ко зато позволяет обрабатывать больше данных, чем может поместиться в физической памяти. Исходя из этого, самый простой способ увеличить производительность компьютера - добавить оперативной памяти. Тогда меньше данных будет сбрасываться на диск и повысится скорость их обработки. Следующий недорогой способ модернизации - переход на 88П-накопители, скорость работы которых в несколько раз превышает скорость работы с обычными жесткими дисками, поэтому операции с областью подкачки будут' осуществляться в несколько раз быстрее. Получается, что, используя механизм подкачки, мы теряем в производитель- ности. Нужно чем-то данные потери компенсировать. Как раз на этот случай
в ядре Ыпих реализована дисковая кэш-память, которая называется стра- ничным кэшем (ра§е сасЬе). Процесс, благодаря которому изменения, внесенные в станичный кэш, сохраняются на диске, называется отложенной записью страниц (ра§е мзИеЪаск). Говоря простыми словами, данный механи зм позволяет повысить произво- дительность дисковых операций. Дисковый кзш является очень важным компонентом системы по следующим причинам: • Доступ к данным, хранящимся на диске, осуществляется на несколько порядков медленнее, чем доступ к оперативной памяти (миллисекунды против наносекунд). С точки зрения СРП доступ к данным, расположен- ным в оперативной памяти компьютера, выполняется намного быстрее, чем на диске, а выборка данных из кэшей первою и второго уровня (Ы и Ь2) процессора выполняется еще быстрее. • Если к некоторым данным осуществлялся доступ, го с достаточно боль- шой степенью вероятности к этим же данным в ближайшем будущем потребуется обратиться снова. Принцип, согласно которому операции обращения к некоторым данным имеют тенденцию группироваться друг с другом во времени, называется временной локализацией (Гетрога! 1осаН^у). • Он гарантирует, что если данные кэшируются при первом доступе к ним, то существует большая вероятность того, что при следующем обращении к ним в ближайшем будущем они бу/гут находиться в кэш-памяти. Тэт факт, что доступ к памяти выполняется намного быстрее, чем к диску, а также высокая вероятность повторного использования данных, находя- щихся в кэше, позволяют добиться существенного увеличения произво- дительности системы в целом 13.2. Методы кэширования Страничный кэш состоит из страниц физической памяти. Содержимое этих страниц соответствует физическим блокам на диске. Размер кэша может
динамически изменяться -- это вполне естественно. Когда есть свободная па- мять, он увеличивается, ко .да памяти не хватает - он уменьшается. Устрой- ство хранения данных, которое кэшируется, называется внешней памятью, поскольку в этом случае диск как бы расположен за пределами кэша и ис- пользуется в качестве первоисточника данных, которые в нем хранятся. Прежде чем начать операцию чтения, например, если из приложения вызы- вается функция геаб(), ядро сначала проверяет, находятся ли нужные данные в страничном кэше. Если они там есть, то дисковая операция не выполняется, а данные копируются прямо из памяти. Если данные были найдены в кэше, тогда это. считается удачной попыткой (сасЬе Ы1), а вот если данных там не было, тогда попытка считается неудачной (сасйе пн§§). После неудачной попытки ядру нужно выполнить ряд блочных операций 1/0, чтобы считать данные с диска. Как только эти операции будут выполнены, ядро помещает считанные с диска данные в страничный кэш. Все последующие обращения к этим данным будут выполнены из кэша, обращений к диску нс будет. Нуж- но отметить, что кэшируются только те данные, к которым осуществляется доступ. Если программа, например, прочитала только часть файла, то только эта часть будет помещена в кэш, а не весь файл. С кэшированием чтения все понятно. А что насчет кэширования записи? Представим, что некоторое приложение выполняет системный вызов мтйе(). Далее может использоваться одна из трех стратегий: 1. Без кэширования (помтИе) - записываемые данные кэшироваться не будут. Если в кэше находится фрагмент данных, соответствующий тому, который в настоящий момент выводится процессором на диск, то этот фрагмент в кэше будет аннулирован. В результате при следующей опе- рации считывания этого фрагмента с диска он будет снова засужен в кэш. В результате при следующей операции считывания этого фрагмента с диска он будет снова загружен в кэш-памяэь. Такая стратегия очень ред- ко используется при реализации кэш-памяти, так как при этом не только не кэшируются записываемые на диск данные, но еще и аннулируется содержимое кэша. В результате снижается производительность дисковой подсистемы и увеличиваются накладные расходы. 2. Кэш со сквозной записью (\упге-1Ьгои§к сасЬе) - данные, записываемые на диск, одновременно обновляются как в дисковом файле, так и в па- мяти. Данные после обновления кэша незамедлительно сбрасываются на диск. В этой стратегии данные в кэше и во внешней памяти находятся
в согласованном состоянии. Не нужно аннулировать содержимое кэша. Также нужно отметить простоту этой стратегии 3. Отложенная запись (уугйе-Ьаск) - данные при записи помещаются непо- средственно в страничный кэш. Незамедлительное или непосредствен- ное обновление внешней памяти не выполняется. Вместо этого страницы с обновленными данными в кэше помечаются как несохраненные (сЬйу) и помещаются з список несохраненных страниц (сЬгГу 1181). В системе су- ществует специальный процесс, называемый мчЧеЬаск, который перио- дически сохраняет страницы, находящиеся в этом списке, на диск. В ре- зультате происходит синхронизация данных, находящихся в памяти и на диске. После этого признак не сохранения страниц сбрасывается. Страте- гия с отложенной записью считается более про1рессивной по сравнению со стратегией со сквозной записью. Из-за переноса операции сохранения на более поздний срок система может собрать все измененные до этого момента данные и записать их на диск за один раз. Производительность дисковой системы существенно повышается, как и сложность реализа- ции стратегии кэширования. А что насчет удаления данных из кэша? Ведь его объем не безграничный и мы не можем прокэшировать все на свете, поэтому нужно проду- мать алгоритм удаления данных из него. В Ыпих для этого используется алгоритм вытеснения данных из кэша (сасйе еУ1сНоп). Вытеснение данных в Ыпих выполняется путем простой выборки синхронизированных (т.е. тех, что уже сохранены на диске) страниц памяти и замещения их содер- жимого чем-нибудь другим. Если таких страниц недостаточно в кэше, ядро запускает процесс отложенной записи, чтобы можно было освободить до- полнительные страницы. Самое сложное здесь решить, что именно нужно вытеснять. Нужно избавляться от тех страниц памяти, к данным которых не будут обращаться в ближайшем будущем. Понятно, что чтобы знать какие именно страницы нам не понадобятся в будущем, нужно как-то заглянуть в это будущее. По этой причине такую стратегию часто называют алгоритмом предсказания. Очевидно, что данная стратегия просто идеальна, но се невоз- можно реализовать. Поэтому вместо стратегии предсказания используется либо стратегия ми- нимального использования (в различных ОС) либо стратегия с двумя списками (в Ыпих). Начнем со стратегии минимального использования.
Одним из самых удачных алгоритмов аппроксимации, особенно для кэш- памяти общего назначения, считается алгоритм замещения элемента с са- мым старым временем последнего обращения (1еаз< гесепйу и§е<1, ЬКЬ). Для реализации стратегии вытеснения по алгоритму ЫШ требуется, чтобы с каждой страницей кэш-памяти была связана временная метка, фиксирующая время последнего обращения к ней, либо чтобы список всех страниц кэш- памяти быт упорядочен по времени последнего обращения. Тогда можно легко удалить страницы с самым старым временем последнего обращения или удалить ст раницы, находящиеся в начале списка (при условии, что стра- ницы с недавним временем обращения находятся в его конце). Чем дольше к фрагменту данных, находящихся в кэш-памяти, никто не обращается, тем меньше шансов на то, что к нему кто то обратится в ближайшем будущем. Все довольно просто. Однако есть и недостаток, который проявляется при однократном доступе к множеству файлов на диске. В таком случае помеще- ние всех страниц с самым старым временем последнего обращения в начало списка не является оптимальным. Как и прежде, ядро не может знать за- ранее, сколько раз будут обращаться к каждому конкретному файлу. Однако ядру известно, сколько было обращений к файлу за прошедший интервал времени. Теперь перейдем к стратегии с двумя списками (1\мо-118(: зпаге^у) Вместо поддержки одного списка элементов, упорядоченных по времени последне- го обращения (гак называемый список ЕКБ), в Ыпих используются два списка: активный и пассивный. Страницы, находящиеся в активном списке, рассматриваются как "необходимые", и по этой причине их нельзя вытеснять. Страницы из пассивного списка могут быть вытеснены из кэша. Страницы помещаются в активный список, только если при обращении к ним они на- ходятся в пассивном списке. При обслуживании обоих списков используется псевдо-ЫШ подход: элементы добавляются в конец списка и удаляются из его начала так же, как и в очередях. Размеры этих списков поддерживаются примерно одинаковыми. Если активный список становится слишком длин- ным по сравнению с неактивным списком, часть его элементов переносится в неактивный список и становится доступной для вытеснения. Стратегия с использованием двух списков позволяет избавиться от недостатка класси- ческого алгоритма ЬК.11, связанного с однократным доступом к большому числу элементов. Она позволяет применить простой псевдо-ЫШ подход для управления элементами списков. Описанный выше подход с двумя списка- ми часто называют ЫШ/2, Его можно обобщить для случая с п-списками, и тогда он будет называться ЫШ/п.
13.3. Кэширование на практике Как уже отмечалось, ядро Ыпих для повышения производительности опе- раций чтения и записи использует собственный механизм кэширования, называемый кэшем страниц или дисковым кэшем. Основная цель данною механизма — копировать данные и двоичные файлы из хранилища в память, тем самим сокращая дисковые операции ввода-вывода и повышая общую производительность. По умолчанию вся свободная физическая память используется операцион- ной системой для целей кэширования страниц, и в зависимости от рабочих нагрузок операционная система управляет своим состоянием, кэшируя, повторно используя и удаляя файлы по мере необходимости. Даже при текущей более высокой пропускной способности 88Г)-пакопите.тей кэширование файлов в памяти приводит к повышению производительности системы. Также довольно распространено заблуждение, что операционная система Ыпих использует слишком много памяти для кэша и это может отрицатель- но сказаться на пользователях систем с небольшим объемом ОЗУ, пользова- телей ноутбуков и мини-систем. На самом деле это хорошо. Использование большого объема памяти под кэш означает, что многие вещи уже кэширова- ны и многие из наших приложений будут работать быстрее из памяти. Важно всегда помнить, что кэшированная память всегда является свободной доступной памятью, которая будет освобождаться по мере необходимости. Если процессу нужно будет больше памяти, то она будет получена за счет кэша. Давайте посмотрим, как работает кэш на практике на примере использова- ния файла размером 2 Гб. На момент проведения следующего эксперимента (если вы хотите повторить за нами) убедитесь (команда /гее -й), это у вас больше свободной памяти, чем размер файла, который вы будете читать. В нашем случае свободной памяти должно быть больше чем 2 Гб. Посмотрим, что у нас с памятью до начала эксперимента: # Ггее -иЬ ЪоСа! изеЧ 5гее нЬагед Ъийегз сасЬе ачаИаЫе Мет: 5.86 94М 5.76 608К 2.1М 49М 5.66 Змар: ОВ ОВ СВ
Далее мы сгенерируем файл размером 2 Гб и сбросим все кэши: # Ьеас! -с 26 </с^еV/и^апс^от > ситтуЛНе # еско 3 > /ргос/зуз^т/с1гор саскез Затем мы подсчитаем количество строк в файле и вычислим продолжитель- ность выполнения этой операции: # Уше ис -1 скцтапуЛИе 8387042 ситту.ГИе геа! 0т3.731з изег 0тС.278з зуз 0т1.223з Выполним ту же команду снова: # Мгг.е ис -1 <1итту.й1е 8387042 йиттуЛИе геа! 0т1.С45з изег 0т0.575з зуз ОтО.47Хз Второе выполнение заняло гораздо меньше времени, потому что файл был закэгаирован в с граничном кэше, и это само по себе улучшило операцию чтения Давайте еще раз посмотрим, что у нас с памятью: .# Егее -иЬ Рога! изед Ггее зИагеб Ьийегз сасЬе аVа^1аЫе Мет: 5.86 94М 3.76 608К 2.1М 2.16 5.56 Зиар: ОВ 03 ОВ Свободной памяти стало на 2 ГБ меньше, а использование буферов и кэша значительно увеличилось. Кэш — это часть памяти, в которой хранятся файлы и двоичные файлы, такие как общие библиотеки, данные, чтобы будущие запросы на эти дан- ные могли обрабатываться быстрее. Буферы — это метаданные, относящиеся к кэшу. о..............................
Снова сбросим кэши: # зузсТ1 -и ут.дгор_саскез=3 Далее мы будем использовать команду ут1оиск, с помощью которой можно увидеть, прокотирован файл (или его части) или нет. # упЛоиск -V йитту.Ше Хитту.Й1е [ ’ ]0/524288 Е11ез: 1 01гесГог1ез: 0 КездХепР Радев: 0/524288 0/2С 0% Е1арзес1: 0.013999 зесопХз Затем опять прочитаем наш файл: # Ыте мс -1 ХиттуЛИс 8387042 Хитту ЛИ е геа1 0т3.732з изэг 0т0.284з зуз 0т1.539з Посмотрим, что скажет утЮиск: # УпЛоисЬ -у Хитту ЛИе Хитту ЛИ е Г0С0СС^Э0С'0<ЮС'0О0000С)0СЭОС<:0СОС0(Э0С0СС<:00ССО0С'00О0000001 524288/524288ГИез: 1 ОХгесРоггез: 0 КезХХелР Радез: 524288/524288 2С/2С 100% Е1арзей: 0.024309 зесопХз Как видим, наш файл прокотирован полностью. Все ото хорошо и понятно, когда размер доступной оперативной памяти пре- вышает размер файла, который мы пытаемся прочитать. Но нс всегда это так. Что будет с кошем, если мы попытаемся прочитать файл, размер которо- (о больше, чем объем доступной памяти?
Закэшируем большой файл: # Ыте мс -1 Ыд.й1е 33544011 ЬддЛИе геа1 0т14.426з изег Ст1.202з зуз 0т6.737з # утЬоисИ -V Ыд.Д1е Ыд.Д1е [ оООООООвООООООООООООООООООООООООООООООООО] 1621005/2097152 ГИез: 1 01гесЪог1ез: 0 КезхдепЬ Радез: 1621005/2097152 6С/8О 77.3% Е1арзед: 0.077948 зесопдз Размер файла 8 Гб, но как мы видим из вывода \>т(оиск, закэшировано было только 6 Гб. Что с производительностью? Давайте прочитаем файл еше раз: # Ъдте нс -1 Ыд.Д1е 33544011 Ыд.й1е геа! 0т14.260з изег 0т1.959з зуз 0т4.741з При повторном чтении производительность не увеличилась. Почему? Как видно из вывода ут1оиск, "голова", то есть начало файла в кэш не попала. Хорошо, а что произойдем, если мы попытаемся прочитать хвост файла? Да- вайте попробуем' # Ъ1те Ъа11 -5000000 Ыд.Д1е >Мсу/пи11 геа1 0п-4.696з изег 01г2.687з зуз 0гп2.001з Как видите, при чтении файла с конца, мы получили прирост в производи- тельности. Получилось как бы скользящее окно (рис. 13.1) и голова файла не попал» в кэш.
Рис. 13.1. Начало файла не прокэшировано Кэш страниц прост, встроен в ОС и обеспечивает явные улучшения произво- дительности при чтении и записи данных. Играет важную роль в собствен- ных процессах Ьших и совместном использовании данных, оптимизируя вы- полнение ядра и пользовательского пространства.
Глава 14» Устройства и модули
14.1. Типы устройств Как ранее было упомянуто, в Ьтих существует три типа устройств: блочные, символьные и сетевые. • Блочные устройства (Ыкдемз) позволяют адресовать фрагменты дан ных, находящиеся на устройстве и называемые блоками. Обычно такие устройства поддерживают операцию позиционирования, бла- годаря которой возможен произвольный доступ к данным. Примеры блочных устройств: жесткие диски, ПУИ-накопители, флешки. Для доступа к блоч- ным устройствам используется специальный файл, называемый узлом блоч- ного устройства (Ыоск йеуюе пойе], который, как правило, смонтирован в виде отдельной файловой системы. • Символьные устройства (сдесз) не позволяют адресовать отдельные блоки данных, они предоставляют доступ к данным только в виде непре- рывного потока символов (байтов). Примеры: клавиатура, мышь, прин- теры, а также практически все цссвдоусзройства. Для доступа к символь- ным устройствам используется специальный файл, называемый узлом символьного устройства (сЬагасЩг йеуюе поде) В отличие от блочного устройства приложение взаимодействует с символьным устройством на- прямую через узел этого устройства.
• Сетевые устройства (пеТдехз) предоставчяют доступ к сети, напри- мер, к Интернету, с помощью физического адаптера (например, сетевой адаптер ЕЙгегпег или беспроводной адаптер 802.11 (\У1-Р1)}. В отличие от других типов устройств, обращение к этим устройствам выполняется че- рез специальный интерфейс, называемый АР1-сокетом (коске! ЛР1). Чтобы система могла работать с устройством, ей необходим драйвер этого устройства. Именно он "объясняет'' системе, как именно нужно работать с тем или иным устройством. Одно не все драйверы устройств в Ыпих работа- ют с физическими устройствами, которые можно увидеть и пощупать. Неко- торые драйверы являются виртуальными и обеспечивают доступ к функци- ональным возможностям ядра. Такие виртуальные устройства называются псевдоустройствами. Самые известные из них - генератор случайных чи- сел ядра (устройства /беу'гапбот и /беу/игапйош), "пустое" устройство (/деу/ пи11), "нулевое" устройство (/деу/>сго) и др. Однако большинство драйверов все-гаки работают с физическими устройствами. 14.2. Модули ядра 14.2.1. Написание простою модуля Как уже отмечалось ранее, ядро Ыпих является монолитным (выполняется в общем защищенном адресном пространстве). Однако также ядро является и модульным, то есть имеется возможность расширения функционала ядра посредством модулей. Ядро позволяет выполнять динамическую загрузку и удаление кода ядра в процессе работы системы. Соответствующие подпрограммы, данные, а также точки входа и выхода группируются в общий бинарный образ, загружаемый объект ядра, который называется модулем. Поддержка модулей позволяет создать минимальное базовое ядро операционной системы, а все дополнительные возможности и драйверы скомпилировать в качестве загружаемых модулей, т.е. самосто- ятельных объектов. Модули т акже позволяют удалять и повторно загружать код ядра, что облегчает отладку, а также дает возможность загружать драй- веры по необходимости в ответ на появление новых устройств с функциями "горячего" подключения
Модуль - это определенным образом написанная программа. Попробуем написать модуль самостоятельно. В лист 14.1 приведен ‘'пустой" шаблон, который ничего не делает, но вы можете использовать его для на- писания собственного модуля ядра. Листинг 14.1. Шаблон модуля ядра Шлих #1пс1и<3е <11пих/1п1е .Ь> #1пс1и<3е <11пих/тос1и1е . Ь> #1пс1ис1е <11пих/кегпе1 . Ъ> /* * ке11о_1п11; - функци» инициализании, вызывается при загрузке модуля. * Б случае успешней загрузки модуля возвращает значение нуль, * и ненулевое значение в противном случае. */ зРаЪдс 1пЪ Ие11о 1п1Ъ(чо1с1) { рг!пГк(КЕКК_АЬЕКТ "1п1Ъ.\п"); геЬихп 0; } /* * Ье11о_ех1.1: - функция завершения, вызывается при выгрузке модуля. */ зРаСЛс чо14 Не11с_ех1Ъ (чоШ) { ргдпЪк (КЕКЦ_АЬЕКТ "Ех1Л1пд I \п" ) ; } то<1и1е_1п1е (Не11о_1п1Р) ; пос!и1е_ех1Р (Ъе11о_ех1Л) ; М00ПЬЕ_11СЕ№Е ("СГЬ") ; М00ЦЬЕ_А1ТТН0К("ЗЪакезреаге") ; МООПЬЕ_ОЕ5СКТ₽ТЮМ("Не11о, Иог1й!") ; Функция Ье11о_шй() регистрируется с помощью макроса Гиос1и1е_1ш1() в ка- честве т очки входа в модуль Она вызывается ядром при загрузке модуля. Вызов то<1и1е_шй() — эго нс вызол функции, а макрос, который устанав- ливает значение своего параметра в качестве функции инициализации для текущего модуля. Все функции инициализации должны соответствовать прототипу: 1пС ту_1п11: (4О1<1) ;
Поскольку функция инициализации редко вызывается за пределами модуля, ее обычно не нужно экспортировать за пределы видимости файла и можно объявить с ключевым словом з1айс. Функции инициализации возвращают значение типа 1п1. Если инициализа ция (или то, что делает функция инициализации) прошла успешно, то функ- ция должна возвратить нулевое значение. В случае ошибки функция должна прекратить выполняемые действия и возвратить ненулевое значение. В рассмотренном нами случае эта функция просто выводит сообщение и воззращает нулевое значение. В реальных модулях функция инициализа- ции регистрирует ресурсы, инициализирует работу оборудования, выделяет структуры данных и т.д. Если рассматриваемый файл будет статически ском- пилирован в образ ядра, то функция инициализации помещается в этот образ и будет вызвана при загрузке ядра. Точка выхода из модуля регистрируется с помощью макроса то<1и1е_ехй(). В данном примере мы зарегистрировали в качестве точки выхода функцию Ье11о_ехй(). Ядре вызывает эту функцию перед удалением модуля из па- мяти. Как правило, в функции завершения нужно освободить все используемые ресурсы, остановить работу и выполнить аппаратный сброс оборудования, а также выполнить другие необходимые при завершении работы модуля дей- ствия. Обычно в функции завершения выполняются действия, обратные тем, что были сделаны в функции инициализации и в процессе работы модуля, особенно это относится к освобождению всех ресурсов, оставшихся после работы модуля. После возврата из функции завершения модуль выгружается из памяти. Функция завершения должна соответствовать прототипу чотс! ту_ех1Л^О1с1); Так же как и в случае функции инициализации, ее можно объявить как 81аИс. Если этот файл будет скомпилирован в статический образ ядра, то данная функция нс будет включена в образ и никогда не будет вызвана (так как если нет модуля, то код никогда нс может быть удален из памяти). Макрос МОО1Д,Е_ЫСЕМ8Е() позволяет указать лицензию на право копи- рования модуля.
За1рузка в память модуля без лицензии ОРЬ приведет к установке в ядре флага 1аиМес1 (буквально "запорченный"). Лицензия на право копирования модуля служит двум целям. Во-первых, для информационных целей. Большинство разработчиков ядра считают отчеты об ошибках, в которых установлен флаг НнШей, не заслу- живающими доверия, поскольку это предполагает, что в ядро был загружен бинарный модуль (т.е. такой модуль, который невозможно отлаживать). Во- иторых, в модулях без лицензии ОРЬ нельзя использовать символы, которые с-тужат "только для ОРЬ". Наконец, макросы МОО11ЬЕ_А0ТНОК() и МОО11ЬЕ_ОЕ8СК1РТЮН() позволяют указать автора модуля и его короткое описание соответственно. Назначение эт их макросов чисто информационное. 14.2.2. Сборка модуля В пределах дерева исходных кодов ядра Первым делом нужно решить, где именно будет находиться модуль в дере- ве исходных кодов. Драйверы необходимо хранить в подкаталогах каталога бпуегз/, который находится в корне дерева исходных кодов ядра. В этом ка- талоге драйверы делятся на классы, типы и собственно на отдельные драй- веры. Например, символьные устройства находятся в каталоге йпуегз/сНаг/, блочные — в каталоге бпуегз/Ыоск/, устройства 158В — в каталоге бпуегз/ нзЬ/. Эти правила не являются жесткими, поскольку многие устройства при- надлежат к разным категориям. Например, большинство П8В-устройств яв- ляются символьными, но они располагаются в каталоге сктсегз/изЬ/, а не в дпуегз/ейаг/. Несмотря на подобные сложности, такая организация является понятной и четкой, после того, как вы в ней разберетесь. Предположим, вы хотите создать драйвер символьного устройства и сохра- нить его файлы в подкаталоге бпуегз/ейаг/. В этом каталоге находится боль- шое количество исходных файлов на языке С, а также ряд других подката- логов. Если драйвер имеет всего один или два исходных файла, их можно поместить непосредственно в этот каталог. Если код драйвера состоит из нескольких исходных или других вспомога- тельных файлов,
то лучше всего создать отдельный подкаталог. Здесь не существует каких- то жестких правил. Предположим, вы хотите создать отдельный подкаталог. Для определенности предположим, что вы хотите написать драйвер для на- шего НеЦоУУогИ-модуля. Следовательно, необходимо создать подкаталог кеИоыогМ в каталоге спуегь/сЬаг/ После этого необходимо добавить новую строку в файл Макейе, который находится в каталоге бпуегз/ейаг/. Для этого отредактируйте файл йпнегз/ сЬаг/Макей1е и добавьте в него следующую запись: оЪ]-гп += Ъе11оисг1д/ Эта строка указывает системе построения, что при компиляции модулей необходимо войти в подкаталог ЬеПохуойб/. Скорее всего, при компиляции драйвера вам потребуется указать отдельный параметр конфигурации, например С(ЖЕ16_Р18Н1Х6 РОЬЕ. В этом случае в файл Макей1е необходимо добавить строку вида: оЬ]-$ (СОИЕЮГ13Н1ЫС_РСЬЕ) += Ъе11оиог1<1/ И наконец, в каталоге бпуегх/сЬаг/йеПохуогШ необходимо создать файл Макейк, содержащий следующую строку: оЪ_]—тп += ЬеИоногШ.о Теперь система построения перейдет в каталог ЬеИохуогЦ/ и создаст модуль йзЬт^.ко из исходного файла Й8Йт§.с Здесь вас может сбить с толку указан- ное расширение объектною файла .о, но в результате будет создан модуль с расширением .ко. Как уже говорилось, скорее всего, при компиляции модуля драйвера с числовым программным управлением вам нужно будет указать параметр конфигурации В таком случае в новый файл Макей1е необходимо добавить следуюптую строку: оЬ]-$(СОКЕ1С_ЕХЗН1Ы6_РОЬЕ) += Ье11о.о
Вне дерена исходников ядра Иногда нужно откомпилировать модуль вне дерева каталогов исходников. Например, вы не хотите перекомпилировать все модули и ждать выполнения команды таке тойи1е&, если вы заметили ошибку в своем драйвере и вам нужно просто пересобрать один модуль, а не все сразу. Для этого вынесите модуль за пределы дерева исходных кодов ядра и создайте Макейк, в кото- рый нужно добавить одну строчку: оЪ]-т := Не11оиог1<1. с В результате файл Ье11о\уог1<1.с будет скомпилирован в файд ЕеПохуогМ.ко. 14.2.3. Установка модулей Скомпилированные модули должны быть инсталлированы в каталог /ЕЬ/ тоёШез/версия/кетеЕ Здесь каждый подкаталог каталога кете1/ соответ- ствует расположению файлов модуля в дереве исходных кодов ядра. Напри- мер, для версии ядра 5.2.10 скомпилированный модуль драйвера кеИсмогИ будет находиться в файле /ИЬ/тос1и1е5/5.2.10/кете1/<1луег5/сйаг/11е11о^ог1(1. ко, если исходный код находился непосредственно в каталоге (Шуегв/сйаг/. Для инсталляции скомпилированных модулей в правильные каталоги ис- пользуется следующая команда: таке тос1и1ез_1пзЪа11 Разумеется, эту7 команду необходимо выполнять с правами пользователя гоо1. 14.2.4. Загрузка модулей Обычно для загрузки модуля в память используют утилиту тэтой. Эта ути- лита очень простая: она "просит" ядро загрузить в память указанный вами •
модуль. Утилита тзтоЛ не отслеживает зависимости и не выполняет ни- какой интеллектуальной обработки ошибок. Использовать ее очень просто Обладая правами пользователя гоо1, нужно ввести команду хпзтой тоди1е.ко где вместо пюткйе.ко необходимо указать имя файла модуля, который тре- буется зафузить. Так, для загрузки модуля управления удочкой выполните следующую команду: тпзгаод Ие11омог1с1. ко Удалить модуль можно аналогичным образом с помощью утилиты питой. Для этого, обладая правами пользователя гоо1, нужно выполнить приведен- ную ниже команду, в которой вместо параметра тМе укажите имя загру- женного в память модуля. гтгг.од. тос1и1е Например, для удаления модуля управления введите следующую команду’: гттос! Ие11омог1с1 14.3. Разработка сложных модулей 14.3.1. Компиляция модулей из нескольких файлов исходного кода Представим, что наш модуль НеИо^УогИ был модернизирован и теперь состоит из двух файлов исходного кода - ЪеПом'ойб.с и ЪеПоаскКс. Чтобы откомпилировать модуль из двух файлов и чтобы компилятор понимал, что они относятся к одному модулю, нужно добавить в МакеШе инструкции:
оЬд-п := Ие11оиог1д.о Ие11омог1с1-оЬ15 := Ье11омог1д.о У1е11оа0з.о В этом примере сначала будут скомпилированы файлы ЬеИомгогМс и ЬеНоадсЛй.с, а затем скомпонованы в файл модуля ЬсПомюгШ.ко. 14.3.2. Зависимости между нодулями Утилиты работы с модулями ОС Ыпих поддерживают зависимости между модулями- Эго означает, что если модуль тоЛ зависит от модуля тоб2, то при загрузке модуля тоё.1 модуль то<12 будет загружен автоматически. Информация о зависимостях между модулями должна быть сгенерирована администратором В большинстве дистрибутивов ОС Ьших эта информация генерируется автоматически и обновляется при загрузке системы. Для гене- рации информации о зависимостях меж цу модулями необходимо, обладая правами по.ньзователя гоо1, выполнить приведенную ниже команду. дертод Для быстрого обновления и генерации информации только о более новых модулях, чем сам файл зависимостей, необходимо, обладая правами пользо- вателя гоо1, выполнить другую команду: дертос! -А Информация о зависимостях между модулями хранится в файле /11Ь/ тоЛи1е8/версия/то4и1ея Лер. 14.3.3. Загрузка модулей с зависимостями Утилита !П$той не очень интеллектуальная. Поэтому также существует ути- лита шойргоЬс, которая позволяет загрузить модуль с учетом зависимостей,
выполняет проверку и обработку ошибочных ситуаций, позволяет передать модулям параметры конфигурации и обладает другими полезными функци- ями. Для управления загрузкой и выгрузкой модулей мы настоятельно реко- мендуем использоват ь именно ее. Для загрузки модуля в ядро с помощью утилиты шойргоЬе, обладая правами пользователя гоо1, запустите команду: тойргоЬе тосЫе [ параметры модуля ] где вместо параметра тос1и1е необходимо указать имя загружаемого модуля. Все следующие далее аогументы интерпретируются как параметры, которые передаются модулю при загрузке. Утилита тойргоЬе пытается загрузить не только указанный модуль, но и все модули, от которых он зависит. Следовательно, это наиболее предпочтитель- ный механизм загрузки модулей ядра. Утилита тойргоЬе также может использоваться для удаления модулей из ядра. Для этого, обладая правами пользователя гоо1, запустите команду гсойргоЬе -г тсйиГез где вместо параметра тоШез нужно указать один или несколько модулей, которые необходимо удалить. В отличие от гтто<1, утилита тойргоЬе так- же удаляет и все модули, от когорых зависит указанный модуль, если по- следние не используются В справочном руководстве операционной систе- мы Ьтих приведен список других, менее распространенных параметров этой команды.
Глава 15. Управление хранилищем
В этой главе мы рассмотрим довольно таки важные вещи, имеющие значе- ние не только для работы ядра Ыпих, но и для самой операционной системы - подключение нового жесткого диска и его разметка в классическом вари- анте - без всяких менеджеров томов. Также мы рассмотрим ГУМ и то. как можно расширить пространство группы томов, например, когда вы увеличи- ли дисковое пространство виртуального сервера. 15.1. Подключение нового жесткого диска и его разметка Классической программой для разметки жесткого диска в Ыпих и дру- гих операционных системах является программа Шкк. Конечно, в той же \У1п<1о\У8 программа Гсйзк совсем другая, но названия программ совпадают. Рассмотрим пример использования этой программы. Представим, что мы подключили новый жесткий диск и нам нужно ''ввести" его в эксплуатацию. Тренироваться лучше всего в виртуальной машине, особенно, если вы в пер- вый раз осуществляете разметку диска. Формат вызова/сНзк такой: # ГсНзк <устройство>
Да, команду/сНяк нужно запускать с правами гоо1. Далее мы будем считать, что новым является устройство Мем/збЬ: # ГсИгк /<1е\>/зс1Ь Посмотрите на рис. 15.1. Я запустил прохрамму Гйвк для нового и неразме- ченного жесткого диска Программа сообщила мне, что: • Все изменения хранятся только в' памяти и не переносятся на жесткий диск до тех пор, пока вы их не запишите. • Устройство нс содержало таблицы разделов и была создана таблица раз- делов 1)08 (по умолчанию). я11.М|1и:.1Цы I 1« I 41 -К 3.те-. <1Ь I й • 1 деме го Г Л1 ггк <«г 11 - 11 гплх 2,2В). кбапдех ыШ геитоп мп «смогу Ш|1у, «мпШ уси йесмЛе «еНе 11к.*т. Нс1 сагеГи! ЬеГоге измт] гке ыгИг сотмапм! . Пеммсе <1оез по! са»>1д1п а гесодп!ге4 рагШ1оп 1аЫе. Ггсй1е4 а леы РОЗ «ИзккчЬе! ыИЪ <Изк МевНПег Вх/1Ес72648. 1'о**л>.мч1 (м Гог Ье1рГ Рис. 15.1. Запуск /Мак для нового жесткого диска сеа1еа я лги ил им «де « раги С‘Д«г ХОВ о ршТШоп МК (МК) а Ьвд1е * ЬовгаЬН Па иишк >.Ье <1о$ смтаК М1эт (Ьлпре <*;&)> 1ау/еп<.гу нп«1$ елТга ПтсЪдоаЪ&у ХсхрегХ оп)у) 5сг>р1 ! 1оа<1 В1$к )едап. Гп» :.таВк язчр1 ( Не О а<тр 4(«к !й<рми Ю зГ*<?» Г Не Заме Л ЕхН «> <* мг иЫе 10 <*1$к ехН ц <рй1 иНЬшп !!а$Чв(( «.Ьапуес СгеаСе а ней 1аке1 д сгглЦ- а пей ецр(и ЬТТ раНХСзеп 1аЬ1с 6 еггл1г а >х'и еяу1у ЗЩ (18=Х> рагСИьи 1аЫе »т ранНют 1лЫе Рис. 15.2. Список команд /Мак
Первым делом ознакомимся со списком команд Мтзк. Введите команду т для получения справки. Список команд в последних версиях М1зк разбит на ]рупиы (рис. 15.2). В таблице 15,1 приведен список команд ^с11зк. Таблица 15.1. Команды программы /(Пик Команда Описание а Сделать раздел активным. Данный флаг был нужен для старых версий У/Нсктлз, которые не могли загружаться с неактивных разделов. Сейчас эта команда попросту не нужна, а в мире Ыпих - тем более Ь Редактировать вложенную В8Э-метку с Применить флаг совместимости с ВО8 <1 Удалить раздел 1 Вывести известные типы разделов п Добавить новый раздел Р Вывод таблицы разделов 1 Изменить тип раздела V Проверить таблицу разделов т Вывод справки и Изменить единицы измерения- X Дополнительная функциональность (только для экспертов) XV Записать таблицу разделов на диск и выйти <1 Выход без сохранения изменении
ё Создать новую пустую таблицу разделов ОРТ с Создать новую пустую таблицу разделов 801 (для ОС 1К1Х) 0 Создать новую пустую таблицу разделов 008 8 Создать новую пустую таблицу разделов 8ип Наша задача - создать раздел (или несколько разделов, здесь решать вам) и подмонтировать его (их) к корневой файловой системе. Первым делом выведем таблицу разделов командой р (рис. 15.3). Как видно из рис. 15.3, таблица разделов пуста, а размер нашего жесткого диска всего 60 Гб. СоттапВ Ст Гог Ье1р): р /ДемххЛЬ 60 СИВ, 64424503440 ЬуСе-;, 1258231/0 хесТогз МпИз: зесСогз оГ 1 * 512 = 512 ЬуТез КесТог зсге С 1ид 1са1хр11уз 1са1) 512 ЬуСез / 512 Ьукез Ь'О зёге Сппп1типь-ор11та11 : 512 ЬуТек / 512 ЬуСех 1)1зк1«Ье1 Гуре: Лоз 1Изк 1Леп11Г1ег: 0х4Г Г.726В8 СоттапД Ст Гог Ъе1р): Рис. 15.3. Пустая таблица разделов Наш диск довольно скромного размера, поэтому программа создала таблицу разделов 1)08. Для больших жестких дисков лучше создать таблицу разде: лов ОРТ. Если программа неправильно выбрала тип таблицы разделов или вы хотите изменить его принудительно, введите команду д. Посмотрите на рис 15.4: я изменил тип таблицы разделов, а затем опять отобразил таблицу разделов. Она по-прежнему пуста, но обратите внимание на ее тип - теперь у нас таблица разделов ОРТ.
Примечание. Таблица раздэлов ОРТ (СОЮ РаПНюп ТаЫе) яв- ляется частью стандарта ЕР1 (Ех1епв|Ь1е Нтвл/аге 1п1ег(асе) - стандарта, который был предложен компанией 1п(е1 на смену стандарта ВЮЗ Таблица ОРТ использует современную систему адресации логических блоков (1_ВА), а не старую сисгему СНЗ (цилиндр-головка-сектор), Но самое главное - это размер раз- дела. В ОРТ можно создать раздел размером до 9.4 Збайт (9 4 *1021 байт), а в МВР - максимальный размер раздела всего 2.2 Тб (2.2 х юг-байТ). „огтапс! (т Гог )1е1р): д Сгеа1е<1 а пей 6РТ ЛлзкЫЪе! (6Щ1): 399Е41Е1 4ЙВ9-42Е6-911Г-СЗЭВС06Е7ВЕЗ). СоттапЛ (ш Гог Ье1р): р 1Чкк /Лем/зЛЬ' 60 61В. 64424509440 ЬуГеь, 125829120 зесГлгз 1г,Из: зесГогз оГ 1 * 512 512 Ьу1ез лесГог к1ге (1ид 1са 1/р11уз1са 1): 512 ЬуГеъ / 512 ЬуГех 1/0 51ве (ткпмим/орНта!). 512 ЬуГез / 512 ЬуГез В15к1аЬе! Гуре: др! 1Нзк НеиМПег: 299Е41Е1 4АВ9-42ЕЬ-911Г-С39ВС0ЬЕ7ВЕЗ СоттапН Ст Гос ЬеГр): _____________________________________________________ Рис. 15.4. Изменение таблицы раздезчв Настало время создать раздел Введите команду п. Программа попросит вас ввести (рис. 15.5): • Номер раздела - это первый раздел, поэтому введите 1. В принципе, ког- да вы будете создавать второй раздел, программа автоматически предло- жит вам ввести номер 2. • Первый сектор раздела Просто нажмите Еп(ег - программа автомати- чески предложит правильный вариант. • Последний сектор раздела. Если вы хотите создать раздел на весь жест- кий диск (то есть использовать все доступное пространство), тогда просто нажмите Еп1ег. В противном случае укажите размер раздела. Проще всего это сделать, используя модификаторы +М и +С, например, для создания раздела размером 30 Гб укажите +300. Если у вас очень большой жесткий диск, где пространство измеряется терабайтами, ис- пользуйте модификатор Т, например, +1Т.
(т Гог Ъе1р): п 'агШюп тндтЪег (1-128, ДеГаи 11 1): 1 ЧгзЪ зес1ог (2048-125829086, йеГаиИ 2048): .а«1 хес!ог, ♦«гес1огз ог *81хе(К,М,6,Т,Р> (2048-125829086, ДеГаиН 125829086): ?геа1ей а нем рагЫЫоп 1 оГ 1урс ‘Ыпих ГПезух^ет' апд оГ 51ге 60 С [В. 'опотапЛ (т Гог Ье1р): _ » Рис. 15.5. Создание, нового раздела Программа сообщит вам, что один раздел создан. Также будет сообщен раз- мер раздела. По умолчанию тип раздела - файловая система Ыпих (Ыпих Я]е^у81ет). Если вы хотите изменить тип раздела, введите команду Ь <номер раздела> Например: г 1 .1/ >1. VIМ-» Ю Ярр1е НГ34№3> 39 лррге ИП: 1И 8рр1е ЯПЩ 41 йурГе Яй!» оННне (?. й|.р!<- Ъ-К11 43 йрр!е 1лЫ»1 44 Лрр1е ТУ гхмхегм 45 Арр1е Сеге .-Погоде 46 $о1«г(з Ым»1 47 5о!лг).ч гоо! 40 Зп1лг1з /нзг А ЛррГе 2Г5 49 Зо1»г1е ь’ьир 5» Во(аги Ьоскор 51 861аНс /мп г 57 /Заме ‘>3 Яо1«г1х «Нсп»и мчЛОг 54 5п1«г1х гсзегмсЛ 1 55 5«»)<г15 гг-‘.»ггме4 2 56 ЗнЯогК ггзвпяМ 3 5? ЗоЫгН гезстм:4 4 50 Зо1лг1.т гсзстмМ 5 59 Нс1ДЗП я«р 6Й Яс-ПИО ?РЗ ы гмияв ит (>?. МСТ ,:<лн;«1епаО?4 63 НКВ30 гпсгур1е4 М (НО КПП» 65 (ЪговсОЗ ксгпе! 66 СЪгоагНЗ 1ЧиН I» >»7 Г.ЬгоагПЗ г*!Ж1".*И 6В МкГмГпМ.ВЗЕ Лл 1л 69 МГИНдЫНЗР ЬооС 7Н М14|0<)М.В31> чыпр 71 №ЛнН|М1!зд иг; 72 НИп»ЙМ.в™ ггз 73 ПИМдЫбЗВ Щпив 71 СерЪ Зоогча! 75 СерЬ ЕпС1Ч|?1еЛ Дойга*! 76 Серб »:;»> ' 72 Серб гп!р1 (ВО ТВ Сер!» 41хк ап сгеаМоп 79 Серь сгцр1 41як 1п сгелк 1ет Ой ОрехК:» Али 81 ЦНХь ГНк :<у»1ем Я? Йин 9 рвг(111п,1 Ьглл' Т;!я. 4..1 404(йЗЯВ Я»ЙВ-111*10011 ДЖЛИЬ543Е<’« 55465ЭВ8 -вине 1 П*1 ап 11 -изеь54зиле 52414941 1«же-илп лпы ВЯЗВГЛ1.3ЕСЛС 52114941Ы4Г-11Л1 ПП11-0ЛЭЯ6543ИЛ: 426ГЬГ?4 -в»»-11 «л - ал 11 - 81НЙ651ЗЕСЛС 4О116265-6П»- Под-М11-МИМ54ЭВСЛС 5265636? ТЫЛ 11ЛА-ПЛ11 И63В65-13ЕСЛС 53?46Г7г 6167 11ЛЛ- ЯЛМ-ЖПВ65ПКЛС ЫЮ2СВ45-1 &вг 11Вг-99М>-«ЧИ:87Э66 я (ЛН5СИВ-1РВ2 нвг-пм, ИНИЛ'Я?.ХЛ31 б«гда(хз-1рвг11пг э9*б «мжягжлз! 6ЛЯ7С4ЯК 1 <102 -11И2 -99Л6 9НЙИ17Э66Э1 6МЖ.17Л ю»2 11И2 «Л6 ИНН82»?Э66з I 6ЛВЕЕ2Е9- 1В02-ИЯ2-ТЖ6 -ЯИЕ»г»4>31 (гЛЭбШЗЗ- 1Ж-11»2-ЗЗЯб ЯЯ»г»7»631 бпчгталг- 1вог-п«г?9«>дююгя7зг.б31 6Л945ЛЗВ 1РВ2 11В2-9ЭЛ6 воявг»736631 ытзт 1 1И2 11вг-99льити2и? 16631 Ы19М767-100г-11вг-59й6-МИ№В?Э(>6:11 ьлэьгз?? - юнг - ивг '/**> -иояки? зы»з I 6МЖЙС7-1 в»г -1 аг яникя?ллз 1. 197481132 В10Е 11 ВС »99В М19Р1829М8 19К4ВВ5О-В1иь ивс -вч’я «изрутгчмн 1ЧГ4ВИи-В1И:-11К вчзп «иимитчмн гВ8!»1ЧС4 ИВЕ НОС ГГШ-ЯИ9В1Я?9МИ 2М519ЕС «1ВЕ 11К-В9?0-М19В1в79648 43Г1вОЛА 11В? НК-НЯ ан 1301879618 ГГ.№2№»-4Г32- 41Л7-ГЛЙ, ЛС€СЗгв5ЛЭИ9 ЖВНЕ2»К 387? 4?ВР-ННХ-7РР2МЭСГСа. гкИЙ?Г<»-9Е18-43Вй-В337 В151Т2СВ1ВЫ. 85В5Е45Л :зтс 11Е1-В4ВЗ ЯГМ0Г7ГСЛЛ? 85КЕ45Е-2ЭХ 11Е1 «483 Е89ЯНГ7ГСЭ0? 85В5Е15» 237С -11Е1ДИВЗ ЕВ9Я1Г7КЗЛ? 8.394ЕПЯ 7,371 11Е11Н81 ЕНЧМЕПТСЖ? 05В5Е150 2Э7С ИЕЫНВЭ-Е89ЯВГ7тл7 Я5В5Е45С-237С-11Е1-1МВЗ ЕВ9ЛВГ7ЕСЭЛ7 4Г.Ю96ЭЕ 9В83 4ГЭв ИСЬ В4ЖИСПТ186 45М19Ь9Е 9В83- 4Г Ж- НС6 5ЕСИ8С1ТПИ6 4ЕВВ7Е29-ЧВ25-41ВН-М'М-НЬДЖНТЖЛ 4ЕЯВ?ЕгЗ ЧВ.75-41ВВ-ЛПЖ-5ЕГЖСЕГГ05» 89С57ПВ ,'ТГ, 1 ВСЯ 89С1 - ГЗЛМКИТ2ВЕ В9С57Е98 г?Е5 4МИ-ОТС1 5ЕГИВСПТ2К В2КГ7ЯЙ ЗбАвИЕ'1 8968 952Ч19ЛВ НЫ СаЪйЧАВ 7Ж 46Й1 8913 СВЕЕЕЕЕЗгМ! П181ЙН - «К5 -47ЛР -в9П2-НПВВ7Нй!<Д<С Рис. 15.6. Подсказка по типу раздела Далее нужно или ввести код типа раздела или ввести команду Ь для вывода подсказки (рис. 15.6).
Проблема зся в том, что нет способа постраничного просмотра типов раз- делов, а все они не помещаются на одном экране. Поэтому все равно при- дется обращаться к документации. Однако в большинстве случаев изменять тип раздела не нужно, поскольку при создании раздела он создается уже нужного типа. Исключение может возникнуть разве что для раздела подкач- ки (Ыпих 5тр), Его код - 82. Если вы передумали менять тип раздела, просто нажмите Еп1ег. Теперь введите р для просмотра нашей таблицы разделов. Всегда просматривайте таблицу перед ее записью. После этого введите команду для сохранения изменений и выхода из программы (рис. 15.7). • нпи, лпк.1 I» |,«! ,1| Л ."<>•• (и . I 11пи> 2.28 > мН! гаи1и ш миит» оп1у, ни1Н ч«» ЛжЫе 1о мг11л- слпДч! Ы-Гогч «: (Ьс мг!1с оммМ. ' 1 мН '.ппЬНп а рог . « 1к-и ВУЗ |Цхк1><Ь>:| иК1| (4е«1>Г1ег НхЫМЛгЛаХ (» Гог )» Мак /Лем/аЛ: М СИ. 64421589118 ЬуГех, 125829128 зсс1огз 1|..1 • Юга <Я 1 ‘>1? 51.2 ЦЛе * Ым- :;1гг < 1щ1с41/ркр1сл1 к 512 1м]{ез / 512 Ьц(гк 1.0 к1г.с (»1»)«нм/1ф111м1): 512 ЫДе $12 кДса И }к1аЬе) 1у₽с <Ш> Нкк ((кчгИГЮг (ЬбШ&ЗаЗ Ь’ммпД (м Гот- : у ,-еМЫ а псы (ЧТ «ВНвЪН <СМ(В: гэгЗЕЖД: ЙВЗВ-ШЧС *5С-(2*)ЙС1ГЕ1ВВЙ> :яаннИ Сог Ье1р>: п «шйег 1 128. 4еГа>111 1> 1 Игк! ЯХ»пг (2.018 12У1г,ЖМ> ЛеГачИ 281») .3 .1 -«с иг, «хиНотз от- •ьЧге1«,П,6,Т,П (аММЕЯЯМЬ. ЛНаиЦ 125824086): Г( «ь.Д а псы рагНИо» 1 «Г 1урп '1Лянх П1ехух(«ж' «М оГ (ге (4 61> 1«мпп4 (м Гог Ьв1р): р И$к /Лем/заЬ: (Я 611, (.М245894Ю ЦЛез. 125823120 зесЪм ЬИх: зесНм-з о< 1 • 512 512 Юг 51яе (1оу1с.» 1/рЬух 1са! >: $12 / 512 ЬуЮк 1/8 «1ье (»ппмт/о|>ит1); 512 Ьи1ез 512 1м|1ез Н к1*Ъе) 1уре: др! Нхк МеиНПег: 23238161 ИйЗВ ЛбЗС-ЭКС-СЛЛСИЕИВй >гу|се 31а г! ЕиЛ Зес1оГ8 81ге ЭМИ I,-Я12ВИП6 12Ж78ЭЭ «Г. Мейж текшем <>м<м1 (м Гвг Ье)₽): и "Ы: рагИНоп 1аЫс Ыа Ьсеп аНегсД 'а!||пд 1ос1)0 1о ге-геа4 рагН11оп 1аЫе. йрк1п5 41$кх. |ги11В|<каН1ца( 13 _ Рис. 15.7. Весь сеанс разметки диска: от создания таблицы разделов до записи изменений Создать раздел мало. Нужно еще создать файловую систему. Не будем ни- чего выдумывать и создадим стандартную файловую систему ех14 командой тк$.ех14: # т'кГз.ехЫ /<^еV/здЫ
Результат выполнения этой команды приведен на рис. 15.8. 1гоо(₽1оеаПю:;*. ~18 мк1 йке2Гз 1.42.13 (1?-Пау-2015) СгеаНпу €11езук1ем нНЬ 15726373 4к Ыоскх апй 3932160 июйез П1езуз1ем Ш(Ь: БйеМеРс-5878 4174 --МйеЧЛЫКесвГШ зирегЫоск Ьаскирх 81огей оп Ыоскз 32768, 98304, 163848, 229376, 294912, 819208, 884736, 1605632, 2654208, 4896000, 7962624, 11239424 ШосаНпд дгсир ГаЫех- Йопе ЙЧИпд »пойе 1аЫсз: Йопе ’.геаНпд ,|(шгпа1 (32768 Ыоскк): Йопе йчНпд зщип’Ыоскз апй П1е$у$1ет асашпИпд ЫогтаНол? Йоне 1гоо1й1оса)Ьо51 18 мкЙ1г /тп1/$йЬ1 !гоо!.@1оса1ЬогЛ 18 тонн!. /йем/$4Ы /явИ/зйЫ. 1гоо181ос4Ню$1 18 к /ятк/кйЫ 1гоо181оса Нюз1 '18 Рис. 15.8. Сование файловой системы и монтирование жесткого диски После этого нужно создать точку монтирования для нового раздела и под- монтировать раздел (название точки монтирования можете изменить по сво- ему усмотрению): # тксНг /тпГ/збЫ # тсипи /<1еу/зс1Ы /.тп'Ь/збЫ # 1з /тпС/зйЫ Почти все готово. Осталось только добавить запись в /е!с/ШаЬ д.хя автомати- ческого монтирования созданного раздела: /аеу/збЫ /тпС/здЫ ехс4 йеГаиГСз 1 1 Вот теперь можно приступать к использованию нового жесткого диска.
15.2. Менеджер логических томов 15.2.1. Введение в ЬУМ Впервые менеджер логических томов (ЬУМ, Ьб§1са1 Уб1шпе Мападег) появился в ядре 2.4 (его первая версия ЬУМ 1), но более активно он стал применяться только в дистрибутивах с ядром 2.6 (уже вторая версия ЬУМ 2). Некоторые современные дистрибутивы использую! ГУМ по умолчанию и создают пулы ЬУМ, в некоторых же ЬУМ даже не установлен по умол- чанию. Чтобы понять, нужен ли вам ЬУМ, нужно разобраться, что это такое. В этой части главы все будет изложено максимально доступно, так что бояться использовать 1УМ не стоит. В тоже время, если вам необхо- димы точные академические определения и дополнительная информация, обратитесь к Ыпих ГУМ НомДо (Ьйр://11др.огё/НОХУТО/ЬУМ-НО^ЛТО/), в котором много технических подробностей (если они вам нужны) и не совсем вес сразу понятно. ЬУМ - это дополнительный уровень абстракции над аппаратными сред- ствами, позволяющий собрать вместе несколько дисков в один логический диск, а затем разбить его так, как вам хочется. Примеров использования ЬУМ множество. Самый простой из них - объединение нескольких небольших дисков в один диск большего размера. Например, вам досталось даром (или почти даром) несколько 58В-дисков небольшого размера, скажем, по 128 Гб и вы хотите объединить эти 2-3 дис- ка, чтобы получить один большой диск 256-384 Гб. Второй пример тоже часто распространен. Представим, что система у вас установлена на небольшом диске, пусть даже на том же 88В-диске размером 80 Гб. Дтя Ыпих такой объем вполне достаточен, по рано или поздно сво- бодное место закончится (все зависит от файлов, с которыми вы работаете) Вы покупаете диск большего размера, скажем, па 500 Гб или даже на 1 Тб. Но система уже установлена и переустанавливать се не хочется. Что делать? Здесь вам поможет ЬУМ. Первый приведенный мною пример (объединение трех дисков во время установки) слишком тривиален и с ним справится любой, даже самый на- чинающий пользователь -просто во время установки нужно выбрать Ь\^М
(если, конечно, дистрибутив его поддерживает) и выбрать диски, которые вы объединяете в группу (пул). Второй пример более сложный только за счет того, что система уже уста- новлена, и мы договорились, что переустанавливать ее не будем Поэтому он и заслуживает рассмотрения в этой главе, а дополнительную информацию вы сможете найти в Ыпих ЬУМ НоМо, ссылка на который была приведена ранее. 15-2.2. Уровни абст ракции ЬУМ Прежде, чем перейти к рассмотрению практической стороны вопроса, нуж- но разобраться с тремя уровнями абстракции, с которыми вам придется столкнуться в ЬУМ. Вот эти уровни: • РУ (РЬуыса1 У61ите) — физические тома. Это могут быть разделы или целые, еще не размеченные диски. • УС (УЫише Огоир) — группа томов. Физические тома объединяются в группу и создается единый диск, который вы можете разбить так, как вам хочется. • ЬУ (Ьо§1са1 УЫише) — логический раздел. Это раздел нашего единого диска (УО), который вы можете отформатировать в любую файловую си- стему и использовать так, как вам хочется, как обычный раздел обычного жесткого диска. Прежде, чем мы продолжим, вы должны знать об одном недостатке ЬУМ. Тома ЬУМ не поддерживаются загрузчиком СК11В. Поэтому если вы ис- пользуете этот устаревший загрузчик, вам нужно создать отдельный раздел /Ьоог за пределами ТУМ. Грубо говоря, если у вас есть диск /беу/зба, раздел .'беу/зба! должен монтироваться к /Ьоо1. В него будет установлен загрузчик. Размер этого раздела должен быть небольшой, примерно 100 Мб (вполне будет достаточно). Что же касается ОКЫВ2, то он нормально загружается с ЬУМ и никакой до- полнительный раздел создавать не нужно.
1................< ьПпих 15.2.3. Немного практики Первым делом вам нужно установить пакет 1упт2, если он еще нс установ- лен. # ар^-деС 1пзЪа11 1уш2 # уит 1пзЪа11 1уш2 Команда установки этого пакета для РеЛога/СепЮ8 приведена на всякий случай, так как в большинстве случаев этот пакет в этих дистрибутивах установлен по умолчанию. Будем считать, что система сейчас установлена на /бем/зба!, который под- монтирован как /. Больше никаких разделов на этом диске не создано - для упрощения примера. Мы подключили второй жесткий диск, который пока еше не разбит. Имя этого диска - /беу/збЬ. Если на втором диске нс созданы разделы, то создавать их и не нужно. Вы можете сделать все устройство сразу физическим томом (РУ). Если на нем есть разделы - не беда, вы можете добавить в группу томов все разделы поочередно Тратить время на создание разделов нс хочется, тем более, что это и не нуж- но, поэтому создаем РУ на все устройство /беу/зйЬ Для этого используется команда русгеа1е: # русгеаЪе /аеу/зс1Ъ РИуз1са1 уо1шпе "/деу/зсОэ" зиссеззГиНу сгеаЬед Теперь нужно создать группу томов с помощью команды у§сгеа1е. Данной команде нужно передать имя группы (пусть это будет и указать фи- зическое устройство: # удсгеаСе шу_уд /деу/з<ЗЪ Уо1ите дгоир "удО" зиссезз^иНу сгеаЬей Создаем отдельные логические тома (команда 1усгеа(ё) для раздела подкач- ки (зхуар) и разделов /йоте, /1тр и /уаг. Параметр -Ь задает размер раздела,
например, -ЬЗОО задает размер 30 Гб. Параметр -п задает имя логического тома: # 1усгеаИе -п змар -Ь8С шу_^д # русгеа-Ье -п Иоте -Ь500С ту_уд # 1усгеат:е -п уаг -ЬЗОС ту_уд # 1усгеах_е -п Гггр -Ь5С ту_уд Последний параметр - это имя нашей группы. При желании можно создать отдельный раздел и для /изг, но. как правило, программное обеспечение (а оно в основном устанавливается в /изг) в Ыпих много места не занимает. В общем, смотрите сами - никто не мешает ввести еше одну команду 1усгеа1е. Тем более что у нас еще осталось место (если учитывагь, что у пас жесткий диск на 1 ГБ). Теперь разберемся, что и где мы создали. Просмотреть информацию по фи- зическим томам, группам томов и логическим разделам можно с помощью команд рх’^р1ау, \’§^1хр1ау и 1усН$р1ау соответственно. Созданные нами разделы будут храниться в папке /<1су/шу_уц/. В этом ката- логе вы найдете файлы йоте, :тр, уаг (правда, это будут ссылки, а не файлы, но суть от этого не меняется). Когда созданы логические тома, можно создать на них файловые системы (отформатировать их). Вы можете использовать любую файловую систему, я предпочитаю ехт4: # ткГз.ехН4 -Ь уаг /с1еу/ту_уд/уаг # ткГз.ехТ.4 -Ъ Иоте /с1еу/ту_уд/Иоте Я тк5з.ехЬ4 -Ь стр /<1еу/ту_уд/1:тр # ткзмар -Ь змар /<!еу/ту уд/зиар # змароп /<1еу/ту_уд/змар Первые три команды создают файловую систему сх14 на устройствах /йеу/ ту_у§/уат, /<1еу/ту _у§/йоте и /йеу/туу^/йпр. Последние две создают раз- дел подкачки и активируют его. Настало время заняться перемещением данных. Суть в следующем - нужно подмонтиррвать поочередно новые тома и скопировать в них содержимое /йоте и /уаг.
# ггксйг /тпй/йоке # 1Г.Ы1 г /тпс/уаг # тсипй /ае^/ту_уд/йоте /тпй/йоте # тоигЛ /с!еу/ту_уд/уаг /тпй/уаг # ср -а /Иоте/* /тпй/йоте г ср -а /уаг/* /тпй/уаг # итоипс /лтй/йоте # итоипй /тпЪ/уаг В папку /1тр копирован, ничего не нужно. Нужно только изменить права доступа: # ткаХг /тпй/гтр # тоопй /аеу/ту_уд/йтр /тпС/Ътр # сйтод -Н а+гмх /тпй/йтр # итоипй /йтр Почти все. Теперь нужно добавить в /е1с/Гз1аЬ записи, монтирующие файло- вые системы /йоте, /уаг, /йпр и указать в нем раздел подкачки: / йеу/таррег/ ту_уд-йоте /йоте ехй4 ге1аР1те X X /с1еу/таррег/ту_уд-уаг /уаг ехй4 геХайгте X X / сАеу/таррег/ту—Уд-Ътр /йтр ехР4 поаЪХте 0 2 / < 1еу/таррег/ту_уд-зи ар попе еьар ЗИ 0 С Все готово. Осталось только ввести команду геЪоот, чтобы система переза- грузилась. Корневая файловая система осталась на старом жестком диске (как и /аяг), а каталоги, которые занимаю» больше всего места, были пере- мещены на логические разделы ЬУМ.
15.3. Расширение ЬУМ-пространства Предположим, что вы расширили дисковое пространство виртуального сервера. Однако одного расширения в панели управления недостаточно - чтобы система увидела изменения, нужно произвести определенные дей- ствия. В принципе, задачу расширения пространства сервера можно было решить иначе, например, добавить еще один виртуальный жесткий диск, а дальше или использовать классический способ или же добавить диск в группу томов - асе зависит от того, как настроена операционная система виртуального сервера. Но случилось то, что случилось - вы уже расшири- ли жесткий диск, а вернуть ресурсы в пул, как правило, нельзя. Поэтому рассмотрим процедуру расширения виртуального диска. Первым делом, посмотрим, сколько сейчас дискового пространства доступ- но. Для этого используется уже известная команда <1/с параметром -Л, чтобы вывод был в удобочитаемом формате: аг -ь гоо1(аиЬипЦи!804;дГ -1 РИезуеСет 31ге Нзед Амах! иее% Моип1ед оп идем 1.56 0 1.56 е% /дем бтр'Рз 301М 4.5М 296М 2% / сил / дем/таррег/м§гоир1-гооб 196 2.16 176 12% / 1трГз "1.56 0 1.56 0% /дем/$Ът 1трГз 5. ем е 5. ем 0% /гип/1оск 1.56 0 1.56 е% / 5у з/€$ / с е гоир /дем/вда! 92 2М 140М 719М 17% /ЬооГ бтр-^5 301,М 0 391М 0% /гип/идег/0 гооГ(»иЬип-би18е4: Рис. 15.9. Команда д/-И На данный момент общий размер группы томов /(1еу/таррег/у§тоир1-гоо1 составляет 19 Гб. Однако мы расширили диск и теперь нам нужно расши- рить размер этой группы томов до полного размера диска. Чтобы система увидели новый объем жесткого диска, нужно пересканиро- вать аппаратную конфигурацию. Для этого мы будем использовать следую- щую команду:
есУю 1 > /зуз/Ыоск/зда/с^еV^се/^езсап Запустите утилиту раг1е<1 (используется для работы с разделами диска): рагЪед Введите команду р для просмотра имеющихся разделов (рис. 15.10). Запом- ни! е номер раздела, который мы будем расширять (2) и новый размер диска (42.96В). гоо10иЬип1и1804:есЬо 1 > /5уз/Ыоск/5да/деУ1се/ге5сап гоо1@иЬип1и1804:раг1ей 2Ш РагГед 3.2 Ц51П8 /деу/ада Ые1соте го 6МЗ РагХей! Туре 'Ие1р' 1о ухеи а 1151 о-? соттапдз. (раг1ес!) р Мос1е1: УМшаге Ухг1иа1 сНзк (зезх) 01$к /<1еу/5да: 42.968 <^33 5ес1ог $1зе (1овхса1/рКу51са1): 512В/512В РагННоп ТаЫе: т$с!о$ 015к Падз: 1итЬег 51аг1 Епд 5126 Тур<= Р11е 5у51ет Р1Э8-. 1 1049кВ 1000МВ 999МВ ргггсагу ех!4 Ьоо! 2 1000МВ 21.56В 20.56В ргхтагу 1ут (рагЧед) Рис. 15.10, Текущая таблица разделов Запустим команду изменения раздела: гезггерагИ Укажем номер раздела: Раг^КХоп пшпЬег? 2
А затем - конец раздела - нужно указать как раз то самое значение 42.9СВ - именно так, без пробелов. "ооГ(в|иЬипГи1804.~# есЬо 1 > /$у$/Ыоск/$с1а/йеу1се/гезсап *ооГ^иЬип1и1804:рагТед □№' РагТед 3.2 изхлв /дем/зда 4е1соте То <5ММ РагТесП Туре 'Ке1р‘ То а 11$Т о€ соттапдз. (рагТей) р 4ойе1: УМиаге У1гТиа1 сНзк (зсзз.) Язк /йеу/зда: 42.96В 5есТог $12е (1ое1са1/рЬу51са1): 512В/512В ?агТ1Т1оп ТаЫе: тздоз ?1$к Е1а§з: МитЬег ЗТагТ Епд 8126 Туре Г11е зузТет РХа^з 1 1049кВ 1000МВ 999МВ ргхтагу ехТ4 ЬооТ 2 1000МВ 21.56В 20.568 ргЧтагу 1ут (рагТед) гезхгерагТ ’агТхТхоп питЬег? 2 Епд? [21.568]? 42.968 (рагТед) цихТ 1п-ЕогтаТ1ол: Уои тау лее<1 То ирдаТе /еТс/Р$ТаЬ. гооТ{*иЬипТи1804:~# | Рис. 15.11. Изменение размера раздела Введите команду диИ для выхода из ранее!. Ранее! сделал свою работу. Оста- лось сообщить ядру об изменениях размера: ругез12е /с1еч/зс1а2 РЬуз1са1 чо1шпе "/де’//зс!а2" сЬапдед 1 рЬузхса! уо1ите(з) гезхгед / 0 рЬуз!са1 Vо1ите(з) поЬ гезхгед Расширим логический том: ]^ехЪепд -г -1 -И00%ГКЕЕ /д<^/таррег/^дгоир1-гооЪ По окончанию работ введем е!/-к чтобы убедиться, что дисковое простран- ство расширилось. Посмотрите на рис. 15.12. На нем результат выполнения команд ругез^е, 1уех1епе! и е!/ Последний вывод сообщает нам, что размер группы томов у§гоир 1-гоо1 теперь составляет 41 Гб. Мы успешно расширили том до ново- го размера.
гооГ(*1иЬип1:и1804:-*# ругезххе /деу/зда2 РНу51са1 уо!ите '7деу/зда2‘‘ сЬапвед 1 рНузхса! уо1ите(з) гезххед / 0 рЬузхса! уо1ите(з) по! гезххед гоо1^иЬипГи1804:~# 1уехГепд -г -1 +100ХРЙЕЕ /деу/таррег/у8гоир1-гоо1 5126 о-Р 1О81С81 ио1ите у^гоирХ/гоо!: сЬап^ ^ГО® 18.11 61В (4637 ехГепГз) Го <38.07 61В (9745 ехК пГ$). Ьоехса! уо1ите У8гоир1/поо1 зиссеззГиИу геззхед. аесоип!=12, а8$12е=400640 Ыкз а!1г=2, ргоз1д32Ы1=1 НпоЬГ=1 зр!подез=0 гтарЫ=0 Ыоск 5=4748288, 1тахрсГ=25 5и1с11К=е Ыкз а$сН-с1=0 Ггуре=1 Моск$=2560, уег51оп=2 зип11=0 Ыкз, 1а2у-соип1=1 Ыоскз=0, Г1ех1еп15=0 теГа-даГа=/деу/таррег/У8гоир1-гоог 1з1хе=512 зесГ82=512 = сгс=1 = геГИпк=0 йага = Ьз1ге=4096 Я 5игп1=0 папхп^ =уег$1оп 2 Ьз122=4096 1ов =1пГегпа1 Ьз12е=4096 = зес182=512 геа1Ыте =попе ех152=4096 даГа Ыоскз сЬап§ес1 Ггот 4748288 Го 9978880 гоо1йиЬип1и1804:^# сН -Н ЕЫезузГет 5126 Озед Дуа И У5е% Моипгед оп иОем 1.66 0 1.66 0% /деу Нар-Ез _315М 4.8М ЗИМ 2% /гип /де V /т арре г / у&гоур!^- гооГ 2.36 .39? Гтр-Ез 1.66 0 1.66 0% /Ьеу/зЬт ГтрГз 5.3М 9 5.3М 0% /гип/1оск Гтр-Ез 1.66 0 1.66 0% /5у5/Г5/С8Гоир /беу/зда1 967М 147М 754М 17% /ЬооГ Ьтр'Ез 315М 0 315М 0% /гип/изег/0 •ооГЙиЬипГи1804: Рис. 15.12. Тем расширен
Приложение 1. Файлы конфигурации Ыпих
Ш.1. Конфигурационные файлы Чтобы эффективно настраивать и ядро, и систему Ьтпх, нужно ориентиро- ваться в содержимом конфигурационного каталога. Если загляните в /е<с, то кроме подкаталогов в нем вы обнаружите и файлы, которые находятся не- посредственно в /еГс. Описание этих файлов приведено в таблице П1.1. Со- держимое каталога может отличаться в зависимости от используемого дис- трибутива и установленного программного обеспечения. Но общая картина будет примерно одинаковой во всех дистрибутивах. Таблица П1.1. Файлы из каталога /е1с Файл Описание ЫКСОЬОВК Конфигурация цвета для утилиты 1з. Здесь вы мо- жете указать, каким цветом будут выводиться ката- логи, файлы, ссылки и т.д. (ЖЕР СОЬОВ.8 Конфигурация цвета для утилиты %гер 3
а суйте Содержит параметры для корректировки аппарат- ных часов аЕазек База данных псевдонимов для почтовых агентов (МТА) аЫепу Содержит пользователем, которым запрещено ис- пользовать планировщик а(. Дополнительная ин- формация доступна в тап а! апасгогЛаЬ Конфигурация (таблица расписания) планировщика апасгоп Ъаз11.Ьа8Ьгс Глобальный файл конфигурации оболочки Ьазй. Локальные файлы конфигурации находятся в до- машнем каталоге каждою пользователя ЫпсЬкеуз Содержит ключи для ВМЗ-сервера Ътс19 ЬтЛгез /рогС. Ыаск- 1181 Содержит список номеров портов в диапазоне от 600 до 1024, которые не могут быть использованы Ып&еырог!, который обычно вызывается 1Р.С- службами. По умолчанию запрещены порты 623, 631,636, 664, 774, 921, 993 и 995, которые исполь- зуются различными сетевыми службами сгоп.сепу Список пользователей, которым запрещено исполь- зовать сгоп сгогАаЬ Таблица расписания демона сгопс1 СГОПу* Конфигурация ЫТР (сервер времени) сзЬ.сзЪгс Файл конфигурации для оболочки С 8Ъс11 Г зн
сяМо&ш Глобальный файл конфигурации для С 8йс11. Опре- деляет поведения во время регистрации пользова- теля (1ощп) в системе. На самом деле - это сцена- рий, который запрещено редактировать вручную. Он должен изменяться только время обновления системы. Вместо этого лучше редактировать /е!с/ С8Й.1о&1П.1оса1, если вам нужно внести изменения в настройки вашего локального окружения сгурИаЬ Содержит информацию о зашифрованных томах йегаикдогпаш Содержит доменное имя для сервисов М8 и Ы18+ кЬсИеш.сопГ Файл конфигурации для Г)НСР-клиента бксНеШб.сопГ Файл конфигурации для ИНСР-клиента, версия 1Ру6 (ЖсрФсопГ Файл конфигурации для ЭПСР-сервера ёЬсрдб.соп^ Файл конфигурации для ВНСР- сервера, версия 1Ру6 сНаЬ^гс Конфигурационный файл для пакета Фа1о§, опре- деляет цветовую схему диалоговых интерфейсов, построенных с помощью пакета (йа!о§ ёпятазс.сопГ Конфигурационный файл для йпятдзд (ВМ8- маскарадинга) бгасиг.сопГ Содержит параметры <1гаси1 - средства, которое формирует шйгатй
опте Конфигурационный файл для репозитария ОК1 СУ8 епуиоптепг Файл используется РАМ-модулем ратепу. Содер- жит переменные окружения, описанные в виде пар КЛЮЧ^ЗНАЧЕНИЕ, по одной паре в одной строке евб.сопГ Параметры ЕеоипГ) (Еп11§Ыспеб 8оипб Оасгооп), который используется для смешивания вместе не- которых цифровых аудио потоков для проигрыва- ния на одиночном устройстве егЬетз Содержит 48-битные ЕгЬетеСадреса и соответству- ющие им !Р-адреса или имена узлов. Может ис- пользоваться некоторыми сетевыми службами для разрешения МАС-адресов в 1Р-адреса ехропя Содержит список экспортируемых файловых си- стем Гебога-ге1еаье Информация о релизе Ребога Й1е8у«?1еп18 Информационный файл, содержит некоторые ха- рактеристики и атрибуты файловых систем. В нем нет ничего особенно интересного РбаЬ Содержит список файловых систем, которые будут монтироваться автоматически при загрузке систе- мы Привете Список пользователей, которые НЕ могут войти в систему по РТР. Среди них вы найдете пользовате- ля гоо1 и многие другие системные учетные запи- си, которые используются для сетевых сервисов и обычно обладают повышенными привилегиями
§гоир Содержит группы пользователей ЬозТ.сопГ Задает порядок разрешения доменных имен Ьозйтатс Содержи! доменное имя узла коз 18 Ранее использовался для разрешения 1Р-адресов в доменные имена. Сейчас для этого используется система ЭМ8, но вы все равно можете определить в нем некоторые 1Р-адреса, если ваша сеть не ис- пользует ИИ 8 или же вам нужно переопределить разрешение для определенного 1Р-адреса. Обе си- туации в наше время настолько редки, что похожи на что-то из области технической фантастики коей.* Файл конфигурации локальной сети йизЫо§тп8 Если существует файл 61е -/.ЬизЫозтп или /е1с/ ЬизЫоёшз, осуществляется «тихий» вход (это от- ключает проверку е-тап и вывод последнего вре- мени входа и сообщения дня (Мезза§е оГЭау)). Если существует файл /уаг/1о§/1акЛ1о§, то выводится время последнего входа в систему ккпарФсопГ Конфигурация демона збптард Ип.сопГ Файл конфигурации для тЗпкй ШпаНаз.сопГ Псевдонимы кодировок для тйпкП
шрийх* Позволяет задавать обработку отображения симво- лов в специальных ситуациях. Используется редко гззие Приглашение, которое выводится при входе в си- стему (ссылка на /изг/НЬЛззие) тззие.пе! Приглашение, которое выводится при сетевом вхо- де в систему (ссылка на /изг/НЬЛззие.пе!) кгЬб.сопГ Параметры КегЬегоз 1б.зо.сасЬе Хэш-версия файла И.зо.сопГ. Создается утилитой Исопйй М.зо.сопГ Настройка динамического связывания во время вы- полнения 1еззкеу Задает параметры преобразования некоторых сим- волов/клавиш, вы не будете редактировать этот файл ГЬяо.соп!' Конфигурация библиотеки НЬао (обычно здесь за- дается аудио-драйвер по умолчанию) НЬаийй.сопГ Конфигурация библиотеки ПЬаибН 10^10.^6^8 Контрольные определения для пакета зЬабоху. Например, здесь можно задать количество неудач- ных попыток входа в систему и многие другие па- раметры 1о§гоШе.сопГ Задает параметры ро гации журналов тасЫпе-к1 Содержит идент ификатор машины
таП.гс Файл конфигурации программы тай тапра{Н.сопй§ Этот файл используется пакетом тап-<1Ь для на- стройки путей тап и са1 типе.{урез Содержит список МГМЕ-типов и соответствующих им расширений файлов тке2Гз.соп{ Файл конфигурации программы тке2Гз тоМ Содержит сообщение дня (Мезза§е оГ {Не Вау). В зависимости от настроек системы может выводить- ся при входе в систему пйоок.сопГ Данный файл являет ся частью пакета т1оо1з сопГ. пс1сопй§ Файл конфигурации сети. Теперь используется только с кодом Т1-КРС в библиотеке ИЬбгс пе1§гоир Содержит описание конфигурации сетевых групп геплогкз Статическая информация о сетевых именах пГзтоипксопГ Файл конфигурации монтирования №'8 ПЗСб.СОпГ Конфигурационный файл для пзеб (Каше 8егутсе Саске) П885УЙск.СОпГ Параметры 5188 (ЫсШогк 8егутсе 8\уйсЬ)
пф.сопГ Файл конфигурации сервера времени пфб о8-ге1еазе Содержит информацию о релизе: номер версии, ко- довое имя и т.д. (ссылка на /изг/ИЬ/оз-геказе) ра883У(1 База данных паролей Р6ПП1881ОП5 Этот файл используется программой сЬк81а€ и кос- венно некоторыми ХРМ-скриптами для проверки или установки прав и режимов файлов и каталоге ч при установке рппГсар Этот файл автоматически генерируется сирзё, его не нужно редактировать. Все изменения, внесенные в этот файл, будут потеряны ргоШе Не изменяйте этот файл во избежание потери из- менений во время очередного обновления системы. Если вам чужно изменить этот файл, отредактируй- те /е1с/ргой1е.1оса1, чтобы установить ваши локаль- ные настройки, например, глобальные псевдонимы, переменные У1811АЬ и ЕО1ТОК и т.д ргогосо18 Список 1Р протоколов руЙюпЗз^ап ЗгагШр-сценарий Руйюп 3 для сохранения истории интерпретатора и автодополнения имен руЛопвШП То же, что и ру1йоп381аЛ, но для старых версий РуЙюп газу Определяет параметры привязки гак устройств к блочным устройствам
тс.зр1азк Сценарий, определяющий внешний вид индикатора начальной загрузки тезоК.сопГ Конфигурационный файл для системы разрешения имен грс Список протоколов удаленного вызова процедур (КРС) Г8упе±СОпГ Файл конфигурации для тзупсд гзупсд.8есге1з Пароли гзупсд зегеепге Параметры программы зегееп (менеджер экрана с эмуляцией терминала УТ100/АН81) зссигепу Содержит имена устройств терминалов (йу), на ко- торых разрешает вход в систему пользователю гоо1 зеплсез Список служб (сервисов) зЬадоху Пароли из файла /е^с/раззмч! физически хранятся в /е'с/з11а<1оу’ Поэтому фактически в /ею/раязж! хра- нится список пользователей, а пароли этих пользо- вателей находятся в /еГс/зИабоху, доступ к которому ограничен зЬеПз Список установленных в системе интерпретаторов я!рсопГ Файл конфигурации ОрепЗЬР 8Р1 зтагГФсоп? Файл конфигурации демона зшапй
зисоегз Позволяет определить, кому можно использовать команду 5и<7о ьизрспб.сопГ Некоторые параметры питания зузсЙ.сопГ Файл конфигурации зузей. Кроме этого файла зузей также читает параметры из файлов /е^с/зузсй.й/*. сопГ, /гип/зузсЙ.й/*.сопГи некоторых других пу1уре Содержит список терминалов и определяет их тип изЬ_то<1езхуйс11 Параметры для пакета изЬтойезхуйсй усэпзо1е.сопГ Конфигурационный файл для виртуальной консоли VI ГС Файл конфигурации текстового редактора хп ху^еггс Параметры программы ху^е! хайг.сопГ Задает, как обработать расширенные атрибуты при копировании между файлами П1.2. Подкаталоги с конфигурационными файлами Далее мы «пройдемся» по подкаталогам каталога /егс с целью выяснить, что находится в каждом из них (табл П1.2). Содержимое вашего каталога /е1с может отличаться в зависимости от дистрибутива и уже установленных программ. Вполне вероятно, что у вас не будет некоторых каталогов, пред ставленных в таблице ГП.2, но будут некоторые другие каталоги, назначение которых можно найти или в справочной системе Ыпих, или в Интернете.
Таблица 17.2. Подкаталоги каталога /есс Каталог Описание М ейУогкМапа^сг Содержит файл конфигурации Кегмюгк Мапа^ег и файлы конфигураций сетевых соединений в некоторых дистрибутивах Раска^еК К РаскадеК.11 - это открытый и свободный на- бор приложений для обеспечения высоко- уровневого интерфейса для различных ме- неджеров пакетов. Этот каталог содержит файлы конфигурации Раска^еКй XII Параметры графического интерфейса XI1 (X аЫ Конфигурация аЬгй! - демона автоматиче- ских отчетов о сбоях акегпаНуез Каталог альтернатив по умолчанию. Файл является частью подсистемы ирда1е- акетаНчез, которая обслуживает символи- ческие ссылки, определяющие команды, файлы и каталоги, используемые по умол- чанию аис1й и ашйзр В этих каталогах находятся конфигураци- онные файлы демона аудита - аисЕМ и его диспетчера событий (аиЗи ечепг сИзраюйег). Основной конфигурационный файл - /еГс/ аибй/ашйиксопГ. В нем задается поведение демона и некоторые настройки, например, расположение журнала по умолчанию /чат/ 1о$/аи<й1/аш1й.1оё
ар1 Конфигурация менеджера пакетов ар! Ьа8Ь_сош1еНоп.(1 Параметры автодополнения командной строки для оболочки Ьазй Ьшйпг.д Демон ЫпйпЫ настраивает дополнитель- ные двоичные файлы для выполнения во время загоузки. В этом каталоге находятся его конфи: урационные файлы соскрй Конфигурация панели управления Соскрй сНз-иШв Пакет сИз-иШ® содержит средство монти- рования ресурсов общего доступа 8МВ/ С1Р8 в Ыпих. В этом каталоге находятся конфигурационные файлы пакета сйз-ибЬ сгопб.б Содержит файлы, которые загружаются в память одновременно с файлами из катало- га /уаг/8роо1/сгоп. После этого демон сгоп загружает содержимое файла Айс/сгопСаЬ и начинает его обработку сгоп.йаНу, сгоп.Ьэиг1у, стоп. шошйЫу, сгоп.\уеек1у Содержат сценарии, которые будут вы- полнены демоном сгоп, соответственно, ежедневно, ежечасно, ежемесячно и еже- недельно сирч Содержит параметры конфигурации систе- мы печати ССР8 (Соттоп С1тх Рппип§ $уз!ет) сир8Ие1рег8 В пакете руйюп-сирзМрегз содержатся мо- дули Руйюп, которые помогают создавать приложения и утилиты с использованием Руйюп-иптерфсйса к ССР 8 В этом катало- ге находятся параметры этого пакета
сгурю-роНоез Конфигурация крипто-политик ёЬиз-1 Содержит файлы конфигурации демона ФЬик-Фаетоп ёс!аик Содержит некоторые параметры по умол- чанию, папример, параметры загрузчика 6В.1ТВ ЙерпмхЫ Чертой - программа для создания файла тойиккЛер и тар-файла. В этом каталоге находятся ее файлы конфигурации. Как администратор сервера, вы можете о них просто забыть, они вам не пригодятся скср Конфигурация ОНСР-сервера ±11' Конфигурация менеджера пакетов (1пГ дгасШ.сопЫ сгаси! заменяет ткшйгФ для создания загрузочной файловой системы в опера- тивной памяти (гапкйзк). Здесь находятся конфигурационные файлы <1гасп1 Гпем'аПФ Конфигурация брандмауэра Гопк Содержит конфигурационные файлы под- системы шрифтов. В частности, файл / еТс/ГоШз/ЕоШз.сопГ описывает каталоги со шрифтами, каталоги с кэшем шрифтов, а также описывает аналоги шрифтов ^пирё Содержит конфигурационный файл (тппР§
ягаЬ.б Содержит файлы, относящиеся к загрузчи- ку (ЖСБ. Вам не нужно редактировать эти файлы, они предназначены для служебных целей 1пп <1 Содержит сценарии системы инициализа- ции :ргои1е2 Параметры подсистемы маршрутизации. Например, могут использоваться для 1Р- балансировки, то есть объединения нескольких Интернет-канал ов в один 18С81 Параметры 18С81 ]ауа Параметры Лауа ]ОС Содержит конфигурационные файлы тек- стового редактора]ое ]ут, ;\'т-соттоп Параметры виртуальной машины Зауа М.зо.сопГ.с! Содержит файлы с расширением сопГ, ко- торые используются для поиска разделяе- мых библиотек НЬп1 Конфигурационные файлы библиотеки г;ьп1 1о§го1а1:е.д Конфигурация средства ротации журналов тс Файлы конфигурации файлового менедже- ра Мккй§Ы Согшпапбег
шсе1ов Программа тсе'.о^ позволяет расшифро- вать аппаратные ошибки, Настраивается посредством конфигурационных файлов в каталоге /е1с/тсе1оё тобргоЬе.б тобргоЬе — программа для добавления и удаления модулей из ядра Ьтих. Соответ- ственно в одноименном подкаталоге ката- лога /е1с находятся ее конфигурационные файлы то(1и1е8-1оа(1.д Содержит параметры некоторых модулей ядра. По умолчанию в этом каталоге пусто ореп1йар Содержит конфигурационные файлы сер- вера каталогов ОрепЬРАР ор! Файлы конфигурации для /орг/ рат.4 Параметры конфигурации модулей аутен- тификации РАМ (Р1и§§аЫе АиЛепРсаНоп Моби1е&) рксзИ Параметры программы рксзН, использу- емой для управления объектами данных, которые находятся на зашифрованных устройствах РКС8#11 (СгурЮк!) рк1 Содержит список ОРО-ключей р1утоиЙ1 Р1утои1Ь — свободный графический экран загрузки дня Ьтих. Этот каталог содержит его конфигурационные файлы
рт Содержит конфигурационные файлы па- кета рт-иШв. Пакет рт-ийк - это инфра- структура управления питанием нового поколения ро»1йх Конфигурационные файлы почтового аген- та РозШх РРР Файлы конфигурации протокола РРР ррфд Файлы конфигурации демона ррфй (про- токол РРТР) ргойиск.с! Относится к системе миграции между вер- сиями дистрибутива ореп8С8Е. Дополни- тельная информация может быть найдена по ссылке кгр://с1ос.ореп8и$е.ог%/ргос1ис1$/ <1га/1/8ЕЕ8/8ЕЕ8-<1ер1оутеп^_8<1 <1га/1/ска. ирс1а(е.81е.к1т1 рике РиксАийю - это звуковой сервер для РО81Х-систем. Его основное назначение - смешивать звуковые потоки от разных приложений, что позволяет нескольким потокам воспроизводиться одновременно. Здесь находятся конфигурационные файлы РикеАиШо гс.с1 Ссылка на каталог 1пн. й Г8у§1о§.Й Конфигурация демона протоколирования гзу81о§(1
рт Различные параметры системы управления пакетами ЯРМ. Обычно файлы из этого каталога нс требуют изменения. Дополни- тельную информацию можно получить по адресу Ьир:/Лу1к1,ореппе$ ги/'ЯРМ затЬа Конфигурационные файлы 8ашЪа 8а$12 Парамет ры 8А8Ь (8ттр1е АиШепйсайоп апб Зесипгу Ьауег) 8есип1у Еще один параметр конфигурации, относя- щийся к модулям аутентификации РАМ зеНпих Содержит файлы конфигурации системы безопасности 8Е1лпих зке! При создании новой учетной записи поль- зователя создается его домашний каталог в каталоге /Ноте, при этом в созданный до- машний каталог пользователя копируются файлы из каталога /зке!. Все помещенные в этот каталог файлы будут скопированы в созданный домашний каталог 8зЬ Содержит файлы конфигурации 88Н- клиента и 88Н-сервера 851 Файлы конфигурации Ореп88Ь 8Ш1оеГ8.(1 Кроме файла /еЩ/зибоегз, настройки зис1о могут определяться содержимым файлов из каталога /еГс/зисоегз.с!
Зу8СОпб§ Содержит конфш урационные файлы всей системы. В этом каталоге очень много раз- личных конфигурационных файлов. На- пример, в каталоге 'е1с/зузсот1б§/пе1дуогк вы найдете конфигурационные файлы сетевых интерфейсов. А в файле с!оск хранится вы- бранный при установке часовой пояс зуясй.б зузсб.б настраивает параметры ядра при загрузке, здесь находятся его конфигураци- онные параметры 8у81егп4 Конфигурационные файлы демона зузСетб идеу Файлы конфигурации и файлы правил ме- неджера устройств ибеу хура_зиррНсап1 Конфигурационные файлы пакета хура зиррлсагЛ (обеспечивает поддержку \УЕР, ^РАи\\ТА2) хб^-среп - это независимый пользователь- ский инструмент для настройки приложе ний рабочего стола по умолчанию. В этом каталоге находятся его конфигурационные файлы Например, в каталоге /е1с/х<1§/ аШозТаП находятся все программы, которые могут быть запущены автоматически. Од- нако запускаются лишь те, которым разре- шен запуск в определенной сессии хшеМ.д Содержит дополнительные файлы конфи- 1урации суперсервера хтетб (в современ- ных дистрибутивах не используется) хт1 Конфигурационные файлы библиотеки НЬхгп!
Приложение 2. Командный интерпретатор Ьаяк
В этом приложении мы рассмотрим командный интерпретатор ЬачЬ. Это больше, чем просто средство для ввода команд, у него есть свои параметры и свои команды. Да, да, именно команды. На ЬазЬ можно написать сценарии (подобно тому, как в М8 008 создавались ВАТ-файлы). Возможности ЬазЬ подобны языку программирования - есть управляющие структуры, циклы и т.д. Знание возможностей ЬазЬ не менее важно для полноценного использо- вания операционной системы Ыпих, чем использование функций ядра или рабочего окружения Обо всем этом мы поговорим в данной главе. П2.1. Настройка Ьаак Ьа$Ь — это самая популярная командная оболочка (командный интерпрета- тор) Ыпих. Основное предназначение ЬазЬ — выполнение команд, введен- ных пользователем. Пользователь вводит команду и ЬазЬ ищет программу, соответствующую команде, в каталогах, указанных в переменкой окруже- ния РАТН. Если такая программа найдена, то Ьазт запускает ее и передает ей введенные пользователем параметры. В противном случае выводится сообщение о невозможности выполнения команды.
Интерпретатор ЬазЬ - не единственная оболочка, доступная в вашей систе- ме. Список доступных оболочек доступен в файле /е^с/вкеИв. В большинстве случаев по умолчанию используется Ьазй. Файл /етс/ргой1е содержит глобальные настройки ЬаьЬ, он влияет на всю систему — на каждую запущенную оболочку. Обычно /е(с/ргой!е не нужда- ется в изменении, а при необходимости изменить параметры Ьазй редакти- руют один из файлов: • ~/.Ьа81т_ргой1е — обрабатывается при каждом входе в систему; • ~/.Ьа8Йтс — обрабатывается при каждом запуске дочерней оболочки; • ~/.Ьа8Ь_1о^оШ — обрабатывается при выходе из системы. Файл ~/.Ьа$Ь_ргой1е часто не существует, а если и существует, то в нем есть всего одна строка: зоигсе ~/.ЬазЬгс Данная строка означает, что нужно прочитать файл ЬазЬгс. Поэтому будем считать основным конфигурационным файлом файл .Ьазйгс. Но помните, что он влияет на оболочку текущего пользователя (такой файл находится в домашнем каталоге каждого пользователя, не забываем: означает до- машний каталог). Если же вдруг понадобится задать параметры, которые повлияют на всех пользователей, то нужно редактировать файл /е1с/ргоШе. Файл .Ьаьй Ызюгу (тоже находится в домашнем каталоге) содержит исто- рию команд, введенных пользователем. Здесь вы можете просмотреть свои же команды, которые вы накануне вводили. Конфигурация ЬазЬ хранится в файле .Ьазйгс. Обычно в этом файле задают- ся псевдонимы команд, определяется внешний вид приглашения командной строки, задаются значения переменных окружения. Псевдонимы команд задаются с помощью команды аИаз, вот несколько при- меров: аИаз И='^с -1' аНаз 11='1з -1аРо'
аИаз 1='18 -1' аНаз д='едтер -1' Псевдонимы работают просто: при вводе команды I на самом деле будет вы- полнена команда /5 -/. Теперь рассмотрим пример изменения приглашения командной строки. Гло- бальная переменная Р81 отвечает за внешний вид командной строки По умолчанию командная строка имеет формат: пользователь^ компьютер:раоочий_каталог Значение Р81 при этом булет: Р31-'\ий\И:\и$' В табл. П2.1 приведены допустимые модификаторы командной строки. Таблица П2.1. Модификаторы командной строки Модификатор Описание 1а АБСП-символ звонка (код 07). Не рекомендуется его использовать — очень скоро начнет раздражать Дата в формате "день недели, месяц, число" \Н Имя компьютера до первой точки \н Полное имя компьют ера У Количество задач, запушенных в оболочке в данное время 1/ Название терминала 1П Символ новой строки
\г Возврат каретки 1у Название оболочки \1 Время в 24-часовом формате (ЧЧ- ММ: СС) \Т Время в 12-часовом формате (ЧЧ: ММ: СС) \@ Время в 12-часовом формате (АМЛ’М) \и Имя пользователя IV Версия Ьа§11 (сокращенный вариант) \У Версия ЬазЬ (полная версия: номер релиза, номер патча) 1и^ Текущий каталог (полный путь) ИГ Текущий каталог (только название каталога, без пути) 1/ Номер команды в истории I# Системный номер команды 15 Если ОЮ пользователя равен 0, будет выведен сим- вол #, иначе — символ $ II Обратный слэш $() Подстановка внешней команды Вот пример альтернативного приглашения командной строки: Р31='[\иС\Ы $(ааЪе +%т/%а/%у) \$'
Вид приглашения будет такой: 1деп±в@лозЫпд] 08/04/19 $ В квадратных скобках выводится имя пользователя и имя компьютера, за- тем используется конструкция $() для подстановки даты в нужном нам фор- мате и символ приглашения, который изменяется в зависимости от иденти- фикатора пользователя. Установить переменную окружения можно с помощью команды ехроП, что будет показано позже. П2.2. Зачем нужны сценарии Ьа$И Представим, что нам нужно выполнить резервное копирование всех важных файлов, для чего создать архивы каталогов /еТс, /Ноше и /изг. Понятно, что понадобятся три команды вида: Ъаг - 1 имл_апхива. Ъаг .Ьг2 каталог Затем нам нужно записать все эти три файла на ПУП с помощью любой программы для прожига ПУП. Если выполнять данную операцию раз в месяц (или хотя бы раз в неделю), то ничего страшного Но представьте, что вам,нужно делать это каждый день или даже несколько раз в день? Думаю, такая рутинная работа вам быстро надоест. А ведь можно написать сценарий, который сам будет создавать ре- зервные копии, и записывать их на ПУП! Все, что вам нужно, — это вста- вить чистый ПУП черед запуском сценария. Можно пойти и иным путем: написать сценарий, который будет делать резервные копии системных каталогов, и записывать их на другой раздел жесткого диска. Ведь не секрет, что резервные копии делаются не только на случай сбоя системы, но и для защиты от некорректного изменения данных пользователем. Помню, удалил важную тему форума и попросил своего хо- стинг провайдера сделать откат. Я был приятно удивлен, когда мне предо- ставили на выбор три резервные копии — осталось лишь выбрать наиболее
подходящую. Не думаете же вы, что администраторы провайдера только и занимались тем, что три раза в день копировали домашние каталоги пользо- вателей? Поэтому, автомата <ация — штука полезная, и любому администра- тору нужно знать, как автомази зиповать свою рутинную работу. П2.3. Сценарий "Привет, мир!’’ По традиции напишем первый сценарий, выводящий всем известную фразу: НеПо, мюг1<1! . Для редактирования сценариев вы можете использовать люби- мый текстовый редактор, например, папо или ее (листинг П2.1). Листинг ПР2.1. Первый сценарий #! /Ып/ЬазЬ еспо "При.зет, мир!" Первая строка нашего сценария — это указание, что он должен быть обра- ботан программой /Ъ1п/Ьач11. Обратите внимание: если между # и ! окажется пробел, то данная директива не сработает, поскольку будет воспринята как обычный комментарий Комментарии начинаются, как вы уже наверняка знаете, с решетки: # Комментарий Вторая строка — это оператор еско, выводящий нашу строку. Сохраните сценарий под именем ке11о и введите команду: •$ сЪтпос! +х 1зе11о Для запуска сценария введите команду: ./пе!1о
На экране вы увидите строку: Привет, мир! Чтобы вводить для запуска сценария просто ЬеПо (без ./), сценарий нужно скопировать в каталог /изг/Ып (точнее, в любой каталог из переменной окру- жения РАТН): # ср ./Не11о /изг/Ып П2.4. Переменные в сценариях В любом серьезном сценарии вы нс обойдетесь без использования перемен- ных. Переменные можно объявлять в любом месте сценария, но до места их первого применения. Рекомендуется объявлять переменные в самом начале сценария, чтобы потом не искать, где вы объявили ту или иную переменную. Для объявления переменной используется следующая конст рукция: переменная=значение Пример объявления переменной: АЕБНЕЗЗ-Нггг.а. ги есЬо $АООКЕ35 При объявлении переменной знак доллара не ставится, но он обязателен при использовании переменной. Также при объявлении переменной не должно быть пробелов до и после знака =. Значение для переменной указывать вручную не обязательно — его можно прочитать с клавиатуры: геас! АЮКЕ53
или со стандартного вывода программы: АЕЕКЕЗЗ='НозЪпате' Чтение значения переменной с клавиатуры осуществляется с помощью инструкции геаЛ. При этом указывать символ доллара не нужно. Вторая команда устанавливает в качестве значения переменной АГЮКЕ88 вывод команды ко$1пате. В Ипих часто используются переменные окружения Это специальные пере- менные, содержащие служебные данные. Вот примеры некоторых часто ис- пользуемых переменных окружение: • ВА8Н — полный путь до исполняемого файла командной оболочки Ьзвй; • ВА8НУЕК8ЮМ — версия ЬазЬ; • НОМЕ — домашний каталог пользователя, который запустил сценарий; • НО8ПЧАМЕ — имя компьютера; • ЕАКООМ — случайное число в диапазоне от 0 до 32 767; • О8ТУРЕ — тип операционной системы; • Р МО — текущий катаз юг; • Р81 — строка приглашения; • 010 — ГО пользователя, который запустил сценарий; • О 8ЕК — имя пользовате и я. Для установки собственной переменной окружения используется команда ехроП'. # присваиваем переменной значение $АЕРКЕЗЗ=йгта.ги # экспортируем переменную — делаем ее переменной окружения # после этого переменная АРОКЕЗЗ будет доступна в других сценариях ехрогЪ $ДРРКЕЗЗ
П2.5. Передаем параметры сценарию Очень часто сценариям нужно передавать различные параметры, например, режим работы или имя файла/каталога. Для передачи параметров использу- ются следующие специальные переменные: • $0 — содержит имя сценария; • $п — содержит значение параметра (п — номер параметра); • $# — позволяет узнать количество параметров, которые были переданы. Рассмотрим небольшой пример обработки параметров сценария. Я пони- маю, что конструкцию сазе-езас вы, возможно, не знаете, но обший принцип должен быть понятен (листинг П2.2). Листинг П2.2 Получение параметров сценария # Сценарий должен вызываться так: # имя_сценария параметр # Анализируем первый параметр сазе "$1" 1п зЬагЪ) У Действия при получении параметра зРагР есИо "Запускаемся..." / / зЦор) # Действия при получении параметра згор есЬо "Завершаем работу..." *) # Действия в остальных случаях # Выводим подсказку о том, как нужно использовать сценарий, и # завершаем работу сценария есИо "Использовать: $0 {зЪагЬIзЪор }" ехар 1 9 г езас Думаю, приведенных комментариев достаточно, поэтому подробно рассма- тривать работу сценария из листинга П2.2 не будем.
П2.6. Обработка массивов Интерпретатор Ьач11 позволяет использовать массивы. Массивы объявляют- ся подобно переменным. Вот пример объявления массива: АЕЗКАУ[0]=1 АКЕ<АУ[1]=2 Выводим элемент массива: есЪо $А«КАУ[0] П2.7. Циклы/ог и и’/и/е Как и в любом языке программирования, в Ьакй можно использовать циклы. Мы рассмотрим циклы (ог и умкИе, хотя вообще в ЪаяЬ доступны также циклы ипШ и зе1ес1, но они применяются довольно редко. Синтаксис цикла/ог выглядит так: Сог переменная тп список до команды допе В цикле, при каждой терапии, переменной будет присвоен очередной эле- мент списка, над которым будут выполнены указанные команды. Чтобы было понятнее, рассмотрим небольшой пример: ^ог п тп 1 2 3; до есдо $п; допе
Обратите внимание1 список значений и список команд должны заканчивать- ся точкой с запятой. Как и следовало ожидать, наш сценарий выведет на экран следующее: 1 2 3 Синтаксис цикла ц>кИе выглядит немного иначе: иЬ11е условие до команды допе Цикл уМ1е выполняется до тех пор, пока истинно заданное условие. Под- робно об условиях мы поговорим, возможно, чуть позже, а сейчас напишем аналог предыдущею цикла, т. е нам нужно вывести 1, 2 и 3, но с помощью иТн/е, а не/ог: п=1 «Ы1е [ $п -1Т 4 ] до есЪо "$п " г=$(( $п+1 )) ; допе П2.8. Условные операторы В ЬазЬ доступны два условных оператора: I/и сазе. Синтаксис оператора ./следующий: 1С условие_1 ЪЪеп команды_1 еШ условие_2 1:Ъеп команды_2
еШ условие_Ы ЪЪеп команды И е1зе команды_Ы+1 й Оператор г/в ЪазЬ работает аналогично оператору //в других языках про- граммирования. Если истинно первое условие, то выполняется первый спи- сок команд, иначе — проверяется второе условие и т. д. Количество блоков ейГ, понятно, и© ограничено. Самая ответственная задача — это правильно составить условие. Условия записываются в квадратных скобках. Вот пример записи условий: # Переменная Ы = 10 [ И==1® ] # Переменная И не равна 10 [ Н!=10 ] Операции сравнения указываются нс с немощью привычных знаков > или <, а с помощью следующих выражений: • -II — меньше; • —больше; • -1е — меньше или равно; • -§е — больше или равно; • -ед — равно (используется вместо =). Применять данные выражения нужно следующим образом: [ переменная выражение значение|переменная ] Например:
# К меньше 10 [ -1Р 10 ] # Ы меньше А [ $М -1Ъ $А ] В квадратных скобках вы также можете задать выражения для проверки су- ществования файла и каталога: • -е файл — условие истинно, если файл существует; • -<Л каталог —- условие истинно, если катало! существует; • -х файл — условие истинно, если файл является исполняемым. С оператором сазе мы уже немного знакомы, но сейчас рассмотрим его син- таксис чуть подробнее. сазе переменная 1п значение_1) команцы_1 ;; значение И) команды И ;; *) команды_по_умолчанию;; езас Значение указанной переменной по очереди сравнивается с приведенными значениями (значение_1, ..., значение_М). Если есть совпадение, то буду! выполнены команды, соответствующие значению. Если совпадений нет, то будут выполнены команды по умолчанию. Пример использования сазе был приведен в листинге П2.2. П2.9. Функций в Ъазк В ЬазЬ можно использовать функции. Синтаксис объявления функции сле- дующий: имя() { список; }
Вот пример объявления и использования функции: 11зЪ_Ьх-Ь () { есНо "Техб Й1ез 1П сиггепб сПгесЬогу: " 1з *.Ьх-Ь } П2.10. Практические примеры сценариев Проверка прав пользователя Для сценариев, требующих полномочий юо1, сначала нужно проверить, ка- кой пользователь запустил сценарий. 1ЛО пользователя гоо1 всегда равен 0. Проверка, является ли пользователь, запустивший сценарий, пользователем гоо1, может выглядеть так, как показало в листинге П2.3. Листинг П2.3. Проверка полномочий пользователя # ! /Ып/ЬазИ ВООТ_ШР=0 1Г [ "$Р1Р" -ед "$К00Т_ию" ] ТЬеп есЬо "Кооб" е!зе есЬо "Обычный пользователь" Й еххй 0 Проверка свободного дискового пространства с уведомлением по е-таН Следующий сценарий проверяет свободное дисковое пространство серве- ра и отправляет уведомление по е-шай администратору, если осталось
меньше 2000 Мбайт дискового пространства. Сценарий целесообразно за- пускать через нланиронщик заданий (например, через стоп) с заданной пе- риодичностью (например, каждый час). Код сценария приведен в листинге П2.4. Листинг П2.4. Проверка свободного дискового пространства # ! /Ып/ЬазЬ # В переменную йгеезрасе будет записано свободное пространство # на контролируемом диске - /<1еч/з<1а1 (в Мбайт) йгеезрасе='<36 -т | дгер "/йеч/зс!а1" I аик '{рг!п6 $4}'' * Если места на диске < 2000 МЬ, то отправляем письмо администратору И [ $6геезрасе -16 2000 ]; РЪеп есЬо "На сервера меньше < 2С00 МВ" | шаИ -з "Свободное место заканчивается!" аЛп±п@йгта.ги а
Приложение 3. Сетевая файловая система
П3.1. Вкратце о МГ8 и установке необходимых пакетов Сетевая файловая система (№8, ЫеГк'огк РПе 8уз1еш) - старый, но прове- ренный способ предоставления доступа к общим файлам. №8 позволяет монтировать файловые системы, которые физически находятся на других компьютерах в вашей локальной сети Принцип работы Ж прост; на сервере устанавливается демон пйд, ко- торый экспортирует файловые системы ЬГН8-клиент монтирует экспорти- руемые файловые системы. После монтирования с удаленной файловой системой можно работать, как с локальной - для пользователя ничего не изменится, разве что скорость доступа к файлам будет чуть ниже, поскольку данные ведь передаются по сети. В вашей сети может быть несколько КР8-серверов и несколько 1ЧГ8- клиентов. По сути, каждый 1мР8-клиент может выступать и в роли №8- сервера, но обычно ЫГ8 используется иначе. Выделяется один НР8-ссрвер. который будет экспортировать общую файловую систему, которая может ис- пользоваться для хранения общих файлов - довольно частый сценарий.
Чтобы установить МЕ8-сервер и/или ТЧР8-клиент произведите поиск пакета по слову ’пй'. Далее прочитайте описания пакетов и установите необходи- мые вам пакеты. Названия пакетов могут отличаться в зависимости от дис- трибутива. Например, в ореп8Н8Е на сервере нужно установить следующие пакеты: • п&-кегпе1-$егуег - содержит МГЗ-сервер; • пГззуаТсЬ утил ита мониторинга К Е8-трафика (можно не устанавливать); • дшНа-пГ$ - система дисковых квот для ЫГ8. На клиенте нужно установить только пакет пй-сПеШ. 113.2. Файл /е1с/схрог18 В файле /егс/е.хроПз прописываются экспортируемые файловые системы. Эти экспортируемые файловые системы могут монтировать клиенты. Об- щий формат записи в файле ехрог1з следующий: файловая_система [компьютер] (опции) Вот типичный пример: /Иоте/риЬИс (гм) /Иоте/ЪетрТаГез -(го) В данном случае каталог /Ноте/риЪНс сервера будет доступен МЕЗ-клиентам для чтения и записи (пу), а каталог /йотеЛетрШез только для чтения (то). При желании можно еще и указать узлы, которым будет доступен экспорти- руемый каталог, например: /Иоте/зЪаге1 192.168.1.100 (гм) /йоте/зйаге2 ИозТ.ехатр1е.сот (гм) /Ьоте/рИагеЗ *.ехатрТе.сот (гм)
Здесь первый каталог (/йоте/зИате) будет доступен только узлу с 1Р-адресом 192.168.1.100, второй катало]' - только узлу с доменным именем Ьо»1. ехатр1е.сот, а третий - всем узлам из домена ехатр1е.сот. Также можно указать целую 1Р-сеть и ее маску, например: /Ъоте/зЪаге^ 192.168.1.0/28 (ги) В данном случае получить доступ к /Ьоте/8Йате4 смо1ут лишь первые 16 1Р-адресов - от 192.168 1.0 до 192.168.1.15 Компьютеры с 1Р-адресами 192.168.1.16 и выше нс смогут использовать эту7 файловую систему. Обычно можно обойтись только опциями го, гы и поассезх. Последняя ис- пользуется для запрещения доступа к файловой системе. Например, вы хо- тите запретить узлу 192.168.1.5 доступ к файловой системе: /Ьоте/з11аге4 192.168.1.5 (поассеяя) Остальные опции ЫР8 приведены в таблице П3.1. Таблица П3.1. Опции экспорта файловой системы в 1УЕ8 Опция Описание а11_вдиазк 1 [реобразует идентификаторы групп и пользователей в анонимные тьесиге Разрешает запросы с любых портов, см. Бесите 1тк_аЬзо1и1е Нс изменяет символические ссылки (по умолчанию) Нпк_ге1аИ\>е Абсолютные ссылки будут преобразованы в относитель- ные гоо1_8циазк Преобразует все запросы от гоо( в запросы от анонимно- го пользователя по_гоо1_8диа,чП Разрешает доступ к файловой системе от имени гоо/. Не рекомендуется
Принимает запросы на монтирование файловой систе- $есиге мы только с портов с номерами < 1024. Такие порты может создавать только гоо1, поэтому такое соединение считается безопасным. Используется по умолчанию После редактирования файла /е^с/ехройь не забудьте перезапустить или за- пустить службу л/з: # зегухсе п^з зТагР или # зегухсе г. Г г гезГ.агЛ ПЗ.З. Использование №Е8-клиента Для монтирования сетевой файловой системы используется та же команда тоит. Синтаксис вызова команды такой: тсип^ -Ъ п^з сервер:ФС тсчка_монтирования Вот пример: тоипТ -X пГз 192.168.1.157:/Ьоте/зЪаге /тпр/япаге Сервер 192.168.1.157 экспортирует файловую систему /Ьоте/зЬаге. Мы под монтируем эту файловую систему к каталогу /тп1'81таге (должен существо- вать на момент вызова команды тоиШ). Также обратите внимание на пара- метр -I, который задает тип файловой системы Конечно, вы не будете вводить эту команду после каждой перезагрузки. Поэтому если удаленную файловую систему нужно использовать постоян- но, лучше прописать ее в файле /е1с/Гз1аЬ: 192.168.1.157:/Ьсте/зЬаге /тпЬ/зЪаге пГз Ьд,Ъаг<1,гм О О
Нужно отметить, что МГ8 - довольно старое решение, как говорят, класси- ческое. Существуют различные варианты сетевых и распределенных фай- ловых систем, например, С1и$1егКР8, ОрепАГ8, РагаИе! Уптиа1 РЛе ЗузТст (РУР8) и др. Основной недостаток МР8 - отсутствие какого-либо шифрования передава- емых по сети данных. Если вы используете №8 в защищенной локальной сети, то это, как правило, не проблема (при отсутствии угроз внутри сети). Но когда есть необходимость передавать данные по Интернету, то нужно ис- пользовать шифрование. Один из способов добавления шифрования к ОТ8 - использование виртуальных частных сетей (УР1Ч), в которых все данные между удаленными системами передаются в зашифрованном виде. В этом случае МР8 имеет право на существование в Интернете. Список использованных источников информации: • Колисниченко ДН. «ЬПЧЦХ. Полное руководство по работе и администриро- ванию» • Ьйр8://ги.\У11йре(11а.ог&/5У1]а/8оЛ1ап(}1П8_Ь1пих_8у5гет • ху\уху.кете1.ог$ • ИНр87/досз.ЬшЬоо.сот/бохуёеп/1тих/кегпе1/3.7/51гис«а8к_ зП'гсТШт! • ЬПр://1.с1р.ог8/НО,УТСЪУМНО\УТО/ • ЬПр://чтщулакоу1ет.ог8/1п(1ех.11йп1 • Ь«р8://тнтог8.е(18е.кете1. ог§/риЬ/Н пих/НЬз/рат/ • Ьйр8.//ху\у\у.1гсер1к.сот''&ее-уес1о1/т11Г.1па1-л'Ь1Ге-Ьаск^оапд-\у11И-Зб-с1гси1аг- с1е5>1[гп_8776623 Ыт?диегу=с#&от у1е^=с!е1а11_а18оНке • н.ги/саСецогу/1тих/ • кйр://итк1.ореспе1.ги'^<РМ • Ьйр8://й-Ыаск.ги/1ших/3/
Матвеев М. Д. Ядро Ыпих СБОРКА НАСТРОЙКА УПРАВЛЕНИЕ Группа подготовки издания: Зав. редакцией компьютерной литературы: М. В. Финков Редактор: Е. В. Финков Корректор: А. В. Громова ООО "Издательство Наука и Техника" ОГРН 125780011624*7 ИНН7811763020,КИП78110)001 192029. г. Сайт Петербург пр. Обуховской обороны, д. 107, лит. Б, пом. 1-Н Подписано в печать 13.02 2023. Формат 70x100 1/16. Бумага газетная. Печать офсетная. Объем 22 п.л. Тираж 1500. Заказ 6032. Отпечатано с готового оригинал-макете ООО «Принт-М», 142300, М.О., г.Чехов, ул Полиграфистов, д.1