Porteus Initrd это дальнейшее развитие livekit. Процесс загрузки хорошо описан на сайте slax.org.
В DogLinux структура папок отличается от Slax. В версии для Debian 11 Bullseye избавились от привязки к aufs (которая не включена в состав ядра) и используется overlayfs. Это позволяет использовать самые свежие ядра и не думать об адаптации патчей для поддержки aufs.
В системе установлен пакет nvidia-detect который в /usr/share/nvidia/ содержит текстовые файлы .ids со списками PCI ID видеокарт, поддерживаемых определенной версией драйвера. В скрипт /usr/local/cr-initrd/mkinitrd который создает файл initrd1.xz добавлен код для копирования файлов nvidia.ids, nvidia-legacy-390xx.ids и nvidia-legacy-340xx.ids.
В папке live/optional лежат готовые модули драйверов nVidia, имена файлов начинаются с префиксов nv340, nv390 и nvidia. И они должны быть загружены в зависимости от установленной в системе видеокарты nVidia или не загружены при её отсутствии.
В оригинальном скрипте linuxrc из Porteus Initrd был код для этого, но потребовались некоторые исправления и изменения логики его работы. Ниже приведены оба варианта.
#Оригинальный код отвечает за обработку параметра vga_detect
if param vga_detect; then
echo $i"detecting GPU"
lspci >/tmp/lspci
nv=`grep "0300: 10de:" /tmp/lspci | cut -d":" -f4`
amd=`grep "0300: 1002:" /tmp/lspci | cut -d":" -f4`
if [ $nv ]; then
echo $i"$nv chipset found, checking which nvidia driver supports it"
cd /usr/share/pciids/NVIDIA; NV=`grep $nv * | cut -d: -f1`; cd /
if [ $NV ]; then
echo $i"nvidia-$NV.xx driver will be activated -"
echo $i"if present in $PTH/optional folder"
find $PTH/optional -name "nvidia-$NV*" 2>/dev/null >>/tmp/modules
else
#Здесь логика такая - если подходящая версия не найдена то будет
#загружена последняя версия - это нам не подходит
#Так как старые видеокарты до GeForce 8000 не поддерживаются
#И должны использовать свободный драйвер nouveau
echo $i"latest nvidia driver will be activated -"
echo $i"if present in $PTH/optional folder"
find $PTH/optional -name "nvidia-*" 2>/dev/null | \
egrep -v '96.43.|173.14.|304.' >>/tmp/modules
fi
elif [ $amd ]; then
echo $i"checking if $amd GPU belongs to 'Radeon HD' series"
cd /usr/share/pciids/AMD; HD=`grep $amd * | cut -d: -f1`; cd /
if [ $HD ]; then
echo $i"$HD-xx driver will be activated -"
echo $i"if present in $PTH/optional folder"
find $PTH/optional -name "$HD-*" 2>/dev/null >>/tmp/modules
else
echo $i"$amd GPU is not supported by amd-catalyst driver"
fi
else
echo $i"could not find any nVidia/AMD GPU on this PC"
fi
fi
#Новый код. Вводим новый параметр nvidia_detect
#Так как пропиетарные драйвера AMD больше не нужны
if param nvidia_detect; then
echo $i"detecting nvidia GPU"
lspci >/tmp/lspci
#Здесь "0300: 10de:" исправлено на "030.: 10de:" так как бывает 0301 и 0302
nvlist=`grep -i "030.: 10de:" /tmp/lspci | cut -d":" -f4`
#Даем возможность отключить функцию определения, так как
#nvidia_detect будет прописан по умолчанию в загрузчике
if param nonvidia; then
echo $i"skipping nvidia GPU detection"
elif [ -n "$nvlist" ]; then
#Так как видеокарт nVidia в системе может быть более одной
#То вводим цикл для обработки массива
for nv in $nvlist
do
echo $i"$nv chip found, checking which nvidia driver supports it"
if grep -qi 10de$nv /usr/share/nvidia/nvidia.ids
then NV=nvidia; break
elif grep -qi 10de$nv /usr/share/nvidia/nvidia-legacy-390xx.ids
then NV=nv390; break
elif grep -qi 10de$nv /usr/share/nvidia/nvidia-legacy-340xx.ids
then NV=nv340; break
else echo $i"$nv chip is not supported by nvidia driver"
fi
done
if [ $NV ]; then
echo $i"$NV driver will be activated"
find $PTH/optional -name "$NV*" 2>/dev/null >>/tmp/modules
NOLOAD="$NOLOAD|mesa-vulkan-drivers"
fi
else echo $i"could not find any nVidia GPU on this PC"
fi
fi
В /tmp/modules записывается список .squashfs модулей, далее скрипт скопирует их в память (если указан параметр copy2ram) и смонтирует.
Реализация поддержки Optimus для ноутбуков со старыми видеокартами nVidia, которые поддерживаются только legacy драйверами 340xx и 390xx.
Эти драйвера не поддерживают PRIME render offload. Применен метод предложенный в ArchLinux Wiki Use_NVIDIA_graphics_only
Создан конфиг /etc/nvidia-legacy-optimus-outputclass.conf. В скрипт /etc/xdg/xfce4/xinitrc добавлен вызов
[ -x /etc/nvidia-legacy-optimus-xrandr.sh ] && /etc/nvidia-legacy-optimus-xrandr.sh
В /etc/profile добавлена соответствующая логика для обнаружения Optimus при загруженных nv340 или nv390 модулях и применения изменений конфигурации перед запуском startx.
if [ -z "${DISPLAY}" ] && [ $(tty) = /dev/tty1 ]; then
if egrep -qe "nv340|nv390" /mnt/live/tmp/modules; then
if grep -q i915 /proc/modules; then
mv /etc/nvidia-legacy-optimus-outputclass.conf /etc/X11/xorg.conf.d/
echo "#!/bin/sh" > /etc/nvidia-legacy-optimus-xrandr.sh
echo "xrandr --setprovideroutputsource modesetting NVIDIA-0" >> \
/etc/nvidia-legacy-optimus-xrandr.sh
echo "xrandr --auto" >> /etc/nvidia-legacy-optimus-xrandr.sh
chmod +x /etc/nvidia-legacy-optimus-xrandr.sh
fi
fi
if ! grep -q text /proc/cmdline; then
sleep 3
startx
fi
fi
LiveUSB 1100MB сборка DogLinux Debian 11 Bullseye (nvidia-drivers, FurMark, Unigine Heaven, ddrescue, WHDD, DMDE) для тестирования, обслуживания ПК, ноутбуков