一 Linux 内核的概述
?
1 什么叫内核
linux 操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件
一个计算机系统是一个硬件和软件的共生体, 它们互相依赖, 不可分割
计算机的硬件, 含有外围设备处理器内存硬盘和其他的电子设备组成计算机的发动机
但是没有软件来操作和控制它, 自身是不能工作的
完成这个控制工作的软件就称为操作系统, 在 Linux 的术语中被称为内核, 也可以称为核心
注: 此篇没有使用先下载内核然后编译的方法, 这样会需要安装很多必备的环境和工具, 比较麻烦, 但是也有助于我们了解内核的编译
?
2 内核版本号区分
Linux 内核使用三种不同的版本编号方式
. 第一种方式用于 1.0 版本之前(包括 1.0)
第一个版本是 0.01, 紧接着是 0.020.030.100.110.120.950.960.970.980.99 和之后的 1.0
. 第二种方式用于 1.0 之后到 2.6, 数字由三部分 A.B.C,A 代表主版本号, B 代表次主版本号, C 代表较小的末版本号
只有在内核发生很大变化时(历史上只发生过两次, 1994 年的 1.0,1996 年的 2.0),A 才变化
可以通过数字 B 来判断 Linux 是否稳定, 偶数的 B 代表稳定版, 奇数的 B 代表开发版 C 代表一些 bug 修复, 安全更新, 新特性和驱动的次数
以版本 2.4.0 为例, 2 代表主版本号, 4 代表次版本号, 0 代表改动较小的末版本号
在版本号中, 序号的第二位为偶数的版本表明这是一个可以使用的稳定版本, 如 2.2.5;
而序号的第二位为奇数的版本一般有一些新的东西加入, 是个不一定很稳定的测试版本, 如 2.3.1
这样稳定版本来源于上一个测试版升级版本号, 而一个稳定版本发展到完全成熟后就不再发展
. 第三种方式从 2004 年 2.6.0 版本开始, 使用一种 time-based 的方式
3.0 版本之前, 是一种 A.B.C.D 的格式
七年里, 前两个数字 A.B 即 2.6 保持不变, C 随着新版本的发布而增加, D 代表一些 bug 修复, 安全更新, 添加新特性和驱动的次数
3.0 版本之后是 A.B.C 格式, B 随着新版本的发布而增加, C 代表一些 bug 修复, 安全更新, 新特性和驱动的次数
第三种方式中不使用偶数代表稳定版, 奇数代表开发版这样的命名方式
举个例子: 3.7.0 代表的不是开发版, 而是稳定版!
?
3 什么时候需要升级内核?
其实一般情况下内核几乎是不升级的, 绝大多数升级内核也是为了搭建服务的兼容性等问题而升级的, 比如在部署 Docker 时内核要在 3.10 以上否则很卡不说还会有各种问题
二升级内核
1 升级之前查看内核
这是我当前系统 (centos6.9) 的内核
?
*2 这里有 ELRepo 项目参考
导入 public key:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
有关 ELRepo 项目使用的 GPG 密钥的详细信息, 请参阅 https://www.elrepo.org/tiki/key 如果您的系统启用了安全启动, 请参阅 SecureBootKey 页面以获取更多信息
3 安装 ELRepo(6 和 7 不同)
为 RHEL-7,SL-7 或 CentOS-7 安装 ELRepo:
- rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm (external link)
- 1
为 RHEL-6,SL-6 或 CentOS-6 安装 ELRepo:
- rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
- 1
4 升级 Kernel
这里需要注意的是, 在 ELRepo 中有两个内核选项, 一个是 kernel-lt(长期支持版本), 一个是 kernel-ml(主线最新版本), 采用长期支持版本(kernel-lt), 更稳定一些
- # kernel-lt
- yum --enablerepo=elrepo-kernel install kernel-lt -y
- # kernel-ml
- yum --enablerepo=elrepo-kernel install kernel-ml -y
5 修改 grub.conf 文件
根据安装好以后的内核位置, 修改 default 的值, 一般是修改为 0, 因为 default 从 0 开始, 一般新安装的内核在第一个位置, 所以设置 default=0
PS: 这里就不得不稍微提下 linux 的启动流程了, 在第三目录
6 升级结束
改完 grub.conf 文件后要重启 rebootshutdown -r now 都行, 执行 uname -r 查看
?
三 linux 开机启动流程
启动第一步 -- 加载 BIOS
当你打开计算机电源, 计算机会首先加载 BIOS 信息, BIOS 信息是如此的重要, 以至于计算机必须在最开始就找到它这是因为 BIOS 中包含了 CPU 的相关信息设备启动顺序信息硬盘信息内存信息时钟信息 PnP 特性等等在此之后, 计算机心里就有谱了, 知道应该去读取哪个硬件设备了
?
启动第二步 -- 读取 MBR
众所周知, 硬盘上第 0 磁道第一个扇区被称为 MBR, 也就是 Master Boot Record, 即主引导记录, 它的大小是 512 字节, 别看地方不大, 可里面却存放了预启动信息分区表信息
系统找到 BIOS 所指定的硬盘的 MBR 后, 就会将其复制到 0×7c00 地址所在的物理内存中其实被复制到物理内存的内容就是 Boot Loader, 而具体到你的电脑, 那就是 lilo 或者 grub 了
?
启动第三步 --Boot Loader
Boot Loader 就是在操作系统内核运行之前运行的一段小程序通过这段小程序, 我们可以初始化硬件设备建立内存空间的映射图, 从而将系统的软硬件环境带到一个合适的状态, 以便为最终调用操作系统内核做好一切准备
Boot Loader 有若干种, 其中 GrubLilo 和 spfdisk 是常见的 Loader
我们以 Grub 为例来讲解吧, 毕竟用 lilo 和 spfdisk 的人并不多
系统读取内存中的 grub 配置信息(一般为 menu.lst 或 grub.lst), 并依照此配置信息来启动不同的操作系统
?
启动第四步 -- 加载内核
根据 grub 设定的内核映像所在路径, 系统读取内存映像, 并进行解压缩操作此时, 屏幕一般会输出 Uncompressing Linux 的提示当解压缩内核完成后, 屏幕输出 OK, booting the kernel
系统将解压后的内核放置在内存之中, 并调用 start_kernel()函数来启动一系列的初始化函数并初始化各种设备, 完成 Linux 核心环境的建立至此, Linux 内核已经建立起来了, 基于 Linux 的程序应该可以正常运行了
?
启动第五步 -- 用户层 init 依据 inittab 文件来设定运行等级
内核被加载后, 第一个运行的程序便是 / sbin/init, 该文件会读取 / etc/inittab 文件, 并依据此文件来进行初始化工作
其实 / etc/inittab 文件最主要的作用就是设定 Linux 的运行等级, 其设定形式是: id:5:initdefault:, 这就表明 Linux 需要运行在等级 5 上 Linux 的运行等级设定如下:
0: 关机
1: 单用户模式
2: 无网络支持的多用户模式
3: 有网络支持的多用户模式
4: 保留, 未使用
5: 有网络支持有 X-Window 支持的多用户模式
6: 重新引导系统, 即重启
关于 / etc/inittab 文件的学问, 其实还有很多
?
启动第六步 --init 进程执行 rc.sysinit
在设定了运行等级后, Linux 系统执行的第一个用户层文件就是 / etc/rc.d/rc.sysinit 脚本程序, 它做的工作非常多, 包括设定 PATH 设定网络配置 (/etc/sysconfig/network) 启动 swap 分区设定 / proc 等等如果你有兴趣, 可以到 / etc/rc.d 中查看一下 rc.sysinit 文件, 里面的脚本够你看几天的
?
启动第七步 -- 启动内核模块
具体是依据 / etc/modules.conf 文件或 / etc/modules.d 目录下的文件来装载内核模块
?
启动第八步 -- 执行不同运行级别的脚本程序
根据运行级别的不同, 系统会运行 rc0.d 到 rc6.d 中的相应的脚本程序, 来完成相应的初始化工作和启动相应的服务
?
启动第九步 -- 执行 / etc/rc.d/rc.local
你如果打开了此文件, 里面有一句话, 读过之后, 你就会对此命令的作用一目了然:
- # This script will be executed after all the other init scripts.
- # You can put your own initialization stuff in here if you dont
- # want to do the full Sys V style init stuff.
rc.local 就是在一切初始化工作后, Linux 留给用户进行个性化的地方你可以把你想设置和启动的东西放到这里
?
启动第十步 -- 执行 / bin/login 程序, 进入登录状态
此时, 系统已经进入到了等待用户输入 username 和 password 的时候了, 你已经可以用自己的帐号登入系统了:)
?
漫长的启动过程结束了, 一切都清静了
其实在这背后, 还有着更加复杂的底层函数调用, 等待着你去研究本文就算抛砖引玉了:)
这个启动流程部分参考了如下文章:
http://blog.chinaunix.net/uid-26495963-id-3066282.html
来源: http://www.bubuko.com/infodetail-2543663.html