Конфигурирование, компиляция и установка собственного ядра Linux

38

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

С чего мне начать?

лютик золотистый
источник

Ответы:

51

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

В следующих инструкциях пути внутри дерева исходных текстов принимают форму [src]/whatever, в которой [src]находится каталог, в который вы установили исходный код, например /usr/src/linux-3.13.3. Возможно, вы захотите сделать это, так su rootкак дерево исходных текстов должно оставаться безопасным с точки зрения разрешений на запись (оно должно принадлежать пользователю root).

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

  1. Скачайте и распакуйте исходный архив.

    Они доступны на kernel.org . Самые последние из них перечислены на первой странице, но если вы заглянете внутрь /pub/каталога, вы обнаружите, что архив полностью восходит к версии 1.0. Если у вас нет особых причин поступать иначе, вам лучше всего выбрать «Последнюю конюшню». На момент написания этой статьи это был tar.xzфайл размером 74 МБ .

    Как только тарбол будет загружен, вам нужно его распаковать куда-нибудь. Нормальное место в /usr/src. Поместите файл туда и:

    tar -xJf linux-X.X.X.tar.xz
    

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

    За 15 с лишним лет создания собственных ядер (в основном на Fedora / Debian / Ubuntu) у меня никогда не было проблем с использованием исходного кода vanilla 1 . Однако в действительности это не имеет большого значения, за исключением того факта, что если вам нужно абсолютно новое ядро, ваш дистрибутив, вероятно, еще не упаковал его. Таким образом, самый безопасный путь - использовать дистрибутив, который следует установить в /usr/src. Я предпочитаю последнюю конюшню, чтобы я мог выступать в роли морской свинки до того, как она попадет в дистрибутивы :)

  2. Начните с базовой конфигурации [опционально].

    Вам не нужно этого делать - вы можете просто погрузиться и создать конфигурацию с нуля. Однако, если вы никогда не делали этого раньше, ожидайте много проб и ошибок. Это также означает необходимость прочитать большинство опций (их сотни). Лучше всего использовать имеющуюся конфигурацию, если она доступна. Если вы использовали дистрибутив с исходным кодом, возможно, он уже содержит [src]/.configфайл, так что вы можете его использовать. В противном случае проверьте /proc/config.gz. Это дополнительная функция, добавленная в ядро ​​2.6. Если он существует, скопируйте его в верхний уровень дерева исходных текстов и gunzip -c config.gz > .config.

Если он не существует, возможно, потому что эта опция была настроена как модуль. Попробуйте sudo modprobe configs, затем проверьте /procкаталог еще config.gzраз.

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

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

  1. Создайте .configразговор.

    [src]/.configтекстовый файл, используемый для настройки ядра Не редактируйте этот файл напрямую . Изменение параметров часто не является простым делом замены a Yи Nт. Д .; обычно существует множество взаимозависимостей и возможностей ветвления. Вместо этого вы хотите использовать одну из целей config из make-файла ядра (то есть ввести make _____в командной строке из исходного каталога верхнего уровня):

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

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

    • make menuconfigмой (и я думаю, что большинство других) предпочтительный метод. Он создает и выполняет интерфейс TUI (цветные меню, которые будут работать на терминале). Это требует, чтобы у вас был установлен -devпакет для ncurses. Это довольно очевидно, за исключением поиска, который доступен через /; «Справка» F1 дает объяснение текущей опции. Существует альтернативная версия make nconfigс несколькими дополнительными функциями, в которой F2 "syminfo" является эквивалентом F1 menuconfig.

    • make xconfigполный графический интерфейс Это требует, qmakeи -devпакет для Qt должен быть установлен, как опять же, это программа, которая компилируется и собирается. Если вы не использовали их ранее, это может быть существенной загрузкой. Причина, по которой я предпочитаю menuconfigверсию с графическим интерфейсом, заключается в том, что иерархии опций представлены с использованием последовательных экранов в первом, но с открытым аккордеоном во втором.

    Первое, что вы должны (но не обязаны) сделать, это добавить строку «Локальная версия» (в разделе « Общие настройки» ). Причина этого указана в # 5 ниже.

    «Лабиринт» - хороший способ описать иерархию опций, и подробное описание этого выходит за рамки вопросов и ответов, подобных этому. Если вы хотите сесть и пройти через все, выделите часы . Грег Кроа-Хартман (ведущий разработчик ядра Linux) имеет бесплатную онлайн-книгу о ядре (см. Ссылки ниже), которая содержит главу о конфигурации , хотя она была написана в 2006 году. Мой совет - начать с разумной основы от вашего текущего ядра дистрибутива (согласно # 2), а затем пройдите его и снимите все то, что, как вы знаете, вам не нужно. Вы также, вероятно, захотите изменить некоторые из опций «модуля» на «встроенные», что подводит нас к следующему пункту ...

  2. О initramfs[опционально]

    «Initramfs» - это сжатая файловая система, встроенная в ядро ​​и / или загруженная во время загрузки. Его основная цель состоит в том, чтобы включить модули, которые понадобятся ядру, прежде чем оно сможет получить доступ к модулям /lib/modulesв корневой файловой системе - например, драйверы для устройства, содержащего эту файловую систему. Дистрибутивы всегда используют их частично, потому что драйверы несовместимы друг с другом и поэтому не могут быть встроены в ядро. Вместо этого, те, которые соответствуют текущей системе, выбираются изнутри initramfs.

    Это хорошо работает и не представляет никаких недостатков, но, вероятно, является ненужным осложнением при сборке собственного ядра. 2 Проблема в том, что если вы не используете initramfs, вам необходимо убедиться, что драйверы для вашей корневой файловой системы (и устройства, на котором она включена ) встроены в ядро. В menuconfigэтом разница между Mопцией (= module) и опцией *(= встроенной). Если вы не поймете это правильно, система рано или поздно выйдет из строя в процессе загрузки. Так, например, если у вас есть жесткий диск SATA и корневая файловая система ext4, вам нужны драйверы для этих встроенных. [Если кто-то может придумать что-нибудь еще, что необходимо, оставьте комментарий, и я включу это здесь].

    Если вы хотите использовать initramfs, вам придется выбрать соответствующие параметры в общей настройке . Там есть скелет руководство по созданию один встроенный в ядро в [src]/Documentation/filesystems/ramfs-rootfs-initramfs.txt, но учтите , что дистрибутивы не делать этого; они используют внешний сжатый файл cpio. Тем не менее, этот документ содержит обсуждение того, что должно идти в initramfs(см. «Содержимое initramfs»).

  3. Сборка и установка ядра.

    Следующий шаг прост. Чтобы сделать ядро, просто запустите makeв [src]каталоге. Если вы работаете в многоядерной системе, вы можете добавить, -j Nчтобы ускорить процесс, где Nуказано количество ядер, которые вы хотите выделить + 1. Нет testили check. Как только это будет сделано, вы можете make modules. На быстром боксе все это должно занять <10 минут.

    Если все пойдет хорошо make INSTALL_MOD_STRIP=1 modules_install. Это создаст каталог в /lib/modulesсоответствии с номером версии ядра плюс строка «Локальная версия», упомянутая на шаге 3, если таковая имеется. Если вы не использовали строку «Локальная версия», будьте осторожны, если у вас уже есть ядро ​​той же версии, от которой вы зависите , потому что эти модули заменят их. 3 не INSTALL_MOD_STRIP=1 является обязательным, значение см. Здесь .

    Затем вы можете make installустановить ядро ​​в папку по умолчанию. Однако я рекомендую сделать это самостоятельно, чтобы не допустить перезаписи существующих файлов. Посмотрите в [src]/arch/[ARCH]/bootфайл с именем bzImage4 , где [ARCH]находится , x86если вы находитесь на x86 или x86-64 машины (и что - то другое , если вы на что - то другое). Скопируйте это /bootи переименуйте в нечто более конкретное и информативное (не важно, что). Сделайте то же самое с [src]/System.map, но переименуйте его по следующей схеме:

    System.map-[VERSION]
    

    Здесь, [VERSION]это точно так же , как имя каталога в /lib/modulesсозданномmake modules_install , который будет включать в себя «Локальная версия» строку, например, System.map-3.13.3-mykernel.

  4. Настройте загрузчик GRUB 2.

    Если вы не используете grub(большинство пользователей Linux), это, очевидно, не относится к вам. Вы должны иметь /etc/grub.d/40_customфайл с небольшим количеством в нем. Если нет, создайте его, принадлежащий root и chmod 755(он должен быть исполняемым). К этому добавьте:

    menuentry 'My new kernel, or whatever' {
        set root='hd0,1'
        linux /boot/[name-of-kernel] root=/dev/sda1 [other kernel options]
    }
    

    Если вы используете initramfs, у вас также должна быть последняя строка initrd /path/to/initramfs. Остерегайтесь set root=линии. В примере предполагается, что grub был установлен на первый раздел первого жесткого диска (hd0,1). Если у вас есть несколько дисков, вы можете использовать вместо этого UUID раздела и заменить эту строку на:

        search --no-floppy --fs-uuid --set=root [the UUID of the partition]
    

    Если grub не находится в вашей корневой файловой системе, это также должно соответствовать root=директиве в linuxстроке, которая указывает вашу корневую файловую систему (ту, что с /sbin/initи /lib/modules). Версия UUID этого есть root=UUID=[the UUID].

    Вы можете посмотреть на свой существующий /boot/grub2/grub.cfgдля подсказки об имени устройства. Вот краткое руководство по этому в grub 2. Когда вы будете счастливы, бегите grub2-mkconfig -o /boot/grub2/grub.cfg(но grub.cfgсначала сделайте резервную копию вашего текущего ). Затем вы можете отредактировать этот файл и переместить вашу запись в начало. Он должен еще содержать список для вашего старого (бег) ядер, а ваш дистрибутив может иметь механизм , который дублируется записью для нового ядра автоматически (так как он был найден в /boot, Fedora делает это, следовательно, используя особый титул menuentryявляется отличная идея). Вы можете удалить это позже, если все пойдет хорошо.

    Вы также можете просто вставить menuentryв grub.cfgнепосредственно, но некоторые дистрибутивы перепишет это , когда их ядро обновляется (тогда как использование /etc/grub.d/будет держать его включено).

    Вот и все. Все, что вам нужно сделать сейчас, это перезагрузить компьютер. Если это не работает, попробуйте вывести проблему из вывода на экран, перезагрузите компьютер, выбрав старое ядро, и вернитесь к шагу 3 (за исключением того, что .configвы уже использовали и подправили его). Это может быть хорошей идеей make clean(или make mrproper) между попытками, но [src]/.configсначала убедитесь, что вы копируете в какую-либо резервную копию, потому что это будет стерто. Это помогает гарантировать, что объекты, используемые в процессе сборки, не устарели.

  5. Относительно заголовков ядра et. и др.

    Одна вещь , которую вы должны сделать , это , вероятно , символическая ( ln -s -i) /lib/modules/X.X.X/sourceи /lib/modules/X.X.X/buildк /usr/srcдиректории , где дерево является источником (держать это). Это необходимо для того, чтобы некоторые инструменты пользовательского пространства (и сторонние установщики драйверов) могли получить доступ к источнику для работающего ядра.

    С этим связана проблема с .hфайлами в /usr/includeи т. Д. Они изменяются очень постепенно и имеют обратную совместимость . У вас есть два варианта:

    • Оставьте те, которые используются вашим дистрибутивом. Если вы регулярно обновляете всю систему, дистрибутив все равно будет периодически устанавливать новые, так что это опция «наименьших хлопот».

    • Использование make headers_install.

    Поскольку они обратно совместимы (имеется в виду «программа, созданная на основе библиотеки C с использованием более старых заголовков ядра, должна выполняться на более новом ядре»), вам не нужно слишком суетиться по этому поводу. Единственная потенциальная проблема - если вы соберете собственное ядро ​​и сохраните его некоторое время, в течение которого дистрибутив обновляет пакет «kernel-headers» до более новой версии, чем тот, что использовался для сборки вашего ядра, и оказывается, что некоторые несовместимость (которая будет применяться только к программному обеспечению, впоследствии скомпилированному из исходного кода).

Ссылки

Вот некоторые ресурсы:

  • [src]/README включает краткое руководство по сборке и установке.

  • [src]/DocumentationКаталог содержит много информации , которая может оказаться полезной в конфигурации.

  • Большая часть книги Грега К.Х. « Ядро Linux в двух словах» (доступно там бесплатно в виде серии PDF) вращается вокруг построения ядра.

  • Grub 2 имеет онлайн-руководство .


1. «Ваниль» относится к оригинальному, незапятнанному официальному источнику, найденному на kernel.org. Большинство дистрибутивов берут этот ванильный источник и добавляют небольшие настройки.

2. Обратите внимание, что существуют обстоятельства, которые требуют initramfs, потому что для монтирования корневой файловой системы требуется некоторое пространство пользователя, например, если оно зашифровано или распределено по сложному массиву RAID.

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

4. Этот файл может называться как-то иначе, если вы использовали нестандартную опцию сжатия. Я не уверен, что все возможности.

лютик золотистый
источник
3
Upvoted. Вы можете добавить упоминание о localmodconfigтаких инструментах, как streamline_config.plскрипт; полезный подход к работе с вашей существующей установки ...
jasonwryan
1
Это, вероятно, достаточно подробно, чтобы быть вопросом канонического типа по инициативе @ terdon. Подумайте над ответом на его вопрос о мета. Или я мог бы, если вы предпочитаете. Похоже, что это могло быть намерением, поскольку вы все равно задали вопрос. Думаю, было бы полезно включить специфичные для дистрибутива методы для создания бинарных пакетов.
Фахим Митха
1
К вашему сведению: initramfsпредполагается использовать почти всегда. Например, для установки rootfs на LVM + RAID часто это требуется. Зашифрованный рут определенно делает. Даже разумно сложные установки RAID делают. В ядре автоматическая сборка даже тривиальных массивов фактически устарела ...
derobert
2
@derobert: Возникает вопрос, что «почти всегда» Linux используется для запуска корпоративного сервера. Я initramfsхочу сказать, что если вам не нужно использовать один, вам не нужно, и это упрощает процесс. Во всяком случае, я добавил сноску о зашифрованных корневых
файлов
Пожалуйста, включите информацию о EFI и функциональности efi-заглушки linux.
IW16