内核的功能:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
2. Linux内核特点
【文章福利】小编推荐自己的Linux内核技术交流群:【977878001】整理一些个人觉得比较好得学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前100进群领取,额外赠送一份价值699的内核资料包(含视频教程、电子书、实战项目及代码)
内核把内部状态信息及统计信息以及可配置参数通过伪文件系统输出到此目录,只能通过echo命令或sysctl方式修改大多数参数的值
/proc/sys目录中因为/proc是个伪文件系统,所以不可以像编辑文本文件一样配置,应使用echo命令或sysctl命令用于设定或查看此目录中的参数
vm.drop_caches:清理缓存
kernel.hostname:主机名
修改/proc/sys/kernel/hostname的值
~]# sysctl -w kernel.hostname=abc.123.com
使用sysctl命令需要以/proc/sys路径为起点,直接给定参数名称
~]# 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命令即可完成,如果想加快速度可以使用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]