Вопрос или проблема
Я только что перекомпилировал ядро Ubuntu Jammy HWE 6.8.0-45, следуя этим шагам:
# Клонируем репозиторий стандартного ядра Ubuntu
git clone git://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/jammy
cd jammy
git checkout Ubuntu-hwe-6.8-6.8.0-45.45_22.04.1
# Зависимости для сборки
sudo apt build-dep linux linux-image-unsigned-`uname -r`
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev fakeroot libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf llvm dwarves
# Удалить все
fakeroot debian/rules clean && make ARCH=x86 mrproper && git clean -fd && git restore . && git clean -fd && git restore .
# внести пользовательские изменения
code debian.hwe-6.8/changelog # Добавить пользовательскую версию
code include/linux/uts.h # Изменить UTS_SYSNAME
# Обновить конфигурации Debian
chmod a+x debian/rules && chmod a+x debian/scripts/* && chmod a+x debian/scripts/misc/*
fakeroot debian/rules clean
fakeroot debian/rules editconfigs
# Начать сборку
fakeroot debian/rules binary-headers binary-generic
Мне было интересно, как я могу перекомпилировать только модуль ‘iwlwifi.ko‘ без перекомпиляции всего ядра.
Я попытался выполнить стандартную перекомпиляцию из корневой директории исходников ядра, запустив:
make -j$(nproc) M=drivers/net/wireless/intel/iwlwifi modules
Но при попытке вставить его я получаю:
> sudo insmod drivers/net/wireless/intel/iwlwifi/iwlwifi.ko
insmod: ERROR: не удалось вставить модуль drivers/net/wireless/intel/iwlwifi/iwlwifi.ko: Неверные параметры
А dmesg
сообщает:
[10754.522405] BPF: [139328] ENUM x509_key_exit
[10754.522410] BPF: size=4 vlen=34
[10754.522410] BPF:
[10754.522411] BPF: Неверное имя
[10754.522412] BPF:
[10754.522413] не удалось проверить модуль [iwlwifi] BTF: -22
Думаю, должен быть способ использовать механизм fakeroot debian/rules
для перекомпиляции только одного модуля, не очищая все и не собирая заново все ядро.
Спасибо за поддержку.
Я думаю, я нашел правильную формулу!
cp /boot/config-$(uname -r) .config
make oldconfig scripts prepare modules_prepare
cp /usr/src/linux-headers-$(uname -r)/Module.symvers .
make -j 24 M=drivers/net/wireless/intel/iwlwifi/
sudo insmod drivers/net/wireless/intel/iwlwifi/iwlwifi.ko
Вот и всё 🙂
Ответ или решение
Чтобы перекомпилировать только один модуль ядра, например iwlwifi.ko
, в Ubuntu с ядром Jammy HWE, выполните следующие шаги. Предполагается, что у вас уже настроены исходные коды ядра и необходимые зависимости, как вы указали в вопросе.
Шаги для перекомпиляции модуля iwlwifi.ko
:
-
Скопируйте конфигурацию ядра:
Сначала вам нужно скопировать конфигурацию текущего ядра в файл.config
:cp /boot/config-$(uname -r) .config
-
Подготовьте конфигурацию:
Затем выполните следующие команды для подготовки исходного кода:make oldconfig scripts prepare modules_prepare
-
Скопируйте
Module.symvers
:
Этот файл нужен для разрешения зависимостей между модулями. Скопируйте его из заголовков текущего ядра:cp /usr/src/linux-headers-$(uname -r)/Module.symvers .
-
Сборка модуля iwlwifi:
Теперь выполните команду для сборки конкретного модуля:make -j$(nproc) M=drivers/net/wireless/intel/iwlwifi
-
Загрузка модуля:
После успешной сборки можно загрузить модуль с командой:sudo insmod drivers/net/wireless/intel/iwlwifi/iwlwifi.ko
Что делать в случае ошибок:
Если при загрузке модуля возникают ошибки, такие как "Invalid parameters" или ошибки BPF, убедитесь, что:
- Вы все еще работаете с исходным кодом и конфигурацией, соответствующими версии ядра, в которой вы пытаетесь собрать модуль.
- Необходимо провести проверку случаев, когда модули могут конфликтовать или когда версия модуля не совместима с загруженным ядром. Это может происходить, если вы не обновили зависимости или не добавили соответствующие параметры.
Заключение
Перекомпиляция отдельных модулей ядра может быть деликатной задачей, но с правильной подготовкой и командой, это можно сделать эффективно. Убедитесь в том, что вы работаете с актуальной конфигурацией и не забывайте проверять логи ошибок для диагностики возможных проблем.