linux如何卸载内核模块_如何加载或卸载Linux内核模块
linux如何卸载内核模块 本文摘自Manning出版的《 Linux in Action》第15章。Linux使用内核模块管理硬件外围设备。 这是这样的。一个运行中的Linux内核是您不想烦恼的事情之一。 毕竟,内核是驱动计算机执行所有操作的软件。 考虑到必须在实时系统上同时管理多少个细节,最好让内核以尽可能少的干扰来完成其工作。 但是,如果在不重新启动整个系统的情况下无法对计算环...
linux如何卸载内核模块
本文摘自Manning出版的《 Linux in Action》第15章。
Linux使用内核模块管理硬件外围设备。 这是这样的。
一个运行中的Linux内核是您不想烦恼的事情之一。 毕竟,内核是驱动计算机执行所有操作的软件。 考虑到必须在实时系统上同时管理多少个细节,最好让内核以尽可能少的干扰来完成其工作。 但是,如果在不重新启动整个系统的情况下无法对计算环境进行很小的更改,则插入新的网络摄像头或打印机可能会给您的工作流程带来痛苦。 每次添加设备时都必须重新启动,以使系统识别它几乎没有效率。
为了在稳定性和可用性的对立优点之间取得有效的平衡,Linux隔离了内核,但允许您通过可加载的内核模块(LKM)快速添加特定的功能。 如下图所示,您可以将模块视为一个软件,它告诉内核在哪里可以找到设备以及如何使用该设备。 反过来,内核使设备可供用户和进程使用,并监督其运行。
没有什么可以阻止您编写自己的模块以完全按照您希望的方式支持设备的,但是为什么要麻烦呢? Linux模块库已经非常强大,以至于通常不需要自己动手。 在绝大多数情况下,Linux会自动加载新设备的模块,而您甚至都不知道它。
尽管如此,由于某些原因,有时它并不是单独发生的。 (您不想让招聘经理不耐烦地等待您的笑脸加入视频会议工作面试时间太长。)为了帮助您完成工作,您需要对内核模块有更多的了解,尤其是,如何找到将运行外围设备的实际模块,然后如何手动激活它。
查找内核模块
按照公认的惯例,模块是扩展名为.ko(内核对象)的文件,位于/lib/modules/
目录下。 但是,在完全导航到这些文件之前,您可能必须做出选择。 因为在启动时可以从版本列表中加载一个选项,所以支持选择的特定软件(包括内核模块)必须存在于某个地方。 好吧, /lib/modules
/就是其中之一。 在该目录中,您可以找到每个可用Linux内核发行版的模块填充目录; 例如:
$ ls /lib/modules
4.4.0-101-generic
4.4.0-103-generic
4.4.0-104-generic
就我而言,活动内核是具有最高发行版本号(4.4.0-104通用)的版本,但不能保证对您而言会是相同的(内核会经常更新)。 如果要对要在实时系统上使用的模块进行某些工作,则需要确保您拥有正确的目录树。
uname -r
( -r
从通常会显示的系统信息中指定内核发行版号):
$ uname -r
4.4.0-104-generic
有了这些信息,您可以使用称为命令替换的过程将uname
合并到文件系统引用中。 例如,要导航到正确的目录,请将其添加到/lib/modules
。 要告诉Linux“ uname”不是文件系统位置,请将uname
部分括在反引号中,如下所示:
$ ls /lib/modules/`uname -r`
build modules.alias modules.dep modules.softdep
initrd modules.alias.bin modules.dep.bin modules.symbols
kernel modules.builtin modules.devname modules.symbols.bin
misc modules.builtin.bin modules.order vdso
您将在kernel/
目录下的子目录中找到大多数模块。 花几分钟时间浏览这些目录,以了解事物的排列方式和可用的内容。 文件名通常可以使您很好地了解所要查找的内容。
$ ls /lib/modules/`uname -r`/kernel
arch crypto drivers fs kernel lib mm
net sound ubuntu virt zfs
这是定位内核模块的一种方法。 实际上,这是快速而肮脏的方法。 但这不是唯一的方法。 如果要获取完整的集合,可以使用lsmod
列出所有当前加载的模块以及一些基本信息。 截断的输出的第一列(此处列出的内容太多了)是模块名称,然后是文件大小和编号,然后是每个模块所依赖的其他模块的名称:
$ lsmod
[...]
vboxdrv 454656 3 vboxnetadp,vboxnetflt,vboxpci
rt2x00usb 24576 1 rt2800usb
rt2800lib 94208 1 rt2800usb
[...]
多少太多? 好吧,让我们再次运行lsmod
,但这一次将输出管道传输到wc -l
以获得行数:
$ lsmod | wc -l
113
这些是已加载的模块。 总共有多少个可用? 运行modprobe -c
并计算行数将得到该数字:
$ modprobe -c | wc -l
33350
共有33,350个可用模块! 多年来,似乎有人一直在努力为我们提供运行物理设备的软件。
注意:在某些系统上,您可能会遇到在/etc/modules
文件中以其唯一条目引用的定制模块,或者将其作为配置文件保存到/etc/modules-load.d/
。 这样的模块很可能是本地开发项目的产品,可能涉及尖端的实验。 无论哪种方式,最好都对正在查看的内容有所了解。
这就是找到模块的方式。 您的下一个工作是弄清楚如果由于某种原因它不是独立发生的,则如何手动加载不活动的模块。
手动加载内核模块
在加载内核模块之前,逻辑要求您必须确认它的存在。 在执行此操作之前,您需要知道它的名称。 有时候,获得这一部分需要同等的魔力和运气,以及在线文档作者的辛勤工作中的一些帮助。
我将通过描述一段时间后遇到的问题来说明该过程。 晴朗的一天,由于仍然无法摆脱我的原因,笔记本电脑上的WiFi接口停止工作。 就这样 也许是软件更新将其淘汰了。 谁知道? 我运行了lshw -c network
,并得到了以下非常奇怪的信息:
network UNCLAIMED
AR9485 Wireless Network Adapter
Linux识别了该接口(Atheros AR9485),但将其列为无人认领。 就像他们说的那样:“当艰难时,艰难地搜索互联网。” 我搜索了atheros ar9 linux模块 ,在浏览了5年甚至10年历史的页面并建议我写自己的模块或放弃时,我终于发现了这一点(使用Ubuntu 16.04,至少)存在一个工作模块。 它的名字是ath9k。
是! 战斗和胜利一样好! 向内核添加模块比听起来容易得多。 要再次检查它是否可用,可以针对模块的目录树运行find
,指定-type f
告诉Linux您正在寻找文件,然后添加字符串ath9k
以及glob星号以包括所有以开头的文件名您的字符串:
$ find /lib/modules/$(uname -r) -type f -name ath9k*
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_common.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_hw.ko
仅需一步,即可加载模块:
# modprobe ath9k
而已。 没有重启。 别大惊小怪。
这是另一个示例,向您展示如何使用已损坏的活动模块。 曾经有一段时间,将我的Logitech网络摄像头与特定软件一起使用会使该摄像头无法被任何其他程序访问,直到下次启动系统为止。 有时,我需要在其他应用程序中打开相机,但没有时间关闭并重新启动。 (我运行了许多应用程序,在启动后将它们全部安装到位需要一些时间。)
因为此模块可能处于活动状态,所以使用lsmod
搜索单词video应该给我有关相关模块名称的提示。 实际上,它总比提示好:用video一词描述的唯一模块是uvcvideo (如下所示):
$ lsmod | grep video
uvcvideo 90112 0
videobuf2_vmalloc 16384 1 uvcvideo
videobuf2_v4l2 28672 1 uvcvideo
videobuf2_core 36864 2 uvcvideo,videobuf2_v4l2
videodev 176128 4 uvcvideo,v4l2_common,videobuf2_core,videobuf2_v4l2
media 24576 2 uvcvideo,videodev
我可能已经控制了导致崩溃的某些事情,我想我可能已经更深入地研究了一下是否可以正确地解决问题。 但是你知道这是怎么回事。 有时您不关心理论,只希望设备正常工作。 因此,我使用rmmod
杀死了uvcvideo模块,并使用modprobe
再次重新启动了它:
# rmmod uvcvideo
# modprobe uvcvideo
再次:没有重启。 没有顽固的血迹。
翻译自: https://opensource.com/article/18/5/how-load-or-unload-linux-kernel-module
linux如何卸载内核模块
更多推荐
所有评论(0)