Summary: | depinfo не находит builtin-модули по алиасу | ||||||
---|---|---|---|---|---|---|---|
Product: | Sisyphus | Reporter: | Sergey V Turchin <zerg> | ||||
Component: | make-initrd | Assignee: | Alexey Gladkov <legion> | ||||
Status: | CLOSED FIXED | QA Contact: | qa-sisyphus | ||||
Severity: | normal | ||||||
Priority: | P3 | CC: | antohami, boyarsh, glebfm, ldv, legion, placeholder, rider, sbolshakov, vsu, vt | ||||
Version: | unstable | ||||||
Hardware: | all | ||||||
OS: | Linux | ||||||
Attachments: |
|
Description
Sergey V Turchin
2018-12-18 17:25:41 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 похоже что от версии ядра это не зависит. А 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 Вероятно, проблема не в depinfo а в содержимом /lib/modules/4.4.82-std-def-alt0.M80P.1/modules.builtin.bin Уберите sha256-ssse3.ko и sha256-mb.ko или пробуйте на i586. (В ответ на комментарий №3) > похоже что от версии ядра это не зависит. А depinfo умеет вообще builtin модули > искать ? # grep crc16 /lib/modules/4.15.0-lks-wks-alt7/modules.builtin kernel/lib/crc16.ko # depinfo crc16 builtin crc16 Умеет. (В ответ на комментарий №1)
> На каком ядре вы это получили ?
i586 4.19.9
(В ответ на комментарий №4) > Вероятно, проблема не в depinfo а в содержимом > /lib/modules/4.4.82-std-def-alt0.M80P.1/modules.builtin.bin Очень на это похоже. В общем всё просто - # depinfo sha256_generic builtin sha256_generic depinfo почему-то не умеет находить модуль по алиасу, если он вкомпилён в ядро. (В ответ на комментарий №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. с файлом modules.builtin всё хорошо. # fgrep sha256 /lib/modules/4.19.8-un-def-alt1/modules.builtin kernel/crypto/sha256_generic.ko Нужно что бы depinfo научился читать алиасы вкомпилённых в ядро модулей. А modprobe умеет же учитывать алиасы вкомпилированных модулей ? может быть есть какой-то интерфейс для того, что бы их прочитать. Это не я придумал. Так работает kmod. Если бы ядро клало инфу про вкомпиленные модули куда-нибудь, то kmod мог бы с этим работать. (В ответ на комментарий №12) > А modprobe умеет же учитывать алиасы вкомпилированных модулей ? Он использует ту же библиотеку libkmod. > может быть есть какой-то интерфейс для того, что бы их прочитать. Я не знаю такого. (В ответ на комментарий №11) > Нужно что бы depinfo научился читать алиасы вкомпилённых в ядро модулей. Для начала нужно научиться при собрке ядра их вынимать и класть в modules.*. Если алиасы будут в 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. Да да, я тоже это нашёл. (В ответ на комментарий №15) > Для начала нужно научиться при собрке ядра их вынимать и класть в modules.*. depmod это тогда должен уметь делать. modprobe, кстати, каким-то образом узнаёт что sha256 вкомпилён в ядро как sha256_generic и его не надо грузить специально. (В ответ на комментарий №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 В libkmod явно есть код, который пытается получить список алиасов для builtin модулей. См. kmod_lookup_alias_from_builtin_file > (В ответ на комментарий №15)
> > Для начала нужно научиться при собрке ядра их вынимать и класть в modules.*.
> depmod это тогда должен уметь делать.
depmod это всего лишь утилита. В модулях вся информация содержится и depmod её складывает в файлы. Про вкомпиленные модули инфы взять просто неоткуда. В /boot/vmlinuz её нет.
Ребят, это старая песня про зависимости. И это всё скорее про kmod и ядро чем про depinfo.
(В ответ на комментарий №21) > В libkmod явно есть код, который пытается получить список алиасов для builtin > модулей. > См. kmod_lookup_alias_from_builtin_file Это поиск по modules.builtin. (В ответ на комментарий №21) > См. kmod_lookup_alias_from_builtin_file kmod_lookup_alias_is_builtin (В ответ на комментарий №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. (В ответ на комментарий №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 модулей. Эта информация должна предоставляться ядром потому что они все там.
(В ответ на комментарий №26) > kmod_module_new_from_name просто делает структуру по имени модуля, где alias > будет пустым. Эта функция не делает ничего волшебного. Ну, я её не читал и надеялся на волшебство. :-) В принципе в ядре в /proc есть другая полезная информация, из которой можно определить наличие нужных нам builtin модулей (/proc/crypto, /proc/kallsyms), но она естественно доступна только для работающего ядра. А тут действительно - надо или выносить всем модули crypto из ядра, или придумывать какой-то механизм, герерирующий алиасы для builtin модулей на этапе сборки. (В ответ на комментарий №27) > > kmod_module_new_from_name просто делает структуру по имени модуля, где alias > > будет пустым. Эта функция не делает ничего волшебного. > Ну, я её не читал и надеялся на волшебство. :-) В depinfo я пытался выжать всё что можно из libkmod (( Тут нужно что-то типа /boot/config-*, но для модулей. Я вообще не уверен, что инфу по алиасам можно вытянуть в момент компиляции. Наверно всё-таки можно. (В ответ на комментарий №28) > В принципе в ядре в /proc есть другая полезная информация, из которой можно > определить наличие нужных нам builtin модулей (/proc/crypto, /proc/kallsyms), > но она естественно доступна только для работающего ядра. Угу. Поэтому это не вариант. Есть ещё /boot/config-VER, где можно по CONFIG_* поискать, но это достаточно ненадёжно и условно получается. Плюс зависит от версии ядра. > А тут действительно - надо или выносить всем модули crypto из ядра, или > придумывать какой-то механизм, герерирующий алиасы для builtin модулей на этапе > сборки. Именно. sha256_generic вынести из ядра не получится, он нужен для kexec. Виталий и Сергей, не знаете, можно ли каким-то образом вычленить алиасы builtin модулей из собранного ядра ? Ну или на этапе сборки получить тот же список. (В ответ на комментарий №30) > sha256_generic вынести из ядра не получится, он нужен для kexec. У меня есть некоторый хак для обхода зависимостей: https://github.com/legionus/make-initrd/tree/master/kmodule.deps.d > можно ли каким-то образом вычленить алиасы 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. Тогда есть предложение расширять логику make-initrd по определению builtin модулей. Как второй вариант - пренебречь размером initramfs и укладывать в него все существующие модули ядра, включая firmware. (В ответ на комментарий №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 Нет, я про то, что бы добавить явную зависимость у luks на sha256 в самом make-initrd. Прям вот только для этого случая. (В ответ на комментарий №37) > Нет, я про то, что бы добавить явную зависимость у luks на sha256 в самом > make-initrd. > > Прям вот только для этого случая. Ты про вот эту зависимость: https://github.com/legionus/make-initrd/blob/master/features/luks/config.mk#L8 ? Антон, а можно ли у нас придумать какие-нибудь post-%install-скрипты для ядра, чтобы можно было после сборки ядра покопаться в RPM/BUILD и сгенерировать дополнительную инфу ? Тогда я бы мог сделать скрипт для дерева ядра и ответную часть в фичу оформить. Про зависимость: да - зависимость эта, но как-то нужно make-initrd сказать что у нас sha256_generic всегда builtin. Про скрипты: Можно придумать, почему нет. Я же правильно понял - тебя интересует некий rpm макрос, который будет выполняться сразу после сборки и установки ядра ? boyarsh@ : Антон, нет возражений ? (В ответ на комментарий №39) > Антон, а можно ли у нас придумать какие-нибудь post-%install-скрипты для ядра, > чтобы можно было после сборки ядра покопаться в RPM/BUILD и сгенерировать > дополнительную инфу ? Если будет какой-то скрипт, то запускать его в процессе сборки наших ядер -- не проблема. (В ответ на комментарий №40) > Про зависимость: да - зависимость эта, но как-то нужно make-initrd сказать что > у нас sha256_generic всегда builtin. Нужно подумать как это лучше сделать. > Про скрипты: Можно придумать, почему нет. > Я же правильно понял - тебя интересует некий rpm макрос, который будет > выполняться сразу после сборки и установки ядра ? Да. Я попробую сделать утилиту, которая будет собирать дополнительную информацию про ядро. Если его выполнять при сборке ядра и паковать результаты, то make-initrd будет умнее. Такой у меня план. Created attachment 7929 [details]
kernel builtin modinfo
Мы тут с Глебом попили пиво и получился вот такой патч. Нужно будет ещё научить kmod читать и понимать эту информацию.
Антон, приложите пожалуйста патчик к ядрам в сизифе. (В ответ на комментарий №44) > Антон, приложите пожалуйста патчик к ядрам в сизифе. Ага, что-то я пропустил письмо с патчем, видимо, по случаю нового года, приложу. (В ответ на комментарий №45) > (В ответ на комментарий №44) > > Антон, приложите пожалуйста патчик к ядрам в сизифе. > > Ага, что-то я пропустил письмо с патчем, видимо, по случаю нового года, > приложу. Будет в следующем std-def в Сизифе Ещё к un-def, пожалуйста. make-initrd с поддержкой kernel.builtin.modinfo уже в сизифе. При наличии kernel.builtin.modinfo depinfo из make-initrd-2.2.8 ищет по алиасам вкомпиленных модулей. 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. 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 Исправлено в make-initrd-2.4.0-alt1 |