Как правильно собирать ядро?

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Как правильно собирать ядро?

Непрочитанное сообщение Olej » 04 окт 2011, 19:02

Ядро в Linux умеют собирать все! :lol:
Умение собирать ядро Linux - это неотъемлемое достоинство всякого нормального джидая (с LORа :lol: :lol: :lol: )... я даже временами предполагаю, что это вообще то единственное, что умеют настоящие джидаи :twisted: (ко всему остальному руки могут расти вполне и из задницы).

Но вот как (и когда) это делать правильно, грамотно??? (потому в теме и знак вопроса стоит - это вопрос!)

Я делал это десятки раз в разных ядрах (начиная ещё с какого-то давнего 2.0.какой-то) и разных дистрибутивах ... но так до сих пор и нет ясности...

Т.е., вопрос не в том, как скомпилировать и установить новое ядро (с LVM или без, c initramfs или каким-то другим образом /root... ) - а вопрос в том: откуда взять тот исходник кода ядра, который компилировать???

1. большинство ядер дистрибутивов - патченные...
2. так что ядро с http://www.kernel.org - это, говорят, не совсем то... (не считая того, что ныне http://www.kernel.org развалили злые хакеры, и там будет что-то меняться с политикой...)
3. но в некоторых дистрибутивах есть исходники ядра в основном репозитарии (Debian?), в некоторых только в дополнительных (CentOS?) с предупреждениями, что "это хорошо не кончится", в некоторых я их вообще не нахожу (Fedora?).
4. но это - текущие версии ядра, а если захочется установить более свежее (самое свежее! ... 3.04 :lol: )???

Что кто использует? и какие есть мнения?
Последний раз редактировалось Olej 04 окт 2011, 19:16, всего редактировалось 2 раза.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как правильно собирать ядро?

Непрочитанное сообщение Olej » 04 окт 2011, 19:11

Olej писал(а): в некоторых я их вообще не нахожу (Fedora?).
Мне говорят: "должны быть!" :-x

Делаем:

Код: Выделить всё

$ 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
....
Размер не смущает? :lol:

И что мы имеем?

Код: Выделить всё

$ 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 » 05 окт 2011, 02:33

Olej писал(а): (не считая того, что ныне http://www.kernel.org развалили злые хакеры, и там будет что-то меняться с политикой...)
Картина проясняется:
http://linux.ru/opublikovan-otchet-o-sostoyanii-kernelorg-posle-vzloma
Согласно информации выложенной в письме, работа по переделке инфраструктуры идёт полным ходом. Как сообщает Питер, новая инфраструктура проекта будет лишена какого бы то ни было доступа к командной оболочке сервера, а доступ к репозторию будет рализован через веб-интерфейс с использованием gitolite.
http://www.linux.ru/taxonomy/term/188
Грег Кроа-Хартман объявил о релизе Linux 3.0.5
...
И да, kernel.org снова в строю, как и было обещано ранее.
4.10.2011 в 17:50

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как правильно собирать ядро?

Непрочитанное сообщение Olej » 05 окт 2011, 12:53

Вот попалось (из сотен!) первое внятное описание:
http://fedoraproject.org/wiki/Docs/CustomKernel
В котором больше половины первой, достаточно обстоятельного текста, идёт объяснение: как взять и как приготовить патченное ядро, именно то ядро, из которого они готовят дистрибутив.
Может ещё кому пригодится...
Правда всё это только относительно одного дистрибутива: Fedora.

Но это тоже не отвечает на вопросы:
- а как быть со сборкой для себя новых ядер (3.05, например 8-) ...) ?
- до какой степени, с какой целью и т.д. дистрибьюторы патчат исходный код ядра?
- какие можно ожидать ... неожиданности ;-) при сборке-установке в своём дистрибутиве из оригинального кода ядра?

... ну и новый добавившийся вопрос в связи с реорганизацией www.kernel.org:
- освоение программы-пакета gitolite (а кому-то и установки ;-) ) для получения оригинальных исходных кодов ядра.

P.S. только сейчас досмотрел, что вот здесь в форуме приведен полный перевод названной статьи ... кому в облом читать на английском :mrgreen:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как правильно собирать ядро?

Непрочитанное сообщение Olej » 05 окт 2011, 14:51

Olej писал(а):Вот попалось (из сотен!) первое внятное описание:
http://fedoraproject.org/wiki/Docs/CustomKernel
Это описание от разработчиков дистрибутива (Fedora), и общие особенности будут в точности одинаковыми для любых дистрибутивов...
И это описание действительно дало ответ на многие вопросы, которые я задавал выше...
Поэтому есть резон его внимательно проанализировать... Что ж они делают?:

1. воссоздание структуры RPM-пакета:

Код: Выделить всё

[olej@nvidia ~]$ rpmdev-setuptree
[olej@nvidia ~]$ tree rpmbuild
rpmbuild
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS
5 directories, 0 files
- это имеет интерес только для счастливых обладателей RPM-дистрибутивов ;-)...
Обращаем внимание, что не важно из какого каталога мы это выполняем, всё равно будет создан ~/rpmbuild в домашнем каталоге ... так что важно не где, а от чьего имени.

2. загрузка исходников из репозитария своего дистрибутива:

Код: Выделить всё

[olej@nvidia 03]$ yumdownloader --source --disablerepo=russianfedora-fixes* kernel*
....
kernel-2.6.35.14-97.fc14.src.rpm                                                  |  68 MB     02:20
3. доустановка или обновление пакетов, которые понадобтся далее (что не установлено):

Код: Выделить всё

[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
...
Вот это он мне установил, хотя я считал, что у меня уже установлено всё-всё :lol:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как правильно собирать ядро?

Непрочитанное сообщение Olej » 05 окт 2011, 15:05

4. Установка исходного пакета (раскидывание по каталогам):

Код: Выделить всё

[olej@nvidia Загрузки]$ rpm -Uvh kernel-2.6.35.14-97.fc14.src.rpm
   1:kernel                 предупреждение: пользователь mockbuild не существует - используется root
предупреждение: группа mockbuild не существует - используется root
...
- там куча предупреждений о фамилии :-D сборщика, но это по-фиг...

А вот посмотреть, что оно и куда стало - любопытно:

Код: Выделить всё

[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: Как правильно собирать ядро?

Непрочитанное сообщение Olej » 05 окт 2011, 15:39

Дальше нумерация моя и их - сбиваются + я пропускаю всё, что касается новой сборки пакета (RPM) нашего нового ядра...

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 :-o - т.е. по большей части там ссылки?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как правильно собирать ядро?

Непрочитанное сообщение Olej » 05 окт 2011, 15:50

6. остаётся совсем немного: создать конфигурацию для сборки...

Глядим:

Код: Выделить всё

[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*: Нет такого файла или каталога
т.е. дистрибьюторы набили своё дерево файлами конфигурации (для разных архитектур + разных сборок x86)...
Берём на свой вкус:

Код: Выделить всё

[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
- time я использовал, чтобы убедиться лишний раз, что никакого make там на самом деле не происходит ... минимальные действия по копированию...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как правильно собирать ядро?

Непрочитанное сообщение Olej » 05 окт 2011, 16:12

7. А вот здесь далее:
- конфигурирование параметров ядра;
- компиляция ядра;
- установка ядра;
- приделывание для него root-fs;
- дописывание меню GRUB;
...

Но это как-раз уж не интересно, это описано в сотнях заметок, общеизвестно...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Как правильно собирать ядро?

Непрочитанное сообщение Olej » 05 окт 2011, 22:03

Ещё нашлась одна интересная мелочь относительно сборки ядра: можно заставить make использовать все процессоры в многоядерном процессоре:

Код: Выделить всё

[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
Почти в 3 раза ускорение сборки!
Но это только в некоторых случаях так:
- здесь 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-м, но дальше рост медленнее - винчестер держит!

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя