В чем преимущество компиляции вашего собственного ядра Linux?


101

Какую пользу я могу получить, собрав собственное ядро ​​Linux? Есть ли какая-то эффективность, которую вы могли бы создать, настроив ее на свое оборудование?


простой вопрос о том, в чем состоит выгода , становится расплывчатым или вырывается из контекста очень быстро Было бы гораздо лучше спросить « What are the pros and cons of compiling your own kernel? против» = не просто, во многих ситуациях нет добавленной стоимости. Плюсы = безопасность, производительность, если вы знаете, что делаете, например, устройства NAS, использующие Linux для работы некоторого аппаратного обеспечения и обеспечения сетевых и графических возможностей.
рон

Ответы:


73

На мой взгляд, единственное преимущество, которое вы действительно получаете от компиляции своего собственного ядра Linux:

Вы узнаете, как скомпилировать собственное ядро ​​Linux.

Это не то, что вам нужно делать для большей скорости / памяти / ххх, что угодно. Это ценно, если вы чувствуете, что находитесь на той стадии своего развития. Если вы хотите иметь более глубокое понимание того, что представляет собой весь этот «открытый исходный код», о том, как и каковы различные части ядра, то вам следует попробовать. Если вы просто хотите ускорить загрузку на 3 секунды, тогда ... в чем смысл ... иди купи ssd. Если вам любопытно, если вы хотите учиться, то компиляция собственного ядра - отличная идея, и вы, вероятно, многого добьетесь.

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

  • Мне нужно, чтобы система загружалась / работала на оборудовании с ограниченными ресурсами
  • Мне нужно протестировать патч и оставить отзыв для разработчиков
  • Мне нужно отключить то, что вызывает конфликт
  • Мне нужно разработать ядро ​​Linux
  • Мне нужно включить поддержку моего неподдерживаемого оборудования
  • Мне нужно улучшить производительность х, потому что я бью текущие ограничения системы (и я знаю, что я делаю)

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


25
Я бы сказал, что если вы хотите собрать собственное ядро ​​просто для обучения, то вы делаете это с помощью исходного дистрибутива Linux, такого как Gentoo или Linux From Scratch. Документация по установке Gentoo stage 2 - отличное руководство для понимания того, что означает сборка Linux из ядра.
Сэнди

Согласились ... эти два проекта созданы для такого типа вещей.
таращиться

Конечно, вы знаете, что на самом деле противоречите себе в своем ответе. Если бы единственным преимуществом компиляции ядра было узнать, как это сделать, то это было бы бесполезно - не имело бы значения. Но потом, несколькими словами, вы говорите, что это ценная вещь ...
rozcietrzewiacz

@rozcietrzewiacz Знание имеет огромное значение. Компиляция ядра поможет вам расширить свои знания. Если вы не купите это, то вот что - знание - это сила, и люди платят хорошие деньги, чтобы получить власть, и деньги держат ценность в современном мире, так что переходной собственностью ....: P
lunchmeat317

Согласен, стоит только за полученные знания.
1100110

35

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

Когда вы компилируете свое собственное ядро, у вас есть пара опций, вы можете скомпилировать официальное ядро ​​Линуса Торвальдса, это не будет включать какие-либо патчи или настройки, которые были добавлены вашим дистрибутивом (которые могут быть хорошими или плохими), или вы можете используйте инструмент перестройки дистрибутива для сборки собственного ядра.

Причины, по которым вы можете захотеть пересобрать ядро, включают в себя:

  • Исправление ошибок или добавление определенной функции в производственную систему, где вы не можете рисковать обновлением всего ядра для одного или двух исправлений.
  • Чтобы опробовать конкретный драйвер устройства или новую функцию
  • Чтобы расширить ядро, работайте над ним
  • тестирование некоторых модулей или функций "Альфа".

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


8
+1. Дети в наши дни, они даже не знают, что означает «make menuconfig», и им никогда не приходилось исправлять свой сетевой код ядра, чтобы предотвратить попадание в сценарий детишек. К счастью, те дни в основном прошли.
axel_c

2
Вы должны добавить bisectIN, чтобы найти, где была введена ошибка ...
xenoterracide

1
Удивительно, как за этот комментарий проголосовали, когда он не имеет ничего общего с вопросом ОП. "Большинство пользователей не ...." давай сейчас. Вопрос ОП очень ясен о желании узнать преимущества; не ваше мнение о том, что "большинство пользователей" делают здесь и там.
Эрик

30

Собственная компиляция ядра позволяет вам включать только те части, которые относятся к вашему компьютеру, что делает его меньше и потенциально быстрее, особенно во время загрузки. Общие ядра должны включать поддержку как можно большего количества оборудования; во время загрузки они обнаруживают, какое оборудование подключено к вашему компьютеру, и загружают соответствующие модули, но для этого требуется время, и им нужно загружать динамические модули, а не запекать код непосредственно в ядре. Нет смысла в том, чтобы ваше ядро ​​поддерживало 400 различных процессоров, когда на вашем компьютере есть только один, или для поддержки Bluetooth-мышей, если у вас их нет, это все потраченное впустую пространство, которое вы можете освободить.


15
Я согласен с большей частью вашего ответа, но мне было бы любопытно узнать некоторые неопровержимые факты о «значительно быстрее». Я бы не хотел создавать у нового пользователя впечатление, что его рабочий стол будет работать быстрее с ядром, созданным вручную (из моего опыта работы с Gentoo, это просто неправда). Можете ли вы количественно оценить выигрыш в скорости загрузки?
Сэнди

2
Этот ответ был верным 15 лет назад, но в наши дни он не очень актуален. В любом случае, большинство драйверов входят в модули, поэтому они занимают место только на диске, а не в памяти. (Или некоторые дистрибутивы по-прежнему поставляются без initrd? Без initrd ядру нужно включать все драйверы, которые могут понадобиться для загрузки.) Что касается времени загрузки, то несколько драйверов, которые тратят более миллисекунды на обнаружение несуществующего оборудования, могут быть отключены. с опцией загрузки ядра.
Жиль

1
@ Майкл, если это непроверенное предположение, я думаю, что замена «значительно быстрее» на «потенциально быстрее» в вашем ответе может быть хорошей идеей ... просто чтобы убедиться, что n00bs не введены в заблуждение. :-)
Сэнди

3
@Sandy Согласен, так как, похоже, я один из тех n00bs :). Исправлено
Майкл Мрозек

2
Я думаю, что «значительно» быстрее на самом деле оправдано предостережением, о котором мы говорим о времени загрузки. Ядро стандартного дистрибутива легко загружается на 5 - 10 секунд, чтобы загрузить то, которое я сократил, чтобы не искать аппаратное обеспечение, которое я не планирую использовать. Скорость выполнения, вероятно, незначительна, я не могу измерить это достоверно.
Калеб

24

Я не могу поверить, что принятый ответ здесь начинается со слов: «Это не то, что вам нужно делать для увеличения скорости / памяти / ххх».

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

Другой пример, BIG SMP под Slackware используется по умолчанию, а на Dell 2800, например, потребляется значительный отпечаток для запуска таких вещей, как GFSD (не как модуль ядра), который, кстати, также потребляет тики процессора для чего-то, что я не нужно Аналогично для NFSD и других универсальных средств, чтобы угодить всем менталитетам, что хорошо, если вы просто пытаетесь получить Linux на коробке и работает, но если вам не безразличны «скорость / память / xxx», тогда эти вещи имеют значение и работают ,

Все мои производственные ящики изготовлены на заказ. Если я использую обычное оборудование, такое как оборудование серии Dell (2800, 2850, 2900 и т. Д.), То просто скопировать файл .config ядра в каждую коробку, скомпилировать ядро ​​и установить.


3
Я думаю, что основной смысл принятого ответа заключается в том, что для большинства аппаратных средств производительность, полученная за счет компиляции собственного ядра, не стоит времени, необходимого для изучения того, как это сделать (и изучения значения опций). Это, вероятно, на опыте: было бы здорово найти некоторые цифры по этому вопросу.
Андрес Риофрио

хорошо, что это неискренне - не указывать это в первоначальном вопросе, а затем принять ответ, который основан на том основании, что вы утверждаете.
Эрик

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

14

Вот несколько ситуаций, когда компиляция вашего собственного ядра принесет вам пользу:

  • Ядро с отключенной загрузкой модулей более безопасно. Это потребует от вас выбора необходимых вам модулей и включения их в состав ядра, а не их компиляции в виде модулей.

  • Отключение поддержки / dev / kmem или отключение ее с помощью соответствующей опции компилятора - хорошая вещь для безопасности. Я думаю, что большинство дистрибутивов делают это по умолчанию сейчас.

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

  • Иногда более поздняя версия ядра будет иметь нужные вам функции, но сегодня это очень редко. Я помню, когда я впервые начал использовать Debian, он использовал ядра 2.4, но для поддержки udev мне было нужно ядро ​​2.6.

  • Отключение сетевых протоколов / опций, которые вам не нужны, может ускорить вашу производительность TCP / IP.

  • Отключение ненужных опций снижает объем памяти ядра, что важно в средах с нехваткой оперативной памяти. Когда вы используете 256 МБ ОЗУ в качестве маршрутизатора, это помогает.

  • Я нахожу все устройства "tty" в / dev раздражающими в системах, где я обычно вхожу только через последовательный или ssh.


Все верно. Однако удаление загрузки модуля может вызвать проблемы при загрузке: большинство, если не все, дистрибутивы сегодня просто предполагают, что модули должны быть загружены. В последний раз, когда я отключал модули, во время загрузки Red Hat появилось множество сообщений об ошибках.
Мэй

7

Компиляция вашего собственного ядра позволяет вам участвовать в процессе разработки ядра, будь то простые вещи, такие как предоставление идентификаторов устройств PCI / USB для существующего драйвера, которые могут заставить работать более новое устройство, чтобы глубоко погрузиться в борьбу с ядром разработка ядра.

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

Мне также нравится собирать собственные ядра, чтобы включить поддержку только того оборудования, которое у меня есть. Когда вы запускаете ядра дистрибутивов и просматриваете вывод lsmod(8), вы видите множество модулей, загруженных для оборудования, которого у вас нет. Это может загрязнить список модулей, / proc, / sys и ваши журналы, так что когда вы ищете что-то, оно может быть скрыто среди шума; Вы также не можете быть на 100% уверены, что эти модули не способствуют возникновению проблемы, которую вы пытаетесь диагностировать.


6

Я второй ответ gabe. (Мой комментарий слишком длинный, поэтому я публикую в качестве ответа).

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

Тем не менее, будьте осторожны - почему прыжки с кроличьей норы, несомненно, волнуют, они откашлят больше ночей и выходных, чем вы думали!


3

На работе мы используем свернутые вручную ядра, чтобы применять патчи вне дерева, такие как vserver и unionfs.

Дома я собираю откатанные вручную ядра, чтобы найти, какой коммит привел к ошибке, с которой я столкнулся. Когда я закончу это, я, вероятно, буду придерживаться свернутого вручную ядра, пока ошибка не будет исправлена ​​в моем дистрибутиве (Debian), после чего я снова вернусь к их ядрам.


2

Эта ветка устарела и все еще действует сегодня, как и тогда, когда был задан вопрос!

Ответ таков: вы компилируете ядро ​​linux по вашему выбору в соответствии с вашими потребностями и требованиями.

Многие сценарии действительны:

  1. Вы являетесь инженером и требуете, чтобы ваша сборка отвечала требованиям и требованиям к производительности и безопасности вашей системы, вы перекомпилируете, чтобы соответствовать и / или превзойти указанные критерии.

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

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

  4. Вы просто хотите быть похожим на обычного пользователя Microsoft и / или Mac, не перекомпилируйте и просто следите за обновлениями из вашего апстрима.

  5. Следите за сценариями :-)

В отличие от пользователей Mac / Windows, Linux предоставляет выбор. Выбор прост или оптимизация системы под ваши требования.


1

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

Резонанс для компиляции вашего собственного ядра:

  • Вы используете дистрибутив на основе исходного кода, поэтому не существует «общего» ядра
  • Вы разработчик ядра и вы разрабатываете ядро
  • Вы должны настроить ядро, например, для встроенного устройства с очень ограниченным жестким диском
  • Некоторые драйвера не скомпилированы в (очень редкий случай)
  • Вы хотите патчить ядро И знаете, что делаете
  • Вы хотите узнать, как скомпилировать ядро

Если бы я не использовал дистрибутив на основе исходного кода, я бы вообще не компилировал ядро.


1

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


1

Я удивлен, что никто не упомянул эту причину для сборки собственного ядра:

потому что вы хотите использовать другой компилятор C / c ++. GCC довольно хорош для компиляции ядра Linux. Но есть и превосходные компиляторы! Оптимизация GCC немного отстает от компилятора Intel C / C ++. Кроме того, Intel поставляет библиотеки примитивов производительности и инструмент vtune, которые необходимы для создания высокопроизводительного ядра Linux. Вы можете достичь этого только с GCC и G ++. Практически независимо от того, что вы делаете, результат будет ограничен компилятором. Итак, я использую компилятор Intel и библиотеки производительности. Он немного большой - загрузка 1,5 ГБ, но это дает представление о том, что содержится в хорошем компиляторе.

Компилятор Intel C / C ++ предоставляется бесплатно для некоммерческого использования. Но проще найти на странице загрузки компилятора Intel c ++ некоммерческую лицензию для поиска на сайте Intel. Я обычно не использую GCC / G ++ для чего-либо. И вам не нужно быть программистом. Вы просто устанавливаете свою среду и меняете две строки в файле make, чтобы они указывали на компилятор Intel.

Тогда вы можете получить серьезную скорость!


-1

Если вы хотите установить Linux на очень специфическое оборудование, скажем, более экзотическое, чем DS , вам придется кросс-компилировать собственное ядро.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.