Primeiro, os detalhes.
ANTES: kernel: 3.2.0-2-amd64, driver nvidia: 295.59
DEPOIS: kernel: 3.2.0-3-amd64, driver nvidia: 302.17-3
Meu Debian wheezy é mantido recente em todos os momentos. Na verdade, fazendo diariamente apt-get upgrade -s
me pegou neste problema em primeiro lugar.
Evidentemente, depois de um apt-get upgrade
, algo "quebrou" no meu Debian - algo relacionado ao ecossistema de construção e / ou ao próprio DKMS.
O driver NVIDIA não pode obter a compilação por qualquer método recomendado nos Wikis oficiais. Incluindo o binário oficial da NVIDIA (log snippet daquele em uma das atualizações).
Veja a saída de dpkg-reconfigure nvidia-kernel-dkms
:
# dpkg-reconfigure nvidia-kernel-dkms
------------------------------
Deleting module version: 302.17
completely from the DKMS tree.
------------------------------
Done.
Loading new nvidia-302.17 DKMS files...
Building only for 3.2.0-3-amd64
Building initial module for 3.2.0-3-amd64
Error! Build of nvidia.ko failed for: 3.2.0-3-amd64 (x86_64)
Consult the make.log in the build directory
/var/lib/dkms/nvidia/302.17/build/ for more information.
Um snippet relevante de /var/lib/dkms/nvidia/302.17/build/make.log
segue. O problema é não na compilação, posso garantir isso.
LD [M] /var/lib/dkms/nvidia/302.17/build/nvidia.o
Building modules, stage 2.
MODPOST 0 modules
make[1]: Leaving directory '/usr/src/linux-headers-3.2.0-3-amd64'
make: Leaving directory '/var/lib/dkms/nvidia/302.17/build'
E é isso. Nenhuma explicação de qualquer tipo em nenhum outro arquivo no mesmo diretório (pelo menos até onde eu verifiquei).
Antes de fazer minhas perguntas: estou usando o driver nouveau agora (não é como se eu tivesse outra escolha), mas não funciona muito bem para mim. Eu tenho 3 desktops, constantemente reproduzindo filmes em 1 deles, e sendo um desenvolvedor muito ocupado no outro 2. O driver nouveau falha um pouco lá (os filmes na segunda tela ficam listras horizontais o tempo todo, o atraso de consoles XFCE um pouco na rolagem, etc.)
Perguntas:
- Devo alterar a versão do meu kernel? Tentei
3.2.0-2-amd64
e 3.2.0-3-amd64
, sem sucesso. Tentar o 3.2.0-3-rt-amd64
faz minha máquina congelar depois de alguns minutos de operação, portanto não me atrevo a instalá-lo novamente.
- Devo alterar uma versão de algo no meu ambiente de criação? (Como apontado nas atualizações, não é apenas o problema da NVIDIA, como se vê).
- Devo supor que meu vinculador esteja com falha (estou não usando
gold
, estou usando ld
do pacote binutils
) e, em caso afirmativo, o que eu poderia fazer fazer o método DKMS finalmente funcionar? Já que o problema parece se manifestar na fase de ligação (e o MODPOST mostra 0 módulos).
Em uma nota pessoal, isso me perturba em um nível muito mais profundo que eu geralmente gosto de admitir. Eu tive um grande respeito ao Debian , que no momento está quebrado. C'mon, um simples apt-get upgrade
quebra todas as compilações / ligações de drivers de kernel de código aberto?
Extremamente decepcionante.
UPDATE # 1:
Na verdade, tentei instalar os drivers oficiais da NVIDIA 304.22, aqui está o arquivo de log. Parece que a ligação realmente falha, não é?
Além disso, se eu tentar também ativar a integração do DKMS, recebo uma mensagem do tipo que o script não pode determinar a versão atual do kernel (texto na 3ª atualização).
nvidia-installer log file '/var/log/nvidia-installer.log'
creation time: Sat Jul 21 22:59:30 2012
installer version: 304.22
PATH: /usr/local/rvm/gems/ruby-1.9.3-p194/bin:/usr/local/rvm/gems/ruby-1.9.3-p194@global/bin:/usr/local/rvm/rubies/ruby-1.9.3-p194/bin:/usr/local/rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
nvidia-installer command line:
./nvidia-installer
Using: nvidia-installer ncurses user interface
-> License accepted.
-> Installing NVIDIA driver version 304.22.
-> There appears to already be a driver installed on your system (version: 304.22). As part of installing this driver (version: 304.22), the existing driver will be uninstalled. Are you sure you want to continue? ('no' will abort installation) (Answer: Yes)
-> Would you like to register the kernel module sources with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later. (Answer: No)
-> Performing CC sanity check with CC="gcc-4.6".
-> Performing CC version check with CC="gcc-4.6".
-> Kernel source path: '/lib/modules/3.2.0-3-amd64/source'
-> Kernel output path: '/lib/modules/3.2.0-3-amd64/build'
-> Performing rivafb check.
-> Performing nvidiafb check.
-> Performing Xen check.
-> Cleaning kernel module build directory.
executing: 'cd ./kernel; make clean'...
-> Building kernel module:
executing: 'cd ./kernel; make module SYSSRC=/lib/modules/3.2.0-3-amd64/source SYSOUT=/lib/modules/3.2.0-3-amd64/build'...
NVIDIA: calling KBUILD...
make -C /lib/modules/3.2.0-3-amd64/build \
KBUILD_SRC=/usr/src/linux-headers-3.2.0-3-common \
KBUILD_EXTMOD="/tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel" -f /usr/src/linux-headers-3.2.0-3-common/Makefile \
modules
test -e include/generated/autoconf.h -a -e include/config/auto.conf || ( \
echo; \
echo " ERROR: Kernel configuration is invalid."; \
echo " include/generated/autoconf.h or include/config/auto.conf are missing.";\
echo " Run 'make oldconfig && make prepare' on kernel src to fix it."; \
echo; \
/bin/false)
mkdir -p /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/.tmp_versions ; rm -f /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/.tmp_versions/*
make -f /usr/src/linux-headers-3.2.0-3-common/scripts/Makefile.build obj=/tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel
gcc-4.6 -Wp,-MD,/tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/.nv.o.d -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/4.6/include -I/usr/src/linux-headers-3.2.0-3-common/arch/x86/include -Iarch/x86/include/generated -Iinclude -I/usr/src/linux-headers-3.2.0-3-common/include -include /usr/src/linux-headers-3.2.0-3-common/include/linux/kconfig.h -I/tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -Os -m64 -mtune=generic -mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 -DCONFIG_AS_FXSAVEQ=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=2048 -Wno-unused-but-set-variable -fomit-frame-pointer -g -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel -Wall -MD -Wsign-compare -Wno-cast-
qual -Wno-error -D__KERNEL__ -DMODULE -DNVRM -DNV_VERSION_STRING=\"304.22\" -Wno-unused-function -Wuninitialized -mno-red-zone -mcmodel=kernel -UDEBUG -U_DEBUG -DNDEBUG -DMODULE -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(nv)" -D"KBUILD_MODNAME=KBUILD_STR(nvidia)" -c -o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/.tmp_nv.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv.c
In file included from /usr/src/linux-headers-3.2.0-3-common/include/linux/kernel.h:17:0,
from /usr/src/linux-headers-3.2.0-3-common/include/linux/sched.h:55,
from /usr/src/linux-headers-3.2.0-3-common/include/linux/utsname.h:35,
from /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-linux.h:38,
from /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv.c:13:
/usr/src/linux-headers-3.2.0-3-common/include/linux/bitops.h: In function ‘hweight_long’:
/usr/src/linux-headers-3.2.0-3-common/include/linux/bitops.h:49:41: warning: signed and unsigned type in conditional expression [-Wsign-compare]
In file included from /usr/src/linux-headers-3.2.0-3-common/arch/x86/include/asm/uaccess.h:575:0,
from /usr/src/linux-headers-3.2.0-3-common/include/linux/poll.h:14,
from /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-linux.h:97,
from /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv.c:13:
/usr/src/linux-headers-3.2.0-3-common/arch/x86/include/asm/uaccess_64.h: In function ‘copy_from_user’:
/usr/src/linux-headers-3.2.0-3-common/arch/x86/include/asm/uaccess_64.h:53:6: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
...snipped lots of compile output with the same warning...
ld -m elf_x86_64 -r -o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nvidia.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-kernel.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-acpi.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-chrdev.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-cray.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-gvi.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-i2c.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-mempool.o /tmp/selfgz10141/NVI
DIA-Linux-x86_64-304.22/kernel/nv-mlock.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-mmap.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-p2p.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-pat.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-procfs.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-usermap.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-vm.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-vtophys.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/os-agp.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/os-interface.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/os-mtrr.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/os-registry.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/os-smp.o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/os-usermap.o
(cat /dev/null; echo kernel//tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nvidia.ko;) > /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/modules.order
make -f /usr/src/linux-headers-3.2.0-3-common/scripts/Makefile.modpost
scripts/mod/modpost -m -i /usr/src/linux-headers-3.2.0-3-amd64/Module.symvers -I /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/Module.symvers -o /tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/Module.symvers -S -w -s
NVIDIA: left KBUILD.
nvidia.ko failed to build!
make[1]: *** [module] Error 1
make: *** [module] Error 2
-> Error.
ERROR: Unable to build the NVIDIA kernel module.
ERROR: Installation has failed. Please see the file '/var/log/nvidia-installer.log' for details. You may find suggestions on fixing installation problems in the README available on the Linux driver download page at www.nvidia.com.
ATUALIZAÇÃO # 2:
De acordo com a sugestão de StarNamer , eu reinstalei o linux-headers-3.2.0-3-amd64
. Depois disso, o DKMS entrou em ação e tentou novamente compilar o driver da NVIDIA. Aqui está o conteúdo do arquivo /var/lib/dkms/nvidia/304.22/build/make.log
:
DKMS make.log for nvidia-304.22 for kernel 3.2.0-3-amd64 (x86_64)
Sun Jul 22 14:50:58 EEST 2012
If you are using a Linux 2.4 kernel, please make sure
you either have configured kernel sources matching your
kernel or the correct set of kernel headers installed
on your system.
If you are using a Linux 2.6 kernel, please make sure
you have configured kernel sources matching your kernel
installed on your system. If you specified a separate
output directory using either the "KBUILD_OUTPUT" or
the "O" KBUILD parameter, make sure to specify this
directory with the SYSOUT environment variable or with
the equivalent nvidia-installer command line option.
Depending on where and how the kernel sources (or the
kernel headers) were installed, you may need to specify
their location with the SYSSRC environment variable or
the equivalent nvidia-installer command line option.
*** Unable to determine the target kernel version. ***
make: *** [select_makefile] Error 1
UPDATE # 3:
Depois de dias e dias pesquisando, comecei a me perguntar se isso é culpa da NVIDIA. Acontece que não é. Eu tentei instalar o Virtual Box 4.1 (do testing
repo), e me deparei com isso novamente :
# cat /var/lib/dkms/virtualbox/4.1.18/build/make.log
DKMS make.log for virtualbox-4.1.18 for kernel 3.2.0-3-amd64 (x86_64)
Tue Jul 24 17:58:57 EEST 2012
make: Entering directory '/usr/src/linux-headers-3.2.0-3-amd64'
LD /var/lib/dkms/virtualbox/4.1.18/build/built-in.o
LD /var/lib/dkms/virtualbox/4.1.18/build/vboxdrv/built-in.o
CC [M] /var/lib/dkms/virtualbox/4.1.18/build/vboxdrv/linux/SUPDrv-linux.o
... snipped ...
CC [M] /var/lib/dkms/virtualbox/4.1.18/build/vboxpci/SUPR0IdcClientComponent.o
CC [M] /var/lib/dkms/virtualbox/4.1.18/build/vboxpci/linux/SUPR0IdcClient-linux.o
LD [M] /var/lib/dkms/virtualbox/4.1.18/build/vboxpci/vboxpci.o
Building modules, stage 2.
MODPOST 0 modules
make: Leaving directory '/usr/src/linux-headers-3.2.0-3-amd64'
E, claro, não há mais detalhes (como já foi dito, parece como um problema de linker, mas não tenho certeza ainda). Então, isso deve ser mais um problema Debian / DKMS ou algum tipo de configuração incorreta. No entanto, juro que não toquei em nada. Eu estava simplesmente fazendo diariamente apt-get upgrade
-s. Então alguma coisa não foi tão bem, obviamente.
ATUALIZAÇÃO # 4:
Eu tentei criar um pequeno módulo como descrito aqui: link . De fato, ainda estou vendo MODPOST 0 modules
. Aqui está a saída quando eu coloco V=1
no Makefile:
# make
make -C /lib/modules/3.2.0-3-amd64/build M=/home/dimi/code/hello V=1 modules
make[1]: Entering directory '/usr/src/linux-headers-3.2.0-3-amd64'
make -C /usr/src/linux-headers-3.2.0-3-amd64 \
KBUILD_SRC=/usr/src/linux-headers-3.2.0-3-common \
KBUILD_EXTMOD="/home/dimi/code/hello" -f /usr/src/linux-headers-3.2.0-3-common/Makefile \
modules
test -e include/generated/autoconf.h -a -e include/config/auto.conf || ( \
echo; \
echo " ERROR: Kernel configuration is invalid."; \
echo " include/generated/autoconf.h or include/config/auto.conf are missing.";\
echo " Run 'make oldconfig && make prepare' on kernel src to fix it."; \
echo; \
/bin/false)
mkdir -p /home/dimi/code/hello/.tmp_versions ; rm -f /home/dimi/code/hello/.tmp_versions/*
make -f /usr/src/linux-headers-3.2.0-3-common/scripts/Makefile.build obj=/home/dimi/code/hello
gcc-4.6 -Wp,-MD,/home/dimi/code/hello/.hello.o.d -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/4.6/include -I/usr/src/linux-headers-3.2.0-3-common/arch/x86/include -Iarch/x86/include/generated -Iinclude -I/usr/src/linux-headers-3.2.0-3-common/include -include /usr/src/linux-headers-3.2.0-3-common/include/linux/kconfig.h -I/home/dimi/code/hello -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -Os -m64 -mtune=generic -mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 -DCONFIG_AS_FXSAVEQ=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=2048 -Wno-unused-but-set-variable -fomit-frame-pointer -g -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -DMODULE -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(hello)" -D"KBUILD_MODNAME=KBUILD_STR(hello)" -c -o /home/dimi/code/hello/.tmp_hello.o /home/dimi/code/hello/hello.c
(cat /dev/null; echo kernel//home/dimi/code/hello/hello.ko;) > /home/dimi/code/hello/modules.order
make -f /usr/src/linux-headers-3.2.0-3-common/scripts/Makefile.modpost
scripts/mod/modpost -m -i /usr/src/linux-headers-3.2.0-3-amd64/Module.symvers -I /home/dimi/code/hello/Module.symvers -o /home/dimi/code/hello/Module.symvers -S -w -c -s
make[1]: Leaving directory '/usr/src/linux-headers-3.2.0-3-amd64'
E aqui está o que eu vejo quando removo V=1
:
# make
make -C /lib/modules/3.2.0-3-amd64/build M=/home/dimi/code/hello modules
make[1]: Entering directory '/usr/src/linux-headers-3.2.0-3-amd64'
CC [M] /home/dimi/code/hello/hello.o
Building modules, stage 2.
MODPOST 0 modules
make[1]: Leaving directory '/usr/src/linux-headers-3.2.0-3-amd64'