Что именно делает" make oldconfig " в файле makefile ядра Linux?


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

6 60

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

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

  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, но у нас было 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 второй раз, второй раз не вызовет никаких дополнительных изменений, чтобы быть сделанный.

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