_                               _           
(_)_ __ ___  _ __ ___  _   _  __| | _____  __
| | '_ ` _ \| '_ ` _ \| | | |/ _` |/ _ \ \/ /
| | | | | | | | | | | | |_| | (_| |  __/>  < 
|_|_| |_| |_|_| |_| |_|\__,_|\__,_|\___/_/\_\

Instalacja sterownika dla Nvidia GeForce 920M

Jakiś czas temu musiałem zoptymalizować mój "zestaw", wymieniłem komputer gamingowy, na dwa latopy. Jeden z nich posiada grafikę Nvidia GeForce 920M, chciałem aby na tym sprzęcie rezydował immudex w wersji testing. I tutaj zaczęły się schody, bowiem obecny (dostępny w repozytorium Debian Bookworm) sterownik Nvidii w wersji 528, nie posiada wsparcia dla tej karty. Więc wpadłem na pomysł zainstalowania wersji 470 z Debian Bullseye. Poniżej znajduje się opis oraz to co udało mi się uzyskać.

Uwaga! Wykonywane tutaj czynności wykorzystują oprogramowanie własnościowe, jeśli jest to sprzeczne z Twoim zasadami etycznymi zrezyguj z dalszego wykonywania poniższych czynności.

Pro Tip! Najlepiej te czynności wykonywać na komputerze uruchomionym z pamięci USB.

Sterowniki do obrazu immudex, możemy dodać na zasadzie "przewinięcia". Więc czynności rozpoczniemy od sprawdzenia dostępności takich poleceń jak unsquashfs oraz mksquashfs. W najnowszych wersjach immudex lub immudex-testing powinny byś one zainstalowane. W celach porządkowych, utworzymy sobie katalog.

$ mkdir 0.1.7

Następnie na wypadek niepowodzenia naszych zmian, pobierzemy z partycji obecnie używane archiwum .squashfs.

$ cp /run/live/medium/live/filesystem.squashfs filesystem.squashfs_original

Teraz możemy przejść do katalogu i rozpakować nasze archiwum.

$ cd 0.1.7
$ sudo unsquashfs -f -d tmp /run/live/medium/live/filesystem.squashfs

Po rozpakowaniu archiwum, katalog tmp będzie zawierać rootfs najnowszego obrazu immudex. Aby był on pełnoprawnym obrazem systemu brakuje mu plików jądra, które nie wchodzi w skład archiwum (bo i po co, pliki jądra muszą znajdować się na zewnatrz archiwum, aby system mógł się uruchomić, archiwum zawierające initrd oraz jądro, marnuje po prostu miejsce). Z tego względu, że brakuje w ogóle kilku plików, nie możemy sobie od tak ich skopiować. Musimy posłużyć się narzędziem apt oraz trochę je oszukać, aby przywrócić te pliki. Wszystkie czynności przedstawione na poniższym przykładzie wykonywane są w środowisku zmienionego katalogu głównego (chroot). Aby moduły jądra zostały poprawnie zbudowane do środowiska zmienionego katalogu głównego potrzebne jest przekazanie kilku systemowych interfejsów: /dev /dev/pts /proc /run /sys.

Polecenie apt install może zawieści się. Wówczas należy przerwać operację i odświerzyć połączenie sieciowe poprzez komunikację z serwerem DHCP (polecenie dhclient).

0.1.7$ for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i tmp${i}; done
0.1.7$ sudo chroot tmp/ bash
(chroot)/$ mkdir boot
(chroot)/$ apt purge linux-image* -y
(chroot)/$ apt install linux-image-amd64

Jeśli nie ma katalogu /boot w katalogu głównym, polecenie apt, zwróci błąd i zakończy działanie. Aby jednak wykonał on zażądane przez nas czynności wystarczy mu sama obecność tego katalogu (katalog może być pusty). Polecenie usuwania pakietu, może zwrócić monit o tym, że usuwamy działające obecnie jądro i czy chcemy przerwać tę czynność. Z pewnością 99% możemy kliknąć Nie, osobiście kiedyś udało mi się zawieści działanie jednego z serwerów przeprowadzając tę czynność, mimo wykonania jej środowisku zmienionego katalogu głównego. Jeśli naszym system jest immudex, to mamy 100%.

Po odzyskaniu plików jądra, wypadałoby zainstalować pakiety wspomagające budowanie jego modułów (chociaż, pakiet build-essential, jest zainstalowany w immudex).

(chroot)/$ apt install build-essential dkms linux-headers-$(uname -r)

Po zainstalowaniu tych pakietów, możemy przejść do instalacji właściwego sterownika. W tym celu utworzymy sobie plik zawierający lokalizację źródeł repozytorium dla wersji Debian Bullseye, ale tylko do repozytoriów contrib oraz non-free (oczywiście, można użyć bardziej odpowiedniej nazyw niż nvidia.list, jednak dla mnie te repozytoria będą służyć jedynie do tego).

(chroot)/$ cp /etc/apt/sources.list /etc/apt/sources.list.d/nvidia.list
(chroot)/$ sed -e 's/bookworm/bullseye/g' -e 's/main/contrib non-free/g' -i /etc/apt/sources.list.d/nvidia.list
(chroot)/$ apt update
(chroot)/$ apt install nvidia-detect
(chroot)/$ nvidia-detect
(chroot)/$ apt install nvidia-driver

Polecenie nvidia-detect zwróci informacje o tym że pasującym sterownikiem jest sterownik w wersji 470. A nie jak w przypadku Debian 12, pakiet sterowników dla układów Nvidia Tesla, który nie działa z tym układem. Powykonaniu tych rootfs jest gotowy do pakowania. Jest jeden mały szczegół. Otóż w tej instalacji zabrakło instalacji pakietu nvidia-settings. Nie został on zainstalowany przez niespełnione zależności. Ważna dla tego pakietu jest biblioteka libxnvctrl0, powinna być ona zgodna z wersją instalowanego sterownika Nvidii, jednak ze względu na to, że zostawiliśmy repozytorium main dla Debian Bookworm, nie będzie między nimi zgodności. Zatem, co trzeba zrobić? Otóż należy usunąć obecnie zainstalowany wersję tej biblioteki wraz z pakietami, które jej wymagają, są to dwa pakiety XFCE. Nie należy usuwać pakietów, już niepotrzebnych, ponieważ za chwilę będą one znów potrzebne. Zapisujemy sobie te pakiety (prawdopodbnie będą to: xfce4-goodies oraz xfce4-sensors-plugin), ponieważ będziemy je instalować ponownie, kiedy uzyskamy odpowiednią wersję wspomnianej biblioteki. Po usunięciu pakietów, tymczasowo zmieniamy wersję dystrybucji, z Bookworm na Bullseye (dla repozytorium main). Instalujemy naszą bibiotekę, następnie wracamy z powrotem do wersji Bookworm dla repozytrium głównego. Teraz możemy zainstalować ponownie te dwa pakiety oraz pakiet nvidia-settings. Poniżej przedstawiłem wyżej wymieniony opis w postaci poleceń.

(chroot)/$ sed -i 's/Bookworm/Bullseye/g' /etc/apt/sources.list;
(chroot)/$ apt remove libxnvctrl0 -y
(chroot)/$ apt update
(chroot)/$ apt install libxnvctrl0 -y
(chroot)/$ sed -i 's/Bullseye/Bookworm/g' /etc/apt/sources.list;
(chroot)/$ apt install xfce4-goodies xfce4-sensors-plugin nvidia-settings

Teraz rootfs jest gotowy do pakowania. Zanim jednak do tego przystąpimy, warto posprzątać po sobie, aby nie zaśmiecać niepotrzebnie obrazu. Następnie musimy odmontować zamontowane interfejsy systemowe. Do pakowania wykorzystamy polecenie mksquashfs.

(chroot)/$ apt-get clean
(chroot)/$ apt-get autoclean
(chroot)/$ apt-get autoremove
(chroot)/$ history -c
(chroot)/$ Ctrl+d
0.1.7$ for i in /dev/pts /dev /proc /run /sys; do sudo umount tmp${i}; done
0.1.7$ sudo mksquashfs tmp/ filesystem.squashfs -e boot

Ze względu na to iż sterowniki do moduły jądra, które mogą ładowane w niekoniecznie znanym nam momencie, warto było by przenieść na dysk docelowy także obraz jądra oraz obraz initrd.

0.1.7$ sudo cp tmp/boot/vmlinuz-6.1.0-7-amd64 vmlinuz
0.1.7$ sduo cp tmp/boot/initrd.img-6.1.0-7-amd64 initrd

Te trzy pliki kopiujemy na dysk. Po skopiowaniu możemy uruchomić system i sprawdzić czy wszytko jest działa. Zainstalowany sterownik z Debian 11, działa prawidłowo na Debian 12. Po wykonaniu dodatkowych czynności w systemie obecny jest również program nvidia-settings, jednak dla tej karty nie posiada on zbyt wielu opcji lub najzwyczajniej nie działa. Mimo to jeśli posiadamy komputer z tym układem, to warto wykonać te czynności, aby nie doświadczać wielu irytujących błędów substytutu sterownika, takich jak screen tearing czy jeszcze bardziej denerwującego restartu serwera X11 podczas odblokowywania sesji po wyłączeniu ekranu ze względu na brak aktywności.

~xf0r3m