it-swarm.com.ru

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

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

64
fred basset

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

107
Ignacio Vazquez-Abrams

Перед запуском '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
20
Angelo Babudro

Резюме

Как уже упоминалось 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 и т.д. Config.

    Эти свойства не отображались в 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/automatics-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
Let_Me_Be

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

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

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

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

2
Nan Xiao

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

0
Danial