Какое ядро использует ос linux: Ядро linux — Википедия – Что такое ядро Linux | Losst

Содержание

Что такое ядро Linux | Losst

Ядро Linux содержит более 13 миллионов строк кода и является одним из самых крупных проектов с открытым исходным кодом в мире. Так что такое ядро Linux и для чего оно используется?

Содержание статьи:

Что такое ядро Linux?

Ядро — это самый низкий уровень программного обеспечения, которое взаимодействует с аппаратными средствами компьютера. Оно отвечает за взаимодействие всех приложений, работающих в пространстве пользователя вплоть до физического оборудования. Также позволяет процессам, известным как сервисы получать информацию друг от друга с помощью системы IPC.

Виды и версии ядра

Что такое ядро Linux вы уже знаете, но какие вообще бывают виды ядер? Есть различные способы и архитектурные соображения при создании ядер с нуля. Большинство ядер могут быть одного из трех типов: монолитное ядро, микроядро, и гибрид. Ядро Linux представляет собой монолитное ядро, в то время как ядра Windows и OS X гибридные. Давайте сделаем обзор этих трех видов ядер.

Микроядро

Микроядра реализуют подход, в котором они управляют только тем, чем должны: процессором, памятью и IPC. Практически все остальное в компьютере рассматривается как аксессуары и обрабатывается в режиме пользователя. Микроядра имеют преимущество в переносимости, они могут использоваться на другом оборудовании, и даже другой операционной системе, до тех пор, пока ОС пытается получить доступ к аппаратному обеспечению совместимым образом.

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

Плюсы

  • Портативность
  • Небольшой размер
  • Низкое потребление памяти
  • Безопасность

Минусы

  • Аппаратные средства доступны через драйверы
  • Аппаратные средства работают медленнее потому что драйверы работают в пользовательском режиме
  • Процессы должны ждать свою очередь чтобы получить информацию
  • Процессы не могут получить доступ к другим процессам не ожидая

Монолитное ядро

Монолитные ядра противоположны микроядрам, потому что они охватывают не только процессор, память и IPC, но и включают в себя такие вещи, как драйверы устройств, управление файловой системой, систему ввода-вывода. Монолитные ядра дают лучший доступ к оборудованию и реализуют лучшую многозадачность, потому что если программе нужно получить информацию из памяти или другого процесса, ей не придется ждать в очереди. Но это и может вызвать некоторые проблемы, потому что много вещей выполняются в режиме суперпользователя. И это может принести вред системе при неправильном поведении.

Плюсы:

  • Более прямой доступ к аппаратным средствам
  • Проще обмен данными между процессами
  • Процессы реагируют быстрее

Минусы:

  • Большой размер
  • Занимает много оперативной памяти
  • Менее безопасно

Гибридное ядро

Гибридные ядра могут выбирать с чем нужно работать в пользовательском режиме, а что в пространстве ядра. Часто драйвера устройств и файловых систем находятся в пользовательском пространстве, а IPC и системные вызовы в пространстве ядра. Это решение берет все лучшее из обоих предыдущих, но требует больше работы от производителей оборудования. Поскольку  вся ответственность за драйвера теперь лежит на них.

Плюсы

  • Возможность выбора того что будет работать в пространстве ядра и пользователя
  • Меньше по размеру чем монолитное ядро
  • Более гибкое

Минусы

  • Может работать медленнее
  • Драйверы устройств выпускаются производителями

Где хранятся файлы ядра?

Где находится ядро Linux? Файлы ядра Ubuntu или любого другого Linux-дистрибутива находятся в папке /boot и называются vmlinuz-версия. Название vmlinuz походит с эпохи Unix. В шестидесятых годах ядра привыкли называть просто Unix, в 90-х годах Linux ядра тоже назывались — Linux.

Когда для облегчения многозадачности была разработана виртуальная память, перед именем файла появились буквы vm, чтобы показать что ядро поддерживает эту технологию. Некоторое время ядро называлось vmlinux, но потом образ перестал помещаться в память начальной загрузки, и был сжат. После этого последняя буква x была изменена на z, чтобы показать что использовалось сжатие zlib. Не всегда используется именно это сжатие, иногда можно встретить LZMA или BZIP2, поэтому некоторые ядра называют просто zImage.

Нумерация версии состоит из трех цифр, номер версии ядра Linux, номер вашей версии и патчи или исправления.

В паке /boot можно найти не только ядро Linux, такие файлы, как initrd.img и system.map. Initrd используется в качестве небольшого виртуального диска, который извлекает и выполняет фактический файл ядра. Файл System.map используется для управления памятью, пока еще ядро не загрузилось, а конфигурационные файлы могут указывать какие модули ядра включены в образ ядра при сборке.

Архитектура ядра Linux

Так как ядро Linux имеет монолитную структуру, оно занимает больше и намного сложнее других типов ядер. Эта конструктивная особенность привлекла много споров в первые дни Linux и до сих пор несет некоторые конструктивные недостатки присущие монолитным ядрам.

Но чтобы обойти эти недостатки разработчики ядра Linux сделали одну вещь — модули ядра, которые могут быть загружены во время выполнения. Это значит что вы можете добавлять и удалять компоненты ядра на лету. Все может выйти за рамки добавления функциональных возможностей аппаратных средств, вы можете запускать процессы сервера, подключать виртуализацию, а также полностью заменить ядро без перезагрузки.

Представьте себе возможность установить пакет обновлений Windows без необходимости постоянных перезагрузок.

Модули ядра

Что, если бы Windows уже имела все нужные драйвера по умолчанию, а вы лишь могли включить те, которые вам нужны? Именно такой принцип реализуют модули ядра Linux. Модули ядра также известные как загружаемые модули (LKM), имеют важное значение для поддержки функционирования ядра со всеми аппаратными средствами, не расходуя всю оперативную память.

Модуль расширяет функциональные возможности базового ядра для устройств, файловых систем, системных вызовов. Загружаемые модули имеют расширение .ko и обычно хранятся в каталоге /lib/modules/. Благодаря модульной природе вы можете очень просто настроить ядро путем установки и загрузки модулей. Автоматическую загрузку или выгрузку модулей можно настроить в конфигурационных файлах или выгружать и загружать на лету, с помощью специальных команд.

Сторонние, проприетарные модули с закрытым исходным кодом доступны в некоторых дистрибутивах, таких как Ubuntu, но они не поставляются по умолчанию, и их нужно устанавливать вручную. Например, разработчики видеодрайвера NVIDIA не предоставляют исходный код, но вместо этого они собрали собственные модули в формате .ko. Хотя эти модули и кажутся свободными, они несвободны. Поэтому они и не включены во многие дистрибутивы по умолчанию. Разработчики считают что не нужно загрязнять ядро несвободным программным обеспечением.

Теперь вы ближе к ответу на вопрос что такое ядро Linux. Ядро не магия. Оно очень необходимо для работы любого компьютера. Ядро Linux отличается от OS X и Windows, поскольку оно включает в себя все драйверы и делает много вещей поддерживаемых из коробки. Теперь вы знаете немного больше о том, как работает ваше программное обеспечение и какие файлы для этого используются.

Linux (ядро) — Национальная библиотека им. Н. Э. Баумана

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 12:14, 29 апреля 2017.

Историческая справка

Краткая история Unix

Основная статья: UNIX

Хронология разработки ядра Linux очень обширна, однако точно прослеживаются истоки его создания, которые ведут к UNIX. В 1969 году Кен Томпсон из исследовательской группы Bell Laboratories совместно с Деннисом Ритчи на передовом микро-компьютере PDP-7 разработал ядро многозадачной, многопользовательской операционной системы UNICS ( позже переименованной в UNIX-TP). В момент создания ядра UNIX-TP Ритчи находился под влиянием своего прошлого проекта — ОС MULTICS, несмотря на наличие достаточно инновационных и передовых идей, таких как: строго сегментированная модель данных, сегментно-страничная виртуальная память, динамическое связывание, переконфигурация всей системы «на ходу», иерархическая файловая система, впервые реализованный подход с использованием стеков для каждого вычислительного процесса внутри системы ядра и др; проект был закрыт ввиду сложной архитектуры ОС, а также из-за недостатков, связанных с распределением памяти файлов, больших по размеру чем установленный системный лимит. Стоит также заметить, что вся операционная система, включая сложный компилятор языка PL/I, пользовательские команды и дополнительные библиотеки, состояла из примерно полутора тысяч исходных файлов, каждый из которых содержал примерно по 200 строк кода. В скомпилированном виде весь этот код занимал около 4,5 Мегабайт, что было огромным размером по тем временам. Компиляторы Multics в основном оптимизировали код по размеру, а не по эффективности использования центрального процессора, что было обосновано стремлением к экономии памяти в многопользовательской системе.

Несмотря на неудачу своего предшественника, UNIX вобрал в себя концепцию MULTICS и был детально проработан. Первые две версии ОС были написаны на ассемблере, однако третья и четвертая версии использовали язык, разработанный Ритчи — С[4] , архитектура третьей версии использовала встроенный компилятор языка, а четвертая представляла собой полностью переписанное на СИ системное ядро. С приходом пятой версии UNIX был полностью переписан на язык СИ. Изначально создателем он был задуман как язык необходимый в написании операционных систем. Это переписывание разрешено команде UNIX TM с целью перехода на более мощную аппаратную часть — PDP-11/45 и 11/70 компьютеры. С 1974 года UNIX стал распространяться среди университетов и академических учреждений. С 1975 года началось появление новых версий, разработанных за пределами Bell Labs, и рост популярности системы.

В 1980 году компанией AT&T был разработан пакет коммерческих лицензий на все дистрибутивы UNIX, и сведение всех версий в одну: UNIX System V. Университет Калифорнии, Беркли продолжал разрабатывать свою собственную версию Unix под названием BSD. Многие из важнейших разработок в UNIX изначально пришли из BSD, к примеру, включение TCP/IP в основную версию UNIX. Поскольку основная часть системы поставлялась в исходных текстах, написанных на языке С, опытным программистам не требовалось документации, чтобы разобраться в архитектуре UNIX. C ростом популярности микропроцессоров другие компании переносили эту операционную систему на другие платформы, но простота и ясность операционной системы искушали многих на ее расширение и последующую модификацию, в результате чего появилось много разновидностей базовой системы.

Не желая терять инициативу, AT&T в 1982 году объединила несколько существовавших версий UNIX и создала версию под названием SYSTEM |||. В отличие от редакций, предназначавшихся, в первую очередь, для внутреннего использования и не получивших дальнейшего развития, SYSTEM ||| была создана для распространения за пределами Bell Labs и AT&T и положила начало новой ветви UNIX , которая и сегодня жива и развивается.

Краткая история Linux

В 1991 году в Хельсинки, Финляндии, Линус Торвальдс начал работу над проектом, который был, по его словам, «просто для удовольствия». Этот проект в конечном счете стал ядром Linux. Он никогда не был предназначен для чего-то особенного, просто инструмент, который позволил бы студенту получить доступ к UNIX-серверам в соседнем университете. Он написал его специально для железа, на котором он работал на тот момент, и оно не зависело от операционной системы. Linux разработана «с нуля» для процессора Intel i386, сегодня она перенесена на огромный ряд других аппаратных платформ, включая серверы Alpha фирмы DEC.

Переход от Unix к Linux

Linux был разработан в попытке создать бесплатную альтернативу коммерческим UNIX-средам. Его история начинается в 1991 или даже в 1983 гг., когда был создан проект GNU, чьей исходной целью было предоставить бесплатную альтернативу UNIX. Linux работает на гораздо большем количестве платформ, например на Intel®/AMD x86. Большинство ОС UNIX способны работать только на одной платформе.У Linux и UNIX общие исторические корни, но есть и серьезные отличия. Много инструментов, утилит, и бесплатных приложений, являющихся стандартными для Linux, первоначально задумывались как бесплатная альтернатива программам для UNIX. Linux часто предоставляет поддержку множества опций и приложений, заимствуя лучшую или наиболее популярную функциональность из UNIX. Администратору или разработчику, который привык работать с Linux, система UNIX может показаться не очень удобной для использования. С другой стороны, фундамент UNIX-подобной операционной системы (инструменты, файловая система, интерфейсы API) достаточно стандартизирован.

Понятие ядра операционной системы Linux.

Ядро является сердцем любой операционной системы, обеспечивая базовую функциональность операционной системы:

  1. создает процессы и управляет ими
  2. распределяет и обеспечивает доступ к файлам, а также к периферийным устройствам

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

Исходный код ядра коммерческих дистрибутивов UNIX является собственностью их разработчиков и не распространяется за пределы компании. Полностью противоположная ситуация с Linux. Процедуры для компиляции и исправления ядер и драйверов весьма различны. Для Linux и других операционных систем с открытым исходным кодом патч может быть выпущен в виде исходного кода, и конечный пользователь может установить, проверить и даже модифицировать его. Эти патчи обычно проверены не так тщательно как патчи от поставщиков коммерческих ОС UNIX. Поскольку нет полного списка приложений и сред, которые должны быть оттестированы для корректной работы на Linux, Linux-разработчики зависят от конечных пользователей и других разработчиков, которые будут отлавливать ошибки.

Поставщики коммерческих UNIX-дистрибутивов выпускают ядра только в виде исполняемого кода. Некоторые релизы являются монолитными, тогда как другие позволяют обновить только какой-нибудь конкретный модуль ядра. Но в любом случае этот релиз предоставляется только в форме исполняемого кода. Если необходимо обновление, администратор должен ждать, пока производитель выпустит патч в бинарном коде, однако его может утешить то, что производитель выполнит тщательную проверку своего патча на обратную совместимость.

Все коммерческие версии UNIX в некоторой степени эволюционировали до модульного ядра. Драйверы и отдельные особенности ОС доступны как отдельные компоненты и могут быть по необходимости загружены или выгружены из ядра. Но открытая модульная архитектура Linux гораздо гибче. Однако гибкость и адаптируемость Linux означают и постоянное изменение. Исходный код Linux постоянно меняется, и, по прихоти разработчика, может поменяться API. Когда модуль или драйвер написан для коммерческой версии UNIX, он проработает гораздо дольше, чем тот же драйвер для Linux.

Архитектура ядра Linux

Устройство компонентов ядра ОС Linux

Ядро состоит из:

  1. Файловая система
  2. Подсистема управления процессами и памятью
  3. Подсистема ввода / вывода

Файловая подсистема

Файловая подсистема обеспечивает унифицированный интерфейс доступа к данным, расположенным на дисковых накопителях, а также к периферийным устройствам. Одни и те же функции open(), read(), write() могут использоваться как при чтении или записи данных на диск, так и при выводе текста на принтер или в терминал. Файловая подсистема контролирует права доступа к файлу, выполняет операции размещения и удаления файла. Поскольку большинство прикладных функций выполняется через интерфейс файловой системы, права доступа к файлам определяют привилегии пользователя в системе. Файловая подсистема обеспечивает маршрутизацию запросов периферийным устройствам, соответствующим модулям подсистемы ввода/вывода.

Подсистема управления запросами

Запущенная на выполнение программа порождает в системе один или более процессов ( задач ). Подсистема управления процессами контролирует:

  1. Создание и удаление процессов
  2. Распределение системных ресурсов ( памяти, вычислительных ресурсов ) между процессами
  3. Синхронизацию процессов
  4. Межпроцессорное взаимодействие

Известно, что в общем случае число активных процессоров превышает число процессоров компьютера, но в каждый конкретный момент времени на каждом процессоре может выполняться только один процесс. Операционная система управляет доступом процессоров к вычислительным ресурсам, создавая ощущение одновременного выполнения нескольких задач. Специальная задача ядра, называемая распорядителем или планировщиком процессов, разрешает конфликты между процессами в конкуренции за системные ресурсы ( процессор, память, периферийные устройства ). Планировщик запускает процесс на выполнение, следя за тем, чтобы процесс монопольно не захватил разделяемые системные ресурсы. Процесс освобождает процессор, ожидая длительной операции ввода/вывода, или по прошествии периода времени. В этом случае планировщик выбирает следующий процесс с наивысшим приоритетом и запускает его на выполнение. Модуль управления памятью обеспечивает размещение оперативной памяти для прикладных задач. Оперативная память является дорогостоящим ресурсом, и, как правило, она редко «простаивает». В случае, если для всех процессов недостаточно памяти, ядро перемещает части процесса или несколько процессов во вторичную память ( как правило, для этого выделена некоторая область жесткого диска ), освобождая ресурсы для действующих процессов. Все современные системы реализуют виртуальную память: процесс выполняется в собственном логическом адресном пространстве, которое может значительно превышать доступную физическую память. Управление виртуальной памятью процесса также входит в перечень задач модуля управления памятью. Модуль межпроцессного взаимодействия.отвечает за уведомление процессов о событиях с помощью сигналов и обеспечивает возможность передачи данных между различными процессами.

Подсистема ввода/вывода

Подсистема ввода/вывода выполняет запросы файловой подсистемы и подсистемы управления процессами для доступа к периферийным устройствам ( дискам, терминалам, а ранее и к магнитным лентам и др. ). Она обеспечивает необходимую буферизацию данных и взаимодействует с драйверами устройств — специальными модулями ядра, непосредственно обслуживающими внешние устройства.

Особенности архитектуры

Ядро Linux поддерживает многие унаследованные от UNIX особенности, такие как:

  1. многозадачность
  2. виртуальную память
  3. динамические библиотеки
  4. отложенную загрузку
  5. производительную систему управления памятью
  6. современные сетевые протоколы

На сегодняшний день Linux — монолитное ядро с поддержкой загружаемых модулей. Драйверы устройств и расширения ядра обычно запускаются в 0-м кольце защиты, с полным доступом к оборудованию. В отличие от обычных монолитных ядер, драйверы устройств легко собираются в виде модулей и загружаются или выгружаются во время работы системы, эта особенность также является унаследованной от первого предшественника — ОС Multics. То, что архитектура Linux не является микроядерной, вызвало обширнейшие споры между Линусом Торвальдсом и Эндрю Таненбаумом в конференции.

Выполнение в режиме ядра

Существуют всего три события, при которых выполнение процесса переходит в режим ядра:

  1. аппаратные прерывания
  2. особые ситуации
  3. системные вызовы

Во всех случаях ядро Linux получает управление и вызывает соответствующую системную процедуру для обработки события. Непосредственно перед вызовом ядро сохраняет состояние системы, а именно состояние прерванного процесса в системном стеке. После завершения обработки, состояние процесса восстанавливается и процесс возвращается в исходный режим выполнения. Чаще всего это режим задачи, например, когда прерывание возникло, когда процесс уже находился в режиме ядра, после обработки события он останется в том же состоянии. Стоит разграничить особые ситуации и прерывания. Аппаратные прерывания генерируются периферией при наступлении исключительных событий ( например, завершение печати или поступление данных на последовательный вход ввода ) и имеют асинхронный характер, поскольку невозможно в тот или иной момент сказать, когда система нам пробросит исключение. Часто, эти прерывания не связаны с текущим процессом, а вызваны внешними событиями. Именно поэтому, обработка прерываний происходит в системном контексте, при этом недопустим доступ к адресному пространству процесса. По этой причине обработка ситуаций не должна блокироваться, поскольку это вызовет блокирование выполнения независимого процесса Системные вызовы позволяют процессам воспользоваться базовыми услугами ядра. Интерфейс системных вызовов определяет ограниченный набор точек входа в ядро системы, обращение к которым изменяет режим выполнения процесса и позволяет выполнять привилегированные функции ядра. Стандартная библиотека C, позволяющая использовать системные функции как обычные процедуры, на самом деле содержит заглушки, обеспечивающие фактическую реализацию вызова соответствующей точки входа ядра. Эта реализация практически не зависит от аппаратной части системы. Например, для систем на базе процессоров Intel используются шлюзы. Имеются два типа шлюзов: шлюзы ловушек и шлюзы вызовов. Для осуществления вызова через шлюз ловушки процесс выполняет команду прерывания, а при работе через шлюз вызова — команду межсегментного вызова. Выполнение системного вызова происходит в режиме ядра, но в контексте процесса, сделавшего системный вызов. Таким образом, открыт доступ к адресному пространству процесса и используется стек ядра процесса.

Примечания

Литература

Робачевский, Андрей (2002). Autotools : Операционная система Unix / by Андрей Робачевский. No Starch Press. p. 528. ISBN 5-8206-0030-4. 

Ссылки

  • Linux-комъюнити [Электронный ресурс]: Общие вопросы / ядро Linux / Дата обращения: 5.03.2017. Режим доступа: https://community.linuxmint.com .
  • UK-сообщество Linux [Электронный ресурс]: Последние обновления / материалы Linux / Дата обращения: 5.03.2017. Режим доступа: https://linux.co.uk .
  • Русский «Linux-ойд» [Электронный ресурс]: Последние обновления / материалы Linux / Дата обращения: 5.03.2017. Режим доступа: http://www.linux.ru/ .

Что делает ядро Linux | Losst

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

Но что делает ядро Linux? Как оно работает? Какие его основные задачи? Это очень обширная тема и мы попытаемся разобрать ее в этой статье.

Содержание статьи:

Что делает ядро Linux?

Ядро Linux состоит из более чем 21 млн строк кода, в каждой из которых записана определенная и очень важная инструкция. Чтобы описать все функции ядра Linux понадобилась бы очень большая статья, поэтому мы попытаемся рассмотреть только самое главное.

Но прежде чем рассматривать как работает та или иная функция ядра операционной системы, давайте рассмотрим за что вообще оно отвечает. Ядро обеспечивает абстракцию для программистов, которые разрабатывают программы для платформы Linux. Эта абстракция позволяет упростить сложные задачи. Термин абстракция в информатике означает скрытие сложных механизмов и алгоритмов за более простой и стандартной функцией.

Естественно, ядро — это не единственное программное обеспечение, которое обеспечивает абстракцию, куда более важен уровень абстракции, предоставляемый драйверами. Ядру необязательно знать как работать с тем или иным устройством, поскольку за это отвечают драйвера. Поэтому ядро может работать на разном оборудовании.

Возьмем для примера чтение и запись данных в оперативную память. Каждая материнская плата может иметь разные контроллеры памяти, а ваш компьютер может работать на процессоре ARM, Intel, AMD, SPARC, PowerPC или MIPS. Но это не будет иметь значения для вашей программы Hello World, а так как ядро предоставляет унифицированный интерфейс для всех этих платформ.

Теперь, давайте рассмотрим какие именно функции предоставляет ядро или, иными словами, какие абстракции мы получим:

Хранение данных:

  • RAM — Чтение и запись данных в оперативную память;
  • Постоянное хранение — Чтение и запись данных на постоянные запоминающие устройства;
  • Виртуальная файловая система;

Доступ к сетям:

  • Работа с физическими сетями (Ethernet, Wireless, LTE, коммутаторы, Bluetooth;
  • Виртуальные сети;

Планирование задач:

  • Совместное использование процессорного времени программами;
  • Балансировка нагрузки процессора и приоритеты;

Поддержка внешних устройств:

  • Съемные USB носители;
  • Веб-камеры;
  • Мыши и клавиатуры;

Безопасность:

  • Права доступа к файлам для пользователей и групп;
  • Разрешение доступа к ресурсам системы;

Благодаря вышеуказанным функциям ядра Linux разработка программ становится проще. Ядро реализует все это с помощью системных вызовов. Дальше мы рассмотрим более детально многие функции.

Хранение данных

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

Ядро Linux обеспечивает прозрачный интерфейс для чтения и записи данных из оперативной памяти. Не имеет значения где запущенна операционная система, на старом процессоре i386 или новом Andorid ARM смартфоне. Код не нужно менять для обеспечения совместимости. Ядро содержит код для большинства аппаратных платформ, поэтому оно может обеспечить единый интерфейс для работы с ними.

Кроме того, ядро изолирует каждый процесс в отдельном пространстве памяти, а это значит, что процессу не нужно знать принадлежит ли эта память ему, потому что вся доступная память принадлежит ему. Такое разделение увеличивает безопасность системы.

Похоже, дела обстоят с постоянным хранением. Ядро скрывает от программ отличия между интерфейсами SATA, PATA, SCSI, USB, M2 и другими протоколами хранения. Одна программа может работать с любым носителем и любой поддерживаемой файловой системой без каких-либо изменений в программе. Это увеличивает повторное использование кода и производительность труда разработчиков.

Доступ к сети

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

Но к счастью, на данный момент самые популярные протоколы, это IPv4 и IPv6. Что касается других сетевых протоколов, таких как DECnet, IPX, AppleTalk, то они поддерживаются ядром, но вряд ли есть смысл использовать их в современных программах.

Вернемся к IPv4 и IPv6. У обоих слишком разные форматы записи IP адреса, но это скорее хорошо, чем плохо. Тип протокола можно определить сразу по форме IP адреса. Ядро обеспечивает поддержку протоколов передачи данных: TCP, UDP, SCTP и ICMP. Все они могут быть очень легко использованы с помощью системных вызовов. Не имеет значения, подключен ли ваш компьютер к Ethernet или Wifi. Эта обеспечивает гибкость для конечных пользователей.

Планирование задач

Планирование процессорного времени это очень большая и сложная тема. Мы не будем затрагивать алгоритмы планирования, нас интересуют только задачи ядра Linux в относительно управления каждым процессом.

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

Каждому процессу нужно время процессора, а ядро гарантирует что каждый процесс получит его в порядке очереди. Помимо этого, некоторым процессам нужна задержка или ожидание ввода/вывода, и этим тоже занимается ядро. Пока процесс ждет, на процессоре будет выполняться другой процесс, а потом исходный процесс получит свое время. Планирование позволяет программисту не заботится о количестве запущенных процессов.

Выводы

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

На завершение краткая история Linux:

Источник: https://fossbytes.com

Собираем ядро Linux | Losst

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

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

В этой инструкции мы рассмотрим как собрать ядро Linux. Первая часть расскажет как настроить ядро в автоматическом режиме. Так сказать, для тех кто не хочет разбираться как оно работает, кому нужно лишь получить на выходе готовый продукт — собранное ядро. Во второй части мы рассмотрим основные этапы ручной настройки ядра, это процесс сложный, и небыстрый, но я попытаюсь дать основу, чтобы вы могли со всем разобраться сами.

Содержание статьи:

Получение исходников ядра

Самое первое что нужно сделать — это скачать исходники ядра. Исходники лучшие брать с сайта вашего дистрибутива, если они там есть или официального сайта ядра: kernel.org. Мы рассмотрим загрузку исходников с kernel.org.

Перед тем как скачивать исходники нам нужно определиться с версией ядра которую будем собирать. Есть две основных версии релизов — стабильные (stable) и кандидаты в релизы (rc), есть, конечно, еще стабильные с длительным периодом поддержки (longterm) но важно сейчас разобраться с первыми двумя. Стабильные это, как правило, не самые новые, но зато уже хорошо протестированные ядра с минимальным количеством багов. Тестовые — наоборот, самые новые, но могут содержать различные ошибки.

Итак когда определились с версией заходим на kernel.org и скачиваем нужные исходники в формате tar.xz:

kernel6

В этой статье будет использована самая новая на данный момент нестабильная версия 4.4.rc7.

Получить исходники ядра Linux можно также с помощью утилиты git. Сначала создадим папку для исходников:

mkdir kernel_sources

Для загрузки самой последней версии наберите:

git clone https://github.com/torvalds/linux

 

Распаковка исходников ядра

Теперь у нас есть сохраненные исходники. Переходим в папку с исходниками:

cd linux_sources

Или если загружали ядро linux с помощью браузера, то сначала создадим эту папку и скопируем в нее архив:

mkdir linux_sources

cp ~/Downloads/linux* ~/linux_sources

Распаковываем архив с помощью утилиты tar:

tar xf linux*

И переходим в папку с распакованным ядром, у меня это:

cd linux-4.4-rc7/

Автоматическая настройка сборки ядра Linux

Перед тем как начнется сборка ядра linux, нам придется его настроить. Как я и говорил, сначала рассмотрим автоматический вариант настройки сборки ядра. В вашей системе уже есть собранное, настроенное производителем дистрибутива, и полностью рабочее ядро. Если вы не хотите разбираться с тонкостями конфигурации ядра, можно просто извлечь уже готовые настройки старого ядра и сгенерировать на их основе настройки для нового. Нам придется лишь указать значения для новых параметров. Учитывая, что в последних версиях не было и не намечается серьезных изменений можно отвечать на все эти параметры как предлагает скрипт настройки.

Параметры используемого ядра хранятся в архиве по адресу /proc/config.gz. Распакуем конфиг и поместим его в нашу папку утилитой zcat:

zcat /proc/config.gz > .config

А дальше запускаем скрипт адаптации настроек:

make oldconfig

В процессе его работы нужно будет ответить на несколько вопросов. Это новые параметры, которые изменились или были добавлены в новое ядро и поддержка нового оборудования, в большинстве случаев можно выбирать вариант по умолчанию. Обычно есть три варианта y — включить, n — не включать, m — включить в качестве модуля. Рекомендованный вариант написан с большой буквы, для его выбора просто нажмите Enter.

На все про-все у вас уйдет около 10-ти минут. После завершения процесса, ядро готово к сборке. Дальше мы рассмотрим настройку ядра вручную, а вы можете сразу перелистать к сборке ядра Linux.

Ручная настройка ядра Linux

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

Начнем. Для запуска меню настроек ядра linux наберите:

make menuconfig

Откроется вот утилита с интерфейсом ncurses:

kernel5

Как видите, некоторые обязательные опции уже включены, чтобы облегчить вам процесс настройки. Начнем с самых основных настроек. Чтобы включить параметр нажмите y, чтобы включить модулем — m, для перемещения используйте клавиши стрелок и Enter, возвратиться на уровень вверх можно кнопкой Exit Откройте пункт General Setup.

Здесь устанавливаем такие параметры:

Local Version — локальная версия ядра, будет увеличиваться при каждой сборке на единицу, чтобы новые ядра при установке не заменяли собой старые, устанавливаем значение 1.

kernel1

Automatically append version information to the version string — добавлять версию в название файла ядра.

Kernel Compression Mode — режим сжатия образа ядра, самый эффективный lzma.

Default Hostname — имя компьютера, отображаемое в приглашении ввода

POSIX Message Queues — поддержка очередей POSTIX

Support for paging of anonymous memory  — включаем поддержку swap

Control Group support — поддержка механизма распределения ресурсов между группами процессов

Kernel .config support и Enable access to .config through /proc/config.gz— включаем возможность извлечь конфигурацию ядра через /proc/config.gz

Здесь все, возвращаемся на уровень вверх и включаем Enable loadable module support, эта функция разрешает загрузку внешних модулей, дальше открываем его меню и включаем:

kernel3

Module unloading — поддержка отключения модулей

Forced module unloading — принудительное отключение модулей

Опять возвращаемся назад и открываем Processor type and features:

Processor family (Opteron/Athlon64/Hammer/K8) — выбираем свой тип процессора.

Опять возвращаемся и переходим в раздел File systems, тут установите все нужные галочки.

kernel4

Обязательно включите The Extended 3 (ext3) filesystem и The Extended 4 (ext4) filesystem — для поддержки стандартных ext3 и ext4 файловых систем

Возвращаемся и идем в Kernel hacking.

Здесь включаем Magic SysRq key — поддержка магических функций SysRq, вещь не первой необходимости, но временами полезная.

Остался еще один пункт, самый сложный, потому что вам его придется пройти самому.  Device Drivers — нужно пройтись по разделам и повключать драйвера для своего оборудования. Под оборудованием я подразумеваю нестандартные жесткие диски, мышки, USB устройства, веб-камеры, Bluetooth, WIFI адаптеры, принтеры и т д.

Посмотреть какое оборудование подключено к вашей системе можно командой:

lspci

После выполнения всех действий ядро готово к сборке, но вам, скорее всего, предстоит разобраться с очень многим.

Чтобы сохранить настройки переместите указатель с помощью стрелок вправо-влево, з позиции Select в позицию Save и нажмите Enter, потом еще раз подтвердите сохранение:

kernel

Чтобы выйти нажмите пару раз кнопку Exit.

Сборка ядра Linux

После завершения всех приготовлений может быть выполнена сборка ядра linux. Для начала процесса сборки выполните:

make && make modules

Теперь можете идти пить кофе или гулять, потому что процесс сборки длинный и займет около получаса.

Установка нового ядра

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

cp arch/x86_64/boot/bzImage /boot/vmlinuz

А можно просто выполнить установочный скрипт, сразу установив заодно и модули:

sudo make install && sudo make modules_install

После установки не забудьте обновить конфигурацию загрузчика Grub:

grub-mkconfig -o /boot/grub/grub.cfg

И перезагружаем компьютер чтобы увидеть новое ядро в работе:

sudo reboot

Выводы

Вот и все. В этой статье мы подробно рассмотрели как собрать ядро Linux из исходников. Это будет полезно всем желающим лучшие понять свою систему, и тем, кто хочет получить самую новую версию ядра в своей системе. Если остались вопросы, задавайте комментарии!

Линус Торвальдс представил ядро Linux 5.1 с большим количеством нововведений / Habr

Спустя два месяца работы Линус Торвальдс представил релиз ядра Linux 5.1. Новинка получила большое количество новых функций и доработок, включая новый интерфейс для асинхронного ввода ввода/вывода io_uring, поддержку масштабируемого мониторинга очень больших ФС через fanotify, решение проблемы 2038 года и др.

По словам Торвальдса, 5.1 получил более 13 тысяч коммитов, что немало. Итоговый список изменений получился очень внушительным.

Как всегда, изменения и нововведения разделены на несколько категорий.

Дисковая подсистема, файловые системы, ввод/вывод


  • в новом релизе появился новый интерфейс для асинхронного ввода/вывода — io_uring. Он хорош тем, что поддерживает поллинг ввода/вывода, плюс может работать как с буферизацией, так и без нее. Ранее механизм асинхронного ввода/вывода не поддерживал эту возможность, плюс мог работать лишь в обход кэша и без буферизации. Из-за ожидания доступности метаданных возникали блокировки;
  • механизм отслеживания событий в ФС fanotify() получил поддержку отслеживания ситуаций изменения суперблока и структуры dirent (это специфическое событие создания, удаления и перемещения каталогов). Новые возможности позволяют решать проблемы с масштабируемостью, которые возникают при создании рекурсивных отслеживаний изменений в очень больших файловых системах при помощи механизма inotify;
  • файловая система Btrfs теперь имеет возможность настройки уровня сжатия для алгоритма zstd. Плюс в этой ФС добавлено отложенное выполнение операций сканирования поддерева для снижения нагрузки и реализация ioctl для управления отключением устройств;
  • в ядре теперь нет файловой системы Exofs, которая представляла собой один из вариантов ext2, оптимизированный для работы с хранилищами объектов OSD. Нет и SCSI-протокола для таких устройств хранения объектов;
  • также внесены исправления, которые направлены на увеличение масштабируемости и производительности файловых систем, которые работают через механизм FUSE.

Безопасность и виртуализация


  • в ядро добавлены низкоуровневые изменения, которые нужны для стековой организации загрузки модулей безопасности (возможность загрузки одного LSM-модуля поверх другого). Плюс есть возможность управлять порядком загрузки;
  • расширены возможности GCC-плагина structleak. Он позволяет блокировать потенциальные утечки содержимого памяти. Добавлена возможность инициализации любых переменных, используемых в коде через обращение по ссылке в стеке;
  • в prctl() появилась опция PR_SPEC_DISABLE_NOEXEC, которая дает возможность управлять спекулятивным выполнением инструкций для выбранного процесса.

Сетевая подсистема


  • в стек mac80211 добавлена возможность назначения одному устройству сразу нескольких MAC-адресов. Кроме того, в этот стек добавлен и учет распределения эфирного времени, с возможностью его распределения между несколькими станциями. Это дает возможность выделять меньше времени на передачу медленным беспроводным станциям при работе в качестве точки доступа;
  • в модуль cfg80211/nl80211 добавлена возможность выноса обработчика аутентификации при работе в режиме точки доступа;
  • если возникают проблемы с сетевым интерфейсом, узнать подробности можно посредством механизма devlink health. Здесь же есть и API для получения информации об устройстве, плюс добавлена команда «flash update» для обновления прошивок сетевого адаптера;
  • добавлена поддержка TLS 1.3.

Память и сервисы


  • разработчики добавили безопасную доставку сигналов, которая учитывает возможность повторного использования PID. Так, ранее при выполнении вызова kill могла возникнуть ситуация, когда после отправки сигнала целевой PID мог быть освобожден из-за завершения работы процесса. В результате сигнал передавался другому процессу;
  • также добавлена возможность использования устройств постоянной памяти в качестве ОЗУ (persistent-memory, например NVDIMM). До выхода нового ядра эти устройства поддерживались в качестве устройств хранения, но теперь их можно задействовать в качестве дополнительной оперативной памяти. Возможность была добавлена в ответ на пожелания пользователей, которым не нужна высокая производительность, но требуется штатный API управления памятью ядра Linux вместо использования имеющихся систем распределения памяти в пространстве пользователя, которые работают поверх mmap для dax-файла;
  • для решения проблемы 2038 года (переполнение 32-разрядного типа time_t) в состав ядра включены системные вызовы, которые предлагают для 32-разрядных архитектур 64-разрядные счетчики времени. Как итог, 64-разрядная структура time_t может теперь использоваться на всех архитектурах.

Железо


  • в драйвер Nouveau добавили поддержку гетерогенного управления памятью, что дает возможность обращения CPU и GPU к общим синхронизированным областям памяти;
  • в DRM-драйвере Intel для GPU и новее режим fastboot включен по умолчанию. Это исключает лишние смены режимов во время загрузки. Добавлены новые идентификаторы устройств на базе Coffelake и Ice Lake;
  • в драйвер amdgpu добавлена поддержка GPU Vega10/20 BACO;
  • добавлена поддержка большого количества новым ARM плат и платформ, включая NVIDIA Shield TV (Darcy) на базе Tegra210, Bosch Guardian, Winterland IceBoard, Inspur on5263m5, Zodiac Digital Tapping Unit, Phicomm K3, X96 Max, FriendlyElec NanoPC-T4, NanoPi M4, Radxa ROCK Pi 4, Logic PD i.MX6QD, Y Soft IOTA Draco/Hydra/Ursa, Phytec phyCORE i.MX6 UltraLite, MYIR Tech MYD-LPC4357, Chameleon96, Oxalis Evalkit V100, Elgin RV1108 R, Si-Linux CAT874, Si-Linux EK874, Raspberry Pi Model 3 A+.

Более подробно об изменениях можно прочитать здесь (англ.) и здесь (рус.).

Ядро Linux. Курс «Введение в Linux и Bash»

Что такое ядро операционной системы

Ядро является главной частью любой операционной системы. Существует точка зрения, которая понятие операционной системы приравнивает к ядру. Есть точка зрения, когда в понятие операционной системы включают как ее ядро, так и системные программы, позволяющие пользователю обращаться через ядро к аппаратным ресурсам.

Так что же такое ядро ОС и каковы его функции? Как известно, компьютер – не только система аппаратного обеспечения (железа), но и набор работающего на нем программного обеспечения. Чтобы второе могло эффективно работать на первом, нужна более низкоуровневая программа, скрывающая сложности работы с железом и предоставляющая обычным программам и пользователям удобный для них интерфейс.

Железо говорит на языке сигналов, регистров, секторов, переводов головок. Программам все это не надо. Они говорят на языке «записать, прочитать, сложить, вычесть …». Специальной программой, обеспечивающей остальным простой и понятный интерфейс для работы на имеющемся оборудовании, является ядро операционной системы. Однако создание виртуальной машины – не единственная функция ядра.

Представим себе, что ядра нет, а каждая запущенная программа сама обращается к железу и обрабатывает сигналы от него. Вроде бы ничего страшного, кроме дублирования кода в каждой такой программе. Но на компьютере одновременно работает множество программ. Как они будут «договариваться» между собой о совместном использовании общего аппаратного обеспечения?

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

Ядро операционной системы – это тоже программа, написанная на том или ином языке программирования и скомпилированная в исполняемый файл. Однако, в отличии от других программ, ядро всегда загружается первым и потом постоянно «сидит» в определенной области оперативной памяти. То есть это программа, которая всегда находится в запущенном состоянии и взаимодействует, с одной стороны, с железом, а с другой – с системными и пользовательскими программами.

В коде ядра особо выделяют драйверы устройств. Драйвер – это программный код, функция которого заключается в предоставлении возможности использовать определенное железо (например, видеокарту). Причем конкретный драйвер не всегда загружается в память вместе с остальной частью ядра. Он туда грузится, лишь когда возникает потребность в ресурсах устройства. Так экономится память, но в ущерб скорости.

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

Ядра Unix-подобных систем

Ядро Unix являлось первой практической реализацией новых идей и открытий 60-70-х годов XX века в области создания операционных систем.

Unix имеет простое монолитное ядро, в котором почти все представляется в виде файлов. Настройки хранятся в текстовых файлах, оборудование также имеет файловый интерфейс. Unix была написана на языке C, и это сделало ее переносимой с одной аппаратной платформы на другую. В Unix были впервые реализованы так называемые многозадачность и многопоточность, виртуальная память и многое другое.

В 80-х годах Unix-системы начали множится и видоизменяться. Некоторые умы вовремя спохватились и создали специальные стандарты, обеспечивающие совместимость систем. Это значит, что программа, написанная для одной Unix-подобной системы, должна работать в другой. Стандарты назвали POSIX.

Особенности ядра Linux

Обычно конечные пользователи имеют дело с дистрибутивами Linux, которые незначительно отличаются между собой, в том числе по компонентам ядра (например, наличию/отсутствию определенных драйверов). Однако ядро в своей основе все-равно остается ядром Linux, его исходники предоставляет проект https://www.kernel.org/. Это совместный проект, к нему может присоединится каждый программист. Основным руководителем остается Линус Торвальдс.

С технической точки зрения, Linux – это ядро, а не операционная система. Linux + программы из проекта GNU рождают операционную систему GNU/Linux. Однако ее тоже не существует в чистом виде. Разработчики дистрибутивов дорабатывают на свой лад GNU/Linux, после чего получаются различные операционные системы-дистрибутивы. У каждого дистрибутива есть собственное имя (Ubuntu, Fedora и т. п.). Однако в основе всех этих систем лежит ядро Linux, поэтому все они принадлежат одному семейству Linux-систем.

Ядро Linux начал разрабатывать в 1991 году Линус Торвальдс. В дальнейшем оно развивалось и совершенствовалось многими людьми. Ядро Linux выпускается под лицензией GNU GPL.

Ядро Linux Unix-подобно, так как заимствовало идеи, заложенные в Unix, соответствует стандартам POSIX, а также по большей части написано на языке С.

У Linux монолитное ядро. Однако некоторые идеи микроядерной архитектуры тут также используются. Так драйверы устройств могут быть представлены в виде модулей и загружаться по требованию, а не при загрузки всего ядра.

Ядро выпускается в виде стабильных и разрабатываемых версий. В стабильных обычно исправлены ошибки, добавлены новые драйверы устройств. До недавнего времени четное второе число в названии ядра, говорило, что оно стабильно. Нечетное число обозначало разрабатываемую нестабильную версию. В 2011 году от такого подхода к нумерации версий отказались.

Опытные пользователи дистрибутивов Linux нередко сами скачивают и устанавливают себе новое ядро. Для этого они сначала распаковывают исходные коды, затем выполняют конфигурацию, потом компилируют, размещают в загрузочном каталоге и изменяют настройки загрузчика.

Конфигурируют ядро с целью включения, отключения или компиляции в виде модуля какого-либо драйвера или функции. Другими словами, «ядро под себя» не будет содержать лишних драйверов для оборудования, которого нет.

Курс с ответами к заданиям и дополнительными уроками:
android-приложение, pdf-версия.

Создание операционной системы на базе ядра linux. С нуля / Habr

Рано или поздно каждый пользователь Линукса задумывается над созданием собственного дистрибутива. Некоторые аргументируют это тем, что можно «все настроить под себя». Другие сетуют на то, что среди уже представленных дистрибутивов в Ветке нет идеального. А у них, якобы, есть суперконцептуальные идеи для собственной системы. Зачем я всю эту психологию затеял? Для того, чтобы сразу перекрыть кислород играющимся с Линуксом новичкам, которым делать нечего. Если уж задумались над созданием ОС, думайте до конца. Итак,

Я хочу создать ОС на базе Linux.
Сразу предупреждаю: был бы XVIII век, всех тех, кто для основы своей будущей системы выбирает другой развитый дистрибутив (и, не дай Бог, популярный…) ждала бы виселица. Пост именно про создание системы с нуля, а значит, всякие Slax и Linux Mint мы трогать не будем.

Шаг 1. Выбор носителя
Вариантов немного: либо ваша ОС запускается с LiveCD, либо с жесткого диска, либо с флеш-устройства. Сразу оговорюсь: не скажу в посте ни слова про жесткий диск, потому что гораздо удобнее создавать гибкий дистрибутив из серии «все свое ношу с собой», либо залоченный дистрибутив на оптическом диске. Если вы научитесь создавать LiveCD или LiveUSB систему, с установкой на жесткий диск проблем не будет.

На всякий случай, приготовьте чистую флешку, CD-диск, и установите, наконец, Virtualbox.

Шаг 2. Компиляция ядра
По поводу выхода третьего ядра Linux, этот шаг воодушевляет на дальнейшие разработки… Итак, нам нужны исходники ядра. Каждый пользователь знает, что их можно достать на сайте kernel.org. Ни в коем случае, слышите?, никогда не прикручивайте к своей системе постороннее ядро, скомпилированное не вами!

Поскольку лень моя зашкаливала, я создал папку /linuxkernel и распаковал туда архив с исходниками. Залогинившись под рутом, я сделал следующее:

cd /linuxkernel
make menuconfig

В принципе, ядро можно конфигурировать тремя способами: make config (диалоговая конфигурация), make menuconfig (псевдографическая конфигурация через ncurses), а также make xconfig (графическая конфигурация). Суть в том, что make config испортит вам настроение надолго, т.к. он задаст все возможные вопросы по всем аспектам всех тем. Проблема с make xconfig встречается не у всех, но вот у меня встречалась и встречается. Если приспичило сделать через X, разбирайтесь сами. Оптимальный вариант — make menuconfig. Эта штука откроет вам псевдографический интерфейс, через который вы сможете настроить ядро на свой лад. Штука требует библиотеки ncurses, которая легко устанавливается.

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

Однако, направить вас все же придется. Перейдите по адресу File Systems —> и поставьте необходимые звездочки. Буква M означает, что поддержка того или иного драйвера осуществляется с помощью подключения к ядру внешнего модуля (ненавижу их!). Нам понадобится также поддержка isofs, для чтения дисков. File Systems —> CD-ROM/DVD Filesystems —> ISO 9660 CDROM file system support. Можно еще поддержать древнедосовские системы.

Чмошные разработчики Mandriva забыли разрешить File systems —> DOS/FAT/NT Filesystems —> NTFS write support, и на одном из их дистрибутивов я мучился с доступом к древневиндовскому разделу.

Посмотрите Processor type and features —> Processor family, мне порекомендовали выбрать Pentium-MMX.

Еще поройтесь в Device Drivers, полезно. Можете шутки ради понавыбирать там все и скомпилировать ядро весом > 50 Мб.

Далее. Ядро после загрузки себя должно загружать, собственно, систему. Либо из скомпилированных в себе файлов (используются во встраиваемых системах), либо из CPIO архива, сжатого чем-нибудь, либо из Initrd. Здесь вам не DOS, здесь не получится сразу сослаться на какой-нибудь init’овый файл в корневом каталоге диска или флешки. На самом деле получится, не слушайте дядю Анникса! Неправильно это, хоть в Интернете по этому поводу уже нехилая полемика ведется. В своей системе мы будем использовать initrd, т.к. это удобно, и не вызовет нецензурных выражений от сторонних разработчиков, в отличие от CPIO архива.

Ах, да, скомпилируйте ядро командой

make bzImage

Если у вас x86, найдете его по адресу /linuxkernel/arch/x86/boot/bzImage.

Для суровых челябинских программистов можно использовать Кросс-компайлинг…

Создание Ramdisk.

Теперь нам нужен initrd с установленной там простейшей оболочкой. Мы будем использовать busybox, потому что эта няша может все. Способ мы украдем у Роберто де Лео, создателя Movix (я бы даже уважать его начал, если бы не запредельная любовь к Perl):

dd if=/dev/zero of=/dev/ram0 bs=1k count=5000 - Создаем Ramdisk в оперативной памяти нашего компьютера.
mke2fs -m0 /dev/ram0 5000 - Форматируем Ramdisk в системе Ext2
mkdir /distro - Создаем папку
mount /dev/ram0 /distro - Монтируем в папку /distro

Все, теперь у нас есть Ramdisk, емкостью в 5 Мб. Можно и больше, только не нужно. В отличие от Томаса Матеджисека, я не собираюсь пичкать initrd модулями в Squashfs, сжатыми LZMA. Все, что необходимо, будет скомпилировано вместе с ядром. Да, это не очень логично и правильно, но мороки в сто раз меньше. А специально для тех, кто осуждает такой подход, можно разрешить опцию модульности в ядре: Enable loadable module support.

В нашем Ramdisk’е, смонтированном в /distro, есть такая папка, lost+found. Это потому, что мы отформатировали его в ext2. Ни в коем случае нельзя ее удалять, хоть она здесь вряд ли поможет, образ-то фиксированный. Нам бы busybox сначала поставить…

Установка Busybox
Вот почему у таких классных проектов такие отстойные сайты? Хотя… это уже не суть важно, если исходники скачаны и успешно распакованы в папку /busybox.

Сконфигурировать busybox можно так же:

cd /busybox
make menuconfig

Если вы еще не поняли, что это, объясню. Busybox заменяет тонны UNIX приложений, хранящихся в папках /bin, /sbin, /usr/bin, /usr/sbin. Вместо этого, создается только одно приложение: /bin/busybox, а на него создается куча ссылок в указанных выше папках. Установим busybox следующей командой:

make CONFIG_PREFIX=/distro install

Еще Busybox создаст файлы /sbin/init и зачем-то /linuxrc, чтобы ваша система корректно запустилась. Но не все необходимые папки были созданы. Так что завершаем все руками и создаем:

/distro/etc
/distro/lib
/distro/dev
/distro/mnt
distro/proc
/distro/root
/distro/tmp
/distro/root

Если что забыл — вспомните, т.к. директории эти забыть сложно.

Все бы хорошо, вот только busybox для работы требует библиотеки, которые нужно скопировать в наш дистрибутив. Очень легко узнать, какие:

ldd /distro/bin/busybox

Программа покажет нам библиотеки, требуемые для нашей оболочки. Сразу говорю: linux gate создается ядром и скопирован быть не может.

При копировании библиотек можно отсекать отладочную информацию (так Роберто советует):

objcopy --strip-debug откуда куда

Делаем из Линукса Линукс

Надо создать несколько системных текстовых файлов:

Нам нужен /etc/inittab. Удивлю вас: в начале жизни система даже не знает, что такое Root. У нас даже пользователь безымянный, но вот файл общесистемных низкоуровневых фич (ОНФ) должен присутствовать. Пилотное содержание файла следующее:

::sysinit:/etc/rc.d/rc.S

# Запустить оболочку в консоли.
::respawn:-/bin/sh

# Перезагрузка по нажатии на Ctrl+Alt+Del.
::ctrlaltdel:/sbin/reboot

# Команды, выполняемые перед выключением и перезагрузкой.
::shutdown:/sbin/swapoff -a >/dev/null 2>&1
::shutdown:/bin/umount -a -r >/dev/null 2>&1

Следующий файл — /etc/fstab. Это таблица, в которой описано, что и куда монтировать при загрузке. Вещь бесполезная! Нам нужно обязательно смонтировать proc, иначе вообще ничего работать не будет, так что в файле пишем:

none /proc proc defaults 0 0

Для mount нужен также файл /etc/mtab. Создайте его и оставьте пустым.

Но mount сделает все необходимое только тогда, когда мы явно его об этом попросим. А просить мы будем в том самом первозагрузочном файле /etc/rc.d/rc.S (rc.d — папка). Вежливо попросим:

#!/bin/ash

/bin/mount -av -t nonfs

Еще нам необходим файл профиля (b)(a)sh, тут вообще раздолье для фантазии. Создаем файл /etc/profile и заполняем следующим:

PATH="$PATH:/bin:/sbin:/usr/bin:/usr/sbin:"
LESS=-MM
TERM=linux
HOME=/root
PS1='> '
PS2='> '
ignoreeof=10
export PATH DISPLAY LESS TERM PS1 PS2 HOME ignoreeof

Понадобится также файл /etc/shell, в котором указано, что есть оболочка:

/bin/sh
/bin/ash
/bin/bash

Вот собственно и все. Можно записывать наш Ramdisk в файл.

mkdir /os - папка для "готового".
umount /dev/ram0 - размонтируем кусочек оперативной памяти.
dd if=/dev/ram0 of=/os/initrd bs=1k count=5000 - создаем файл.
gzip /os/initrd - сжимаем файл initrd

Создание загрузочной флешки

«Финишная прямая» нашей маленькой разработки. Берем флешку, вставляем, форматируем в vfat (можно и в ext, но не забывайте, что еще не все пользователи Windows застрелились).

На флешке создаем папку boot, в ней папки initrd и kernel.

Из папки /os копируем сжатый Ramdisk в папку boot/initrd на флешке, называем «main.gz». Из папки с исходниками ядра копируем bzImage в папку boot/kernel на флешке, называем «main.lk». Достаем файлы загрузчика Syslinux (в Интернете, либо из другого дистрибутива: тут не принципиально), а именно syslinux.bin, syslinux.boot, syslinux.cfg. Копируем их в корневой каталог нашей флешки. В файле syslinux.cfg пишем что-то подобное:

default mm
prompt 1
timeout 100
label mm
kernel /boot/kernel/main.lk
append initrd=/boot/initrd/main.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
label mc
kernel /boot/kernel/main.lk
append initrd=/boot/initrd/custom.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
label cm
kernel /boot/kernel/custom.lk
append initrd=/boot/initrd/main.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
label cc
kernel /boot/kernel/custom.lk
append initrd=/boot/initrd/custom.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
label hd
localboot 0x80

Тем самым мы поддержали кастомные initrd и ядро, которые, эксперимента ради, можно подключить к нашему дистрибутиву.

Узнаем, каким девайсом в системе является наша флешка (можно запустить mount без параметров и посмотреть). Это либо /dev/sdb1, либо /dev/sdc1, либо /dev/sdd1. Стоит отмонтировать флешку перед началом установки.

Устанавливаем syslinux (если пакета в системе нет, apt-get install syslinux):

syslinux -d путь_к_устройству

В корневом каталоге флешки должен появиться файл ldlinux.sys. Если он есть, значит syslinux.bin, syslinux.boot больше не нужны.

Как настроить BIOS на загрузку из флешки, я вам рассказывать не буду — это легко. Скажу только, что очень удобно создать папку /boot/initrd/init, в которую можно будет смонтировать /boot/initrd/main, для последующей работы с ним. Только не забудьте разжимать и сжимать его gzip’ом.

Ну вот и все.

Как-бы я только что рассказал вам, как создать с нуля систему на Linux. Легко, не правда ли? Далее вы можете редактировать скрипт /sbin/init, ведь у вас еще много работы! Вы должны будете написать скрипт для монтирования флешки, который делает chroot в корневой каталог. В противном случае, вы вынуждены будете работать с ReadOnly разделом, величиной в 5 Мб. Но это уже совсем другая история.

Unnx Davis T, B.

Для непросвещенных:

Томас Матеджисек — создатель Slax и Linux Live Scripts.
Роберто де Лео — создатель Movix.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *