Как правильно собирать ядро?
Модератор: Olej
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Как правильно собирать ядро?
Ядро в Linux умеют собирать все!
Умение собирать ядро Linux - это неотъемлемое достоинство всякого нормального джидая (с LORа )... я даже временами предполагаю, что это вообще то единственное, что умеют настоящие джидаи (ко всему остальному руки могут расти вполне и из задницы).
Но вот как (и когда) это делать правильно, грамотно??? (потому в теме и знак вопроса стоит - это вопрос!)
Я делал это десятки раз в разных ядрах (начиная ещё с какого-то давнего 2.0.какой-то) и разных дистрибутивах ... но так до сих пор и нет ясности...
Т.е., вопрос не в том, как скомпилировать и установить новое ядро (с LVM или без, c initramfs или каким-то другим образом /root... ) - а вопрос в том: откуда взять тот исходник кода ядра, который компилировать???
1. большинство ядер дистрибутивов - патченные...
2. так что ядро с http://www.kernel.org - это, говорят, не совсем то... (не считая того, что ныне http://www.kernel.org развалили злые хакеры, и там будет что-то меняться с политикой...)
3. но в некоторых дистрибутивах есть исходники ядра в основном репозитарии (Debian?), в некоторых только в дополнительных (CentOS?) с предупреждениями, что "это хорошо не кончится", в некоторых я их вообще не нахожу (Fedora?).
4. но это - текущие версии ядра, а если захочется установить более свежее (самое свежее! ... 3.04 )???
Что кто использует? и какие есть мнения?
Умение собирать ядро Linux - это неотъемлемое достоинство всякого нормального джидая (с LORа )... я даже временами предполагаю, что это вообще то единственное, что умеют настоящие джидаи (ко всему остальному руки могут расти вполне и из задницы).
Но вот как (и когда) это делать правильно, грамотно??? (потому в теме и знак вопроса стоит - это вопрос!)
Я делал это десятки раз в разных ядрах (начиная ещё с какого-то давнего 2.0.какой-то) и разных дистрибутивах ... но так до сих пор и нет ясности...
Т.е., вопрос не в том, как скомпилировать и установить новое ядро (с LVM или без, c initramfs или каким-то другим образом /root... ) - а вопрос в том: откуда взять тот исходник кода ядра, который компилировать???
1. большинство ядер дистрибутивов - патченные...
2. так что ядро с http://www.kernel.org - это, говорят, не совсем то... (не считая того, что ныне http://www.kernel.org развалили злые хакеры, и там будет что-то меняться с политикой...)
3. но в некоторых дистрибутивах есть исходники ядра в основном репозитарии (Debian?), в некоторых только в дополнительных (CentOS?) с предупреждениями, что "это хорошо не кончится", в некоторых я их вообще не нахожу (Fedora?).
4. но это - текущие версии ядра, а если захочется установить более свежее (самое свежее! ... 3.04 )???
Что кто использует? и какие есть мнения?
Последний раз редактировалось Olej 04 окт 2011, 19:16, всего редактировалось 2 раза.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Как правильно собирать ядро?
Мне говорят: "должны быть!"Olej писал(а): в некоторых я их вообще не нахожу (Fedora?).
Делаем:
Код: Выделить всё
$ yumdownloader --source --disablerepo=russianfedora-fixes* kernel*
....
kernel-2.6.35.14-97.fc14.src.rpm | 68 MB 02:20
$ ls *.rpm
grub.conf kernel-2.6.35.14-97.fc14.src.rpm virt_xen.hist
$ rpm -v -i kernel-2.6.35.14-97.fc14.src.rpm
....
И что мы имеем?
Код: Выделить всё
$ cd ~/rpmbuild/
$ ls
SOURCES SPECS
$ ls SOURCES/
acpi-ec-add-delay-before-write.patch
acpi-update-battery-information-on-notification-0x81.patch
add-appleir-usb-driver.patch
af_netlink-add-needed-scm_destroy-after-scm_send.patch
asix-add-USB-ID-for-Logitec-LAN-GTJ-U2A.patch
...
Это всего лишь набор патчей, которые нужно применять только к этому ядру kernel-2.6.35.14, к официальным (ванильным) сорцам.
Это ни на грамм не приближает к цели, если собирать ядро уже 2.6.36
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Как правильно собирать ядро?
Картина проясняется:Olej писал(а): (не считая того, что ныне http://www.kernel.org развалили злые хакеры, и там будет что-то меняться с политикой...)
http://linux.ru/opublikovan-otchet-o-sostoyanii-kernelorg-posle-vzloma
http://www.linux.ru/taxonomy/term/188Согласно информации выложенной в письме, работа по переделке инфраструктуры идёт полным ходом. Как сообщает Питер, новая инфраструктура проекта будет лишена какого бы то ни было доступа к командной оболочке сервера, а доступ к репозторию будет рализован через веб-интерфейс с использованием gitolite.
Грег Кроа-Хартман объявил о релизе Linux 3.0.5
...
И да, kernel.org снова в строю, как и было обещано ранее.
4.10.2011 в 17:50
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Как правильно собирать ядро?
Вот попалось (из сотен!) первое внятное описание:
http://fedoraproject.org/wiki/Docs/CustomKernel
В котором больше половины первой, достаточно обстоятельного текста, идёт объяснение: как взять и как приготовить патченное ядро, именно то ядро, из которого они готовят дистрибутив.
Может ещё кому пригодится...
Правда всё это только относительно одного дистрибутива: Fedora.
Но это тоже не отвечает на вопросы:
- а как быть со сборкой для себя новых ядер (3.05, например ...) ?
- до какой степени, с какой целью и т.д. дистрибьюторы патчат исходный код ядра?
- какие можно ожидать ... неожиданности при сборке-установке в своём дистрибутиве из оригинального кода ядра?
... ну и новый добавившийся вопрос в связи с реорганизацией www.kernel.org:
- освоение программы-пакета gitolite (а кому-то и установки ) для получения оригинальных исходных кодов ядра.
P.S. только сейчас досмотрел, что вот здесь в форуме приведен полный перевод названной статьи ... кому в облом читать на английском
http://fedoraproject.org/wiki/Docs/CustomKernel
В котором больше половины первой, достаточно обстоятельного текста, идёт объяснение: как взять и как приготовить патченное ядро, именно то ядро, из которого они готовят дистрибутив.
Может ещё кому пригодится...
Правда всё это только относительно одного дистрибутива: Fedora.
Но это тоже не отвечает на вопросы:
- а как быть со сборкой для себя новых ядер (3.05, например ...) ?
- до какой степени, с какой целью и т.д. дистрибьюторы патчат исходный код ядра?
- какие можно ожидать ... неожиданности при сборке-установке в своём дистрибутиве из оригинального кода ядра?
... ну и новый добавившийся вопрос в связи с реорганизацией www.kernel.org:
- освоение программы-пакета gitolite (а кому-то и установки ) для получения оригинальных исходных кодов ядра.
P.S. только сейчас досмотрел, что вот здесь в форуме приведен полный перевод названной статьи ... кому в облом читать на английском
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Как правильно собирать ядро?
Это описание от разработчиков дистрибутива (Fedora), и общие особенности будут в точности одинаковыми для любых дистрибутивов...Olej писал(а):Вот попалось (из сотен!) первое внятное описание:
http://fedoraproject.org/wiki/Docs/CustomKernel
И это описание действительно дало ответ на многие вопросы, которые я задавал выше...
Поэтому есть резон его внимательно проанализировать... Что ж они делают?:
1. воссоздание структуры RPM-пакета:
Код: Выделить всё
[olej@nvidia ~]$ rpmdev-setuptree
[olej@nvidia ~]$ tree rpmbuild
rpmbuild
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS
5 directories, 0 files
Обращаем внимание, что не важно из какого каталога мы это выполняем, всё равно будет создан ~/rpmbuild в домашнем каталоге ... так что важно не где, а от чьего имени.
2. загрузка исходников из репозитария своего дистрибутива:
Код: Выделить всё
[olej@nvidia 03]$ yumdownloader --source --disablerepo=russianfedora-fixes* kernel*
....
kernel-2.6.35.14-97.fc14.src.rpm | 68 MB 02:20
Код: Выделить всё
[olej@nvidia Загрузки]$ sudo yum-builddep kernel-2.6.35.14-97.fc14.src.rpm
...
Зависимости разрешены
=========================================================================================================
Пакет Архитектура Версия Репозиторий Размер
=========================================================================================================
Установка:
asciidoc noarch 8.4.5-5.fc14 fedora 183 k
binutils-devel i686 2.20.51.0.7-8.fc14 updates 733 k
elfutils-devel i686 0.152-1.fc14 updates 69 k
newt-devel i686 0.52.12-1.fc14 fedora 47 k
perl-ExtUtils-Embed noarch 1.28-146.fc14 updates 31 k
python-devel i686 2.7-8.fc14.1 fedora 376 k
redhat-rpm-config noarch 9.1.0-8.fc14 updates 64 k
xmlto i686 0.0.23-3.fc13 fedora 45 k
Установка зависимостей:
elfutils-libelf-devel i686 0.152-1.fc14 updates 31 k
flex i686 2.5.35-11.fc14 fedora 278 k
flex-static i686 2.5.35-11.fc14 fedora 12 k
slang-devel i686 2.2.3-1.fc14 updates 91 k
Результат операции
=========================================================================================================
Install 12 Package(s)
Объем загрузки: 1.9 M
Будет установлено: 5.6 M
Продолжить? [y/N]: y
...
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Как правильно собирать ядро?
4. Установка исходного пакета (раскидывание по каталогам):
- там куча предупреждений о фамилии сборщика, но это по-фиг...
А вот посмотреть, что оно и куда стало - любопытно:
- каталог сборки пока пуст как турецкий барабан
А вот каталог исходных сырцов содержит архив официального (ванильного) дистрибутива:
и огромное число файлов заплаток:
Код: Выделить всё
[olej@nvidia Загрузки]$ rpm -Uvh kernel-2.6.35.14-97.fc14.src.rpm
1:kernel предупреждение: пользователь mockbuild не существует - используется root
предупреждение: группа mockbuild не существует - используется root
...
А вот посмотреть, что оно и куда стало - любопытно:
Код: Выделить всё
[olej@nvidia rpmbuild]$ pwd
/home/olej/rpmbuild
[olej@nvidia rpmbuild]$ ls
BUILD RPMS SOURCES SPECS SRPMS
[olej@nvidia rpmbuild]$ ls BUILD/
[olej@nvidia rpmbuild]$ du -hs BUILD/
4,0K BUILD/
А вот каталог исходных сырцов содержит архив официального (ванильного) дистрибутива:
Код: Выделить всё
[olej@nvidia SOURCES]$ pwd
/home/olej/rpmbuild/SOURCES
[olej@nvidia SOURCES]$ ls -l linux*.bz2
-rw-r--r--. 1 olej olej 69305709 Авг 2 2010 linux-2.6.35.tar.bz2
и огромное число файлов заплаток:
Код: Выделить всё
[olej@nvidia SOURCES]$ ls -l *.patch | wc -l
150
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Как правильно собирать ядро?
Дальше нумерация моя и их - сбиваются + я пропускаю всё, что касается новой сборки пакета (RPM) нашего нового ядра...
5. выполняем из сценария сборки пакета создание дерева исходных кодов (это уже то, к чему стремимся):
Я не зря так много показал листинга (там его на самом деле гораздо больше):
- видно применение патчей
- создание каталога configs
Смотрим, что оно наделало:
Каталог сборки (BUILD), который был пустой, теперь содержит два(!) дерева: ванильное и патченное!
Причём их размеры: 457+452=530 - т.е. по большей части там ссылки?
5. выполняем из сценария сборки пакета создание дерева исходных кодов (это уже то, к чему стремимся):
Код: Выделить всё
[olej@nvidia SOURCES]$ uname -m
i686
[olej@nvidia rpmbuild]$ cd SPECS
[olej@nvidia SPECS]$ ls
kernel.spec
[olej@nvidia SPECS]$ rpmbuild -bp --target=`uname -m` kernel.spec
Платформы для сборки: i686
Сборка для платформы i686
Выполняется(%prep): /bin/sh -e /var/tmp/rpm-tmp.QV9ZSr
+ umask 022
+ cd /home/olej/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ patch_command='patch -p1 -F1 -s'
++ grep -x -v /home/olej/rpmbuild/BUILD/kernel-2.6.35.fc14
++ find /home/olej/rpmbuild/BUILD -maxdepth 1 -type d -name 'kernel-2.6.*'
+ sharedirs=
+ :
+ '[' '!' -d kernel-2.6.35.fc14/vanilla-2.6.35 ']'
+ '[' -d kernel-2.6.35.fc14/vanilla-2.6.35 ']'
+ rm -f pax_global_header
+ [[ ! -z '' ]]
+ cd /home/olej/rpmbuild/BUILD
+ rm -rf kernel-2.6.35.fc14
+ /bin/mkdir -p kernel-2.6.35.fc14
...
Patch12086: linux-2.6-cgroups-rcu.patch
+ case "$patch" in
+ patch -p1 -F1 -s
+ ApplyPatch sched-05-avoid-side-effect-of-tickless-idle-on-update_cpu_load.patch
+ local patch=sched-05-avoid-side-effect-of-tickless-idle-on-update_cpu_load.patch
+ shift
+ '[' '!' -f /home/olej/rpmbuild/SOURCES/sched-05-avoid-side-effect-of-tickless-idle-on-update_cpu_load.p
Patch12565: sched-05-avoid-side-effect-of-tickless-idle-on-update_cpu_load.patch
+ case "$patch" in
+ patch -p1 -F1 -s
+ ApplyPatch sched-10-change-nohz-idle-load-balancing-logic-to-push-model.patch
+ local patch=sched-10-change-nohz-idle-load-balancing-logic-to-push-model.patch
+ shift
+ '[' '!' -f /home/olej/rpmbuild/SOURCES/sched-10-change-nohz-idle-load-balancing-logic-to-push-model.pat
...
+ mkdir configs
+ for cfg in 'kernel-2.6.35.14-*.config'
++ grep -c kernel-2.6.35.14-arm.config
++ echo kernel-2.6.35.14-i686-PAE.config kernel-2.6.35.14-i686-PAEdebug.config kernel-2.6.35.14-i686-debu
+ '[' 0 -eq 0 ']'
...
+ find . '(' -name '*.orig' -o -name '*~' ')' -exec rm -f '{}' ';'
+ cd ..
+ exit 0
- видно применение патчей
- создание каталога configs
Смотрим, что оно наделало:
Код: Выделить всё
[olej@nvidia BUILD]$ pwd
/home/olej/rpmbuild/BUILD
[olej@nvidia BUILD]$ ls
kernel-2.6.35.fc14
[olej@nvidia BUILD]$ du -hs
530M .
[olej@nvidia kernel-2.6.35.fc14]$ pwd
/home/olej/rpmbuild/BUILD/kernel-2.6.35.fc14
[olej@nvidia kernel-2.6.35.fc14]$ ls
linux-2.6.35.i686 vanilla-2.6.35
[olej@nvidia kernel-2.6.35.fc14]$ du -hs linux-2.6.35.i686
457M linux-2.6.35.i686
[olej@nvidia kernel-2.6.35.fc14]$ du -hs vanilla-2.6.35
452M vanilla-2.6.35
Каталог сборки (BUILD), который был пустой, теперь содержит два(!) дерева: ванильное и патченное!
Причём их размеры: 457+452=530 - т.е. по большей части там ссылки?
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Как правильно собирать ядро?
6. остаётся совсем немного: создать конфигурацию для сборки...
Глядим:
Теперь глядим то же самое в дереве ванильного (официального) ядра:
т.е. дистрибьюторы набили своё дерево файлами конфигурации (для разных архитектур + разных сборок x86)...
Берём на свой вкус:
И восстанавливаем эту конфигурацию как исходную (для дальнейших изменений):
- time я использовал, чтобы убедиться лишний раз, что никакого make там на самом деле не происходит ... минимальные действия по копированию...
Глядим:
Код: Выделить всё
[olej@nvidia linux-2.6.35.i686]$ pwd
/home/olej/rpmbuild/BUILD/kernel-2.6.35.fc14/linux-2.6.35.i686
[olej@nvidia linux-2.6.35.i686]$ ls *config*
config-arm config-ia64-generic config-powerpc32-smp config-s390x
config-debug config-local config-powerpc64 config-sparc64-generic
config-generic config-nodebug config-powerpc-generic config-x86_64-generic
config-i686-PAE config-powerpc32-generic config-rhel-generic config-x86-generic
configs:
kernel-2.6.35.14-i686.config kernel-2.6.35.14-i686-PAE.config
kernel-2.6.35.14-i686-debug.config kernel-2.6.35.14-i686-PAEdebug.config
Код: Выделить всё
[olej@nvidia vanilla-2.6.35]$ pwd
/home/olej/rpmbuild/BUILD/kernel-2.6.35.fc14/vanilla-2.6.35
[olej@nvidia vanilla-2.6.35]$ ls *config*
ls: невозможно получить доступ к *config*: Нет такого файла или каталога
Берём на свой вкус:
Код: Выделить всё
[olej@nvidia linux-2.6.35.i686]$ pwd
/home/olej/rpmbuild/BUILD/kernel-2.6.35.fc14/linux-2.6.35.i686
[olej@nvidia linux-2.6.35.i686]$ cp configs/kernel-2.6.35.14-i686-PAE.config ./config
Код: Выделить всё
[olej@nvidia linux-2.6.35.i686]$ time make oldconfig
scripts/kconfig/conf -o arch/x86/Kconfig
#
# configuration written to .config
#
real 0m0.488s
user 0m0.224s
sys 0m0.163s
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Как правильно собирать ядро?
7. А вот здесь далее:
- конфигурирование параметров ядра;
- компиляция ядра;
- установка ядра;
- приделывание для него root-fs;
- дописывание меню GRUB;
...
Но это как-раз уж не интересно, это описано в сотнях заметок, общеизвестно...
- конфигурирование параметров ядра;
- компиляция ядра;
- установка ядра;
- приделывание для него root-fs;
- дописывание меню GRUB;
...
Но это как-раз уж не интересно, это описано в сотнях заметок, общеизвестно...
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Как правильно собирать ядро?
Ещё нашлась одна интересная мелочь относительно сборки ядра: можно заставить make использовать все процессоры в многоядерном процессоре:
Иногда это может ускорить в разы!
Вот подтверждающие прогоны ... ядро я, конечно, не стал, это нужно до утра сидеть...
Взял под рукой был дистрибутив сервера ntp (такой выбрал, чтоб не сильно быстро и не сильно долго компилился):
Почти в 3 раза ускорение сборки!
Но это только в некоторых случаях так:
- здесь 4 ядра, но Atom, хоть и быстрых...
- а винчестер твердотельный SDD ... для Linux можно себе такой позволить.
Основная нагрузка при компиляции - на винчестер.
Это и здесь хорошо видно: резкое ускорение при переходе от 1-го процессора к 2-м, но дальше рост медленнее - винчестер держит!
Код: Выделить всё
[olej@nvidia ubuntu.10.04.3]$ man make
...
-j [jobs], --jobs[=jobs]
Specifies the number of jobs (commands) to run simultaneously. If there is more than one
-j option, the last one is effective. If the -j option is given without an argument, make
will not limit the number of jobs that can run simultaneously.
Вот подтверждающие прогоны ... ядро я, конечно, не стал, это нужно до утра сидеть...
Взял под рукой был дистрибутив сервера ntp (такой выбрал, чтоб не сильно быстро и не сильно долго компилился):
Код: Выделить всё
olej@atom:/usr/src/ntp-4.2.6p3$ make clean
olej@atom:/usr/src/ntp-4.2.6p3$ time make -j1
...
real 2m7.698s
user 1m56.279s
sys 0m12.665s
olej@atom:/usr/src/ntp-4.2.6p3$ make clean
olej@atom:/usr/src/ntp-4.2.6p3$ time make -j2
...
real 1m16.018s
user 1m58.883s
sys 0m12.733s
olej@atom:/usr/src/ntp-4.2.6p3$ make clean
olej@atom:/usr/src/ntp-4.2.6p3$ time make -j3
...
real 1m9.751s
user 2m23.385s
sys 0m15.229s
olej@atom:/usr/src/ntp-4.2.6p3$ make clean
olej@atom:/usr/src/ntp-4.2.6p3$ time make -j4
...
real 1m5.023s
user 2m40.270s
sys 0m16.809s
olej@atom:/usr/src/ntp-4.2.6p3$ make clean
olej@atom:/usr/src/ntp-4.2.6p3$ time make
...
real 2m6.534s
user 1m56.119s
sys 0m12.193s
olej@atom:/usr/src/ntp-4.2.6p3$ make clean
olej@atom:/usr/src/ntp-4.2.6p3$ time make -j
...
real 1m5.708s
user 2m43.230s
sys 0m16.301s
Но это только в некоторых случаях так:
- здесь 4 ядра, но Atom, хоть и быстрых...
Код: Выделить всё
olej@atom:/usr/src/ntp-4.2.6p3$ cat /proc/cpuinfo | head -n10
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 28
model name : Intel(R) Atom(TM) CPU 330 @ 1.60GHz
stepping : 2
cpu MHz : 1596.331
cache size : 512 KB
physical id : 0
siblings : 4
- а винчестер твердотельный SDD ... для Linux можно себе такой позволить.
Основная нагрузка при компиляции - на винчестер.
Это и здесь хорошо видно: резкое ускорение при переходе от 1-го процессора к 2-м, но дальше рост медленнее - винчестер держит!
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя