2.9 内核模块

2.9 内核模块

Linux采用的是模块化技术,这样的设计使得系统内核可以保持最小化,同时确保了内核的可扩展性与可维护性,模块化设计允许我们在需要时才将模块加载至内核,实现动态内核的调整。

2.9.1 内核模块存放位置

Linux内核模块文件的命名方式通常为<模块名称.ko>,Centos 6.3系统的内核模块被集中存放在/lib/modules/`uname -r`/(/lib/modules/2.6.32-279.el6.x86_64)目录下。

2.9.2 查看已加载内核模块

lsmod命令用来显示当前Linux内核模块状态,不使用任何参数会显示当前已经加载的所有的内核模块。输出的三列信息分别为模块名称、占用内存大小、是否在被使用,如果第三列为0,则该模块可以随时卸载,非0则无法执行modprobe删除模块。

[[email protected] ~]# lsmod 
Module                  Size  Used by
lp                      9338  0 
nfsd                  305863  13 
lockd                  74270  1   nfsd
nfs_acl                  2647  1   nfsd
auth_rpcgss             44895  1   nfsd
sunrpc                263516  17  nfsd,lockd,nfs_acl,auth_rpcgss

2.9.3 加载与卸载内核模块

modprobe命令可以动态加载与卸载内核模块:

[[email protected] ~]# modprobe ip_vs	    	   动态加载ip_vs模块
[[email protected] ~]# lsmod |grep ip_vs	    	查看模块是否加载成功
ip_vs             115490  0 
libcrc32c            1246  1 ip_vs
ipv6              322541  123 ip_vs,cnic,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6
[[email protected] ~]# modprobe -r ip_vs	    	动态卸载ip_vs模块

modinfo命令可以查看内核模块信息:

[[email protected] ~]# modinfo ip_vs
filename:       /lib/modules/2.6.32-279.el6.x86_64/kernel/net/netfilter/ipvs/ip_vs.ko
license:        GPL
srcversion:     01386EABC060B63920E181B
depends:        ipv6,libcrc32c
vermagic:       2.6.32-279.el6.x86_64 SMP mod_unload modversions

通过上述modprobe方式加载的内核模块仅在当前有效,计算机重启后并不会再次加载该模块,如果希望系统开机自动挂载内核模块,则需要将modprobe命令写入/etc/rc.sysinit文件中,或者通过修改/etc/modprobe.d/目录下的相关配置文件实现:

[[email protected] ~]# echo "modprobe ip_vs" >> /etc/rc.sysinit

当内核模块不再需要时,可以通过将/etc/rc.sysinit文件中的对应的modprobe命令删除,但需要重启计算机才生效。此时,可以通过modprobe -r命令立即删除内核模块。

2.9.4 修改内核参数

1. 临时调整内核参数

Linux内核参数随着系统的启动会被写入到内存中,可以直接修改/proc目录下的大量文件来调整内核参数,并且这种调整是立刻生效的。

开启内核路由转发功能(通过0或1设置开关):

[[email protected] proc]# echo "1" > /proc/sys/net/ipv4/ip_forward

禁止所有的icmp回包(禁止其它主机ping本机)功能:

[[email protected] proc]# echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all

调整所有的进程可以打开文件总数量(当大量的用户访问网站资源时,可能会因该数字过小 而导致错误):

[[email protected] proc]# echo "108248" > /proc/sys/fs/file-max

2. 永久调整内核参数

通过man proc可以获得大量关于内核参数的描述信息。设置参数永久生效,可以修改/etc/sysctl.conf文件,文件格式为“选项=值”。

[[email protected] ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1
net.ipv4.icmp_echo_ignore_all = 1
fs.file-max = 108248

注意,通过sysctl.conf文件修改的内核参数不会立刻生效,修改完成后,使用sysctl -p命令可以使这些设置立刻生效。

时间: 2024-10-11 23:04:44

2.9 内核模块的相关文章

Linux 内核模块设计

一.  内核模块 1.  头文件 Linux/init.h  和 Linux/module.h 2.  装载内核 insmod  对应的转载函数 module_init(); 3.  卸载内核 rmmod  对应的卸载函数 module_exit(); 二.  编写 helloworld.c 三.编写Makefile 四 .  把 helloworld.ko 移到Part3/rootfs 打开开发板下载. 直接运行Uboot insmod 挂载一下 helloworld.ko lsmod   查

内核模块

linux内核:单内核+内核模块 内核/boot/vmlinuz-version 模块/lib/modules/version/....ko 用户访问监控内核:/proc /sys /proc/sys/可用来改变内核运行参数 echo "gentoo" > /proc/sys/kernel/hostname sysctl -w kernel.hostname="gentoo"立即生效,不能永久有效 /etc/sysctl.conf设置永久有效->sysc

linux内核模块开发

一,内核模块功能: 让内核文件(zImage或bzImage)本身并不包含某组件,而是在该 组件需要被使用的时候,动态地添加到正在运行的内核中 二,内核模块安装和卸载加载:insmod (insmod hello.ko)卸载:rmmod (rmmod hello)查看:lsmod加载:modprobe (modprobe hello)modprobe如同insmod,也是加载一个模块到内核.它的不同之处在于它会根据文件/lib/modules/<$version>/modules.dep来查看

内核模块编译实验

1.实验原理 Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个单内核.单内核由于所有内容都集成在一起,效率很高,但可扩展性和可维护性相对较差,模块机制可弥补这一缺陷. Linux模块可以通过静态或动态的方法加载到内核空间,静态加载是指在内核启动过程中加载:动态加载是指在内核运行的过程中随时加载. 一个模块被加载到内核中时,就成为内核代码的一部分.模块加载入系统时,系统修改内核中的符号表,将新加载的模块提供的资源和符号添加到内核符号表

《linux内核设计与分析》内核模块编程

内核模块编程 一.准备工作 虚拟机:VMware Workstation 12操作系统:ubuntu当前内核版本:linux-headers-4.4.0-22-generic 二.有关于内核模块的知识 模块是具有独立功能的程序,它可以被单独编译,但不能独立运行.它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的.模块通常由一组函数和数据结构组成,用来实现一种文件系统.一个驱动程序或其他内核上层的功能. 内核模块的相关指令: 查看内核版本 uname –a 模块

3、Linux内核模块学习

一.内核模块的学习   内核的整体框架是非常的大,包含的组件也是非常多,如何将需要的组件包含在内核中呢?选择一,就是将所有的组件全部编译进内核,虽然需要的组件都可以使用,但是内核过分庞大,势必带来效率影响:选择二是,将组件编译为模块,需要的时候,就自行加载进内核,这种就是我们称之为的模块,当模块被加载到内核的机制,不仅控制了内核大小,同时被加载的内核与被编译进内核的部分,功能意义.    3.1.内核的加载与卸载     将 hello.c 编译为模块,hello.ko, insmod hell

Linux内核模块编写详解

内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了.Linux内核和它的用户空间是大不相同的:抛开漫不经心,你必须小心翼翼,因为你编程中的一个bug就会影响到整个系统,本文给大家介绍linux内核模块编写,需要的朋友可以参考下 内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了.Linux内核和它的用户空间是大不相同的:抛开漫不经心,你必须小心翼翼,因为你编程中的一个bug就会影响到整个系统.浮点运算做起来可不容易,堆栈固定而狭小,而你写的代码总是异步的,

Ubuntu 编译安装 Linux 4.0.5 内核,并修复 vmware 网络内核模块编译错误

. . . . . 今天把 Ubuntu 14.04 升级到了最新的 4.0.5 的内核版本,本来不打算记录下来的,但是升级的过程中确实遇到了一些问题,所以还是记录下来,分享给遇到同样问题的猿友. 先去官网下载最新的内核压缩包:https://www.kernel.org/ 网速不给力,只能用虚拟机里的迅雷下载,然后再拷贝出来. LZ 把源码包拷贝到 /usr/src 下面,直接就在这里编译安装了: # 切换到 root 身份 >$ su # 解压缩源码,得到文件夹 /usr/src/linux

Linux内核驱动学习(三)----内核模块基础 | 设计 | 可选项

内核模块基础--特点及其命令使用 1.模块本身并不被编译进内核文件(zImage或bzImage) 2.可以根据需要在内核运行时动态加载.卸载---->进而达到节省空间的目的 命令详解(以下载驱动DNW为例): insmod 模块名称(注意有.ko后缀)--安装 insmod dnw_usb.ko lsmod-->查看安装的内核模块 rmmod 模块名称(注意没有.ko后缀)---->卸载内核模块 rmmod dnw_usb 内核模块设计--简单的模块编写 根据上图范例代码,比较应用程序

linux 内核模块函数调用

在编写linux内核模块的时候,有时候我们需要调用一只内核模块里面的函数,然而如果是在不同目录下面编译生成的内核模块,此时A模块去调用B模块的函数时候会出现函数未定义,无法调用的情况.那么以前我是在同一个目录下面,先后写两个makefile,然后编译生成两个不同的内核模块,这种方式可以正常实现A模块调用B模块里面的函数,不过非常麻烦.本博文将会针对这种情况提出一种可以同时生成多个内核模块,不要再次编译的方面,下面贴出源码: 内核模块cal.ko: #include <linux/module.h