linux如何卸载内核模块_如何加载或卸载Linux内核模块

linux如何卸载内核模块

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

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

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

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

Kernel modules

内核模块充当设备和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如何卸载内核模块

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一部分 基础知识 <br>1.1 什么是LKMs <br>1.2 什么是系统调用 <br>1.3 什么是内核符号表(Kernel-Symbol-Table) <br>1.4 如何实现从用户空间到内核空间的转换 <br>1.5 使用用户空间函数的方法 <br>1.6 常用内核空间函数列表 <br>1.7 什么是内核守护进程 <br>1.8 创建你自己的设备 <br><br>第二部分 渐入佳境 <br>2.1 如何截获系统调用 <br>2.2 一些有趣的系统调用 <br>2.2.1 发现有趣的系统调用(strace方法) <br>2.3 迷惑内核的系统表 <br>2.4 和文件系统有关的攻击 <br>2.4.1 如何隐藏文件 <br>2.4.2 如何隐藏文件的内容(完全的) <br>2.4.3 如何隐藏文件的某一部分(一个实现原型) <br>2.4.4 如何重新定向或者监视文件操作 <br>2.4.5 如何避免任何文件权限问题 <br>2.4.6 如何使的一个有入侵工具的目录不可存取 <br>2.4.7 如何改变CHROOT环境 <br>2.5 和进程有关的入侵 <br>2.5.1 如何隐藏任何进程 <br>2.5.2 如果改变文件的执行结果 <br>2.6 和网络(Socket)有关的入侵 <br>2.6.1 如果控制Socket操作 <br>2.7 TTY纪录的方法 <br>2.8 用LKMs写病毒 <br>2.8.1 如何让LKM病毒感染任何文件(不仅仅是模块) <br>2.8.2 如何让LKM病毒帮助我们进入系统 <br>2.9 使我们的LKM不可见,而且不可卸载 <br>2.10 其他的入侵kerneld进程的方法 <br>2.11 如何检查当前的我们的LKM <br><br>第三部分 解决方案(给系统管理员) <br>3.1 LKM检测的理论和想法 <br>3.1.1 一个使用的检测器的原形 <br>3.1.2 一个密码保护的create_module(...)的例子 <br>3.2 防止LKM传染者的方法 <br>3.3 使你的程序不可以被跟踪(理论) <br>3.3.1 一个反跟踪的实用例子 <br>3.4 使用LKMs来防护你的linux内核 <br>3.4.1 为什么我们必须允许任何一个程序都拥有可执行的权限 <br>3.4.2 链接的补丁 <br>3.4.3 /proc权限的补丁 <br>3.4.4 安全级别的补丁 <br>3.4.5 底层磁盘补丁 <br><br>第四部分 一些更好的想法(给hacker的) <br>4.1 击败系统管理员的LKM的方法 <br>4.2 修补整个内核-或者创建Hacker-OS <br>4.2.1 如何在/dev/kmem中找到内核符号表 <br>4.2.2 新的不需要内核支持的'insmod' <br>4.3 最后的话 <br><br>第五部分 最近的一些东西:2.2.x版本的内核 <br>5.1 对于LKM作者来说,一些主要的不同点 <br><br>第六部分 最后的话 <br>6.1 LKM传奇以及如何使得一个系统即好用又安全 <br>6.2 一些资源链接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值