内核的功能:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
.ko
结尾(kernel object)。通过模块化也使得Linux内核不会变得过于庞大,用到哪个模块功能就装载哪个/boot/vmlinux-VERSION-release
:核心文件,最核心、最基本的文件/lib/modules/VERSION-release
:模块文件,目录名称和内核版本号严格匹配,其中存内核模块各类型文件。不过,模块之间也有依赖关系,所以查看目录时也可以看到大量的依赖关系元数据等信息,而真正的内核文件就在子目录./kernel
中存放/lib/modules/VERSION-release/kernel/arch
:平台相关的内容/lib/modules/VERSION-release/kernel/crypto
:内核中加密解密等安全相关的内容/lib/modules/VERSION-release/kernel/drivers
:驱动/lib/modules/VERSION-release/kernel/fs
:文件系统相关内容/lib/modules/VERSION-release/kernel/kernel
:自己的一些基本核心功能/lib/modules/VERSION-release/kernel/lib
:各种内核模块用到的库/lib/modules/VERSION-release/kernel/mm
:内存管理相关内容/lib/modules/VERSION-release/kernel/net
:网络相关内容/lib/modules/VERSION-release/kernel/sound
:声音相关内ramdisk
:基于内存的磁盘,这个组件不是必须的,主要的功能是帮助内核驱动硬盘内核把内部状态信息及统计信息以及可配置参数通过伪文件系统输出到此目录,只能通过echo命令或sysctl方式修改大多数参数的值
/proc/sys
目录中因为/proc
是个伪文件系统,所以不可以像编辑文本文件一样配置,应使用echo
命令或sysctl
命令用于设定或查看此目录中的参数
/etc/sysctl.conf
sysctl -w parameter=VALUE
,sysctl
命令设定参数格式比较特殊,要以/proc/sys
目录为起点,并且把路径中的斜线改为.
具体看下方示例sysctl -p [/path/file]
net.ipv4.ip_forward
:核心转发功能vm.drop_caches
:清理缓存kernel.hostname
:主机名修改/proc/sys/kernel/hostname
的值
sysctl
命令~]# sysctl -w kernel.hostname=abc.123.com
sysctl
命令需要以/proc/sys
路径为起点,直接给定参数名称echo
命令~]# echo ‘123.abc.com’ > /proc/sys/kernel/hostname
echo
命令需要给定绝对路径sysfs
伪文件系统挂载在此目录,用于让内核输出硬件的相关参数,有些参数可以修改,用于调整硬件工作特性。
udev
命令通过此路径输出的信息动态为各设备创建所需的设备文件,udev
是运行在用户空间的进程,它的专用工具有udevadmin
、hotplug
。udev
创建设备文件时,命名法则会基于事先定义好的规则文件,一般在/etc/udev/rules.d
及/usr/lib/udev/rules.d
目录
通过对内核模块的增删完成内核编译,自定义一个与自身需求相匹配的内核。不过,如果仅仅是对功能的增删,不能对内核源代码进行改进实现内核定制,这种带来的意义也不是特别大。所以,在没有修改源代码能力的前提下,还是不建议自行编译内核使用的
1. 准备开发环境,centos 6.9系统需要安装两个包组Development tools 和Server Platform Development
~]# yum groupinstall Development tools Server Platform Development
2. 查看目标主机的硬件设备信息
~]# lscpu
~]# lspci
~]# lsblk
3. 准备内核源码文件,可以在www.kernel.org中获取,下载后并解压至/usr/src目录
~]# tar xf linux-3.9.tar.xz -C /usr/src
~]# ln -sv /usr/src/linux-3.9/ /usr/src/linux
4. 为了便于编译成功,可以使用当前系统中的内核编译配置文件作为模板,路径为
/boot/config/config-2.6.32-696.el6.x86_64,将这个文件复制为/usr/src/linux/.config
~]# cp /boot/config-2.6.32-696.el6.x86_64 ./.config
5. 调整适用于当前内核的参数,使用make menuconfig命令进入文本窗口,完成配置后保存退出
配置参数时前边中括号的值的取值有
[ ]:N,表示不编译此功能
[*]:Y,把此功能编译进内核
[M]:M,把此功能编译成模块
~]# make menuconfig
6. 开始编译,因为编译工作会占据终端前台,所以最好启动一个虚拟屏幕完成编译
~]# yum install screen
~]# screen
~]# make
当终端断开也没关系,可以使用screen -ls查看任务,接着使用screen 加编号即可恢复
编译完成后安装
~]# make modules_install
~]# make install
重启系统验证
make config
:基于命令行,以遍历的方式去配置内核编译参数make menuconfig
:基于curses的文本窗口界面对内核参数进行编译make gconfig
:基于GTK开发环境的窗口配置方式make xconfig
:基于QT开发环境的窗口配置方式oldconfig
:基于现有的config文件完成编译make depconfig
:内核为每一种硬件平台都提供了默认配置,此选项就是基于内核对目标平台提供的默认配置进行编译 make allnoconfig
:所有选项均回答为nomake allyesconfig
:所有选项均回答为yes编译操作使用make
命令即可完成,如果想加快速度可以使用make -J #
指定同时编译的核心数。但是有时编译完成后,会发现有个功能忘记编译了,此时没必要完全从新编译,就可以使用部分编译
只编译某个目录的代码进内核
进入内核源码目录:cd /usr/src/linux
执行编译:make some_dir/
只编译特定模块
进入内核源码目录:cd /usr/src/linux
执行编译:make some_dir/file.ko
编译完成后使用cp
命令将file.ko
复制至/lib/modules
对应的目录下即可
编译的目标平台与当前平台不相同,可查询目标平台的使用帮助make ARCH=arch_name help
,然后根据帮助使用命令make ARCH=arch_name
即可
同目录中如果想二次编译,一定会存在第一次编译时很多编译结果,可以使用以下方式进行源码树清理
make clean
:移除所有生成的文件,仅保留config文件和自行补丁代码
make mrproper
:移除所有编译生成的文件+config文件+备份文件
make distclean
:移除所有,相当于刚解压源代码的状态
因内核编译时间较长,当终端挂了,编译工作也就挂了,这时就可以用screen命令打开一个虚拟屏幕,在上面执行编译操作,它会剥离于当前终端的关系
ctrl + a,d
:剥离当前screen与终端的关系
screen -ls
:查看打开的screen
screen -r #
:恢复某个screen
命令格式:uname [option]
option
-a:显示所有信息
-s:显示内核名称
-r:显示内核版本
-n:显示节点名称
-v:显示内核制作版本信息
-m:显示当前内核支持的硬件平台
-p:显示处理器类型
-i:显示硬件平台架构
-o:显示操作系统
显示内核装载的模块,与/proc/modules
文件中的一致,返回信息当中会显示模块的名称、模块的大小、被调用的次数和正被谁使用
显示模块的详细信息
命令用法:modinfo [-k kernel] [mod_name | mod_file]
option
-k kernel:如果系统中有多个内核,此选项可以指定显示某个内核的模块信息
-n:只显示模块名称
-a:只显示作者
-p:只显示模块参数
-d:只显示模块描述
filename: /lib/modules/3.10.0-1062.el7.x86_64/kernel/fs/ext4/ext4.ko.xz
license: GPL
description: Fourth Extended Filesystem
author: Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others
alias: fs-ext4
alias: ext3
alias: fs-ext3
alias: ext2
alias: fs-ext2
retpoline: Y
rhelversion: 7.7
srcversion: E8D131800079B8E4D30649E ## 源码版本
depends: mbcache,jbd2 ## 依赖到哪些模块
intree: Y
vermagic: 3.10.0-1062.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: 51:08:4E:41:88:03:02:BE:5C:B0:74:AC:0D:A3:FE:10:23:3B:7F:1C
sig_hashalgo: sha256
装载、卸载模块
命令格式:modprobe [mod_name]
-r:卸载模块
-n:干跑模式
-q:静默模式
-C config_file:指定模块的配置文件,默认为/etc/modprobe.conf和/etc/modprobe.d/*.conf
内核模块依赖关系文件及系统信息映射文件生成工具,比如在/lib/modules/Version/modules.dep
文件,它就是保存着模块中的依赖关系,但这个文件没有被真正使用,而真正使用的是这个文件的二进制版本modules.dep.bin
。或者是/boot
目录中,有个System.map-Version
文件,用来保存内核文件的映射关系,而这些都是depmod
命令生成的
装载模块的命令,但是它不会将被装载模块所依赖的模块装载,必须手动解决依赖关系,并且必须明确指定模块的绝对路径
命令格式:ismod [filename]
卸载模块命令
命令格式:rmmod [option]