1、Linux内核剖析
1.1 什么是内核
内核指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等核心功能的系统软件,是整个操作系统的最底层。Linux内核的功能有:进程管理、文件系统、硬件驱动、内存管理、安全功能(SELinux)、网络子系统,内核结构如图1所示。
1.2 内核体系
(1)单内核体系
单内核是个很大的进程,它的内部又能够被分为若干模块。但是在运行的时候,它是作为一个整体的大进程;其模块间的通信时通过直接调用其他模块中的函数实现,而不是消息传递。
Linux内核:核心+外围模块
核心:/boot/vmlinuz-VERSION-release
模块:/lib/modules/VERSION-release
(2)微内核体系
在微内核中,大部分内核都作为单独的进程在特权状态下运行,他们通过消息传递进行通信,在典型情况下,每个概念模块都有一个进程,如Windows、Solaric。
1.3 内核模块
(1)内核模块
Linux内核具有模块化的特性,因此在编译核心时,无需将全部功能都放入内核本体,可将这些功能编译成一个个单独的模块,需要时在将分别载入:
编译仅内核本体[*]
编译成内核模块[M]
不选择使用[]
(2)内核模块管理
lsmod:显示内核已装载模块;
modprobe –l:显示可用模块
动态装载/卸载模块其操作命令如下所示。
//装载
# modprobe MOD_NAME 或 insmod /path/to/module_file
//卸载
modprobe -r MOD_NAME 或 rmmod MOD_NAME
查看某模块详细信息,其操作命令如下所示。
# modinfo MOD_NAME
模块之间也可能有依赖关系,装载某模块需要先装载其依赖的模块,“depmod”可分析加载模块的依赖关系,生成“modules.dep”文件和映射文件,这两个文件位于“/lib/modules/VERSION-release”目录下。
1.4 查看内核版本
uname:打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。
【语法】
uname [选项] [参数]
uname命令的选项及说明,如表1所示。
2、内核参数配置
2.1 伪文件系统
Linux系统上有两个伪文件系统:分别是/proc和/sys。
/proc存储的是当前内核运行状态映射的一系列特殊文件,用户可通过这些文件查看硬件和进程的信息,还可更改某些文件来改变内核运行状态。
只读文件:输出统计信息;
读写文件:设定内核工作特性,一般位于/roc/sys目录下,不允许使用文本编辑器进行编写,而只能使用重定向的方式或使用专用的工具,例如“echo 1 > /proc/sys/vm/drop_cathes”。常用参数有:kernel.hostname(系统主机名)、vm.drop.caches(释放缓存)、net.ipv4.icmp_echo_ignore_all(可屏蔽别人PING本主机)、net.ipv4.ip_forward(决定主机是否可路由)。
查看伪文件系统的目录结果如图2所示(以CentOS 7为例)。
2.2 修改内核参数
常用修改内核参数的方法命令有以下三种,分别是:
①echo "XXX" > /proc/sys/
②sysctl -w VARAIABLE=VALUE
③vi /etc/sysctl.conf
其中,针对上述的三种方法具体描述如下。
①sysctl常用修改内核参数的命令有:“sysctl -a”(显示sysctl可控制的所有参数)、“sysctl VARAIABLE”(查看指定参数)、“sysctl -p”(重读配置文件并其生效)。
②修改sysctl配置文件,在该配置文件中修改内核参数不会立即生效,但会永久有效。
2.3 /sys
跟/proc一样也是一个伪文件系统,存放着由内核的驱动程序所探测到的硬件设备相关信息。
Linux内核2.4版本以下:/dev所有设备文件都是事先预置;
Linux内核2.6版本以下:/dev下所有设备文件能够按需创建;用户空间的某影院程序可根据/sys中信息来为每个设备按需创建设备文件。
3、内核更新
3.1 Ubuntu操作系统
在Ubuntu操作系统上更新内核,其操作过程如下所示(以Ubuntu Server 16.04为例)。
(1)查看当前安装的内核,其命令如下,查看结果如图3所示。
# dpkg -l | grep linux-image
(2)查看系统中可以更新的内核版本,其命令如下。
# apt-cache search linux-image
(3)从可以更新的内核版本中选择,相应的版本,进行安装新内核,如选择新内核版本为4.4.0-98,其命令如下。
# apt-get install linux-image-4.4.0-98-generic linux-image-extra-4.4.0-98-generic
(4)卸载不要的内核,其命令如下所示。
# apt-get purge linux-image-4.4.0-87-xx-generic linux-image-extra-4.4.0-87-xx-generic
(5)更新GRUB引导,其命令如下。
# update-grub
(6)重启系统,使用如下命令进行查看内核版本是否升级成功。
# uname –r
3.2 CentOS操作系统
在CentOS操作系统上更新内核,其操作过程如下所示(以CentOS 7为例)。
(1)查看当前内核信息,其命令如下,结果如图4所示。
# uname –sr
(2)在CentOS 7中升级内核
大多数现代发行版提供了一种使用yum等包管理系统和官方支持的仓库升级内核的方法。但是,这只会升级内核到仓库中可用的最新版本,而不是在https://www.kernel.org/中可用的最新版本。Red Hat只允许使用前者升级内核,CentOS允许使用ELRepo,这是一个第三方仓库,可以将内核升级到最新版本。
要在CentOS 7上启用ELRepo仓库,请运行如下命令。
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
仓库启用后,可以使用一下命令列出可用的内核相关包,结果如图5所示。
# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
安装最新的稳定内核(4.16.5-1)安装包,其命令如下所示。
# yum --enablerepo=elrepo-kernel install kernel-ml
(3)设置GRUB引导
为了让新安装的内核成为默认启动选项,你需要如下修改GRUB配置:
打开并编辑/etc/default/grub并设置GRUB_DEFAULT=0。意思是GRUB初始化页面的第一个内核将作为默认内核。
# vi /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos/root crashkernel=auto vconsole.keymap=us rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
使用如下命令重新创建内核配置。
# grub2-mkconfig -o /boot/grub2/grub.cfg
(4)重启验证
重启并验证最新的内核已作为默认内核,并查看新内核信息,如图6所示。
# uname -sr