Bug 35795 - depinfo не находит builtin-модули по алиасу
Summary: depinfo не находит builtin-модули по алиасу
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: make-initrd (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: Alexey Gladkov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2018-12-18 17:25 MSK by Sergey V Turchin
Modified: 2020-03-06 14:13 MSK (History)
9 users (show)

See Also:


Attachments
kernel builtin modinfo (1.64 KB, patch)
2018-12-30 18:21 MSK, Alexey Gladkov
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Sergey V Turchin 2018-12-18 17:25:41 MSK
Например, `depinfo sha256` на i586 ругается.
На x86_64 тоже, если убрать sha256-ssse3.ko и sha256-mb.ko.
Comment 1 Alexey Gladkov 2018-12-19 15:03:24 MSK
На каком ядре вы это получили ?
Comment 2 Anton Farygin 2018-12-19 15:12:20 MSK
# depinfo sha256
module /lib/modules/4.19.8-un-def-alt1/kernel/arch/x86/crypto/sha256-ssse3.ko.gz
module /lib/modules/4.19.8-un-def-alt1/kernel/arch/x86/crypto/sha256-mb/sha256-mb.ko.gz
module /lib/modules/4.19.8-un-def-alt1/kernel/crypto/mcryptd.ko.gz

x86_64, Sisyphus
Comment 3 Anton Farygin 2018-12-19 15:14:46 MSK
похоже что от версии ядра это не зависит. А depinfo умеет вообще builtin модули искать ?

# zcat /proc/config.gz|fgrep -i sha256
CONFIG_CRYPTO_SHA256_SSSE3=m
CONFIG_CRYPTO_SHA256=y

# depinfo sha256
module /lib/modules/4.4.82-std-def-alt0.M80P.1/kernel/arch/x86/crypto/sha256-ssse3.ko
Comment 4 Anton Farygin 2018-12-19 15:25:11 MSK
Вероятно, проблема не в depinfo а в содержимом
/lib/modules/4.4.82-std-def-alt0.M80P.1/modules.builtin.bin
Comment 5 Sergey V Turchin 2018-12-19 15:27:13 MSK
Уберите sha256-ssse3.ko и sha256-mb.ko или пробуйте на i586.
Comment 6 Alexey Gladkov 2018-12-19 15:29:58 MSK
(В ответ на комментарий №3)
> похоже что от версии ядра это не зависит. А depinfo умеет вообще builtin модули
> искать ?

# grep crc16 /lib/modules/4.15.0-lks-wks-alt7/modules.builtin
kernel/lib/crc16.ko

# depinfo crc16
builtin crc16

Умеет.
Comment 7 Sergey V Turchin 2018-12-19 15:30:51 MSK
(В ответ на комментарий №1)
> На каком ядре вы это получили ?
i586 4.19.9
Comment 8 Alexey Gladkov 2018-12-19 15:31:51 MSK
(В ответ на комментарий №4)
> Вероятно, проблема не в depinfo а в содержимом
> /lib/modules/4.4.82-std-def-alt0.M80P.1/modules.builtin.bin

Очень на это похоже.
Comment 9 Anton Farygin 2018-12-19 15:34:07 MSK
В общем всё просто - 
#  depinfo sha256_generic
builtin sha256_generic

depinfo почему-то не умеет находить модуль по алиасу, если он вкомпилён в ядро.
Comment 10 Alexey Gladkov 2018-12-19 15:38:30 MSK
(В ответ на комментарий №9)
> В общем всё просто - 
> #  depinfo sha256_generic
> builtin sha256_generic
> 
> depinfo почему-то не умеет находить модуль по алиасу, если он вкомпилён в ядро.

# grep sha256_generic /lib/modules/4.15.0-lks-wks-alt7/modules.*
/lib/modules/4.15.0-lks-wks-alt7/modules.builtin:kernel/crypto/sha256_generic.ko

Что значит почему-то ? Очевидно почему ))
depinfo не может найти по алиасу потому что он ничего про него не знает. Если модуль вкомпилен, то алиаса не будет в базе. Только упоминание в modules.builtin.
Comment 11 Anton Farygin 2018-12-19 15:39:49 MSK
с файлом modules.builtin всё хорошо.

# fgrep sha256 /lib/modules/4.19.8-un-def-alt1/modules.builtin
kernel/crypto/sha256_generic.ko

Нужно что бы depinfo научился читать алиасы вкомпилённых в ядро модулей.
Comment 12 Anton Farygin 2018-12-19 15:40:24 MSK
А modprobe умеет же учитывать алиасы вкомпилированных модулей ? может быть есть какой-то интерфейс для того, что бы их прочитать.
Comment 13 Alexey Gladkov 2018-12-19 15:40:55 MSK
Это не я придумал. Так работает kmod. Если бы ядро клало инфу про вкомпиленные модули куда-нибудь, то kmod мог бы с этим работать.
Comment 14 Alexey Gladkov 2018-12-19 15:41:47 MSK
(В ответ на комментарий №12)
> А modprobe умеет же учитывать алиасы вкомпилированных модулей ?

Он использует ту же библиотеку libkmod.

> может быть есть какой-то интерфейс для того, что бы их прочитать.

Я не знаю такого.
Comment 15 Alexey Gladkov 2018-12-19 15:43:03 MSK
(В ответ на комментарий №11)
> Нужно что бы depinfo научился читать алиасы вкомпилённых в ядро модулей.

Для начала нужно научиться при собрке ядра их вынимать и класть в modules.*.
Comment 16 Alexey Gladkov 2018-12-19 15:50:14 MSK
Если алиасы будут в modules.alias, то depinfo будет их искать.

И кстати:

# modinfo sha256_generic 
modinfo: ERROR: Module sha256_generic not found.

# modprobe -D sha256_generic 
builtin sha256_generic

# modprobe -D sha256
insmod /lib/modules/4.15.0-lks-wks-alt7/kernel/arch/x86/crypto/sha256-ssse3.ko.xz 
insmod /lib/modules/4.15.0-lks-wks-alt7/kernel/crypto/mcryptd.ko.xz 
insmod /lib/modules/4.15.0-lks-wks-alt7/kernel/arch/x86/crypto/sha256-mb/sha256-mb.ko.xz

# depinfo sha256
module /lib/modules/4.15.0-lks-wks-alt7/kernel/arch/x86/crypto/sha256-ssse3.ko.xz
module /lib/modules/4.15.0-lks-wks-alt7/kernel/arch/x86/crypto/sha256-mb/sha256-mb.ko.xz
module /lib/modules/4.15.0-lks-wks-alt7/kernel/crypto/mcryptd.ko.xz

depinfo ведёт себя как modprobe.
Comment 17 Anton Farygin 2018-12-19 15:52:18 MSK
Да да, я тоже это нашёл.
Comment 18 Sergey V Turchin 2018-12-19 15:53:56 MSK
(В ответ на комментарий №15)
> Для начала нужно научиться при собрке ядра их вынимать и класть в modules.*.
depmod это тогда должен уметь делать.
Comment 19 Anton Farygin 2018-12-19 16:00:36 MSK
modprobe, кстати, каким-то образом узнаёт что sha256 вкомпилён в ядро как sha256_generic и его не надо грузить специально.
Comment 20 Sergey V Turchin 2018-12-19 16:03:51 MSK
(В ответ на комментарий №19)
> modprobe, кстати, каким-то образом узнаёт что sha256 вкомпилён в ядро как
> sha256_generic и его не надо грузить специально.
Не узнаёт. Достаточно убрать в сторонку sha256-ssse3.ko и sha256-mb.ko .
# modprobe sha256
modprobe: FATAL: Module sha256 not found in directory /lib/modules/4.19.9-un-def-alt1
Comment 21 Anton Farygin 2018-12-19 16:06:29 MSK
В libkmod явно есть код, который пытается получить список алиасов для builtin модулей.
См. kmod_lookup_alias_from_builtin_file
Comment 22 Alexey Gladkov 2018-12-19 16:12:50 MSK
> (В ответ на комментарий №15)
> > Для начала нужно научиться при собрке ядра их вынимать и класть в modules.*.
> depmod это тогда должен уметь делать.

depmod это всего лишь утилита. В модулях вся информация содержится и depmod её складывает в файлы. Про вкомпиленные модули инфы взять просто неоткуда. В /boot/vmlinuz её нет.

Ребят, это старая песня про зависимости. И это всё скорее про kmod и ядро чем про depinfo.
Comment 23 Alexey Gladkov 2018-12-19 16:14:22 MSK
(В ответ на комментарий №21)
> В libkmod явно есть код, который пытается получить список алиасов для builtin
> модулей.
> См. kmod_lookup_alias_from_builtin_file

Это поиск по modules.builtin.
Comment 24 Sergey V Turchin 2018-12-19 16:17:10 MSK
(В ответ на комментарий №21)
> См. kmod_lookup_alias_from_builtin_file
kmod_lookup_alias_is_builtin
Comment 25 Sergey V Turchin 2018-12-19 16:22:52 MSK
(В ответ на комментарий №23)
> > См. kmod_lookup_alias_from_builtin_file
> Это поиск по modules.builtin.
kmod_lookup_alias_is_builtin такой, а kmod_lookup_alias_from_builtin_file еще пытается делать kmod_module_new_from_name.
Comment 26 Alexey Gladkov 2018-12-19 16:35:10 MSK
(В ответ на комментарий №25)
> (В ответ на комментарий №23)
> > > См. kmod_lookup_alias_from_builtin_file
> > Это поиск по modules.builtin.
> kmod_lookup_alias_is_builtin такой, а kmod_lookup_alias_from_builtin_file еще
> пытается делать kmod_module_new_from_name.

Серёг, и что ?

kmod_module_new_from_name просто делает структуру по имени модуля, где alias будет пустым. Эта функция не делает ничего волшебного.

kmod НЕ может получить информацию о alias из builtin модулей. Эта информация должна предоставляться ядром потому что они все там.
Comment 27 Sergey V Turchin 2018-12-19 16:36:55 MSK
(В ответ на комментарий №26)
> kmod_module_new_from_name просто делает структуру по имени модуля, где alias
> будет пустым. Эта функция не делает ничего волшебного.
Ну, я её не читал и надеялся на волшебство. :-)
Comment 28 Anton Farygin 2018-12-19 16:43:14 MSK
В принципе в ядре в /proc есть другая полезная информация, из которой можно определить наличие нужных нам builtin модулей (/proc/crypto, /proc/kallsyms), но она естественно доступна только для работающего ядра.

А тут действительно - надо или выносить всем модули crypto из ядра, или придумывать какой-то механизм, герерирующий алиасы для builtin модулей на этапе сборки.
Comment 29 Alexey Gladkov 2018-12-19 16:47:33 MSK
(В ответ на комментарий №27)
> > kmod_module_new_from_name просто делает структуру по имени модуля, где alias
> > будет пустым. Эта функция не делает ничего волшебного.
> Ну, я её не читал и надеялся на волшебство. :-)

В depinfo я пытался выжать всё что можно из libkmod ((

Тут нужно что-то типа /boot/config-*, но для модулей. Я вообще не уверен, что инфу по алиасам можно вытянуть в момент компиляции. Наверно всё-таки можно.

(В ответ на комментарий №28)
> В принципе в ядре в /proc есть другая полезная информация, из которой можно
> определить наличие нужных нам builtin модулей (/proc/crypto, /proc/kallsyms),
> но она естественно доступна только для работающего ядра.

Угу. Поэтому это не вариант.

Есть ещё /boot/config-VER, где можно по CONFIG_* поискать, но это достаточно ненадёжно и условно получается. Плюс зависит от версии ядра.

> А тут действительно - надо или выносить всем модули crypto из ядра, или
> придумывать какой-то механизм, герерирующий алиасы для builtin модулей на этапе
> сборки.

Именно.
Comment 30 Anton Farygin 2018-12-19 16:52:18 MSK
sha256_generic вынести из ядра не получится, он нужен для kexec.
Comment 31 Anton Farygin 2018-12-19 16:54:25 MSK
Виталий и Сергей, не знаете, можно ли каким-то образом вычленить алиасы builtin модулей из собранного ядра ? Ну или на этапе сборки получить тот же список.
Comment 32 Alexey Gladkov 2018-12-19 16:56:50 MSK
(В ответ на комментарий №30)
> sha256_generic вынести из ядра не получится, он нужен для kexec.

У меня есть некоторый хак для обхода зависимостей:

https://github.com/legionus/make-initrd/tree/master/kmodule.deps.d
Comment 33 Vitaly Chikunov 2018-12-25 03:59:28 MSK
> можно ли каким-то образом вычленить алиасы builtin модулей из собранного ядра ?

Этой информации нет в vmlinux. Она создается только для будущих модулей (у кого CONFIG_X=m) в секции .modinfo. Для built-in модулей секция .modinfo не создается. Пролетали патчи, которые её создают, но они не прошли.
http://lkml.iu.edu/hypermail//linux/kernel/0512.0/0024.html
http://lkml.iu.edu/hypermail//linux/kernel/0501.3/2388.html

> Ну или на этапе сборки получить тот же список.

Только запарсить исходники ядра на MODULE_ALIAS.
Comment 34 Anton Farygin 2018-12-25 07:36:29 MSK
Тогда есть предложение расширять логику make-initrd по определению builtin модулей.
Comment 35 Anton Farygin 2018-12-25 07:37:51 MSK
Как второй вариант - пренебречь размером initramfs и укладывать в него все существующие модули ядра, включая firmware.
Comment 36 Alexey Gladkov 2018-12-25 21:41:58 MSK
(В ответ на комментарий №34)
> Тогда есть предложение расширять логику make-initrd по определению builtin
> модулей.

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

Я конечно могу "запарсить исходники ядра на MODULE_ALIAS" и дополнить информацию в modules.alias, но тогда для создания initrd будут требоваться исходники ядра.

С другой стороны, если бы это происходило во время сборки ядра и сохранялось например в /lib/modules/KVER/modules.builtin.alias, то это можно было бы использовать при генерации initrd.

Есть ещё вариант использовать System.map, но это хардкор и может захакать только конкретную проблему, а не общее решение.

(В ответ на комментарий №35)
> Как второй вариант - пренебречь размером initramfs и укладывать в него все
> существующие модули ядра, включая firmware.

Ну это всегда пожалуйста:

MODULES_ADD = ^.

и будет ubuntu-way
Comment 37 Anton Farygin 2018-12-25 21:44:43 MSK
Нет, я про то, что бы добавить явную зависимость у luks на sha256 в самом make-initrd.

Прям вот только для этого случая.
Comment 38 Alexey Gladkov 2018-12-25 21:48:57 MSK
(В ответ на комментарий №37)
> Нет, я про то, что бы добавить явную зависимость у luks на sha256 в самом
> make-initrd.
> 
> Прям вот только для этого случая.

Ты про вот эту зависимость:

https://github.com/legionus/make-initrd/blob/master/features/luks/config.mk#L8

?
Comment 39 Alexey Gladkov 2018-12-25 23:34:27 MSK
Антон, а можно ли у нас придумать какие-нибудь post-%install-скрипты для ядра, чтобы можно было после сборки ядра покопаться в RPM/BUILD и сгенерировать дополнительную инфу ?

Тогда я бы мог сделать скрипт для дерева ядра и ответную часть в фичу оформить.
Comment 40 Anton Farygin 2018-12-26 07:37:20 MSK
Про зависимость: да - зависимость эта, но как-то нужно make-initrd сказать что у нас sha256_generic всегда builtin.

Про скрипты: Можно придумать, почему нет.
Я же правильно понял - тебя интересует некий rpm макрос, который будет выполняться сразу после сборки и установки ядра ?

boyarsh@ : Антон, нет возражений ?
Comment 41 Anton V. Boyarshinov 2018-12-26 12:38:48 MSK
(В ответ на комментарий №39)
> Антон, а можно ли у нас придумать какие-нибудь post-%install-скрипты для ядра,
> чтобы можно было после сборки ядра покопаться в RPM/BUILD и сгенерировать
> дополнительную инфу ?

Если будет какой-то скрипт, то запускать его в процессе сборки наших ядер -- не проблема.
Comment 42 Alexey Gladkov 2018-12-26 18:18:31 MSK
(В ответ на комментарий №40)
> Про зависимость: да - зависимость эта, но как-то нужно make-initrd сказать что
> у нас sha256_generic всегда builtin.

Нужно подумать как это лучше сделать.

> Про скрипты: Можно придумать, почему нет.
> Я же правильно понял - тебя интересует некий rpm макрос, который будет
> выполняться сразу после сборки и установки ядра ?

Да.

Я попробую сделать утилиту, которая будет собирать дополнительную информацию про ядро. Если его выполнять при сборке ядра и паковать результаты, то make-initrd будет умнее. Такой у меня план.
Comment 43 Alexey Gladkov 2018-12-30 18:21:54 MSK
Created attachment 7929 [details]
kernel builtin modinfo

Мы тут с Глебом попили пиво и получился вот такой патч. Нужно будет ещё научить kmod читать и понимать эту информацию.
Comment 44 Alexey Gladkov 2019-01-21 13:23:28 MSK
Антон, приложите пожалуйста патчик к ядрам в сизифе.
Comment 45 Anton V. Boyarshinov 2019-01-21 16:11:14 MSK
(В ответ на комментарий №44)
> Антон, приложите пожалуйста патчик к ядрам в сизифе.

Ага, что-то я пропустил письмо с патчем, видимо, по случаю нового года, приложу.
Comment 46 Anton V. Boyarshinov 2019-01-21 16:27:05 MSK
(В ответ на комментарий №45)
> (В ответ на комментарий №44)
> > Антон, приложите пожалуйста патчик к ядрам в сизифе.
> 
> Ага, что-то я пропустил письмо с патчем, видимо, по случаю нового года,
> приложу.

Будет в следующем std-def в Сизифе
Comment 47 Anton Farygin 2019-01-22 08:56:39 MSK
Ещё к un-def, пожалуйста.
Comment 48 Alexey Gladkov 2019-01-23 00:50:30 MSK
make-initrd с поддержкой kernel.builtin.modinfo уже в сизифе.
Comment 49 Alexey Gladkov 2019-01-25 15:55:10 MSK
При наличии kernel.builtin.modinfo depinfo из make-initrd-2.2.8 ищет по алиасам вкомпиленных модулей.
Comment 50 Sergey V Turchin 2020-01-16 11:37:55 MSK
make-initrd-2.3.0-alt1.x86_64
5.4.11-un-def-alt1
# grep sha256 modules.builtin 
kernel/crypto/sha256_generic.ko
kernel/lib/crypto/libsha256.ko
В modules.builtin.modinfo буквы "sha256_generic" тоже есть.
Удаляю sha256-ssse3.ko.gz, делаю `depmod -a`, после чего

# depinfo sha256
depinfo: ERROR: Module sha256 not found.
Comment 51 Sergey V Turchin 2020-01-16 11:55:58 MSK
make-initrd, соответственно:
Adding modules (postload) ...
add-module: No module "sha256" found for kernel 5.4.11-un-def-alt1
make: *** [/usr/share/make-initrd/features/add-modules/rules.mk:31: load-modules] Ошибка 1
make: *** [/usr/share/make-initrd/mk/make-initrd.mk:29: all] Ошибка 1
Comment 52 Alexey Gladkov 2020-03-06 13:23:12 MSK
Исправлено в make-initrd-2.4.0-alt1