Linux内核采用的是模块化技术,这样的设计使得系统内核可以保持最小化,同时确保了内核的可扩展性与可维护性,模块化设计允许我们在需要时才将模块加载至内核,实现内核的动态调整。
Linux内核模块文件的命名方式通常为“模块名称.ko.xz”,CentOS 7系统的内核模块被集中存放在/lib/modules/`uname-r`/目录中。下面通过几个示例说明如何对内核模块进行基本操作。
1、查看已加载的内核模块
a. lsmode 命令
lsmod命令:用来显示当前Linux内核模块的状态,不使用任何参数会显示当前已经加载的所有内核模块。输出的三列信息分别为模块名称、占用内存大小、是否正在使用,如果第三列为0,则该模块可以被随时卸载,非0则无法执行modprobe命令删除模块。
# 已树形方式显示内核文件列表
tree /lib/modules/`uname -r`/kernel
/lib/modules/3.10.0-1160.71.1.el7.x86_64/kernel
# 查看内核文件列表
lsmode
2、加载与卸载内核模块
a. modprobe 命令
- 描述:可以动态加载与卸载内核模块。
- 语法:modprobe [选项] 模块名
-r 卸载模块
modprobe ip_vs # 动态加载 ip_vs 模块
lsmod | grep ip_vs # 查看模块是否加载成功
modprobe -r ip_vs # 动态卸载 ip_vs 模块
b. modinfo 命令
- 描述:可以动态加载与卸载内核模块。
- 语法:modinfo 模块名
modinfo ip_vs
通过modprobe命令加载的内核模块仅在当前有效,计算机重启后并不会被加载,如果希望系统开机自动加载内核模块,则需要将modprobe命令写入/etc/rc.d/rc.local文件,rc.local是开机执行的脚本,需要赋予其可执行的权限。
echo "modprobe ip_vs" >> /etc/rc.d/rc.local
chmod +x >> /etc/rc.d/rc.local
# 当不再需要内核模块时,可以通过modprobe -r命令来立刻删除内核模块,但需要重启计算机才能生效。
modprobe -r ip_vs
另外一种实现永久加载内核模块的方式是修改/etc/modprobe.d/目录中的相关配置文件,我们可以在该目录中创建任意文件,扩展名是conf,以下示例的功能是将Linux内核的嵌套虚拟化功能打开。
# 新建文件
vim /etc/modprobe.d/kvm-nested.conf
options kvm-intel nested = 1
options kvm-intel enable_shadow_vmcs = 1
options kvm-intel enable_apicv = 1
options kvm-intel ept = 1
options kvm ignore_msrs = 1
options kvm-amd nested = 1
配置文件中的options可以用来加载内核模块,上面加载了kvm-intel、kvm和kvm_amd模块,还可以在每个模块后面设置一些模块参数,参数是可选项,根据需要添加即可。
3、修改内核参数
a. 临时调整内核参数
随着系统的启动,Linux内核参数会被写入内存,我们可以直接修改/proc目录中的大量文件来调整内核参数,并且这种调整是立刻生效的,下面来看几个示例。
# 开启内核路由转发功能(通过0或1设置开关)。
echo "1" > /proc/sys/net/ipv4/ip_forward
# 禁止所有icmp回包功能(禁止其他主机对本主机执行ping命令)
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
# 调整所有进程可以打开的文件总数量(当大量的用户访问网站资源时,可能会因该数字过小而导致错误)。
echo "108248" > /proc/sys/fs/file-max
b. 永久调整内核参数
通过man proc命令可以获得大量关于内核参数的描述信息。但直接修改/proc相关文件的方式在系统重启后将不再有效,如果希望设置参数并使其永久生效,可以修改/etc/sysctl.conf文件,或在/etc/sysctl.d/目录中新建.conf文件,文件格式为“选项=值”,通过vim命令修改这些配置文件,将前面三个示例的参数设置为永久生效。
注意:通过sysctl.conf文件修改的内核参数不会立刻生效,修改完成后,使用sysctl -p命令可以使这些参数立刻生效。