無法創建“Hello World”模組(以及 NVIDIA 和 VirtualBox)
首先,細節。
**之前:**核心:3.2.0-2-amd64,nvidia 驅動程序:295.59
**之後:**核心:3.2.0-3-amd64,nvidia 驅動程序:302.17-3
我的 Debian wheezy 始終保持最新狀態。實際上,每天做事
apt-get upgrade -s
一開始就讓我遇到了麻煩。顯然,
apt-get upgrade
在我的 Debian 上出現了一些“損壞”的東西——與建構生態系統和/或 DKMS 本身有關的東西。NVIDIA 驅動程序無法通過官方 Wiki 中推薦的任何方法建構。包括 NVIDIA 官方二進製文件(其中一個更新的日誌片段)。
這是輸出
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.
來自
/var/lib/dkms/nvidia/302.17/build/make.log
以下的相關片段。問題不在編譯中,我可以保證。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'
就是這樣。在同一目錄中的任何其他文件中沒有任何類型的解釋(至少據我檢查)。
在我提出問題之前:我現在正在使用 nouveau 驅動程序(反正我沒有任何選擇),但它對我來說不太好用。我有 3 個台式機,其中 1 個經常播放電影,另外 2 個是一個非常忙碌的開發人員。nouveau 驅動程序在那裡有點失敗(第二個螢幕上的電影總是出現水平條紋,XFCE 控制台滯後有點滾動等)
問題:
- 我應該更改我的核心版本嗎?試過了
3.2.0-2-amd64
,3.2.0-3-amd64
無濟於事。嘗試3.2.0-3-rt-amd64
執行幾分鐘後我的機器就會當機,因此我不敢再次安裝它。- 我應該在建構環境中更改某個版本嗎?(正如更新中所指出的,事實證明,這不僅僅是 NVIDIA 的問題)。
- 我是否應該假設我的連結器有問題(我沒有使用
gold
,我正在ld
從binutils
包中使用),如果是這樣,我該怎麼做才能使 DKMS 方法最終起作用?由於問題似乎確實在連結階段表現出來(並且 MODPOST 顯示 0 個模組)。就個人而言,這讓我在更深層次上感到不安,我通常願意承認。我非常尊重 Debian,現在它已經被粉碎了。來吧,一個簡單的
apt-get upgrade
破壞所有開源核心驅動程序編譯/連結?非常令人失望。
更新#1:
事實上,我確實嘗試安裝官方 304.22 NVIDIA 驅動程序,這是日誌文件。看起來連結確實失敗了,是嗎?
此外,如果我也嘗試啟用 DKMS 集成,我會收到一條消息,指出腳本無法確定目前核心版本(第三次更新中的文本)。
nvidia-installer 日誌文件“/var/log/nvidia-installer.log” 創建時間:2012年7月21日星期六22:59:30 安裝程序版本:304.22 路徑:/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 命令行: ./nvidia 安裝程序 使用:nvidia-installer ncurses 使用者界面 -> 接受許可。 -> 安裝 NVIDIA 驅動程序版本 304.22。 -> 您的系統上似乎已經安裝了驅動程序(版本:304.22)。作為安裝此驅動程序(版本:304.22)的一部分,現有驅動程序將被解除安裝。你確定你要繼續嗎?(“否”將中止安裝)(答案:是) -> 您想向 DKMS 註冊核心模組源嗎?如果您稍後安裝不同的核心,這將允許 DKMS 自動建構新模組。(答案:沒有) -> 使用 CC="gcc-4.6" 執行 CC 健全性檢查。 -> 使用 CC="gcc-4.6" 執行 CC 版本檢查。 -> 核心源路徑:'/lib/modules/3.2.0-3-amd64/source' -> 核心輸出路徑:'/lib/modules/3.2.0-3-amd64/build' -> 執行 rivafb 檢查。 -> 執行 nvidiafb 檢查。 -> 執行 Xen 檢查。 -> 清理核心模組建構目錄。 執行:'cd ./kernel; 打掃乾淨'... -> 建構核心模組: 執行:'cd ./kernel; 製作模組 SYSSRC=/lib/modules/3.2.0-3-amd64/source SYSOUT=/lib/modules/3.2.0-3-amd64/build'... 英偉達:呼叫 KBUILD... 製作 -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 \ 模組 測試 -e 包含/生成/autoconf.h -a -e 包含/config/auto.conf || ( \ 迴聲; \ echo " 錯誤:核心配置無效。"; \ echo " include/generated/autoconf.h 或 include/config/auto.conf 失去。";\ echo " 在核心 src 上執行 'make oldconfig && make prepare' 來修復它。"; \ 迴聲; \ /bin/假) 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.od -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/核心 -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-檢查 -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-設置變數 -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/核心 -Wall -MD -Wsign-compare -Wno-cast-22/核心 -Wall -MD -Wsign-compare -Wno-cast-22/核心 -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 在 /usr/src/linux-headers-3.2.0-3-common/include/linux/kernel.h:17:0 包含的文件中, 來自 /usr/src/linux-headers-3.2.0-3-common/include/linux/sched.h:55, 來自 /usr/src/linux-headers-3.2.0-3-common/include/linux/utsname.h:35, 來自/tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-linux.h:38, 來自/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:在函式“hweight_long”中: /usr/src/linux-headers-3.2.0-3-common/include/linux/bitops.h:49:41:警告:條件表達式中的有符號和無符號類型 [-Wsign-compare] 在 /usr/src/linux-headers-3.2.0-3-common/arch/x86/include/asm/uaccess.h:575:0 包含的文件中, 來自 /usr/src/linux-headers-3.2.0-3-common/include/linux/poll.h:14, 來自/tmp/selfgz10141/NVIDIA-Linux-x86_64-304.22/kernel/nv-linux.h:97, 來自/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:在函式'copy_from_user'中: /usr/src/linux-headers-3.2.0-3-common/arch/x86/include/asm/uaccess_64.h:53:6:警告:有符號和無符號整數表達式之間的比較 [-Wsign-compare] ...用相同的警告剪掉了很多編譯輸出... 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 腳本/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 英偉達:離開 KBUILD。 nvidia.ko 建構失敗! make[1]: *** [模組] 錯誤 1 make: *** [模組] 錯誤 2 -> 錯誤。 錯誤:無法建構 NVIDIA 核心模組。 錯誤:安裝失敗。有關詳細資訊,請參閱文件“/var/log/nvidia-installer.log”。您可以在 www.nvidia.com 的 Linux 驅動程序下載頁面上的 README 中找到有關修復安裝問題的建議。
更新#2:
根據StarNamer的建議,我確實重新安裝了
linux-headers-3.2.0-3-amd64
。完成後,DKMS 啟動並再次嘗試編譯 NVIDIA 驅動程序。這是文件的內容/var/lib/dkms/nvidia/304.22/build/make.log
:用於核心 3.2.0-3-amd64 (x86_64) 的 nvidia-304.22 的 DKMS make.log 2012 年 7 月 22 日星期日 14:50:58 如果您使用的是 Linux 2.4 核心,請確保 您要麼配置了與您的核心源相匹配的核心源 核心或安裝了正確的核心標頭檔集 在您的系統上。 如果您使用的是 Linux 2.6 核心,請確保 您已經配置了與您的核心匹配的核心源 安裝在您的系統上。如果您指定了單獨的 使用“KBUILD_OUTPUT”或 "O" KBUILD 參數,確保指定這個 帶有 SYSOUT 環境變數或帶有 等效的 nvidia-installer 命令行選項。 取決於核心來源(或 核心標頭檔)已安裝,您可能需要指定 它們的位置與 SYSSRC 環境變數或 等效的 nvidia-installer 命令行選項。 *** 無法確定目標核心版本。*** 製作:*** [select_makefile] 錯誤 1
更新#3:
經過幾天和幾天的Google搜尋,我開始懷疑這是否是 NVIDIA 的錯。事實證明,它不是。我嘗試安裝 Virtual Box 4.1(來自
testing
repo),但我再次偶然發現了這個:# cat /var/lib/dkms/virtualbox/4.1.18/build/make.log 核心 3.2.0-3-amd64 (x86_64) 的 virtualbox-4.1.18 的 DKMS make.log 2012 年 7 月 24 日星期二 17:58:57 make: 進入目錄`/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 ……剪斷了…… 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 建築模組,第 2 階段。 MODPOST 0 個模組 make: 離開目錄`/usr/src/linux-headers-3.2.0-3-amd64'
當然,沒有更多細節(正如已經說過的,它看起來確實是一個連結器問題,但我還不能確定)。所以這一定是 Debian / DKMS 問題或某種錯誤配置。但是,我發誓我沒有碰任何東西。我只是在做日常
apt-get upgrade
-s。顯然,事情進展得不太順利。更新#4:
我確實嘗試按照此處所述創建一個小模組:https ://stackoverflow.com/questions/4715259/linux-modpost-does-not-build-anything 。確實我還在看
MODPOST 0 modules
。這是我放入V=1
Makefile 時的輸出:# 製作 make -C /lib/modules/3.2.0-3-amd64/build M=/home/dimi/code/hello V=1 個模組 make[1]: 進入目錄`/usr/src/linux-headers-3.2.0-3-amd64' 製作 -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 \ 模組 測試 -e 包含/生成/autoconf.h -a -e 包含/config/auto.conf || ( \ 迴聲; \ echo " 錯誤:核心配置無效。"; \ echo " include/generated/autoconf.h 或 include/config/auto.conf 失去。";\ echo " 在核心 src 上執行 'make oldconfig && make prepare' 來修復它。"; \ 迴聲; \ /bin/假) 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.od -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章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 腳本/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/程式碼/hello/Module.symvers -S -w -c -s make[1]: 離開目錄`/usr/src/linux-headers-3.2.0-3-amd64'
這是我刪除時看到的內容
V=1
:# 製作 make -C /lib/modules/3.2.0-3-amd64/build M=/home/dimi/code/hello modules make[1]: 進入目錄`/usr/src/linux-headers-3.2.0-3-amd64' CC [M] /home/dimi/code/hello/hello.o 建築模組,第 2 階段。 MODPOST 0 個模組 make[1]: 離開目錄`/usr/src/linux-headers-3.2.0-3-amd64'
解決了!
就這麼簡單:
/root/.bashrc
裡面有這個:export GREP_OPTIONS='--color=always'
將其更改為:
export GREP_OPTIONS='--color=never'
…並重新啟動 root shell(當然;不要省略這一步)。一切又開始工作了。第一次嘗試建構的 NVIDIA 和 VirtualBox 核心模組。我太高興了!:-)
話又說回來,我對核心建構工具有點失望。他們應該更了解並通過
--color=never
他們使用的任何地方grep
;或者更確切地說,儲存 的舊值GREP_OPTIONS
,在建構過程的生命週期內覆蓋它,然後恢復它。我希望我與這個問題的史詩般的一周戰鬥將證明對社區和核心建構工具開發人員都是有價值的。
非常感謝那些和我在一起並試圖提供幫助的人。
(所有學分都在這裡:http ://forums.gentoo.org/viewtopic-p-4156366.html#4156366 )