Сборка внешних модулей для работающего ядра

Я пытаюсь создать последние криптографические драйверы Linux для сервера Ubuntu. На сервере Ubuntu установлено работающее ядро, дополнительные компоненты и заголовки. Однако исходный код криптомодулей взят с GitHub Торвальда (а не с Ubuntu).

Я также работаю с документом по ядру Building External Modules. Я клонировал последнее ядро ​​с помощью:

git clone --depth=1 https://github.com/torvalds/linux.git 

Затем:

cd linux

Следующий:

$ make -C /usr/src/linux-headers-4.2.0-34 M=$PWD crypto
make: Entering directory '/usr/src/linux-headers-4.2.0-34'

  ERROR: Kernel configuration is invalid.
         include/generated/autoconf.h or include/config/auto.conf are missing.
         Run 'make oldconfig && make prepare' on kernel src to fix it.

make: Nothing to be done for 'crypto'.
make: Leaving directory '/usr/src/linux-headers-4.2.0-34'

И:

$ find /usr/src -name 'autoconf.h'
/usr/src/linux-headers-4.2.0-34-generic/include/generated/autoconf.h
$ find /usr/src -name 'auto.conf'
/usr/src/linux-headers-4.2.0-34-generic/include/config/auto.conf

И это:

$ find /usr/src -type d -name 'build'
/usr/src/linux-headers-4.2.0-34/tools/build
/usr/src/linux-headers-4.2.0-34-generic/include/config/build

Попытка использовать каталог build приводит к следующему:

$ make -C /usr/src/linux-headers-4.2.0-34/tools/build M=$PWD crypto
make: Entering directory '/usr/src/linux-headers-4.2.0-34/tools/build'
make: *** No rule to make target 'crypto'.  Stop.
make: Leaving directory '/usr/src/linux-headers-4.2.0-34/tools/build'

Я явно упускаю что-то очевидное. Это неудивительно, поскольку я почти ничего не знаю о kbuild. У меня есть действующая конфигурация и исходники в /usr/src, а новые файлы в $PWD/crypto. Мне непонятно, почему я создаю новую конфигурацию для существующей конфигурации.

Как мне обновить криптомодули ядра для работающего ядра, предоставленного кем-то другим?


person jww    schedule 26.03.2016    source источник
comment
Здесь: make -C /usr/src/linux-headers-4.2.0-34 M=$PWD crypto - вместо crypto должно быть modules.   -  person Tsyvarev    schedule 26.03.2016
comment
Спасибо @Tsyvarev. Это приводит к той же проблеме: ERROR: Kernel configuration is invalid. и добавляет новую проблему: cc1: fatal error: can’t open ‘kernel/bounds.s’ for writing: Permission denied compilation terminated.   -  person jww    schedule 26.03.2016
comment
Обычно ядро ​​Linux должно быть сконфигурировано перед сборкой. Отсутствие kernel/bounds.s обычно указывает на эту проблему. Используйте make menuconfig, make oldconfigили любую другую цель configure.   -  person Tsyvarev    schedule 26.03.2016
comment
Спасибо @Tsyvarev. Я предполагаю, что Ubuntu уже настроил его, и мне нужно только подключить существующую конфигурацию. can’t open ‘kernel/bounds.s’ - глядя на Kbuild, это связано с одним из тех глупых приемов, которые иногда придумывают разработчики. Вот комментарий по поводу хитрости: Мы используем внутренние правила kbuild, чтобы избежать сообщения об обновлении от make. Поэтому, чтобы избежать сообщения обновлено, они заменили его на не могу открыть ‘kernel/bounds.s’ для записи...   -  person jww    schedule 26.03.2016
comment
Вы не написали в своем сообщении с вопросом, что у вас есть wired in the existing configuration. Как вы это сделали? Скопировав .config файл?   -  person Tsyvarev    schedule 27.03.2016
comment
Спасибо @Tsyvarev. Я думаю, это один из вопросов, который необходимо обсудить в ответе. Документация ядра, похоже, не обсуждает это.   -  person jww    schedule 27.03.2016


Ответы (1)


На самом деле здесь нужно заботиться о двух вещах:

Совпадает ли работающая версия ядра с исходным кодом, который мы используем.
Поскольку ранее скомпилированное ядро ​​может не иметь всех зависимостей, которые могут использоваться в последней версии, при компиляции внешнего модуля с последний исходный код ядра может зависеть от любой части кода, которая присутствует только в последней версии. Поэтому рекомендуется использовать последнюю версию ядра, с которой мы используем внешний модуль.

Во-вторых, файл .config для компиляции ядра
Вы можете скопировать его из /boot/config(current-version)* вашей файловой системы в .config верхнего каталога исходного кода ядра. Текущую версию мы можем получить от uname -r

Таким образом, если работающая версия (проверьте с помощью команды uname -r) не совпадает с загруженным исходным кодом, вам необходимо скомпилировать и использовать новое ядро ​​или иным образом загрузить ту же версию ядра, что и работающее ядро. Для компиляции ядра используйте файл конфигурации, находящийся в загрузочном каталоге, скопируйте его, как указано выше.

Затем вы можете продолжить обычным способом компиляции внешнего модуля и загрузить его с работающим ядром без каких-либо проблем.

person Samrat Das    schedule 27.03.2016