Автоматический подбор версии драйвера NVIDIA при загрузке Linux-дистрибутива PocketHandyBox

Автоматический подбор версии драйвера NVIDIA при загрузке Linux-дистрибутива PocketHandyBox

Прокомментировать Просмотры: 19

GTX 1070

В дистрибутивах с модульным строением, таких как Puppy, Slax и Porteus, корневая файловая система формируется из нескольких слоёв с помощью aufs или overlayfs. Каждый слой представляет собой squashfs-образ, подключаемый через loopback.

Проприетарные драйверы NVIDIA для Linux в классических дистрибутивах не рассчитаны на одновременное присутствие разных версий в единой файловой системе. В модульных системах эту задачу можно решить созданием отдельных squashfs-модулей для каждой версии драйвера NVIDIA.

PocketHandyBox — компактный портативный дистрибутив на базе Debian/Devuan с «из коробки» встроенной поддержкой NVIDIA, предназначенный для тестирования и обслуживания ПК и ноутбуков.

В PocketHandyBox squashfs-модули с драйверами NVIDIA расположены в каталоге live/nvidia. Отдельно вынесены образы ядер Linux: файлы с расширением .kmodsfs содержат в имени номер сборки ядра (uname -r), для которого они созданы.

Определение модели видеокарты по PCI ID и выбор нужной версии драйвера осуществляются в initrd-образе через скрипт linuxrc, используя только утилиты BusyBox.

# Обнаружение видеокарт NVIDIA на шине PCIe
if [ "$NVIDIA" = detect ]; then
  echo "${i}Идёт поиск GPU NVIDIA"
  nvlist=$(lspci | grep -i "030.: 10de:" | cut -d":" -f4)
  if [ -n "$nvlist" ]; then
    for nv in $nvlist; do
      echo "${i}Чип 10de:$nv найден, определяем поддерживаемый драйвер"
      if grep -siq 10de$nv /usr/share/nvidia/nvidia.ids; then NVIDIA=nvidia; break
      elif grep -siq 10de$nv /usr/share/nvidia/nvopen.ids; then NVIDIA=nvopen; break
      elif grep -siq 10de$nv /usr/share/nvidia/nvidia-tesla-470.ids; then NVIDIA=nv470; break
      elif grep -siq 10de$nv /usr/share/nvidia/nvidia-legacy-390xx.ids; then NVIDIA=nv390; break
      elif grep -siq 10de$nv /usr/share/nvidia/nvidia-legacy-340xx.ids; then NVIDIA=nv340; break
      else
        echo "${i}Чип 10de:$nv не поддерживается драйвером"
      fi
    done
  else
    echo "${i}NVIDIA GPU не найден"
  fi
fi

# Подбор модулей NVIDIA
if [ -n "$NVIDIA" ] && [ "$NVIDIA" != detect ]; then
  echo "${i}Будет загружен драйвер: $NVIDIA"
  find $DATADIR/nvidia -name "$NVIDIA*.kmodsfs" 2>/dev/null | grep $KERNEL >> /tmp/modules
  find $DATADIR/nvidia -name "$NVIDIA*.squashfs" 2>/dev/null | grep -v gsp | egrep -ve "$NOLOAD" >> /tmp/modules
  [ "$NVIDIA" = nvopen ] && \
    find $DATADIR/nvidia -name "nvidia*.squashfs" 2>/dev/null | egrep -ve "$NOLOAD" >> /tmp/modules
  NOLOAD="$NOLOAD|mesa-vulkan-drivers"
fi

Пакет nvidia-detect содержит в /usr/share/nvidia/ файлы .ids со списками PCI ID, поддерживаемых каждой версией драйвера. При сборке initrd-образа (initrd1.xz) скрипт mkinitrd встраивает эти файлы в cpio-архив.

В загрузчике по умолчанию передаётся параметр nvidia=detect. При старте системы скрипт проверяет вывод lspci, ищет совпадение PCI ID в файлах .ids и устанавливает переменную NVIDIA с префиксом, указывающим на нужную версию драйвера.

Найденные образы .squashfs и .kmodsfs добавляются в /tmp/modules. Дальнейшая функция IncludeModules монтирует их в /memory/images/, а затем объединяет слои через overlayfs.

После формирования нового корня linuxrc передаёт управление в /usr/sbin/init или systemd. Запускаются системные сервисы, включая udev, и применяются настройки из /etc/modprobe.d и /etc/modules-load.d (в том числе blacklist nouveau), находящиеся в подключённых squashfs-модулях.

В результате рабочий драйвер NVIDIA становится доступен сразу после загрузки, без дополнительных действий.

При выходе серии RTX 5000 возникла проблема: архитектура Blackwell не поддерживается закрытыми ядрами NVIDIA, тогда как открытые модули не совместимы с Maxwell и Pascal. В PocketHandyBox собрано сразу два набора модулей ядра: проприетарные и открытые.

Чтобы не дублировать userspace-библиотеки и утилиты, они вынесены в общий squashfs-образ. Сформированы два списка PCI ID: nvidia.ids (Maxwell и выше, исключая Blackwell) и nvopen.ids (Turing и выше, включая Blackwell). Логика скрипта linuxrc доработана: при выборе nvopen к монтируемым добавляются все образы nvidia*.squashfs, включая прошивки GSP.

RTX 5050
RTX 5050

Если интересно, в следующих публикациях расскажу о механизмах переключения на дискретную NVIDIA-карту для современных драйверов с поддержкой PRIME render offload и для устаревших версий 340.xx и 390.xx, где этой функции нет.

 

Источник

Поделиться:

Похожие статьи

Поиск по играм, новостям и статьям…

Введите не менее двух символов

Введите не менее двух символов