开机关机流程与Loader

Lear 2024-07-09 14:10:35
Categories: Tags:

开机关机流程与Loader:

  1. 整个开机流程是

(1) 载入BIOS的硬件信息,并取得第一个开机装置的代号

(2)读取第一个开机装置的MBR的boot Loader(grub)的开机信息

(3)载入OS Kernel信息,解压Kernel,尝试驱动硬件

(4) Kernel执行init程序并获得run-lebel信息(如3或5)

(5) init执行 /etc/rc.d/rc.sysinit

(6)启动内核外挂模块 (/etc/modprobe.conf)

(7) init执行run-level的各种Scripts,启动服务

(8) init执行 /etc/rc.d/rc.local

(9)执行 /bin/login,等待用户Login

(10)Login后进入Shell

==========================================================================================
Linux 系统的启动,从计算机开机通电自检开始,一直到登陆系统,需要经历多个过程。学习 Linux 的启动过程,有助于了解 Linux 系统的结构,也对系统的排错有很大的帮助。

CentOS 6.x 系统启动过程发生了较大的变化,使用 Upstart 启动服务取代了原先的 System V init 启动服务。Upstart 启动服务的效率更高,启动速度更快。
Linux 系统启动过程比较复杂,我们先整理一下基本的启动过程,有一个整体的印象,然后再进一步说明。

目前,CentOS 6.x 的启动流程经历以下几步:
服务器加电,加载 BIOS 信息,BIOS 进行系统检测。依照 BIOS 设定,找到第一个可以启动的设备(一般是硬盘);
读取第一个启动设备的 MBR (主引导记录),加载 MBR 中的 Boot Loader(启动引导程序,最为常见的是 GRUB)。
依据 Boot Loader 的设置加载内核,内核会再进行一遍系统检测。系统一般会采用内核检测硬件的信息,而不一定采用 Bios 的自检信息。内核在检测硬件的同时,还会通过加载动态模块的形式加载硬件的驱动。
内核启动系统的第一个进程,也就是 /sbin/init。
由 /sbin/init 进程调用 /etc/init/rcS.conf 配置文件,通过这个配置文件调用 /etc/rc.d/rc.sysinit 配置文件。而 /etc/rc.d/rc.sysinit 配置文件是用来进行系统初始化的,主要用于配置计算机的初始环境。
还是通过 /etc/init/rcS.conf 配置文件调用 /etc/inittab 配置文件。通过 /etc/inittab 配置文件来确定系统的默认运行级别。
确定默认运行级别后,调用 /etc/init/rc.conf 配置文件。
通过 /etc/init/rc.conf 配置文件调用并执行 /etc/rc.d/rc 脚本,并传入运行级别参数。
/etc/rc.d/rc 确定传入的运行级别,然后运行相应的运行级别目录 /etc/rc[0-6].d/ 中的脚本。
/etc/rc[0-6].d/ 目录中的脚本依据设定好的优先级依次启动和关闭。
最后执行 /etc/rc.d/rc.local 中的程序。
如果是字符界面启动,就可以看到登录界面了。如果是图形界面启动,就会调用相应的 X Window 接口。

总的来说,Linux 系统的启动,要经历BIOS自检 -> 启动 GRUB -> 加载内核 -> 执行第一个进程 -> 配置系统初始环境。当然,本节仅是简单地看启动过程,接下来分别详解介绍每步启动过程。

==========================================================================================
在CentOS 7中,要配置一个.ko(内核模块)文件以便在开机时自动加载,可以按照以下步骤操作:

1.确认模块兼容性:确保您的.ko文件与正在运行的内核版本兼容。可以使用uname -r命令来查看您的内核版本。

2.手动加载模块:在自动加载之前,应该先手动加载模块以确保它能够正常工作。使用insmod或modprobe命令来加载模块。例如:

sudo insmod /path/to/your/module.ko

或者

sudo modprobe module_name

3.自动加载:

创建模块配置文件:在/etc/modules-load.d/目录下创建一个配置文件(例如your_module.conf),在文件中添加模块名称。文件内容应该是模块的名称,不是文件路径。
echo ‘module_name’ | sudo tee /etc/modules-load.d/your_module.conf

复制模块到系统目录(如果需要):如果模块不在系统的默认模块目录中,可能需要将其复制到/lib/modules/$(uname -r)/kernel/drivers/目录下,然后运行sudo depmod来更新模块依赖关系。

4.重启系统:重启系统来验证模块是否在启动时自动加载了。

5.检查模块是否加载:重启后,使用lsmod | grep module_name来检查模块是否已经加载。

注意事项:

确保有足够的权限来执行这些操作,通常需要root权限。
加载内核模块可能会对系统稳定性和安全性产生影响,请确保从可靠的来源获取模块,并在生产环境之前在测试环境中进行充分测试。

==========================================================================================
在ubuntu根文件系统中添加对应内核模块名称到/etc/modprobe.d/your.conf即可

  1. 复制内核模块到/lib/modules/uname -r/下

cp your-kernel-module-name.ko /lib/modules/uname -r/

  1. 执行命令”depmod -a”生成modules.dep和map文件

depmod -a
3.添加内核模块名称到/etc/modprobe.d/your.conf, 如下:

cat /etc/modprobe.d/your.conf
your-kernel-module-name

  1. 扩展

linux 的udev机制会自己加载内核模块