Конфигурация ядра Linux

Я использую Gentoo, и обычный путь к сборке лежит через make nconfig, что чревато тем, что рано или поздно ты забываешь о том, какую конфигурацию ты используешь. Файл .config в этом не помошник, так как он не отделяет выбранные пользователем параметры от тех, которые выбрались по зависимости.

Итак, как это выглядит

  1. В директории /usr/src/local у меня находится файл Kconfig примерно такого содержания:

     config LENOVO_G500
        bool "Lenovo G500"
        default y
    
        # crypto
        select DM_CRYPT
        select CRYPTO_AES_NI_INTEL
        select CRYPTO_USER_API_SKCIPHER
    
        # qemu
        select KVM
        select KVM_INTEL
    
        # ethernet
        select ALX
    
        # wireless card
        select ATH_CARDS
        select ATH9K
        select CFG80211_WEXT
    

Спецификацию формата можно подробно узнать в документации к ядру https://github.com/torvalds/linux/blob/master/Documentation/kbuild/kconfig-language.txt, но на деле придется пользоваться только select SOMETHING, что выбирает CONFIG_SOMETHING таким же образом, как это было бы выбрано с помощью nconfig.

  1. В основной файл Kconfig ядра добавляется созданный файл Kconfig

    echo 'source "../local/Kconfig"' >> /usr/src/linux/Kconfig
    
  2. С помощью make nconfig привычным образом находим нужные нам опции, после чего добавляем их в файл /usr/src/local/Kconfig.

  3. Сборка ядра теперь выглядит таким образом

    make defconfig
    make -j$(nproc)
    

Что в итоге

Вся конфигурация ядра прозрачна, и больше не нужно вспоминать те опции, которые были выбраны, при этом при сборке нового ядра достаточно добавить одну строчку в /usr/src/linux/Kconfig. Единственным недостатком является отсутствие возможности выбрать с помощью Kconfig определенную опцию модулем. Если кто-то знает как это сделать – напишите мне на почту, пожалуйста, а то я уже всерьез намереваюсь отправлять патчи в апстрим.

На деле, как я думаю очевидно, я не выполняю все перечисленные команды руками, поэтому вот небольшие скрипты:

    user@localhost /usr/src $ cat run_after_update.sh
    #!/bin/bash
    grep local /usr/src/linux/Kconfig && exit
    echo 'source "../local/Kconfig"' >> /usr/src/linux/Kconfig
    /usr/src/rebuild.sh
    emerge @module-rebuild

    user@localhost /usr/src $ cat rebuild.sh
    #!/bin/bash
    set -eux
    cd /usr/src/linux
    make defconfig
    make -j9
    make modules
    make modules_install
    make install
    genkernel initramfs --luks --lvm
    grub-mkconfig -o /boot/grub/grub.cfg