Fedora+Nvidia=CUDA

23 Aug 2014

Итак. Мы хотим получить рабочую инсталляцию на Fedora (в моем случае - RFRemix и с этим связано несколько багов).

Для этого нам надо:

  1. видеокарту nvidia :)
  2. установленный репозитарий cuda (отсюда)
  3. заметку о том, как восстановить plymouth после установки драйвером nvidia

1 - Ставим

# yum install cuda

Этот метапакет поставит все, что должно идти в комплекте (включая свежие дрова)

2 - Удаляем kmod-nvidia

Если у вас уже были проинсталены дрова невидии, то нужно удалить имеющийся kmod. Так как он может содержать несовместимую с текущими библиотеками версию модуля

# yum remove kmod-nvidia

3 - Пересобираем akmod

# akmod -kernel $(uname -r)

Тут может потребоваться доставить kernel-headers

4 - Пересобираем initrd

Для этого воспользуемся dracut

# dracut --force

5 - Ребут :)

6 - Можно собрать семплы

Замечу, что делать это надо под рутом или проставив соотвествующие права на папки. Так как мейкфайлы сильно завязаны на относительные пути.

# cd /usr/local/cuda-6.5/samples/5\_Simulations/fluidsGL  
# make

7 - А вот тут нас поджидает облом (RFRemix)

\>\>\> WARNING - libGL.so not found, refer to CUDA Samples release notes for how to find and install them. \<\<\<  
\>\>\> WARNING - libGLU.so not found, refer to CUDA Samples release notes for how to find and install them. \<\<\<  
\>\>\> WARNING - libX11.so not found, refer to CUDA Samples release notes for how to find and install them. \<\<\<  
\>\>\> WARNING - libXi.so not found, refer to CUDA Samples release notes for how to find and install them. \<\<\<  
\>\>\> WARNING - libXmu.so not found, refer to CUDA Samples release notes for how to find and install them. \<\<\<

Ага!

Смотрим в findgllib.mk

ifeq ("$(OSLOWER)","linux")  
 # first search lsb\_release  
 DISTRO = $(shell lsb\_release -i -s 2\>/dev/null | tr "[:upper:]" "[:lower:]")  
 DISTVER = $(shell lsb\_release -r -s 2\>/dev/null)  
 ifeq ("$(DISTRO)","")  
 # second search and parse /etc/issue  
 DISTRO = $(shell more /etc/issue | awk '{print $$1}' | sed '1!d' | sed -e "/^$$/d" 2\>/dev/null | tr "[:upper:]" "[:lower:]")  
 DISTVER= $(shell more /etc/issue | awk '{print $$2}' | sed '1!d' 2\>/dev/null  
 endif  
 ifeq ("$(DISTRO)","")  
 # third, we can search in /etc/os-release or /etc/{distro}-release  
 DISTRO = $(shell awk '/ID/' /etc/\*-release | sed 's/ID=//' | grep -v "VERSION" | grep -v "ID" | grep -v "DISTRIB")  
 DISTVER= $(shell awk '/DISTRIB\_RELEASE/' /etc/\*-release | sed 's/DISTRIB\_RELEASE=//' | grep -v "DISTRIB\_RELEASE")  
 endif  
endif

ifeq ("$(OSUPPER)","LINUX")  
 # $(info) \>\> findgllib.mk -\> LINUX path \<\<\<)  
 # Each set of Linux Distros have different paths for where to find their OpenGL libraries reside  
 UBUNTU\_PKG\_NAME = "nvidia-340"  
 UBUNTU = $(shell echo $(DISTRO) | grep -i ubuntu \>/dev/null 2\>&1; echo $$?)  
 FEDORA = $(shell echo $(DISTRO) | grep -i rfremix \>/dev/null 2\>&1; echo $$?)  
 RHEL = $(shell echo $(DISTRO) | grep -i red \>/dev/null 2\>&1; echo $$?)  
 CENTOS = $(shell echo $(DISTRO) | grep -i centos \>/dev/null 2\>&1; echo $$?)  
 SUSE = $(shell echo $(DISTRO) | grep -i suse \>/dev/null 2\>&1; echo $$?)

Еще раз ага!

Смотрим как определяется тип дистрибутива.

Это команда

awk '/ID/' /etc/\*-release | sed 's/ID=//' | grep -v "VERSION" | grep -v "ID" | grep -v "DISTRIB"

А у меня она выдает rfremix. А значит такого таргета ни разу нет в списке. :)
Ну что делать-то? меняем fedora на rfremix в findgllib.mk и радуемся.
Собралось! Но…

8 - А что у нас с библиотеками?

$ ./fluidsGL  
./fluidsGL: error while loading shared libraries: libcufft.so.6.5: cannot open shared object file: No such file or directory

Еще раз. У нас для ldconfig не заданы пути, где лежит libcufft.so.6.5

$ find /usr/ -name libcufft.so.6.5  
/usr/local/cuda-6.5/targets/x86\_64-linux/lib/libcufft.so.6.5
$ grep -R /usr/local/cuda-6.5/targets/x86\_64-linux/lib /etc/ld.so.conf.d/

Пусто.

# echo "/usr/local/cuda-6.5/targets/x86\_64-linux/lib" \> /etc/ld.so.conf.d/cuda-lib64.conf  
# ldconfig

9 - Наслаждаемся

fluidsGL