(Howto) Сборка ядра в Debian.

Автор Brainey, 02 июня 2011, 14:26:58

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

Brainey

Подготовка
Ставим пакеты, необходимые для компиляции ядра:
# aptitude install kernel-package libncurses5-dev fakeroot build-essential pkg-config

Переходим в каталог, в котором собираемся производить сборку. (В этом примере в качестве данного каталога будет рассматриваться /usr/src). Скачиваем и распаковываем исходники ядра:
# cd /usr/src && wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-версия-ядра.tar.bz2 && tar xjf linux-версия.tar.bz2

Переходим в папку с исходниками:
# cd /usr/src/linux-версия



Наложение патчей
Если вы собираетесь накладывать патчи на ядро, ставим необходимую для наложения патчей программу:
# aptitude install patch

Сами же патчи накладываются следующими командами:
patch -p1 -i patch-версия

Если патч запакован в архив, то команда будет выглядеть так:
bzip2 -dc /usr/src/patch-версия | patch -p1

В этом случае использовался патч, запакованный в архив .tar.bz2, если же ваш случай отличается от моего, то в этой команде всего лишь нужно заменить имя архиватора bzip2 на нужное, например, на gzip в случае с tar.gz архивом.
Кстати говоря, перед наложением патчей, лучше проверить, насколько хорошо они накладываются на ядро. Для этого к вышеприведенным командам добавляется флаг --dry-run, который имитирует применение патча:
patch -p1 -i patch-версия --dry-run
bzip2 -dc /usr/src/patch-версия | patch -p1 --dry-run

Если при выполнении этих команд в выводе не появились строчки, содержащие что-то вроде комбинации слов "Hunk failed", то скорее всего, всё хорошо.



Конфигурирование
Конфигурация ядра читается из файла .config. Для создания оного можно воспользоваться старым файлом конфигурации ядра, который лежит в /boot:
# cp /boot/config-$( uname -r ) .config

Либо создать новый.
Для конфигурирования ядра можно использовать одну из нижеперечисленных команд:
make nconfig
Эта команда поддерживается, начиная с ядра версии 2.6.35, не требует установки дополнительных пакетов.
make menuconfig
Старый аналог make nconfig

make xconfig
Эта программа конигурации имеет графический интерфейс, использующий qt. Если собирается ядро младше версии 2.6.38, то ставим следующие пакеты:
# aptitude install qt3-dev-tools
Если 2.6.38 или старше, то:
# aptitude install libqt4-dev

make gconfig
Тоже имеет графический интерфейс, но в отличие от xconfig, использует gtk, а не qt.
Для работы с ней ставим следующие пакеты:
# aptitude install libgtk2.0-dev libglib2.0-dev libglade2-dev

make oldconfig
При использовании этой команды, файл конфигурации создаётся автоматически, основываясь на текущей конфигурации ядра.

make defconfig
При использовании defconfig файл конфигурации создается, основываясь на значения по умолчанию.

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

make localyesconfig
Скрипт для отказа от initrd. Все необходимые модули включаются в ядро.



Компиляция ядра и сборка в пакеты
Компиляция и сборка ядра в пакеты производится следующей командой:
# make-kpkg --initrd --revision=mybuild.1.0 kernel_image kernel_headers

Также можно задать количество потоков для компиляции. В этом случае команда будет выглядеть так:
# CONCURRENCY_LEVEL=N make-kpkg --initrd --revision=mybuild.1.0 kernel_image kernel_headers
где N = количество потоков.

Установка
После компиляции ядра в каталоге создаются два deb-пакета, которые ставятся командами
dpkg -i linux-image-версия.deb
dpkg -i linux-headers-версия.deb

После чего grub автоматически прописывает их в своем конфигурационном файле.
Теперь можно загрузиться с новым ядром. Если при конфигурировании вы не допустили никаких критических ошибок, всё должно быть хорошо.  :)
Конференция форума в jabber: debianforum@conference.jabber.ru | Клуб кедоводов: kde@conference.jabber.ru

Metrix

Вот и у нас на форуме теперь есть хаутушка про то, как собирать ядро)))
Юзербар в отпуске

paulcarroty

В Debian Wiki вроде давно есть.

Angel_ok

Цитата: Brainey от 02 июня 2011, 14:26:58В этом примере в качестве данного каталога будет рассматриваться /usr/src
В README не рекомендуют использовать эту директорию
ЦитироватьDo NOT use the /usr/src/linux area! This area has a (usually
   incomplete) set of kernel headers that are used by the library header
   files.  They should match the library, and not get messed up by
   whatever the kernel-du-jour happens to be.

Цитата: Brainey от 02 июня 2011, 14:26:58Компиляция и сборка ядра в пакеты производится следующей командой:
# make-kpkg --initrd --revision=mybuild.1.0 kernel_image kernel_headers
Часто встречается рекомендация использовать данную команду не из под руда а с помощью fakeroot
fakeroot make-kpkg --initrd kernel_image kernel_headers

Также необходимо добавить к инструкции пункт
Если что-то пошло не так - необходимо выполнить
make mrproper
Предварительно забэкапив .config
Вы думаете, всё так просто? Да, всё просто. Но совсем не так...
                                                                                                          Альберт Эйнштейн

sx88

Прошу прощения если пишу не в ту тему. При компиляции ядра 3.5.4 возник вопрос по поводу опции
Enable cleancache driver to cache clean pages if tmem is present
Что это такое и для чего служит? Кто ее включал?
И еще, если у меня процессор Intel нужна ли мне опция AMD MCE features ?

Olej

Цитата: sx88 от 26 декабря 2012, 19:47:16
Прошу прощения если пишу не в ту тему. При компиляции ядра 3.5.4 возник вопрос по поводу опции
Enable cleancache driver to cache clean pages if tmem is present
Что это такое и для чего служит? Кто ее включал?
И еще, если у меня процессор Intel нужна ли мне опция AMD MCE features ?

Меня всегда удивляло: зачем вы лезете конфигурировать ядро, если не понимаете что там и зачем?
Там 2 или 3 сотни конфигурационных параметров ... вы все их будуте разгребать и менять?
Вам КАЖЕТСЯ, что вы соберёте ядро лучше? - Да ни в жисть!

Единственный разумный путь конфигурирования ядра:
- хорошо понимать тот ЕДИНСТВЕННЫЙ (или минимум) параметр, который не устраивает в стандартной конфигурации;
- использовать oldconfig ...
- а после этого поменять тот единственный параметр.

sx88

Цитата: Olej от 26 декабря 2012, 20:42:34Меня всегда удивляло: зачем вы лезете конфигурировать ядро, если не понимаете что там и зачем?
Что-то понимаем, что-то нет, ищем в гугле, читаем форумы русскоязычные и иностранные.
ЦитироватьВам КАЖЕТСЯ, что вы соберёте ядро лучше? - Да ни в жисть!
Эх...  :-[  Но попробовать хотя бы стоит?  :D
Кстати, спасибо за совет за разумный путь конфигурации ядра. Если не получится "терпением и трудом" то прибегнем к вашему совету.

Olej

#7
Цитата: sx88 от 26 декабря 2012, 21:29:59
Эх...  :-[  Но попробовать хотя бы стоит?  :D

Конечно стоит!
Но стоит: понять какой ограничивающий параметр нам мешает + его устранить.

P.S. посмотрите ещё вот сюда: Драйверы и модули ядра Linux  - там есть и об этом.

sx88

#8
Вот что нашел по опции  Enable cleancache driver to cache clean pages if tmem is present
Открыть содержимое (спойлер)
Реализация нового типа кэша Cleancache, который может использоваться ядром для хранения восстановимых из других источников данных, которые не страшно потерять, но при наличии ресурсов неплохо держать в памяти. Например, в Cleancache могут храниться ассоциированные с файлами на диске страницы памяти, которые в случае очистки кэша впоследствии могут быть перечитаны с диска. Поддержка CleanCache уже добавлена в Ext3, Ext4, Btrfs, OCFS2 и Xen. Cleancache является первой практической реализацией появившейся в ядре 2.6.39 техники трансцендентного управления памятью ("Transcendent memory"), позволяющей улучшить поведение системы при работе с не представляющими важность данными (например кэш) в условиях дефицита оперативной памяти. По сути Transcendent memory напоминает RAM-диск, имеющий ряд особенностей: размер RAM-диска не известен, запись данных не всегда может быть гарантирована и уже записанные данные могут быть очищены (удалены);
[свернуть]
Насколько я понял, если довольно много ОЗУ, то можно опцию и не включать. Интересно, от нее есть реальный прирост в производительности?  ???

Сообщение объединено: 27 декабря 2012, 21:36:41

Цитата: Olej от 26 декабря 2012, 23:39:14P.S. посмотрите ещё вот сюда: Драйверы и модули ядра Linux  - там есть и об этом.
Немного не понял, что там есть? Лекция для программистов с глубоким пониманием того, как ядро работает с модулями, памятью и т.п. Т.е., чтобы грамотно собрать ядро нужно перелопатить весь материал?

sx88

#9
Как говориться :"Стучите и вам откроют, ищите и найдете" "... по неотступности".
Кто-нибудь в курсе какое значение ставить в опции MTRR cleanup spare reg num ?
Сама функция MMTR cleanup очищает мусор из регистров. Только непонятно какое значение выставлять. Наткнулся на форму обсуждение данного вопроса. 
Вывод регистров, с которыми работает MTRR cleanup
cat /proc/mtrr
reg00: base=0x000000000 (    0MB), size= 4096MB, count=1: write-back
reg01: base=0x100000000 ( 4096MB), size= 1024MB, count=1: write-back
reg02: base=0x0bb800000 ( 3000MB), size=    8MB, count=1: uncachable
reg03: base=0x0bc000000 ( 3008MB), size=   64MB, count=1: uncachable
reg04: base=0x0c0000000 ( 3072MB), size= 1024MB, count=1: uncachable
reg05: base=0x13fe00000 ( 5118MB), size=    2MB, count=1: uncachable

В dmesg "MTRR variable ranges enabled:" отображается полный список регистров.
Открыть содержимое (спойлер)
[    0.000000] MTRR variable ranges enabled:
[    0.000000]   0 base 000000000 mask F00000000 write-back
[    0.000000]   1 base 100000000 mask FC0000000 write-back
[    0.000000]   2 base 0BB800000 mask FFF800000 uncachable
[    0.000000]   3 base 0BC000000 mask FFC000000 uncachable
[    0.000000]   4 base 0C0000000 mask FC0000000 uncachable
[    0.000000]   5 base 13FE00000 mask FFFE00000 uncachable
[    0.000000]   6 disabled
[    0.000000]   7 disabled
[    0.000000]   8 disabled
[    0.000000]   9 disabled
[свернуть]
Так вот, на форуме человек говорит, что значение MTRR cleanup spare reg num нужно выставлять таким, какое количество незадействованных (disable) регистров. 
Открыть содержимое (спойлер)
After some research, try-and-fail, the issue is solved. For anyone interested, here's what I've come to:

On the beginning of the kernel init, I have the fallowing output:

Code:
[    0.000000] MTRR variable ranges enabled:
[    0.000000]   0 base 000000000 mask F80000000 write-back
[    0.000000]   1 base 07F800000 mask FFF800000 uncachable
[    0.000000]   2 base 07F700000 mask FFFF00000 uncachable
[    0.000000]   3 disabled
[    0.000000]   4 disabled
[    0.000000]   5 disabled
[    0.000000]   6 disabled
[    0.000000]   7 disabled
[    0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600070106
[    0.000000] original variable MTRRs
[    0.000000] reg 0, base: 0GB, range: 2GB, type WB
[    0.000000] reg 1, base: 2040MB, range: 8MB, type UC
[    0.000000] reg 2, base: 2039MB, range: 1MB, type UC
[    0.000000] total RAM covered: 2039M
[    0.000000] Found optimal setting for mtrr clean up
[    0.000000]  gran_size: 64K  chunk_size: 16M         num_reg: 3      lose cover RAM: 0G
[    0.000000] New variable MTRRs
[    0.000000] reg 0, base: 0GB, range: 2GB, type WB
[    0.000000] reg 1, base: 2039MB, range: 1MB, type UC
[    0.000000] reg 2, base: 2040MB, range: 8MB, type UC
showing how the MTRR memory is configured. You can see that from the 8 registers, 3 are taken and 5 are free. The "mtrr_spare_reg_num" is about those 5 free registers, where MTRR cleanup can make use of. My graphics card (GMA965) has 8MB of dedicated memory and 256MB of shared memory. So, MTRR cleanup will take use of one of those registers using it as a write-combining.

My kernel command-line is configured as "mtrr_spare_reg_num=5", saying that 5 of the 8 registers are free for MTRR cleanup to use. When set to a value > 5, MTRR complains about cannot find a optimal setting, leading to a bunch of errors - of course, since it's saying that > 5 registers are free, when actually they are taken.

The MTRR cleanup, in my case, only use one register (reg 3) for the MTRR cleanup, keeping the other 4 registers free, and thus giving the /proc/mtrr output showed on the first post.

So, this is it. Thank you, business_kid, for helping me out.
[свернуть]
С точки зрения здравой логики, раз MTRR cleanup очищает мусор, значит она должна очищать мусор из заполненных регистров, а не из тех, которые недоступны/запрещены. Значит нужно ставить значение 6 (задействованные), а не 4 (disable регистры)

У кого какие соображения по этому поводу?
Источник из генту вики
Открыть содержимое (спойлер)
cat /proc/mtrr
reg00: base=0x000000000 (    0MB), size= 2048MB, count=1: write-back
reg01: base=0x080000000 ( 2048MB), size= 1024MB, count=1: write-back
Note that the reg01 is actually a normal memory layout due to 3G/1G memory split option i have set my kernel up as, There is not section at point reg01 for my write-combined graphics card in fact that is missing all together. This is because the ATI fglrx driver has claimed it. If you use Frame-buffer either kernel or X.org then the setting will appear as reg03,4,5 etc and will be moved(remapped) from the reg01 slot IO hope that clears up the reason and how this setting in the kernel works. If when MTRR_cleanup is disabled you notice the base address of your graphics card is at a different regXX number then change the spare reg number to this accordingly so you can allow for the write-combined or as in my case proprietary driver to take control of it.
[свернуть]

Olej

Цитата: sx88 от 26 декабря 2012, 23:57:44
Цитата: Olej от 26 декабря 2012, 23:39:14P.S. посмотрите ещё вот сюда: Драйверы и модули ядра Linux  - там есть и об этом.
Немного не понял, что там есть? Лекция для программистов с глубоким пониманием того, как ядро работает с модулями, памятью и т.п. Т.е., чтобы грамотно собрать ядро нужно перелопатить весь материал?

нет, там есть приложение в конце, которое описывает только сборку ядра ...
а кроме того, там есть замечание о том, как ускорить сборку ядра раз в 10-20 (используя tmpfs), что очень способствует для экспериментов ... как вам: вместо 1.5 часа - 5 минут? :)

sx88

Цитата: Olej от 29 декабря 2012, 04:09:40что очень способствует для экспериментов ... как вам: вместо 1.5 часа - 5 минут?
По-моему, здорово :)
Может, стоит завести отдельную тему по опциям ядра, описаню, их включению/выключению для стационарников/нетбуков/ноутбуков? Каждый будет по мере сил записывать свои наблюдения, эмпирический опыт.

SeHELLioN

Цитата: sx88 от 05 января 2013, 01:17:48Может, стоит завести отдельную тему по опциям ядра, описаню, их включению/выключению для стационарников/нетбуков/ноутбуков? Каждый будет по мере сил записывать свои наблюдения, эмпирический опыт.
если есть желающие следить за ней и регулярно дополнять шапку, собирая такое большое и доступное howto, то против никто не будет
Asus m5a97+Amd fx-8350+4x4GB DDR3 1600MGz+asus gtx670 DCII (перешита в top)
Debian stable

noname

#13
хотелось бы добавить по ошибке при сборке ядра 3.xx:
make: *** Documentation/lguest: No such file or directory.
Вот что google говорит:
-при переходе ядер с версии 2.х.х на 3.х.х поменялось расположение каталога с документацией по lguest.
Находясь в каталоге с исходниками ядра:
#cd ./Documentation
#ln -s virtual/lguest
#cd  /usr/src/linux-3.xx 
т.е создаем символьную ссылку в  /Documentation  на тот самый  потерявшийся  lquest.
Без этого ну никак не хотело собираться 3.2
Если что поправьте :-[
Вот еще полезная ссылка
http://hardware4linux.info/types/   <---Тут можно посмотреть что есть в пк  :)
взято с http://zenux.ru/articles/44/
Ещё вот утилиты: ccache (кеширует процесс сборки,в репозиториях есть)
и distcc (сборка по сети ресурсами нескольких ПК)
вот http://rascal.su/blog/2010/11/05/
Gentoo x86_64 AMD E-350 Openbox 3.5.2

AlekseyDebian

make-kpkg --initrd --revision=mybuild.1.0 kernel_image kernel_headers

Так ядро не компилируется: ругается, что версия должна начинаться с цифры.

Так все ок:
make-kpkg --initrd --revision=1.0 kernel_image kernel_headers