Что именно делает" make oldconfig " в файле makefile ядра Linux?
может ли кто-нибудь объяснить, что именно делает целевой "oldconfig" в файле makefile ядра Linux? Я вижу, что на него ссылаются в какой-то документации по сборке, но никогда не объяснял, что именно он делает.
6 ответов:
он читает существующий
.config
file и запрашивает у пользователя параметры в текущем источнике ядра, которые не найдены в файле. Это полезно при принятии существующей конфигурации и перемещении ее в новое ядро.
перед запуском '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 !64BIT
64BIT
, максимальное значение составляет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 второй раз, второй раз не вызовет никаких дополнительных изменений, чтобы быть сделанный.