Может ли кто-нибудь объяснить, что целевой "oldconfig" делает именно в make файле ядра Linux? Я вижу, что он упоминается в некоторой сборке документации, но никогда не объяснил, что именно он делает.
Что делает "make oldconfig" делать именно в make файле ядра Linux?
Ответ 1
Он читает существующий файл .config
и запрашивает у пользователя параметры в текущем источнике ядра, которые не найдены в файле. Это полезно при использовании существующей конфигурации и перемещении ее в новое ядро.
Ответ 2
Перед запуском 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
Ответ 3
Резюме
Как упоминалось от Ignacio, он обновляет ваш .config
для вас после обновления исходного кода ядра, например. с git pull
.
Он пытается сохранить существующие параметры.
Наличие script для этого полезно, потому что:
-
могут быть добавлены новые параметры или удалены старые.
-
В конфигурационном файле ядра Kconfig есть опции, которые:
- подразумевают друг друга через
select
- зависят от другого через
depends
Эти отношения параметров делают ручное конфигурационное разрешение еще сложнее.
- подразумевают друг друга через
Модифицировать .config вручную, чтобы понять, как он разрешает конфигурации
Сначала создайте конфигурацию по умолчанию с помощью:
make defconfig
Теперь отредактируйте созданный файл .config
вручную, чтобы эмулировать обновление ядра и запустить:
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
и т.д. Configs.Эти свойства ранее не отображались на
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
script: fooobar.com/questions/95432/...
И если вы хотите автоматизировать модификацию .config
, это не так просто: Как вы неинтерактивно включаете функции в файле .config ядра Linux?
Ответ 4
Обновляет старую конфигурацию с новыми/измененными/удаленными параметрами.
Ответ 5
Из этого страница:
Сделать oldconfig взятым .config и запускать его по правилам Kconfig и создает .config, который совместим с Правила Kconfig. Если есть значения CONFIG, которые отсутствуют, make oldconfig попросит их.
Если .config уже соответствует правилам, найденным в Kconfig, то make oldconfig по существу не работает.
Если вы должны запустить make oldconfig, а затем запустите make oldconfig a второй раз, второй раз не приведет к дополнительным изменениям сделал.
Ответ 6
Это пытка. Вместо того, чтобы включать общий файл conf, они заставляют вас ударять 9000 раз, чтобы создать его.