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

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

Модератор: Olej

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

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

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

Olej писал(а): Иногда это может ускорить в разы!
Но только иногда!
Вот результат на другом компьютере:

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

[olej@nvidia ntp-4.2.6p3]$ time make
...
real    0m28.298s
user    0m20.492s
sys     0m3.108s
[olej@nvidia ntp-4.2.6p3]$ time make -j2
...
real    0m23.629s
user    0m21.013s
sys     0m3.278s
- это тот же дистрибутив собирается...
- быстрее (по итогу) почти в 5 раз...
- но ускорение от числа процессоров почти не ощущается,
- здесь процессоры (2) очень быстрые:

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

[olej@nvidia ntp-4.2.6p3]$ cat /proc/cpuinfo | head -n10
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 23
model name	: Pentium(R) Dual-Core  CPU      E6600  @ 3.06GHz
stepping	: 10
cpu MHz		: 3066.000
cache size	: 2048 KB
physical id	: 0
siblings	: 2
- а винчестер - добротный WD SATA, самый заурядный - вот он и тормозит всё дело!

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

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

Непрочитанное сообщение Olej » 07 окт 2011, 20:00

Перенесу сюда то, что мне подсказали, а я проверил... это к вопросу большого ускорения сборки ядра...
Предложение: компилировать не на HDD (см.выще), а в tmpfs:

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

[olej@nvidia ~]$ free
             total       used       free     shared    buffers     cached
Mem:       4124164    1516980    2607184          0     248060     715964
-/+ buffers/cache:     552956    3571208
Swap:      4606972          0    4606972
[olej@nvidia ~]$ df -m | grep tmp
tmpfs                     2014         1      2014   1% /dev/shm
до 2Gb у меня RAM-диска есть, перегоняем туда дерево исходных кодов и там собираем:

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

[olej@nvidia linux-2.6.35.i686]$ pwd
/dev/shm/linux-2.6.35.i686
[olej@nvidia linux-2.6.35.i686]$ time make bzImage
...
  HOSTCC  arch/x86/boot/tools/build
  BUILD   arch/x86/boot/bzImage
Root device is (8, 1)
Setup is 13052 bytes (padded to 13312 bytes).
System is 3604 kB
CRC 418921f4
Kernel: arch/x86/boot/bzImage is ready  (#1)

real   9m23.986s
user   7m4.826s
sys   1m18.529s
- сборка ядра <10 min ... совсем неплохо :lol:

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

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

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

Olej писал(а):- сборка ядра <10 min ... совсем неплохо :lol:
Но вот использовать многопроцессорность вместе с этим трюком при сборке ядра (а может и без RAM-диска, просто многопроцессорность) - не получается:

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

[olej@nvidia linux-2.6.35.i686]$ time make -j bzImage
...
Can't fork, trying again in 5 seconds at /dev/shm/linux-2.6.35.i686/scripts/recordmcount.pl line 179.
make[2]: *** [drivers/md/dm-table.o] Ошибка 1
make[2]: *** Ожидание завершения заданий...
ccache: FATAL: Failed to fork
make[2]: *** [drivers/md/dm-uevent.o] Ошибка 1
Can't fork, trying again in 5 seconds at /dev/shm/linux-2.6.35.i686/scripts/recordmcount.pl line 179.
Can't fork, trying again in 5 seconds at /dev/shm/linux-2.6.35.i686/scripts/recordmcount.pl line 531, <IN> li
make[2]: scripts/Makefile.build:230: fork: Ресурс временно недоступен
make[2]: scripts/Makefile.build:230: fork: Ресурс временно недоступен
...
  LD      security/selinux/ss/built-in.o
make[1]: *** [security/selinux] Ошибка 2
make: *** [security] Ошибка 2
make[1]: *** [drivers/ata] Ошибка 2
make: *** [drivers] Ошибка 2
make: *** [kernel] Ошибка 2
make: *** wait: Нет дочерних процессов.  Останов.
Видно, что что-то с синхронизациями процессов, создаваемых по fork там не заладилось.
Почему? я не готов пока на это ответить.

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

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

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

Olej писал(а): Вот результат на другом компьютере:

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

[olej@nvidia ntp-4.2.6p3]$ time make
...
real    0m28.298s
user    0m20.492s
sys     0m3.108s
[olej@nvidia ntp-4.2.6p3]$ time make -j2
...
real    0m23.629s
user    0m21.013s
sys     0m3.278s
- это тот же дистрибутив собирается...
- быстрее (по итогу) почти в 5 раз...
- но ускорение от числа процессоров почти не ощущается,
- здесь процессоры (2) очень быстрые:
А теперь та же сборка, того же пакета, в 2 процессора, но в tmpfs:

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

$ pwd 
/dev/shm/ntp-4.2.6p3 
$ make -j
... 
real    0m4.081s 
user    0m1.710s 
sys     0m1.149s 
Вместо ~30 сек. - 4 сек.! почти на порядок :!:
Это неприменимо для сборки ядра, но вполне применимо для других сборок из исходников.

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

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

Непрочитанное сообщение Olej » 18 окт 2011, 17:48

Olej писал(а): (не считая того, что ныне http://www.kernel.org развалили злые хакеры, и там будет что-то меняться с политикой...)
На сегодня там как-то что-то восстановили...
По крайней мере, исходники для стабильных версий 3.0.х можно взять, в частности, на FTP-сервере:
ftp://ftp.kernel.org/pub/linux/kernel/v3.0

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

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

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

Возник такой вопрос (т.е. к нему дошли слушатели моего семинара по кернел, занимающиеся embedded устройствами на ARM):

- можно ли собрать нынешнее ядро (3.04, скажем) в малой конфигурации как монолитное (так как собиралось ядро в Linux 0.96 ;-) )
- когда заведомо известный набор модулей компилируется в ядро, а как модули ничего не собирается
- без нужды для загрузки в никаких initramfs или любых других форматов для корневой файловой системы (временной!).

Есть ли такой опыт? или URL на публикации?

Ali
Писатель
Сообщения: 57
Зарегистрирован: 08 окт 2011, 08:00
Контактная информация:

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

Непрочитанное сообщение Ali » 22 окт 2011, 21:24

Olej писал(а):Возник такой вопрос (т.е. к нему дошли слушатели моего семинара по кернел, занимающиеся embedded устройствами на ARM):
За ARM не скажу, бо руками не делал. :-)
Olej писал(а): - можно ли собрать нынешнее ядро (3.04, скажем) в малой конфигурации как монолитное (так как собиралось ядро в Linux 0.96 ;-) )
Целиком скорее всего нет, но значительную часть можно.
Olej писал(а): - когда заведомо известный набор модулей компилируется в ядро, а как модули ничего не собирается
Если его(модуля) зависимости не собраны как модуль, то скорее всего ДА.
Olej писал(а): - без нужды для загрузки в никаких initramfs или любых других форматов для корневой файловой системы (временной!).
А вот такую вещь я делал руками. :-) Нужно вкомпилить в ядро драйвер корневой-ФС и дискового конроллера, SCSI device support и т.п..
Во слово "временной" проглядел. Следовательно дискового конроллера и SCSI device support не надо, а нужно то на чём она лежит. Или ея то и заменить iitramfs. ;-), смотря по жедезу и загрузчику. (uboot вроде бы умеет)

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

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

Непрочитанное сообщение Olej » 22 ноя 2011, 02:14

Ali писал(а):
Olej писал(а): Возник такой вопрос (т.е. к нему дошли слушатели моего семинара по кернел, занимающиеся embedded устройствами на ARM):
За ARM не скажу, бо руками не делал. :-)
Относительно сборки ядра под другие архитектуры (ARM, MIPS, PPC, ...) на примере ARM появилось достаточно подробно обсуждение в другой теме: Linux для embedded применений.

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

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

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

Olej писал(а): Видно, что что-то с синхронизациями процессов, создаваемых по fork там не заладилось.
Почему? я не готов пока на это ответить.
Всё таки остался ... занозой ;-) вопрос: почему? при сборке ядра в несколько процессоров - возникает такая досадная и непонятная ошибка?

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

[olej@nvidia linux-2.6.35.i686]$ time make -j bzImage
...
Can't fork, trying again in 5 seconds at /dev/shm/linux-2.6.35.i686/scripts/recordmcount.pl line 179.
make[2]: *** [drivers/md/dm-table.o] Ошибка 1
make[2]: *** Ожидание завершения заданий...
ccache: FATAL: Failed to fork
make[2]: *** [drivers/md/dm-uevent.o] Ошибка 1
Can't fork, trying again in 5 seconds at /dev/shm/linux-2.6.35.i686/scripts/recordmcount.pl line 179.
Can't fork, trying again in 5 seconds at /dev/shm/linux-2.6.35.i686/scripts/recordmcount.pl line 531, <IN> li
make[2]: scripts/Makefile.build:230: fork: Ресурс временно недоступен
make[2]: scripts/Makefile.build:230: fork: Ресурс временно недоступен
...
Почему такая подобная ошибка не возникает (я не встретил) при сборке других, и очень крупных, не уступающих kernel проектов... вот при сборке инструментария для кросс-компиляции embedded проектов BuildRoot (см. здесь рядом тему) - они предуреждают в документации примерно так: "не используйте -j 2 - мы сами сгенерируем в Makefile -j в зависимости от числа ваших процессоров"...

Но могу понять. :evil:

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

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

Непрочитанное сообщение Olej » 14 мар 2012, 23:35

Некоторые "параметры" сборки относительно свежего ядра (3.0.9 - ещё недавно называлось как последнее stable), сборка классическая без каких-либо фокусов по ускорению:

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

[olej@notebook linux-3.0.9]$ time make bzImage
...
Root device is (253, 0)
Setup is 14908 bytes (padded to 15360 bytes).
System is 3734 kB
CRC 2ce5541c
Kernel: arch/x86/boot/bzImage is ready  (#1)
real    27m13.481s
user    17m42.535s
sys     2m29.441s
[olej@notebook linux-3.0.9]$ time make modules
...
real    106m18.688s
user    76m47.999s
sys     9m52.632s
[olej@notebook linux-3.0.9]$ du -hs
4,4G    .
P.S. да, кстати, чтоб хоть по порядку величины определиться чего ожидать, нужно сказать не каком процессоре: это 2-х ядерный notebook 1.6 GHz.

Ответить

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

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

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