Свое ядро в *ubuntu, или Зачем и как компилировать ядро в Linux
Когда мне говорят о жесточайших тормозах Линукса по сравнению с виндой, установленной на одной и той же машине, я задаю один единственный вопрос: «У вас ядро самосборное или то раздутое до невозможности, что поставляется в дистрибутиве по умолчанию?» Обычно ответ: «Естественно, то что в дистрибутиве!»
Кроме того, при этом воспринимается с огромным удивлением, что для улучшения работы системы не мешало бы пересобрать ядро под свой конкретный компьютер, дабы отключить в нем огромное количество того, что абсолютно не нужно для вашего железа, а лишь тормозит его работу… Сразу возникает резонный вопрос, зачем же разработчики дистрибутива включили в него настолько тормозное ядро, что обычный пользователь, установивший себе этот дистрибутив, должен сам перекомпилировать его?.. И вопрос вроде бы логичен, да не совсем…
Разработчики дистрибутивов обычно включают в него такое ядро, которое могло бы без проблем распознать максимально возможное железо, как на компьютере, который покупал еще ваш дедушка, дабы в свободное от просмотра новостей по телеку порезаться в «Call of duty», так и новейшую систему, купленную для выжимания максимума из возможностей компьютера. Естественно, при этом ядро получается раздутым донельзя, и при работе жутко тормозит, ибо системе приходится каждый раз «ковыряться» в большой куче записей и драйверов внутри ядра, что не может радовать ни вас, ни ваш компьютер… А компиляция собственного ядра позволяет отключить все ненужное, оставив только необходимую функциональность… Дело в том, что при работе операционной системы Linux, ядро — единственный участок памяти, который не свопуется, поэтому вполне логично сделать его как можно меньше. Надеюсь, я научно-популярно объяснил абсолютную необходимость пересобрания ядра?..
Обычно, впервые осознав важность компиляции ядра, начинающие пингвиноводы опускают руки, считая, что для этого необходимо много знаний и времени, и вообще это занятие для красноглазых администраторов, засыпающих лишь на пару часов с ноутбуком под мышкой, и уж точно не для человека, мало пока еще понимающего в Линуксе… Однако, спешу вас уверить, что все весьма просто и не стоит пугаться не самой сложной процедуры. Вам необходимо лишь узнать полную конфигурацию своего компьютера и выделить часок для внимательного конфигурирования ядра. Соберет же ядро программа установки, а вам лишь придется на полчаса предоставить машину в ее полное распоряжение. 🙂
Итак, как и обещал ранее, расскажу о процессе настройки и компиляции собственного ядра… Поехали!
Первое, что нам понадобится, - это собственно исходники нового ядра, под управлением которого скоро будет работать ваш Линукс. Скачать можно совершенно свободно на http://www.kernel.org. Качать необходимо последнее стабильное ядро (оно обычно первое в списке, там где написано «The latest stable version of the Linux kernel is…»). Советую брать архив tar.bz2, но всего лишь потому, что он меньше по размеру. Если вы уже собирали ядро, то вам можно будет просто докачать заплатки, то есть патчи, чтобы не качать довольно большое по объему ядро целиком… На самом деле, я рекомендую использовать полное ядро, ибо читал, что при заплаточном собирании ядра могут возникать различные проблемы, зачастую напрямую связанные с простой кривизной рук, однако, без соответствующих знаний лучше не рисковать…
Итак, ядро скачано… Задаем команду:
sudo chmod 777 /usr/src
После этого, забрасываем его (скачанный архив) в папку /usr/src. Распаковываем архив командой:
tar -jxvf xxxxx.tar.bz2
В этой команде xxxxx.tar.bz2 - это название файла архива с ядром… Как только закончится распаковка, ваши исходники будут находиться в каталоге /usr/src/xxxxx.
Прежде, чем приступить к настройке ядра, точно выяснить спецификации вашего компьютера:
1) тип процессора,
2) чипсет материнской платы,
3) тип видеокарты,
4) тип сетевой платы,
5) тип саунд-карты,
6) тип жестких дисков,
7) usb-устройства и прочее…
Далее, перед сборкой ядра необходимо установить сопроводительные пакеты: gcc, libc6-dev, kernel-package, libncurses5-dev, fakeroot и build-essential.
Когда все установлено и изучено, можно приступать собственно к конфигурированию ядра.
Заходим в директорию /boot, и видим там файл примерно такого названия config-2.6.24-19-generic. Он нам и нужен. Копируем его в каталог с исходниками /usr/src/xxxxx и переименовываем его в .config.
Также предварительно открываем файл Makefile, и в строчке "EXTRAVERSION=" дописываем свое название для ядра, например, EXTRAVERSION=-mykernel. Никакой другой функции эта строчка не несет, кроме, как удобства в опознании собственного ядра.
Далее запускаем конфигуратор ядра, для чего, находясь в папке /usr/src/xxxxx, даем команду:
make menuconfig
Эта команда запускает консольный интерфейс настройки. Ежели вам более по душе графический конфигуратор, то для его запуска нужно использовать команду:
make xconfig
Есть еще вариант консольной настройки:
make oldconfig
Этот вариант очень полезен только тогда, когда уже имеется сформированный файл настроек .config (можно использовать файл настроек от старого ядра). В этом варианте задаются только вопросы по возможностям, появившимся с той версии ядра, для которой сделан файл настроек.
Если вы хотите, чтобы ядро работало стабильно и максимально быстро, ответственно подойдите к вопросу настройки. Внимательно читайте каждый пункт. Если чего-то не понимаете, то ищите ответы в интернете. Например, здесь, можно найти описание многих настроек и советы по оптимальному их использованию. Кстати, там же в разделе "3.4 Пример настройки ядра" имеется и несколько советов по оптимизации ядра.
После настройки выбираем пункт "Сохранить конфигурацию в новый файл", где указываем имя файла, отличного от .config, например .config_mykernel. Затем переименовываем .config в .config_old. И у вас получается два файла - .config_old и .config_mykernel. Кстати, есть возможность посмотреть различия между стандартной и вашей конфигурацией так:
diff .config .config_mykernel
Теперь копируем вашу конфигурацию .config_mykernel как .config. Т.е. у вас получится три файла конфигурации. При компиляции будет использоваться файл .config. Файлы .config_ubuntu и .config_mykernel нам помогут в будущем для новой компиляции. Это на тот случай, если новое ядро окажется неработоспособным.
Далее приступим к компиляции. Перед этим, нужно очистить мусор командой:
make-kpkg clean
Компиляцию ядра стоит делать под суперпользователем. Для чего становимся рутом и запускаем процесс сборки ядра:
sudo -s -H
make-kpkg --initrd --revision=mykernel.1 kernel_image kernel_headers
в этой строчке mykernel.1 обозначает название ядра. Можно писать все что душе угодно.
Операция компиляции занимает довольно продолжительное время, зависящее от мощности компьютера, у меня оно обычно занимало около получаса…
По окончании процесса создадутся два deb-файла с ядром, сконфигурированным конкретно под ваши нужды. Поздравляю, ядро готово.
Теперь необходимо установить собранное ядро в систему:
sudo dpkg -i linux-image-xxxxx.deb
sudo dpkg -i linux-headers-xxxxx.deb
Замените на точные названия созданных вами deb-файлов. Далее перегружаемся и видим, в меню свое ядро. Если у вас все загрузилось как положено, я думаю, вы сразу ощутите прирост производительности. Однако, если у вас установлена, например, карточка от nVidia, скорее всего на этом все и закончится… У меня, например, после запуска моей версии ядра просто был черный экран и ноль эмоций…
Исправилось это установкой проприетарных драйверов от nVidia. Есть два варианта их установки: под новое ядро (при этом графический сервер будет работать только под вашим ядром (рекомендуется, если вы не планируете работать ни в каком ядре, кроме своего) и под несколько существующих у вас ядер (в таком случае система будет грузиться как в новом, созданном вами ядре, так и в предыдущем). Но это уже совсем другая история…
Спасибо, отличная статья — гораздо качественней всё описано, чем в большинстве аналогов!
Хотелось бы только продолжения — а конкретней, «другую историю» про nvidia — именно актуально!
Спасибо за статью! Но у меня есть вопрос. Пробовал конфигурировать существующее ядро. Ни одна команда не срабатывает : make xconfig и остальные. make: *** Нет правила для сборки цели `xconfig’. Останов. Вот такой ответ выпадает в терминале. Все пакеты описаные Вами установил. В чем у меня ошибка? Сильно не ругайте новичка. Буду благодарен за ответ.
make menuconfig — работает?
Нет. Ни одна команда не срабатывает. make oldconfig — тоже не работает. Вроде бы и пакеты все установлены.
Честно говоря, не знаю. как помочь, по одной простой причине — у меня никогда такого не было… Попробуй спросить у народа на Форуме — forum.ubuntu.ru , там ребята погениальнее, может, чем помогут
Огромное спасибо!!!!!!! У меня в 8.10 постоянно грелся компьютер из-за перераздутого ядра. Пробовал компилировать по другим инструкциям, та-же шняга. После компиляции по Вашей инструкции всё отлично заработало!!! Огромное Вам спасибо и БОООЛЬШОЙ поклон!!!!!!!
Ребята, бесконечное количество документации! Это я не взываю к лени, мол нахрен нам читать талмуды.. там всё относительно сжато и кратко.
(с) Читайте доки — они рулез
а по делу:
> Спасибо за статью! Но у меня есть вопрос. Пробовал конфигурировать существующее ядро. Ни одна команда не срабатывает : make xconfig и остальные. make: *** Нет правила для сборки цели `xconfig’. Останов. Вот такой ответ выпадает в терминале. Все пакеты описаные Вами установил. В чем у меня ошибка? Сильно не ругайте новичка. Буду благодарен за ответ.
не забудьте поставить исходники в /usr/src/linux, потом:
cd /usr/src/linux
make help
Да и ещё! Ядро собирается от рута, то есть если вы не сделали su, то для вас вышеуказанное будет так:
sudo cd /usr/src/linux
sudo make help
sudo make…. и т.д.
Спасибо, я таки смог сам собрать свое ядро благодаря вам)))) А про сборку Firefox 3.1b2 не напишите?))) просто толкового мануала на русском не нашел нигде=(
Всё проходит нормально но фаилов .deb в папке не появляется, что может быть?
А возможность выбора на этапе загрузки между старым и новым ядром будет?
Спасибо за статью, собирал по ней и по статье «ядерная физика для домохозяек 2.0»:)
С 10го раза правда собралось, сначала не монтировалась ФС, потом были жуткие тормоза при загрузке. Теперь как минимум загружается быстрее.
Статья то неплохая. Только после таких ручных сборок и установки/удаления пакетов постоянно вылетает ошибка: E: linux-image-2.6.27.18-4gb: подпроцесс post-installation script возвратил код ошибки 2. (включил в ядре поддержку 64 гбайта, чтобы видело все 4 установленные а не 3.2 как было при десктопном ядре по умолчанию). Вот как теперь подправить его чтобы выключить этот post-installation script?
Точно такие же грабли как и у оратора выше. Умоляю помогите
ErV, друг, мне помогло следующее:
sudo mv /etc/kernel/postinst.d/nvidia-common /tmp/
Это выяснил путем вчитывания в сообщения и общения на IRC-канале Ubuntu.
видимо там какие-то траблы с nvidia , но так как у меня видяха интел-интегрированная и ничего от nvidia нету,
то сунул этот скрипт в /tmp/ пусть лежит до лучших времен.
Спасибо большое, друг! Помогло!
Добрый день! Поскольку почти все драйверы по умолчанию вынесены в модули, которые в ядро загружаются только по требованию, то перекомпиляция имеет смысл только для того, чтобы подправить секции «Тип процессора», «Визуализация» и «Kernel Hacking». То есть нам не нужно настраивать ни диски, ни контроллеры, ни периферию…
>в этой строчке mykernel.1 обозначает название ядра.
>Можно писать все что душе угодно.
не все. конкретно: латиница, цифры, тильда, точка и плюс. и обязательно должна содержаться цифра.
>Компиляцию ядра стоит делать под суперпользователем.
>Для чего становимся рутом и запускаем процесс сборки ядра:
брехня. компиляцию ядра стоит делать через fakeroot. и не надо все подряд делать от рута. во всем процессе sudo понадобится только один раз:
sudo dkpg -i *.deb
>sudo chmod 777 /usr/src
плохой путь. раздача прав на все что ни попадя ни к чему хорошему не приведет.
ls -lAh /usr/ — какой владелец у src? правильно, root:src! вот и добавляем юзера в группу src, а остальным неча там делать.
да, в убунте особого прироста не дает. а вот как прет на дебиане — это нечто!
а где в линухе просмотреть все типы своих девайсов то?
lspci напишы
> Также предварительно открываем файл Makefile, и в строчке “EXTRAVERSION=” дописываем свое название для ядра, например, EXTRAVERSION=-mykernel. Никакой другой функции эта строчка не несет, кроме, как удобства в опознании собственного ядра.
У меня сборка началась только тогда, когда я указал «экстраверсию» всю в нижнем регистре. До тех пор, пока у меня там присутствовали заглавные буквы, компиляция не стартовала. Считаю, что это нужно также отметить в статье.
Статье конечно уже 2 года, но попробовал следуя ей собрать ядро. Ubuntu 10.04, скачал исходники Linux kernel 2.6.35
1. Читаем ридми в: Do NOT use the /usr/src/linux area!
Так и есть, если распаковать в этот каталог, ядро не компилируется.
2. Скопировал старый конфиг от 2.6.32-24, запустил xconfig, сохранил. Ничего не меняю. Компилирую. Устанавливаю два получившихся DEB пакета. Перезагрузка.
Kernel panic — VFS: unable to mount root fs on block device (0,0)
И так несколько раз, с различными конфигурациями ядра.
В ядре включены SCSI, ATA, все файловые системы. Создавал initrd файл, пробовал на свежей системе с ext3 и reiserfs — ничего не помогает.
В чем еще может быть проблема?
Железо — ноутбук Samsung NC20, sata винт.
Скорее всего, это совпадение, но после сборки собственного ядра, когда система захотела скачать новый кернел (а я ей не позволил), у меня напрочь умерли иксы.
Чинить их мне было лень, так что снес и переставил всю систему. Больше пока не рискую играться с ядрами 🙂
Хотелось бы на тесты производительности взглянуть до и после сборки ядра. Сдается мне прирост процента 3, не более! ((((