Що відбувається на кожному кроці процесу створення ядра Linux?


27

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

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

  • Який вихід makeу каталозі ядра Linux?
  • Чи створює це "стиснене зображення ядра"?
  • Як називається файл "стисненого зображення ядра" і де він розміщується?
  • Що робить make modules?
  • Чи make modulesслід робити до або після make?
  • Не makeбудує мої модулі автоматично?
  • Який процес (англійською мовою, а не лише список команд) додавання новобудованих ядер до списку завантажувальних ядер?
  • Що робить make install?
  • Додасть make installйого до мого списку завантажувальних ядер, щоб мені більше не довелося нічого робити?
  • Є еквівалент make modules_install?

Це слід розділити на кілька запитань.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Відповіді:


34

З вершини...

  • makeкомпілює і пов'язує зображення ядра. Це єдиний файл з назвою vmlinuz.
  • make modulesкомпілює окремі файли для кожного питання, на яке ви відповіли Mпід час налаштування ядра. Об'єктний код пов'язаний із вашим щойно вбудованим ядром. (Для відповідей на запитання Yвони вже є частиною vmlinuz, а для запитаних відповідей Nвони пропускаються).
  • make installвстановлює вбудоване ядро ​​в /vmlinuz.
  • make modules_installвстановлює ваші модулі ядра до /lib/modulesабо /lib/modules/<version>.

Щодо додавання його до списку доступних ядер, про це подбає завантажувач. Для кожного завантажувача він різний, але grubє найпоширенішим для x86 та amd64, тому опишу це. Насправді це досить просто. Grub заглядає /, /bootі /lib/modulesдля будь-якої речі, яка виглядає, це може бути робоче ядро, і додає його. І так, це спрощений опис.

Цей додатковий "жахливий матеріал" в документації на Ubuntu - це зайвий матеріал для створення debпакету. Коли ти робиш це більше, ніж для себе, набагато краще упакувати його. Ви вчасно переключитесь.

Створення ядра та модулів зберігається окремо, тому що для людей, яким потрібно (тобто розробників ядер), вони часто вносять зміни лише в модуль. Вони можуть застосувати свої зміни, відновити та встановити лише модулі. Це економить багато часу, коли це доводиться робити 20 разів на день. Він ніколи не буде оновлюватися, щоб мати єдину make everythingкоманду. Ви натомість запустіть make && make modules && make install && make modules_install так, як каже документація . Процес збирання надає перевагу розробникам ядра, а не вам. І саме так і має бути.

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

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


1
Дякую за людський доступ до опису цього процесу. У мене є кілька сумнівів. Моя компіляція ядра виробляла vmlinux, а не vmlinuz. Я думаю, що різниця - стиснення. Чи слід стискати зображення вручну? Чи /vmlinuzє каталог у кореневій папці? коли я буду встановлювати, буде створений цей каталог і там буде розміщено нове ядро? Чи make modules_installзамінять мої встановлені модулі? Припустимо, я розміщую свій vmlinux в / boot-каталозі, чи потрібно мені робити щось інше (наприклад, редагувати файли конфігурації grub і робити оновлення grub чи щось після цього?)
AnkurVj

3
Ви маєте рацію, різниця - стиснення. Команда make bzimage- що це робить. /vmlinuzце двійковий файл, а не каталог. Я робив лише упаковані ядра протягом останніх 5 років, тому не пам’ятаю точно поведінки modules_installбезпосередньо встановленого ядра. Grub знайде ваше ядро /bootбез допомоги. Так, завжди слід працювати grub-updateпісля встановлення нового ядра.
Багамат

тож я мав би зробити це make bzimageзамість make? Чи потрібно мені робити знову make cleanі make bzimageзнову? До /vmlinuzви маєте в виду файл буде створений в кореневому каталозі або в каталозі вихідного коду ядра Linux?
AnkurVj

1
Насправді не важливо, стиснене воно чи ні. Якщо не стискається, він просто займає трохи більше місця на диску. Все, що має префікс, /- це абсолютний шлях, так що так, це файл у корені.
bahamat

1
@GuyAvraham Модулі, на Yякі відповіли , збираються в (тобто вони є частиною vmlinuz). Відповіді на модулі Mскладаються як завантажувані модулі. Відповіді на модулі Nне складаються. make modules_installстосується лише тих, хто відповів M.
bahamat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.