Что именно делает" make oldconfig " в файле makefile ядра Linux?
может ли кто-нибудь объяснить, что именно делает целевой "oldconfig" в файле makefile ядра Linux? Я вижу, что на него ссылаются в какой-то документации по сборке, но никогда не объяснял, что именно он делает.
6 ответов:
он читает существующий
.configfile и запрашивает у пользователя параметры в текущем источнике ядра, которые не найдены в файле. Это полезно при принятии существующей конфигурации и перемещении ее в новое ядро.
перед запуском 'make oldconfig' необходимо скопировать файл конфигурации ядра из старого ядра в корневой каталог нового ядра.
вы можете найти копию старого файла конфигурации ядра на работающей системе в
/boot/config-3.11.0. Кроме того, исходный код ядра имеет конфигурации вlinux-3.11.0/arch/x86/configs/{i386_defconfig / x86_64_defconfig}Если ваш источник ядра находится в /usr/src / linux
cd /usr/src/linux cp /boot/config-3.9.6-gentoo .config make oldconfig
резюме
как уже упоминалось Игнасио, он обновляет свой
.configдля вас после обновления исходного кода ядра, например, с помощьюgit pull.он пытается сохранить существующие варианты.
наличие сценария для этого полезно, потому что:
новые опции могут быть добавлены, или старые удалены
формат конфигурации Kconfig ядра имеет параметры что:
- подразумевают друг друга через
select- зависит от другого через
dependsэти отношения параметров делают ручное разрешение конфигурации еще сложнее.
давайте .настройка вручную, чтобы понять, как он разрешает конфигурации
сначала создайте конфигурацию по умолчанию с помощью:
make defconfigтеперь отредактируйте сгенерированный вручную эмулируйте обновление ядра и запустите:
make oldconfigчтобы увидеть, что происходит. Некоторые выводы:
строки типа:
# CONFIG_XXX is not setне просто комментарии, а фактически указывают, что параметр не установлен.
например, если мы удалим строку:
# CONFIG_DEBUG_INFO is not setи работать
make oldconfig, он спросит нас:Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)когда все закончится, то
.configфайл будет обновлен.если вы измените какие-либо характер линии, например,
# CONFIG_DEBUG_INFO, это не в счет.строки типа:
# CONFIG_XXX is not setвсегда используются для отрицания свойства, хотя:
CONFIG_XXX=nтакже понимается как отрицание.
например, если вы удалите
# CONFIG_DEBUG_INFO is not setи ответ:Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)С
N, то выходной файл содержит:# CONFIG_DEBUG_INFO is not setи
CONFIG_DEBUG_INFO=nкроме того, если мы вручную измените строку на:
CONFIG_DEBUG_INFO=nи работать
make oldconfig, затем строка изменяется на:# CONFIG_DEBUG_INFO is not setбез
oldconfigспрашивая нас.конфигурации, зависимости которых не выполняются, не отображаются на
.config. Как и все остальные.например, установил:
CONFIG_DEBUG_INFO=yи работать
make oldconfig. Теперь он попросит нас:DEBUG_INFO_REDUCED,DEBUG_INFO_SPLITи т. д. конфигурации.эти свойства не появляются на
defconfigдо.если мы посмотрим под
lib/Kconfig.debugгде они определены, мы видим, что они зависят отDEBUG_INFO:config DEBUG_INFO_REDUCED bool "Reduce debugging information" depends on DEBUG_INFOкогда
DEBUG_INFOбыл выключен, они вообще не появлялись.конфиги, которые
, еслиselectedпри включении конфигурации автоматически устанавливаются без запроса пользователя.CONFIG_X86=yи мы убираем строку:CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=yи работать
make oldconfig, линия воссоздается, не спрашивая нас, в отличие отDEBUG_INFO.это происходит потому, что
arch/x86/Kconfigсодержит:config X86 def_bool y [...] select ARCH_MIGHT_HAVE_PC_PARPORTи выбрать сил, чтобы быть правдой. См. также: https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig
запрашиваются конфигурации, ограничения которых не выполняются.
например,
defconfigустановил:CONFIG_64BIT=y CONFIG_RCU_FANOUT=64если мы редактируем:
CONFIG_64BIT=nи работать
make oldconfig, он спросит нас:Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)это так
RCU_FANOUTопределена вinit/Kconfigкак:, безconfig RCU_FANOUT int "Tree-based hierarchical RCU fanout value" range 2 64 if 64BIT range 2 32 if !64BIT64BIT, максимальное значение составляет32, но у нас было64установить на.config, которое сделало бы его противоречивым.бонусы
make olddefconfigустанавливает для каждого параметра значение по умолчанию, не спрашивая в интерактивном режиме. Он запускается автоматически наmakeдля того чтобы обеспечить что.configявляется последовательным в случае, если вы изменили его вручную, как мы сделали. См. также: https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree
make alldefconfigкакmake olddefconfig, но он также принимает фрагмент конфигурации для слияния. Эта цель используетсяmerge_config.shскрипт:https://stackoverflow.com/a/39440863/895245и если вы хотите автоматизировать
.configизменение, это не слишком просто: как вы неинтерактивно включаете функции в ядре Linux .конфигурационный файл?
отсюда страница:
сделать oldconfig берет .config и запускает его по правилам Kconfig файлы и производит .конфигурация, которая согласуется с Правила Рейнхард. Если есть значения конфигурации, которые отсутствуют, сделать oldconfig будет просить за них.
Если .конфигурация уже соответствует правилам, найденным в Kconfig, затем сделать oldconfig-это, по сути, нет.
Если вы должны были запустить make oldconfig, а затем запустите make oldconfig a второй раз, второй раз не вызовет никаких дополнительных изменений, чтобы быть сделанный.