linux如何卸载内核模块

本文摘自Manning出版的《 Linux in Action》第15章。

Linux使用内核模块管理硬件外围设备。 这是这样的。

一个运行中的Linux内核是您不想烦恼的事情之一。 毕竟,内核是驱动计算机执行所有操作的软件。 考虑到必须在实时系统上同时管理多少个细节,最好让内核以尽可能少的干扰来完成其工作。 但是,如果在不重新启动整个系统的情况下无法对计算环境进行很小的更改,则插入新的网络摄像头或打印机可能会给您的工作流程带来痛苦。 每次添加设备时都必须重新启动,以使系统识别它几乎没有效率。

为了在稳定性和可用性的对立优点之间取得有效的平衡,Linux隔离了内核,但允许您通过可加载的内核模块(LKM)快速添加特定的功能。 如下图所示,您可以将模块视为一个软件,它告诉内核在哪里可以找到设备以及如何使用该设备。 反过来,内核使设备可供用户和进程使用,并监督其运行。

内核模块充当设备和Linux内核之间的转换器。

没有什么可以阻止您编写自己的模块以完全按照您希望的方式支持设备的,但是为什么要麻烦呢? 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如何卸载内核模块

linux如何卸载内核模块_如何加载或卸载Linux内核模块相关推荐

  1. linux内核及其模块的查询,加载,卸载 lsusb等

    http://blog.sina.com.cn/s/blog_53e81e2a0100zkxi.html 1,/sbin/update-modules文件,他是一个linux通用的模块管理脚本程序. ...

  2. 在Linux系统中实现一个可加载的内核模块

    Intro 坐标成都电讯大专, 某操作系统课老师在PPT上草草写下3个内核线程API后就要求编程, 感受一下: include/linux/kthread.h,你就看到了它全部的API,一共三个函数. ...

  3. Linux驱动模块加载和卸载以及设备注册与注销

    一.驱动模块的加载和卸载 Linux驱动有两种运行方式,第一种就是将驱动编译进Linux内核中,这样当Linux内核启动的时候就会自动运行驱动程序.第二种就是将驱动编译成模块(Linux下模块扩展名为 ...

  4. Linux驱动3:驱动模块加载与卸载

    目录 一.环境配置 1.开发板环境 2.uboot环境 ①设置bootargs ②设置bootcmd 二.加载驱动与卸载驱动 1.加载命令选择 2.创建目录环境以及驱动文件复制 3.加载驱动 提示①& ...

  5. Linux如何加载与卸载U盘

    Linux如何加载与卸载U盘   第一:以root用户登陆 先加载USB模块 modprobe usb-storage 用fdisk -l 看看U盘的设备 假如U盘是sda1   第二:确定在 目录 ...

  6. linux加载的驱动无法卸载,Linux驱动模块卸载后不能再加载、驱动不能卸载的问题(转)...

    在编写驱动程序的时候有时候会出现这种情况,模块加载之后不能卸载或卸载之后不能在加载,cat /proc/devices 后发现设备还占用着设备号,这种情况下,再次加载驱动模块肯定不会成功,必须重新启动 ...

  7. 【转】Linux如何在系统启动时自动加载模块

    1.Linux安装驱动程序 tar zxf ixgbe-<x.x.x>.tar.gz cd ixgbe-<x.x.x>/src/ make install modprobe & ...

  8. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。...

    原文:C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件. 当某个程序集文件被载入AppDomain,该文件在AppDomain.Unloa ...

  9. C#中动态加载和卸载DLL

    在C++中加载和卸载DLL是一件很容易的事,LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL,然后在任何地方卸载.在C#中我们也能使用Assembly.LoadFile实 ...

最新文章

  1. 深入理解计算机系统-之-内存寻址(四)--linux中分段机制的实现方式
  2. ISIS—BGP—VRRP 城域网典型架构图 拓扑实验
  3. 手机中geetest是什么文件_安卓手机系统中各类英文文件夹的含义详解,不知道的尽快熟知!...
  4. 【考研保研直通车】C9高校考研真题
  5. 2.Knockout.Js(监控属性Observables)
  6. Python数值计算:一 使用Pylab绘图(1)
  7. Struts2与Struts1的区别
  8. C++ 的 RTTI
  9. 每当Xcode升级之后,都会导致原有的Xcode插件不能使用,解决办法
  10. PostgreSQL 与 PostGIS
  11. 戴口罩人脸数据集和戴口罩人脸生成方法
  12. Android 自定义CheckBoxPreference的CheckBox复选框
  13. Visio绘制时间轴、日程安排图、时间进度图的方法
  14. Photoshop利用快速蒙版抠图方法
  15. Python基础--01数据类型-标识符命名规范
  16. python实现英雄联盟信息获取
  17. 排列组合公式及排列组合算法
  18. Spring Cloud - 注册中心
  19. C语言心语,心语,心缘
  20. Qt学习之路_12(简易数据管理系统)

热门文章

  1. 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  2. [转] 2018年冬流感通知
  3. elasticsearch5.0启动出现的错误
  4. linux下chkConfig的用法,mysqld开机自启动
  5. zabbix使用zabbix-java-gateway监控jvm/tomcat性能
  6. oracle“记录被另一个用户锁住”
  7. 用Win XP接收传真
  8. 2011年4月51CTO壁纸点评活动获奖名单【已结束】
  9. 终于看到这么贱的星座分析了
  10. 买mac电脑的各个使用阶段: