Warning: Compiler version check failed:
The major and minor number of the compiler used to
compile the kernel:
gcc version 9.3.1 20200408 (Red Hat 9.3.1-2) (GCC)
does not match the compiler used here:
cc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
错误信息:
././include/linux/compiler_types.h:214:24: error: expected '(' before '__inline'
#define asm_inline asm __inline
^
一)、参考链接:
1、centos-release-scl https://github.com/sclorg/centos-release-scl
On CentOS, there are packages centos-release-scl and centos-release-scl-rh available in centos-extra repository
2、Issue with module compilation on Centos 7 kernel-lt-5.4 from elrepo https://github.com/aabc/ipt-netflow/issues/171
(首发地址:学习日记 https://www.learndiary.com/2023/09/centos-7-elrepo-kernel-5-4-nvidia/ )
CentOS 7 是一款 2014 年发布的企业级 Linux 服务器操作系统,现在仍不断有新的机器在继续安装它。但 CentOS 7 标准的 3.10 内核不一定支持一些新的硬件,这时安装 elrepo 源里的长期支持内核 kernel-lt 和主线内核 kernel-mt 就成了一个选择。
但是, 因为 CentOS 7 古老的开发工具集,我在新的 elrepo 内核下面安装 nvidia 驱动碰到了麻烦。本文以一台宿主机是 Deepin 20.9 Linux,在 virt-manager 虚拟机软件里直通 Nvidia P106-100 矿卡的 CentOS 7.9 虚拟机为例,简述在 elrepo kernel 5.4 下面几种不同方式安装的工具集下安装 nvidia 驱动的情况。着重介绍 gcc 及 ld 程序的安装设置。而安装 elrepo kernel 和 nvidia 驱动则只给出参考链接。
一、视频演示
本视频详细介绍 CentOS 7 Linux 下安装 elrepo-kernel 源的 5.4 长期支持内核、centos-release-scl-rh 源里的 devtoolset-9-gcc 和 nvidia 闭源驱动及使用 dkms 在新安装 elrepo-kernel 源里的 6.5 主线内核时自动编译安装 nvidia 驱动的完整步骤。演示地址:【CentOS 7 elrepo 5.4 内核安装 nvidia 闭源驱动】
https://www.bilibili.com/video/BV1wN411i7zJ/?share_source=copy_web&vd_source=d1925b070926f23b2b6676137251e9ea
二、安装 elrepo kernel 5.4
这里把 kernel-lt、kernel-lt-devel、kernel-lt-headers 全部安装上。其中 kernel-lt-headers 不是安装 nvidia 驱动必需的。参见:How To Install Linux Kernel 5.17 on CentOS 7 https://computingforgeeks.com/install-linux-kernel-5-on-centos-7/
三、在 CentOS 7 下安装 nvidia 驱动的通用步骤
参考链接:How to install Nvidia driver on CentOS 7 Linux https://www.cyberciti.biz/faq/how-to-install-nvidia-driver-on-centos-7-linux/
CentOS 7 下可能缺少一些组件,导致虽然能完成 nvidia 的安装但功能不完整,因此可以把这些可选依赖组件先装上:
安装过程中可能 dkms 部署 nvidia 驱动会失败,但这并不影响当前内核成功安装 nvidia 驱动,但会导致新装内核后无法自动 dkms 部署 nvidia 驱动。解决方法是在首次 nvidia 驱动安装完成之后,手动执行一次 dkms 部署如下:
然后安装新的内核 dkms 就可以自动部署 nvidia 驱动了。需要在新装内核时 dkms 自动部署 nvidia 驱动,还需要把真实使用的 gcc 软链接到 /usr/bin/gcc
四、在自带 gcc 4.8.5 开发工具集下安装 nvidia 驱动失败
在使用自带 gcc 4.8.5 的默认情况下,按照上面的步骤安装 nvidia 驱动会失败。检查安装日志“/var/log/nvidia-installer.log”线索摘要如下:
警告信息:编译内核和编译nvidia驱动用的 gcc 版本不一致:
五、用 centos-release-scl-rh 源里的 devtoolset-9-gcc 的 gcc-9 安装成功(推荐)
一)、参考链接:
1、centos-release-scl https://github.com/sclorg/centos-release-scl
On CentOS, there are packages centos-release-scl and centos-release-scl-rh available in centos-extra repository
2、Issue with module compilation on Centos 7 kernel-lt-5.4 from elrepo https://github.com/aabc/ipt-netflow/issues/171
二)、安装步骤:
然后用上面“三”里面安装 nvidia 驱动的通用步骤即可。
六、使用 Conda 里的 gcc 9.4 安装成功
一)、参考链接
Conda 或 Miniconda 的安装使用这里就不详述了。参考链接:
Linux 下非 root 用户 Conda 安装生物信息 R 软件包 CellMix 演示 https://www.learndiary.com/2022/05/linux-conda-cellmix/
二)、安装步骤:
这里还需要把 conda 里的 gcc 和 ld 链接到 /usr/bin 下面:
然后用上面“三”里面安装 nvidia 驱动的通用步骤即可。
七、编译安装 gcc 9 后再安装 nvidia 驱动
一)、参考链接:
Compile and install gcc-9.3.0 https://gist.github.com/yosoufe/ad45f45c10fe08abecbf53000d0d199f
下载 https://ftp.gnu.org/gnu/gcc/gcc-9.3.0/
二)、安装步骤
这里还需要把编译的 gcc 链接到 /usr/bin 下面:
然后用上面“三”里面安装 nvidia 驱动的通用步骤即可。
八、用自带 gcc 4.8.5 编译 5.4 内核再安装 nvidia 驱动
一)、参考链接:
How to compile and install Linux Kernel 5.4.1 from source code https://www.cnblogs.com/ztguang/p/12644257.html
注意:
1、这里可以借用 elrepo-kernel 源里的 5.4 内核的编译配置文件 /boot/config-5.4*,把它在内核源码文件夹另存为 .config,再执行 make oldconfig 生成新的内核编译配置文件即可。
2、我试了一下,新的 5.4 内核用自带的 gcc 4.8.5 编译出错,报告:
经测试,内核 5.4.207 可以用自带的 gcc 4.8.5 编译安装成功。
二)、安装步骤:
在新编译安装的5.4.207内核下,使用自带的 gcc 4.8.5,用上面“三”里面安装 nvidia 驱动的通用步骤即可。
九、小结
从上面的测试中可以看出,nvidia 驱动模块的安装主要跟内核使用的编译工具集版本和当前安装驱动使用的编译工具集版本特性是否匹配有关。内核的 gcc 编译器版本是9.3.1,安装nvidia驱动模块的 gcc 编译器版本这里使用 9.3.1、9.4.0、9.3.0 都可以。内核和驱动同时使用自带的 gcc 4.8.5 也行。另外,ld 的版本也要匹配。
另外,经过测试发现,使用 conda 安装和自编译的工具集,需要把 gcc 链接到 /usr/bin 下面,conda 安装还需要把 ld 链接到 /usr/bin 下面。
需要在新装内核时 dkms 自动部署 nvidia 驱动,每种情况都需要把真实使用的 gcc 软链接到 /usr/bin/gcc。
请注意我所测试的版本和环境,不一定长期有效,也不一定任何环境有效,仅供参考。