首页 雷火电竞正文

https,linux驱动办理利器,详解dkms作业原理-雷火app

admin 雷火电竞 2019-11-04 137 0

布景

最近遇到一个费事的问题,几台服务器在晋级内核之后,新的内核发动直接panic,无法正常驱动raid卡. 经过进入ramos,发现新的内核里边没有对应的raid卡驱动ko文件. 后边才发现老的内核中rraid卡驱动是从源代码独自编译出来的. 换了新的kernel之后,忘了给新的内核从头编译这个驱动就重启了,导致kernel panic.

在linux中,每个驱动ko文件是与一个特定内核绑定的,也便是在老内核下面编译的驱动在新内核下面无法运用,相同的,在新内核下面编译的驱动在老内核也无法运用.

在linux kernel源代码树中,现已包含了咱们常见的许多驱动,那么在装置一个新的内核rpm包的时分,这些驱动也就被一同装置了. 可是有些驱动不在源代码树里边,这些驱动需求手动编译装置;还有一些驱动虽然在源代码树中,可是源代码树中的或许太老了,新的驱动也需求独自编译装置.

运用dkms来办理源代码树外的驱动

dkms便是用来处理在kernel源代码树中不存在的驱动,或许咱们自己保护的驱动的. 它能够确保新的kernel装置之后,这些驱动被主动从头编译,主动运转depmod指令,主动生成新的initram文件.

dkms这个东西存在于epel源中,需求先确保epel翻开,然后yum -y install dkms就能够装置这个东西了.运用rpm -ql dkms看下这个包装置了什么东西.

/usr/sbin/dkms是dkms指令行自身,是一个bash脚本.咱们用的最多的是dkms status,用来检查当时dkms办理的驱动的状况

/var/lib/dkms是dkms作业目录.

/etc/kernel/目录下面的两个文件,分别是postinst和prerm的kernel hook,dkms主动办理驱动中心便是这两个文件.

现在大部分驱动rpm包都有两种方法的,一种是直接针对rhel特定版别(也便是特定内核)编译好的. 还有便是一个dkms enabled的rpm包.

下面以megaraid_sas-07.710.06.00-1dkms.noarch.rpm这个dkms enabled包为例来操作.什么是dkms enabled的rpm包呢

首要,这个rpm装置文件的途径一定是/usr/src/module-version目录,比方这儿的/usr/src/megaraid_sas-07.710.06.00,然后这个包里边一定有一个dkms.conf文件.

由于dkms作业的时分需求读取这个dkms.conf文件,这个文件实践是一个shell脚本,dkms作业的时分会source进去.

咱们看下装置这个包的时分详细会做的作业

装置之前,dkms status输出为空,表明没有办理任何驱动

这个包装置的时分,会看到dkms add,dkms build(编译驱动),dkms install(把编译好的驱动装置到/lib/modules/`uname -r`目录下),跑depmod,跑dracut从头生成initramfs的进程(假如手动装驱动,便是这些进程)

dkms enabled包的scripts,里边是中心的dkms指令

dkms enabled包的装置进程,能看到要害的过程被履行

假如dkms仅仅能帮咱们履行这些指令,那么其实用途也不大. dkms最主要的用途是当咱们装置了一个新的kernel包之后,其会用到kernel hook给咱们主动从头给新内核完结上面的作业.

dkms运用kernel hook主动办理驱动

在咱们装置了这个dkms enabled的驱动包之后,咱们装置一个新的内核

能看到这个新的kernel包装置的进程中跑了一些脚本.

完结之后,dkms status直接显现新的内核直接把这个驱动包装置上了.

dkms的作业目录/var/lib/dkms也显现这个驱动包装置到了新的内核.

那么dkms在装置新的内核包的时分,怎样触发给新的内核包从头编译驱动的呢?

咱们看下内核包的scripts,发现里边有对/usr/sbin/new-kernel-pkg脚本的调用

而/usr/sbin/new-kernel-pkg里边有对/etc/kernel/postinst.d/目录下的脚本进行调用的逻辑.

dkms给/etc/kernel/postinst.d下面装置了脚本

这个脚本里边调用/usr/lib/dkms/dkms_autoinstaller进行主动装置

dkms_autoinstaller调用dkms autoinstall,在autoinstall中,会对当时一切状况为installed,而且dkms.conf装备汇总AUTOINSTALL=yes的模块对装置的内核进行编译装置.

总结

dkms是dell做的一个主动办理kernel源代码树外的驱动结构,现在很多用于各种硬件,特别是存储硬件的驱动办理中. 其运用方法特别简略,只需求将一个dkms enabled的源代码包装置即可. 后边的作业便是dkms自己处理了. 我们找硬件驱动包的时分能够找dkms enabled的,假如没有也能够从源代码用tarball的方法导入,自己再加个dkms.conf就能够了.

雷火电竞版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

最近发表

    雷火app_雷火竞技竞猜平台|首页

    http://film101studio.com/

    |

    Powered By

    使用手机软件扫描微信二维码

    关注我们可获取更多热点资讯

    雷火电竞出品