Що саме робить “make oldconfig” у файлі make ядра Linux?


82

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

Відповіді:


127

Він зчитує існуючий .configфайл і пропонує користувачеві параметри в поточному джерелі ядра, яких у файлі немає. Це корисно при прийнятті існуючої конфігурації та переміщенні її до нового ядра.


привіт, я протестував з u-boot кодом (він також використовує Kconfig). Я використав 'make menuconfig' і встановив його на охорону архітектури (і був створений новий файл .config. Архітектура за замовчуванням - Пісочниця.). тоді я зробив 'make menuconfig' і виявив, що архітектура arm все-таки була обрана. Отже, якщо є .config, "make menuconfig" починається з цього файлу .config. Тож цілі 'menuconfig' та 'oldconfig' однакові по суті?
Чан Кім

Я думаю, menuconfig та oldconfig починаються з .config. Тільки oldconfig припускає, що .config походить зі старого ядра і заповнює нові конфігураційні змінні в поточному ядрі.
Чан Кім

25

Перед запуском 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
Не будуйте ядро ​​як root! см youtube.com/watch?v=fMeH7wqOwXA#t=15m44s
Тед

24

Резюме

Як згадував 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)
    

    with 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
    

    і виберіть сили, щоб цей параметр був істинним. Дивіться також: /unix/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узгодженість у випадку, якщо ви змінили його вручну, як ми це зробили. Дивіться також: /server/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

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


2

З цієї сторінки :

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

Якщо .config вже відповідає правилам, знайденим у Kconfig, то make oldconfig по суті є забороною.

Якщо вам потрібно було запустити make oldconfig, а потім запустити make oldconfig вдруге, другий раз не спричинить жодних додаткових змін.


1

Це катування. Замість того, щоб включати загальний файл конф, вони змушують вас повернутись 9000 разів, щоб створити його.


6
Спробуйте:yes "" | make oldconfig
Рей Доннеллі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.