Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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 раз, чтобы создать его.