Bug 57781

Summary: Ошибка определения ядра
Product: Sisyphus Reporter: Дмитрий <dmitry>
Component: nvidia_glx_commonAssignee: Sergey V Turchin <zerg>
Status: CLOSED NOTABUG QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: shaba, zerg
Version: unstable   
Hardware: x86_64   
OS: Linux   

Description Дмитрий 2026-02-05 21:02:20 MSK
При сборке в контейнерном окружении скрипт /usr/sbin/x11presetdrv вызывает /usr/libexec/X11/drvpre.d/nvidia, который определяет версию ядра через uname(). Это приводит к некорректной работе, так как в изолированном окружении uname() возвращает версию ядра хоста, а не версию ядра, установленного внутри контейнера.

Предлагаю добавить входной параметр для явного указания версии ядра, чтобы обойти ограничение uname() в контейнерных сборках.
Comment 1 Sergey V Turchin 2026-02-06 11:14:41 MSK
(Ответ для Дмитрий на комментарий #0)
> в изолированном
> окружении uname() возвращает версию ядра хоста, а не версию ядра,
> установленного внутри контейнера.
В этом случае модуль ядра nvidia тоже хостовый, правильно?
Comment 2 Дмитрий 2026-02-06 12:04:34 MSK
(Ответ для Sergey V Turchin на комментарий #1)
> (Ответ для Дмитрий на комментарий #0)
> > в изолированном
> > окружении uname() возвращает версию ядра хоста, а не версию ядра,
> > установленного внутри контейнера.
> В этом случае модуль ядра nvidia тоже хостовый, правильно?

Неа, как один из примеров, мы собираем например на ALS целиком систему:
https://altlinux.space/alt-atomic/onyx/actions/runs/631/jobs/1

У "forgejo-runner" который собирает систему может быть любое ядро, оно отличается от того ядра которое включает в себя сам контейнер и которое будет фактически поставлено при установке системы
Comment 3 Sergey V Turchin 2026-02-06 12:24:46 MSK
(Ответ для Дмитрий на комментарий #2)
> У "forgejo-runner" который собирает систему может быть любое ядро, оно
> отличается от того ядра которое включает в себя сам контейнер и которое
> будет фактически поставлено при установке системы
А работает там модуль nvidia из какого ядра? Хостового или контейнеровского?
Comment 4 Дмитрий 2026-02-06 13:04:48 MSK
(Ответ для Sergey V Turchin на комментарий #3)
> (Ответ для Дмитрий на комментарий #2)
> > У "forgejo-runner" который собирает систему может быть любое ядро, оно
> > отличается от того ядра которое включает в себя сам контейнер и которое
> > будет фактически поставлено при установке системы
> А работает там модуль nvidia из какого ядра? Хостового или контейнеровского?

Из контейнеровского, ядра у нас лежат тут:
/usr/lib/modules/<version>/vmlinuz
initramfs тут:
/usr/lib/modules/<version>/initramfs.img

Например когда если мы вызываем depmod внутри контейнера мы передаём ему версию что бы он его сам искал в /usr/lib/modules/<version>/, не пытаясь определить по uname:

depmod -a '6.12.66-6.12-alt1'

Справка:
depmod -h
Usage:
   depmod -[aA] [options] [forced_version]
Comment 5 Sergey V Turchin 2026-02-06 19:36:30 MSK
Раз от хостового ядра в контейнере ничего нет, значит uname() сообщает не ту версию ядра.

Это какой гипервизор?
Comment 6 Дмитрий 2026-02-06 20:05:33 MSK
(Ответ для Sergey V Turchin на комментарий #5)
> Раз от хостового ядра в контейнере ничего нет, значит uname() сообщает не ту
> версию ядра.
> 
> Это какой гипервизор?

Да, итоговый хук "/drvpre.d/nvidia" который настраивает nvidia и делает всякие разные симлинки не отработает потому что не понимает где он собственно запущен, он не ожидает что будет работать в контейнере где ядро хоста не имеет значения.

Это не гипервизор, это обычные OCI-контейнеры (podman/docker) которые использует forgejo-runner на altlinux.space. В Linux контейнеры разделяют ядро с хостом — uname() это системный вызов к хостовому ядру, поэтому он всегда возвращает версию ядра хоста, но наш OCI-контейнер уже содержит своё ядро и свои модули и узнать о них с помощью uname() невозможно при сборке образа.

Поэтому вариантов кроме как дать возможность указывать параметром ядро вручную я не вижу. Мы сейчас это починили тем что сделали упрощённый аналог всей той бизнес-логики что делает/drvpre.d/nvidia на баш, но этот вариант мне не нравится, я хочу что бы отрабатывало Ваше решение нативно при установке
Comment 7 Дмитрий 2026-02-06 20:26:25 MSK
Подумав ещё, пришёл к выводу что адаптировать x11presetdrv/nvidia для контейнерной сборки не имеет практического смысла. Около 60% логики этого инструмента — определение GPU через PCI-скан и выбор подходящей версии драйвера под конкретное оборудование. При сборке контейнерного образа целевое GPU неизвестно, поэтому вся эта логика неприменима.
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
Для наших целей достаточно упрощённого скрипта на bash, который берёт самый свежий установленный в образ драйвер и создаёт необходимые симлинки. Выбор драйвера под конкретное оборудование уже должно отработать на целевой машине, только вот там запрещено изменение /usr, но это уже другая проблема. Думаю можно закрывать :)
Comment 8 Sergey V Turchin 2026-02-07 11:40:24 MSK
(Ответ для Дмитрий на комментарий #6)
> Это не гипервизор, это обычные OCI-контейнеры (podman/docker)
В таком случае не вводите в заблуждение. Используется ядро хоста.
Синхронизируйте установленные пакеты ядер на хосте и внутри контейнера.