Niezgodność interfejsu API Nvidii

27

Zaplanowałem dzień relaksu przy Portalu 2, ale po uruchomieniu Steam (po raz pierwszy od kilku tygodni) zostałem powitany w terminalu następującą wiadomością:

Error: API mismatch: the NVIDIA kernel module has version 270.41.19,
but this NVIDIA driver component has version 270.41.06.  Please make
sure that the kernel module and all NVIDIA driver components
have the same version.

Przyznaję, że tak naprawdę nie wiem, o czym mówi, kiedy mówi kierowca. Wersja nvidia-currentjest 270.41.19. Myślałem, że to sterownik i moduł, wszystko w jednym.

Korzystam z X-SWAT PPA i zauważyłem, że nvidia-settingspakiet został ulepszony do 275.09.07. Ponieważ jest to tylko aplikacja do ustawiania, nie sądzę, aby ta niezgodność miała z tym coś wspólnego. Nie jest to również ta sama wersja, co opisywany problem.

Wolałbym nie wracać do standardowego sterownika Nvidii, ponieważ jest on mniej niż stabilny na moim GTX580. Zaakceptowałbym odpowiedź, która wymaga ręcznej konfiguracji i sprawia, że ​​rekompiluje się, gdy jądro się ponownie kompiluje (tj. Niektóre kreacje DKMS), ale musi działać. Nie chcę wracać do trybu tekstowego przy każdym ponownym uruchomieniu po aktualizacji jądra.

Edycja: Minecraft działa bez jednej skargi na wersje sterowników. Penumbra umiera z mniej więcej tym samym błędem podczas wchodzenia do gry.

Edycja: Oto, z czym mam do czynienia w przypadku plików 32-bitowych. Wszystkie wydają się mieć właściwą wersję.

ls -l /usr/lib32/nvidia-current/ | awk '{ print $8 " " $9 " " $10 }'

libcuda.so -> libcuda.so.270.41.19
libcuda.so.1 -> libcuda.so.270.41.19
libcuda.so.270.41.19  
libGL.la  
libGL.so -> libGL.so.1
libGL.so.1 -> libGL.so.270.41.19
libGL.so.270.41.19  
libnvcuvid.so -> libnvcuvid.so.1
libnvcuvid.so.1 -> libnvcuvid.so.270.41.19
libnvcuvid.so.270.41.19  
libnvidia-cfg.so -> libnvidia-cfg.so.1
libnvidia-cfg.so.1 -> libnvidia-cfg.so.270.41.19
libnvidia-cfg.so.270.41.19  
libnvidia-compiler.so -> libnvidia-compiler.so.1
libnvidia-compiler.so.1 -> libnvidia-compiler.so.270.41.19
libnvidia-compiler.so.270.41.19  
libnvidia-glcore.so.270.41.19  
libnvidia-ml.so -> libnvidia-ml.so.1
libnvidia-ml.so.1 -> libnvidia-ml.so.270.41.19
libnvidia-ml.so.270.41.19  
libnvidia-tls.so.270.41.19  
libnvidia-wfb.so.1 -> libnvidia-wfb.so.270.41.19
libnvidia-wfb.so.270.41.19  
libOpenCL.so -> libOpenCL.so.1
libOpenCL.so.1 -> libOpenCL.so.1.0
libOpenCL.so.1.0 -> libOpenCL.so.1.0.0
libOpenCL.so.1.0.0  
libXvMCNVIDIA_dynamic.so.1 -> libXvMCNVIDIA.so.270.41.19
libXvMCNVIDIA.so -> libXvMCNVIDIA.so.270.41.19
libXvMCNVIDIA.so.1 -> libXvMCNVIDIA.so.270.41.19
libXvMCNVIDIA.so.270.41.19  

Edycja 2: Mogłem coś znaleźć.

Czaiłem się we /usr/lib32/właściwym (nie w nvidia-currentpodkatalogu) znalazłem następujące:

ls -l /usr/lib32/ | awk '{ print $8 " " $9 " " $10 }' | grep 270

libcuda.so.1 -> libcuda.so.270.41.06
libcuda.so.270.41.06  
libGL.so.1 -> libGL.so.270.41.06
libGL.so.270.41.06  
libnvidia-compiler.so.270.41.06  
libnvidia-glcore.so.270.41.06  
libnvidia-tls.so.270.41.06  
libvdpau.so.1 -> libvdpau.so.270.41.06
libvdpau.so.270.41.06  
libvdpau_trace.so -> vdpau/libvdpau_trace.so.270.41.06

Z jakiegoś powodu wszystko /usr/lib32/nvidia-current/jest w odpowiedniej wersji, ale jest tam mnóstwo cruft, /usr/lib32/które mogą zrujnować imprezę.

Edycja 3: Nie udało się wyśledzić, który pakiet jest właścicielem tych plików:

find /usr/lib32 -iname '*270.41.06*' -exec dpkg -S "{}" \;

dpkg-query: no path found matching pattern /usr/lib32/libnvidia-compiler.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/libGL.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/vdpau/libvdpau_nvidia.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/vdpau/libvdpau_trace.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/libvdpau.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/tls/libnvidia-tls.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/libnvidia-tls.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/libcuda.so.270.41.06.
dpkg-query: no path found matching pattern /usr/lib32/libnvidia-glcore.so.270.41.06.

Jakieś wskazówki, jak sobie radzić z tymi uszkodzonymi wersjami? Usuń ich? Usunąć następnie dowiązanie symboliczne do ./nvidia-current/wersji?

Oli
źródło
Czy korzystasz z systemu 64-bitowego? Jeśli tak, to czy różnica między działającymi i zepsutymi grami może być taka, czy są to wersje 32-bitowe, czy 64-bitowe? W takim przypadku może być tak, że 32- lub 64-bitowe komponenty przestrzeni użytkownika są nieaktualne.
James Henstridge
Jestem na 64bit. To brzmi, jakby to była dobra diagnoza. Działa także Trine (która jest również natywnym 64-bitowym komputerem).
Oli
@James ma pomysł, jak można to naprawić?
Oli
Nie mam w pobliżu systemu Nvidii, więc zgaduję. 32-bitowe biblioteki przestrzeni użytkownika są prawdopodobnie gdzieś poniżej /usr/lib32. Sprawdź, czy wyglądają tak samo jak podstawowe wersje 64-bitowe. Jeśli się różnią, dowiedz się, jaki pakiet jest ich właścicielem i poszukaj aktualizacji.
James Henstridge

Odpowiedzi:

17

Wykonanie następujących czynności rozwiązało to dla mnie na Ubuntu 12.04 64bit z jądrem 3.0.29. Mam nadzieję, że to pomoże.

sudo apt-get purge nvidia-current
sudo apt-get install nvidia-current
gsbabil
źródło
4
Użyj, dpkg --get-selections | grep nvidiaaby znaleźć inne pakiety NVIDII, które musisz wyczyścić
Christopher Manning,
Dzięki GSBabil, naprawiłem podobny problem dla mnie. Potrzebowałem później ponownego uruchomienia, zanim jednak „wziął”.
Ash
5
@ChristopherManning łatwiejszym sposobem na zrobienie tego byłoby sudo apt-get remove --purge nvidia *
Ben McCann
Świetnie działało, dziękuję! Nareszcie mam aktualne sterowniki, Steam jest szczęśliwy: D
Ads20000,
@GSBabil Chcę tak źle kupić ci piwo.
Matthew Scragg
14

Po odkryciu było mnóstwo starych plików kręcących się w górę / usr / lib32 / Przesunąłem je za pomocą następującego polecenia:

sudo find /usr/lib32 -iname '*270.41.06*' -exec mv {} {}.old \;

I ponownie uruchomiłem X. To zepsuło wszystko w 3D. Huzzah. Korzystając z poprzedniego polecenia, zauważyłem cztery zepsute linki:

ls -l /usr/lib32/ | awk '{ print $8 " " $9 " " $10 }' | grep 270

libcuda.so.1 -> libcuda.so.270.41.06
libGL.so.1 -> libGL.so.270.41.06
libvdpau.so.1 -> libvdpau.so.270.41.06
libvdpau_trace.so -> vdpau/libvdpau_trace.so.270.41.06

Zamiast ręcznie zamieniać linki na cztery pliki, poszedłem do Elronda, lorda Rivendell i zleciłem mu utworzenie wspólnoty, która mogłaby wpaść do Morhdorh, podkręcić się do Góry Przeznaczenia i wykonać jedno polecenie, by mi przynieść (i przez to mają na myśli nas wszystkich) i w ciemności zwiąż nas.

Dosyć tego. Oto jedno polecenie:

ls -l /usr/lib32/ | awk '{ print $8 " " $9 " " $10 }' | grep 270 | cut -d' ' -f1 | xargs -l1 sudo bash -c "rm /usr/lib32/\$0 && ln -s /usr/lib32/nvidia-current/\$0 /usr/lib32/\$0"

Czy ona nie jest spektakularna? I zadziałało. Mam teraz 4 błyszczące nowe dowiązania symboliczne:

ls -l /usr/lib32/ | awk '{ print $8 " " $9 " " $10 }' | grep '/nvidia-current'

libcuda.so.1 -> /usr/lib32/nvidia-current/libcuda.so.1
libGL.so.1 -> /usr/lib32/nvidia-current/libGL.so.1
libOpenCL.so -> nvidia-current/libOpenCL.so
libvdpau.so.1 -> /usr/lib32/nvidia-current/libvdpau.so.1
libvdpau_trace.so -> /usr/lib32/nvidia-current/libvdpau_trace.so

Potem sprawdziłem, czy wszystko działało. Przed ponownym uruchomieniem pomyślałem, że powinienem sprawdzić, czy linki są prawidłowe:

ls -l /usr/lib32/ | awk '{ print $8 " " $9 " " $10 }' | grep '/nvidia-current' | cut -d' ' -f3 | xargs file

/usr/lib32/nvidia-current/libcuda.so.1:      symbolic link to `libcuda.so.270.41.19'
/usr/lib32/nvidia-current/libGL.so.1:        symbolic link to `libGL.so.270.41.19'
/usr/lib32/nvidia-current/libvdpau.so.1:     ERROR: cannot open `/usr/lib32/nvidia-current/libvdpau.so.1' (No such file or directory)
/usr/lib32/nvidia-current/libvdpau_trace.so: ERROR: cannot open `/usr/lib32/nvidia-current/libvdpau_trace.so' (No such file or directory)

Świetny. Tak więc mega-polecenie poprawiło tylko dwa linki. Po głębszym spojrzeniu wydaje się, że libvdpaupliki faktycznie istnieją /usr/lib32/nvidia-current/vdpau/. Bez bałaganu o tym czasie:

sudo rm /usr/lib32/libvdpau{,_trace}.so*
sudo ln -s /usr/lib32/{nvidia-current/vdpau/,}libvdpau.so*
sudo ln -s /usr/lib32/{nvidia-current/vdpau/,}libvdpau_trace.so*

ls -l /usr/lib32/ | awk '{ print $8 " " $9 " " $10 }' | grep '/nvidia-current' | cut -d' ' -f3 | xargs file

/usr/lib32/nvidia-current/libcuda.so.1:                      symbolic link to `libcuda.so.270.41.19'
/usr/lib32/nvidia-current/libGL.so.1:                        symbolic link to `libGL.so.270.41.19'
/usr/lib32/nvidia-current/vdpau/libvdpau.so.270.41.19:       ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
/usr/lib32/nvidia-current/vdpau/libvdpau_trace.so.270.41.19: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped

Przynajmniej są właściwie (choć trochę niezręcznie) połączone. Czas na test.

Edycja: To zadziałało, ale wyciągnij wnioski z mojej walki: nie komplikuj.

Oli
źródło
Dobrze pamiętam tego rodzaju piekło - tylko nie zaryzykowałem użycia wiersza polecenia (w przypadku pomyłki) w celu naprawienia mojego: P.
RolandiXor
7

również po prostu zrób to:

$ dpkg --get-selections | grep nvidia

nvidia-common                   install
nvidia-current                  install
nvidia-current-updates              install
nvidia-experimental-x...            install
nvidia-settings                 install
nvidia-settings-updates             install

i wtedy:

$ sudo apt-get purge nvidia-experimental-x...
...
$ sudo reboot

wszystko w porządku!

shgnInc
źródło
2
Było to pomocne, ponieważ ujawniało starsze wersje, które zostały zainstalowane. Kiedy je oczyściłem, wszystko w porządku się uruchomiło. Dzięki!
Josh Johnson
dobrze. Jestem na to taka polana.
shgnInc,
Świetna odpowiedź. Przejrzałem listę i wyczyściłem ją, a następnie ponownie zainstalowałem to, czego potrzebowałem i uruchomiłem ponownie. Voila! +1
nicorellius
7

Miałem ten problem raz i jest zaskakująco łatwy do naprawienia.

Poniższe informacje dotyczą niejednolitej pamięci, więc bądź ostrożny!
Najpierw musisz zobaczyć, że biblioteki nvidia w / usr / lib32 / match:

/usr/lib32/libOpenCL.so  
/usr/lib32/nvidia-current  
/usr/lib32/nvidia-current/libGL.la  
/usr/lib32/nvidia-current/libGL.so  
/usr/lib32/nvidia-current/libGL.so.1  
/usr/lib32/nvidia-current/libGL.so.270.41.06  
/usr/lib32/nvidia-current/libOpenCL.so  
/usr/lib32/nvidia-current/libOpenCL.so.1  
/usr/lib32/nvidia-current/libOpenCL.so.1.0  
/usr/lib32/nvidia-current/libOpenCL.so.1.0.0  
/usr/lib32/nvidia-current/libXvMCNVIDIA.so  
/usr/lib32/nvidia-current/libXvMCNVIDIA.so.1  
/usr/lib32/nvidia-current/libXvMCNVIDIA.so.270.41.06  
/usr/lib32/nvidia-current/libXvMCNVIDIA_dynamic.so.1  
/usr/lib32/nvidia-current/libcuda.so  
/usr/lib32/nvidia-current/libcuda.so.1  
/usr/lib32/nvidia-current/libcuda.so.270.41.06  
/usr/lib32/nvidia-current/libnvcuvid.so  
/usr/lib32/nvidia-current/libnvcuvid.so.1  
/usr/lib32/nvidia-current/libnvcuvid.so.270.41.06  
/usr/lib32/nvidia-current/libnvidia-cfg.so  
/usr/lib32/nvidia-current/libnvidia-cfg.so.1  
/usr/lib32/nvidia-current/libnvidia-cfg.so.270.41.06  
/usr/lib32/nvidia-current/libnvidia-compiler.so  
/usr/lib32/nvidia-current/libnvidia-compiler.so.1  
/usr/lib32/nvidia-current/libnvidia-compiler.so.270.41.06  
/usr/lib32/nvidia-current/libnvidia-glcore.so.270.41.06  
/usr/lib32/nvidia-current/libnvidia-ml.so  
/usr/lib32/nvidia-current/libnvidia-ml.so.1  
/usr/lib32/nvidia-current/libnvidia-ml.so.270.41.06  
/usr/lib32/nvidia-current/libnvidia-tls.so.270.41.06  
/usr/lib32/nvidia-current/libnvidia-wfb.so.270.41.06  
/usr/lib32/nvidia-current/tls  
/usr/lib32/nvidia-current/tls/libnvidia-tls.so.270.41.06  
/usr/lib32/nvidia-current/vdpau  
/usr/lib32/nvidia-current/vdpau/libvdpau.so.270.41.06  
/usr/lib32/nvidia-current/vdpau/libvdpau_nvidia.so  
/usr/lib32/nvidia-current/vdpau/libvdpau_nvidia.so.1  
/usr/lib32/nvidia-current/vdpau/libvdpau_nvidia.so.270.41.06  
/usr/lib32/nvidia-current/vdpau/libvdpau_trace.so.270.41.06  
/usr/lib32/vdpau 

Zgodnie z tym, co opisałeś, najprawdopodobniej nie pasują do nich. Jeśli tak jest, musisz je usunąć (ostrożnie - użyj menedżera plików, nie próbuj rm -rf !!!!!!!!! ), a następnie ponownie zainstaluj nvidia-current :).
To powinno dać ci odpowiednie wersje bibliotek i dać ci działający system.

RolandiXor
źródło
4

Miałem ten problem, który miał wpływ na mój program uruchamiający SWTOR w winie. Czytając powyższe postanowiłem spróbować zrobić to za pośrednictwem interfejsu użytkownika Ubuntu. Oto proste rozwiązanie, które zadziałało dla mnie;

Usuń i ponownie zainstaluj dodatkowe sterowniki za pomocą interfejsu użytkownika:

  1. Przejdź do System -> Administracja -> Dodatkowe sterowniki
  2. Wybierz sterownik karty graficznej NVIDIA i naciśnij przycisk „usuń”. NIE PONOWNIE PONOWNIE URUCHAMIAĆ PO.
  3. Po usunięciu wybierz ten sam sterownik i kliknij „aktywuj”.
  4. Teraz uruchom ponownie.
  5. Powinien zostać naprawiony.
Erik Madsen
źródło
3

po kilku testach odkryłem, że pakiety:

nvidia-current
nvidia-304
nvidia-settings
nvidia-settings-304

praca dla wszystkich jąder 3.2.0- * i 3.8.0- *,

podczas gdy pakiety:

nvidia-current-updates
nvidia-experimental-304
nvidia-304-updates
nvidia-settings-updates
nvidia-settings-experimental-304
nvidia-settings-304-updates
nvidia-319
nvidia-experimental-310
nvidia-319-updates
nvidia-settings-319
nvidia-settings-experimental-310
nvidia-settings-319-updates

działa tylko dla jądra 3.8.0- *.

Ubuntu jockey nadal poleca wersję 319 również wtedy, gdy obecne jest tylko jądro 3.2.0- *. Więc błąd tutaj.

Ponadto polecenia:

$ sudo apt-get purge nvidia-current
$ sudo apt-get install nvidia-current

lub

$ sudo dpkg-reconfigure nvidia-current

zainstaluj sterownik tylko dla jednej wersji jądra dla każdej wersji dodatkowej i usuń ją dla wszystkich pozostałych.

Tak więc w moim przypadku mam zainstalowane następujące jądra:

3.8.0-32-generic
3.2.0-55-generic-pae
3.2.0-55-generic
3.2.0-54-generic-pae
3.2.0-54-generic
3.2.0-53-generic-pae
3.2.0-53-generic
3.2.0-52-generic-pae
3.2.0-52-generic
3.2.0-51-generic-pae
3.2.0-51-generic
3.2.0-49-generic-pae
3.2.0-49-generic

Mam sterownik tylko dla:

3.8.0-32-generic
3.2.0-55-generic-pae

podczas uruchamiania innych jąder wyniki sterownika nie są zainstalowane.

Wydaje mi się, że gdzieś w pakiecie jest błędne wskazanie do budowania i instalowania tylko dla niektórych jąder.

W dowolnym miejscu wydanie następującego polecenia naprawi sytuację:

$ sudo dkms install nvidia-304/304.88 -k 3.8.0-32-generic
$ sudo dkms install nvidia-304/304.88 -k 3.2.0-55-generic
$ sudo dkms install nvidia-304/304.88 -k 3.2.0-55-generic-pae
$ sudo dkms install nvidia-304/304.88 -k 3.2.0-54-generic
$ sudo dkms install nvidia-304/304.88 -k 3.2.0-54-generic-pae
$ sudo dkms install nvidia-304/304.88 -k 3.2.0-53-generic
$ sudo dkms install nvidia-304/304.88 -k 3.2.0-53-generic-pae
$ sudo dkms install nvidia-304/304.88 -k 3.2.0-52-generic
$ sudo dkms install nvidia-304/304.88 -k 3.2.0-52-generic-pae
$ sudo dkms install nvidia-304/304.88 -k 3.2.0-51-generic
$ sudo dkms install nvidia-304/304.88 -k 3.2.0-51-generic-pae
$ sudo dkms install nvidia-304/304.88 -k 3.2.0-49-generic
$ sudo dkms install nvidia-304/304.88 -k 3.2.0-49-generic-pae

do następnego apt-get zainstaluj nvidia-current lub ponownie skonfiguruj

Wątek: Zaktualizowano sterownik Nvidii - mieszane wersje 304.88 i 319.32 są powiązane z tym samym, ale nie miałem wystarczających środków, aby tam pisać .

efa
źródło
1

Zdarzyło mi się to po zainstalowaniu najnowszego eksperymentalnego sterownika Nvidia. Nadal chciałem wypróbować najnowszy sterownik, jeśli to możliwe, zamiast powracać do starszego sterownika, więc to działało dla mnie:

sudo apt-get remove --purge nvidia*
sudo apt-get install nvidia-319
sudo reboot
bmaupin
źródło
0

Usunięcie wszystkich pakietów nvidia i ponowna instalacja są rzeczywiście najłatwiejszym sposobem na naprawienie tego.

Po pierwsze usunąłem wszystkie pakiety nvidia za pomocą poniższej komendy:

$ dpkg --get-selections | grep nvidia | awk '{print $1}' | xargs sudo apt-get -y purge

Następnie zrestartowałem się z ciekawości, aby zobaczyć, jak będzie wyglądał mój interfejs graficzny - słaba rozdzielczość i powolne, zgodnie z oczekiwaniami.

Po otwarciu powłoki uruchamiam poniższe polecenie, aby ponownie zainstalować nvidię:

$ sudo apt-get install nvidia-current
$ sudo reboot

Wszystko znów działa. Powodzenia.

George Anderson
źródło