背景:最近在安装显卡驱动,查找了一些网上的教程,但总感觉思路不够清晰,没办法弄清背后涉及的Linux原理,于是参考网上教程,并查阅了相关资料,希望能对显卡驱动安装作一个梳理,以做记录。
首先,查看版本信息
# cat /etc/system-release
CentOS Linux release 7.6.1810 (Core)
# uname -r
3.10.0-957.21.3.el7.x86_64
一、Linux module(模块)机制
Linux内核作用有以下作用:
1、管理内存
2、调度任务
3、驱动硬件
4、网络功能
5、安全
6、管理文件系统
Linux内核框架庞大,随着新硬件、文件系统和新功能的不断发展,如果把所有需要的功能都编译到Linux内核中,会造成内核体积庞大,每次加入新的功能都需要重新编译内核,非常麻烦。
为解决这个问题,Linux引入了模块机制,简单来讲,就是kernel(内核)只负责最主要的功能,当需要添加新的硬件和功能时,可以把新功能和新硬件的驱动单独编译为一个模块,开机载入kernel时,系统会同时载入模块,从而提高灵活性。当然,也可以把模块看作kernel的一部分。
在我的机器上,驱动模块放在以下目录中
/lib/modules/3.10.0-957.21.3.el7.x86_64/kernel/drivers
来看看该目录下有什么东西:
# ls /lib/modules/3.10.0-957.21.3.el7.x86_64/kernel/drivers
acpi block crypto firewire hv infiniband md misc nvdimm pinctrl ptp staging usb virtio
ata bluetooth dax firmware hwmon input media mmc nvme platform pwm target uwb watchdog
auxdisplay cdrom dca gpio i2c iommu memstick mtd parport power rtc thermal vfio xen
base char dma gpu idle isdn message net pci powercap scsi tty vhost
bcma cpufreq edac hid iio leds mfd ntb pcmcia pps ssb uio video
可以看到有acpi电源管理驱动,cdrom驱动,gpu驱动,还有nvme,pci,scsi,usb等驱动。由于本文主要讨论显卡驱动,我们进入gpu目录来看看有什么。
# cd gpu
# ls
drm
# cd drm
# ls
amd bochs drm_kms_helper.ko.xz drm_panel_orientation_quirks.ko.xz i2c mgag200 qxl scheduler udl vmwgfx
ast cirrus drm.ko.xz gma500 i915 nouveau radeon ttm virtio
可以看到有以.ko.xz结尾的文件,这就是Linux下模块的文件类型。还有一个特别要注意的目录nouveau,该目录下有nouveau.ko.xz文件,在我们没有安装Nvidia官方驱动时,系统开机默认使用的就是这个驱动。(nouveau是一个开源驱动,性能很差)
由于安装显卡驱动模块,要重新编译模块,所以需要内核模块编译的相关文件kernel-header和kernel-devel,通过yum安装
# yum -y install kernel-header
# yum -y install kernel-devel
二、initramfs文件(参考自鸟哥的Linux私房菜)
开机时我们需要识别硬盘并挂载/目录,从而载入kernel,然而此时并没有硬盘SATA接口的SCSI驱动,那么该如何挂载并载入kernel呢