Автоматический подбор версии драйвера NVIDIA при загрузке Linux-дистрибутива PocketHandyBox
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.

Если интересно, в следующих публикациях расскажу о механизмах переключения на дискретную NVIDIA-карту для современных драйверов с поддержкой PRIME render offload и для устаревших версий 340.xx и 390.xx, где этой функции нет.
Сотрудники OpenAI продали акции почти на $7 млрд при оценке компании в $852 млрд
Выручка Rocket Lab достигла рекордных $234 млн при росте портфеля заказов до $2,36 млрд
Rocket Lab усомнилась в возможности первого запуска Neutron в 2026 году
Google, где производительность? Pixel 11 Pro XL проиграл предшественнику в первом бенчмарке
Энтузиасты начали модифицировать Steam Machine: к консоли подключили Radeon RX 9070 XT ценой жертвы SSD
Индийская академия MAHE и химическая компания GHCL создали ИИ-систему для мониторинга топлива
Европейская спутниковая группировка IRIS2 переходит к строительству после увеличения бюджета и расширения до 348 аппаратов
В России наладят массовую корпусировку процессоров «Иртыш»