Что происходит на каждом этапе процесса создания ядра Linux?

27

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

Процедура , описанная на сайте в Ubuntu делает много работы с fakeroot, dpkg, make-kpkg, некоторые initramfs и другие ужасный материал , который работает , но просто не помогает мне понять , что происходит.

  • Что выводится makeв каталоге ядра Linux?
  • Создает ли это «сжатый образ ядра»?
  • Как называется файл "сжатый образ ядра" и где он находится?
  • Что делает make modules?
  • Должно make modulesбыть сделано до или после make?
  • Разве makeмои модули не создаются автоматически?
  • Каков процесс (на английском языке, а не просто список команд) добавления вновь собранных ядер в список загружаемых ядер?
  • Что делает make install?
  • Добавит ли make installэто мой список загрузочных ядер, чтобы мне больше ничего не нужно было делать?
  • Есть ли эквивалент make modules_install?
AnkurVj
источник
Это должно быть разделено на несколько вопросов.
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

34

Сверху...

  • makeкомпилирует и связывает образ ядра. Это один файл с именем vmlinuz.
  • make modulesкомпилирует отдельные файлы для каждого вопроса, на который вы ответили Mво время настройки ядра. Код объекта связан с вашим недавно собранным ядром. (В ответах на вопросы Yони уже являются частью vmlinuz, а в ответах на вопросы Nони пропускаются).
  • make installустанавливает ваше встроенное ядро ​​в /vmlinuz.
  • make modules_installустанавливает ваши модули ядра в /lib/modulesили /lib/modules/<version>.

Что касается добавления его в список доступных ядер, об этом позаботится загрузчик. Это отличается для каждого загрузчика, но grubнаиболее распространено на x86 и amd64, поэтому я опишу это. Это на самом деле довольно просто. Граб смотрит /, /bootи /lib/modulesдля любой вещи, которая выглядит, как будто это может быть рабочее ядро, и добавляет его. И да, это упрощенное описание.

Этот дополнительный «ужасный материал» в документации по Ubuntu - это дополнительный материал для создания debпакета. Когда вы делаете это больше, чем для себя, гораздо лучше упаковать это. Вы переключитесь во времени.

Сборка ядра и модулей хранится отдельно, потому что для людей, которым это необходимо (т.е. для разработчиков ядра), они часто вносят изменения только в модуль. Они могут применить свои изменения, перестроить и установить только модули. Это экономит много времени, когда это нужно делать 20 раз в день. Он никогда не будет обновлен, чтобы иметь одну make everythingкоманду. Вы вместо этого запускаете, make && make modules && make install && make modules_install как написано в документации . Процесс сборки благоприятствует разработчикам ядра, а не вам. И так и должно быть.

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

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

bahamat
источник
1
Большое спасибо за удобочитаемое описание процесса. У меня есть несколько сомнений. Моя компиляция ядра произвела vmlinux, а не vmlinuz. Я думаю, что разница заключается в сжатии. Нужно ли сжимать изображение вручную? Находится /vmlinuzли каталог в корневой папке? когда я сделаю make install, будет ли создан этот каталог и будет ли там помещено новое ядро? Будет ли make modules_installзаменить мои установленные модули? Предположим, я помещаю свой vmlinux в каталог / boot, нужно ли мне делать что-то еще (например, редактировать файлы конфигурации grub и делать grub-update или что-то после этого?)
AnkurVj
3
Вы правы, разница в сжатии. Команда make bzimageэто то, что делает. /vmlinuzэто бинарный файл, а не каталог. Я делал только упакованные ядра в течение последних 5 лет, так что я не помню точно поведение modules_installнепосредственно установленного ядра. Grub найдет ваше ядро /bootбез посторонней помощи. Да, вы всегда должны запускаться grub-updateпосле установки нового ядра.
Багамат
так что я должен был сделать make bzimageвместо make? Мне нужно сделать снова make cleanи make bzimageснова? К /vmlinuzвы имеете в виду файл будет создан в корневом каталоге или в каталоге исходного кода ядра Linux?
AnkurVj
1
Не имеет значения, сжато ли ваше ядро ​​или нет. Несжатый это просто занимает немного больше места на диске. Все с префиксом /является абсолютным путем, так что да, это файл в корне.
Багамат
1
@GuyAvraham Модули, на Yкоторые даны ответы , компилируются (т. Е. Они являются частью vmlinuz). Отвеченные модули Mкомпилируются как загружаемые модули. Отвеченные модули Nне компилируются. make modules_installотносится только к ответившим M.
багамат