Что делает "make oldconfig" именно в make-файле ядра Linux? - PullRequest
68 голосов
/ 14 ноября 2010

Может кто-нибудь объяснить, что именно делает цель "oldconfig" в make-файле ядра Linux?Я вижу, что на это есть ссылка в какой-то документации по сборке, но никогда не объяснял, что именно делает.

Ответы [ 6 ]

110 голосов
/ 14 ноября 2010

Читает существующий файл .config и запрашивает у пользователя параметры в текущем исходном коде ядра, которые не найдены в файле. Это полезно, если взять существующую конфигурацию и переместить ее в новое ядро.

20 голосов
/ 09 мая 2014

Перед запуском '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
17 голосов

Резюме

Как уже упоминалось от Ignacio , он обновляет ваш .config для вас после обновления источника ядра, например, с git pull.

Он пытается сохранить ваши существующие параметры.

Наличие сценария для этого полезно, потому что:

  • возможно, были добавлены новые опции или удалены старые

  • формат конфигурации ядра Kconfig имеет следующие параметры:

    • подразумевают друг друга через select
    • зависит от другого через depends

    Эти отношения параметров делают разрешение ручной настройки еще сложнее.

Давайте изменим .config вручную, чтобы понять, как он разрешает конфигурации

Сначала создайте конфигурацию по умолчанию с помощью:

make defconfig

Теперь отредактируйте созданный файл .config вручную, чтобы эмулировать обновление ядра, и запустите:

make oldconfig

чтобы увидеть, что происходит. Некоторые выводы:

  1. Линии типа:

    # 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, это не считается.

  2. Линии типа:

    # 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 нас не спросят.

  3. Конфиги, чьи зависимости не встречаются, не отображаются на .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 был выключен, они вообще не появлялись.

  4. Конфиги, которые являются 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

  5. Запрашиваются конфигурации, ограничения которых не выполняются.

    Например, 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, но у нас на .config установлено 64, что делает его несовместимым.

Бонусы

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, это не так просто: Как неинтерактивно включать функции в файле .config ядра Linux?

5 голосов
/ 14 ноября 2010

Обновляет старую конфигурацию с новыми / измененными / удаленными параметрами.

2 голосов
/ 28 июля 2015

С этой страницы :

Make oldconfig берет .config и запускает его по правилам Kconfig файлы и создает .config, который совместим с Правила Kconfig. Если есть значения CONFIG, которые отсутствуют, сделать oldconfig попросит их.

Если .config уже соответствует правилам, найденным в Kconfig, тогда make oldconfig по сути не работает.

Если вы запустите make oldconfig, а затем запустите make oldconfig a второй раз, второй раз не вызовет каких-либо дополнительных изменений сделал.

0 голосов
/ 27 декабря 2016

Это пытка. Вместо того, чтобы включать общий файл conf, они заставляют вас нажимать return 9000 раз, чтобы сгенерировать его.

...