Что делает" 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
    • зависит от другого via depends

    эти отношения опций делают ручное разрешение конфигурации еще сложнее.

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

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

make defconfig

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

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, etc. конфигурации.

    эти свойства не появляются на 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
    

    и выберите forces, чтобы этот параметр был true. См. также: 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 as:

    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 .файл config?


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


отсюда страница:

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

Если .config уже состоит из правил, найденных в Kconfig, тогда сделайте oldconfig по существу no-op.

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


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