@stvoid

Почему после компиляции своего ядра linux его размер в разы больше?

Последние несколько месяцев предпочитаю собирать ядро из исходников, чтобы было самое актуальное. Просто вот такие собственные заморочки, благо всё железо AMD и какие-никакие плюшки в последних версиях завозят.

Пока экспериментирую со сборкой под своё желео, но каждый раз теряю возможность либо диски подрубать, либо флешки, но не суть.

Больше всего интересует вопрос, почему дженерик ядра весят в разы меньше, в районе 130мб, а у меня после компиляции даже под локальное железо не меньше 400мб?
Сейчас собираю с olddefconfig, немного подправляя настройки, но всё равно не понимаю от чего это зависит всё. Нормальных ответов не нашел нигде.
Где-то просто написано, что собирать через make + make modules_install + make install
А где-то в гайдах собирают deb пакетами, которые потом устанавливают.

Так всё же, как лучше собирать ядро?
Почему такая большая разница при компиляции ядра и при использвовании готовых дженериков из репозиториев?
Может быть дополнительно кто-то даст ссылочку на хорошее руководство по важных параметрам конфига, потому что тоже с трудом ищется, а стандартные подсказки не всегда очевидно объясняют (например отключение рандомизации хипа - влияет ли на производительность? или просто фишка для безопасности?).
  • Вопрос задан
  • 331 просмотр
Пригласить эксперта
Ответы на вопрос 3
3vi1_0n3
@3vi1_0n3
Собирал свежие ядра пару лет под Дебиан, пока поддержку некоторого железа в пакетном не завезли через два релиза, потом перестал. Там очень много непонятного между пакетными ядрами и сборкой из исходников.
Несколько примеров:
1. По умолчанию куча новых модулей (не входящих в старые версии) включена. Если использовать конфиг от старого ядра, новые модули может понадобиться отключать руками.
2. По умолчанию куча модулей для старого железа включена.
3. Есть шанс, что определенные модули идут в разных пакетах и не входят в дженерик в дистрибутивных сборках, либо исключены совсем. Из сырцов вы получите всё, вообще всё, что есть в исходниках, либо в модулях, либо в основном ядре, если специально не отключать, в том числе кучу старых девайсов, которых у вас скорее всего нет, или платы видеозахвата, которые вам, например, не нужны.
4. Если хотите собрать ядро поменьше, придется внимательно читать информацию по железу и тратить реально дофига времени на то, чтобы оставить в монолитном куске только то, что нужно, включая все зависимости, остальное либо собирать модулями, либо отключать совсем.
5. Можно поотключать вообще всё и постепенно включать то, что имеет смысл. Грузиться нормально скорее всего сразу не будет, но по ошибкам обычно можно примерно понять куда копать.

Разобраться с этим списком быстро не будет. Можно взять конфиг из пакетного ядра, и начать копать от него, в любом случае это вопрос количества попыток, опыта и уровня понимания что там зачем. Scheduler, например. Есть возможность выбрать один из поддерживаемых, но надо знать, что это такое, и различия между ними. Где-то видел
статью про планировщики, возможно на хабре.

Я обычно собирал реально только то, что использовал, преемптивное ядро, плюс USB-устройства выборочно (клавы-мыши в монолит, то, что потенциально могу использовать - в модули), плюс поддержку в ядре файловых систем выборочно (одну, которая используется на корневом разделе, в монолит) и так далее. И после успешной загрузки проходил еще несколько раз и смотрел, что я могу еще отключить совсем, чтобы не собирать ненужное. Занимает обычно лютое количество времени, чтобы найти, прочитать и понять что там что, и довести до состояния "только необходимое плюс немного на перспективу". Собственно поэтому бросил этим страдать сразу как дистрибутивное ядро в пакетах проапдейтилось до нужной версии.

В плане как собирать, пакетом или через make - пакетом скорее всего удалится чище, руками не надо удалять ничего, и по размеру пакета можно оценить размер сборки сразу. Хотя это и так несложно, всё лежит в известных местах.

Руководства, которое объясняет, что надо, а что не надо, не видел никогда. Скорее всего потому, что всё очень быстро меняется, за полгода в ядро вливают кучу кода. Это было заметно даже во времена версий 2.4/2.6.
Поэтому make menuconfig и гуглить непонятное.
Ответ написан
@rPman
Если я верно помню, oldconfig берет конфигурацию из предыдущей сборки (а что там будет по умолчанию не совпадает с тем что выбрал мейнтейнер), т.е. из каталога с исходниками, а тебе, если ты хочешь подправить те что уже в дистрибутиве идут, то бери из /boot/config... (кстати помню для gentoo брал и копировал конфиг у ubuntu, решая таким образом проблемы с видео).

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

На практике, единственное, ради чего стоит заморачиваться с компиляцией ядра - это включение новых функций. Пример юзкейса, взять ядро cloud, заточенное на запуск в виртуальном окружении (оно очень компактное и виртуалка быстро грузится) и добавить там выключенный функционал (файловые системы например или отключенный raid или еще что)

p.s. ложка дегтя, за обновлениями придется следить самостоятельно, никакого функционала обычно в ОС для этого не встраивают
Помню в gentoo для этого была утилита genkernel но ее все равно запускать вручную
Ответ написан
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
дженерик ядра весят в разы меньше, в районе 130мб

Скооооолько?
(смотрю на оглавление /boot и ничего не понимаю - то ли лыжи не едут...)
wks-001:[root] 712> ls -la
total 47072
drwxr-xr-x  6 root root     4096 Nov 22 18:10 .
drwxr-xr-x 20 root root     4096 Nov 23 19:54 ..
-rw-r--r--  1 root root   212316 Apr 25  2023 config-5.15.82-calculate
-rw-------  1 root root 13361105 Nov 22 18:02 initramfs-5.15.82-calculate.img
-rw-r--r--  1 root root  3747325 Apr 25  2023 System.map-5.15.82-calculate
-rw-r--r--  1 root root  6480256 Apr 25  2023 vmlinuz-5.15.82-calculate


в gentoo для этого была утилита genkernel но ее все равно запускать вручную

В calculate есть cl-kernel, который сохранит старый конфиг, если есть, подгрузит типовой, если нет, покажет менюху для выбора настроек и сам все соберет

Правда, единственное для чего я лезу пересобирать ведро - увеличить размер буфера под системные сообщения (чтобы dmesg начинался с начала, а не с середины). Еще один раз понадобилось для VPN, как правило большинству юзеров ведро пересобирать незачем.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы