Хто-небудь може пояснити, що цільовий "oldconfig" робить саме у файлі make ядра Linux? Я бачу, що на нього посилаються в якійсь будівельній документації, але я ніколи не пояснював, що саме він робить.
Хто-небудь може пояснити, що цільовий "oldconfig" робить саме у файлі make ядра Linux? Я бачу, що на нього посилаються в якійсь будівельній документації, але я ніколи не пояснював, що саме він робить.
Відповіді:
Він зчитує існуючий .config
файл і пропонує користувачеві параметри в поточному джерелі ядра, яких у файлі немає. Це корисно при прийнятті існуючої конфігурації та переміщенні її до нового ядра.
Перед запуском 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
Резюме
Як згадував Ignacio , він оновлює ваш .config
для вас після оновлення джерела ядра, наприклад git pull
.
Він намагається зберегти ваші наявні варіанти.
Наявність сценарію для цього корисно, оскільки:
Можливо, були додані нові опції або видалено старі
Формат конфігурації ядра 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)
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
питаючи нас.
Налаштування, залежності яких не виконуються, не відображаються на .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
було, вони взагалі не з’являлись.
Конфігурації 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
Просять конфігурації, обмеження яких не виконуються.
Наприклад, 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?
З цієї сторінки :
Make oldconfig бере файл .config і запускає його за правилами файлів Kconfig і створює файл .config, який відповідає правилам Kconfig. Якщо відсутні значення CONFIG, яких немає, make oldconfig запитає їх.
Якщо .config вже відповідає правилам, знайденим у Kconfig, то make oldconfig по суті є забороною.
Якщо вам потрібно було запустити make oldconfig, а потім запустити make oldconfig вдруге, другий раз не спричинить жодних додаткових змін.
Це катування. Замість того, щоб включати загальний файл конф, вони змушують вас повернутись 9000 разів, щоб створити його.
yes "" | make oldconfig