Может ли кто-нибудь объяснить, что целевой "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 раз, чтобы создать его.