linux设备启动,[ 总结 ] Linux系统启动流程

Linux系统启动过程分析:

按下电源 --> BIOS自检 --> 系统引导(lilo/grub) --> 启动内核 --> 初始化系统 --> 用户登录

1. BIOS自检:

BIOS(basic input/output system), 又称基本输入输出系统,可以视为永久的记录在ROM中的一个软件,是操作系统输入输出管理的一部分。

BIOS的功能分为两种:POST码和Runtime服务。POST阶段完成后它将从存储器中被清除,而Runtime服务会一直保留,用于目标操作系统的启动

BIOS两个阶段所做的详细工作如下:

(1)上电自检POST(power-on self test), 主要负责检测外围关键设备是否正常工作。例如:最常见的是内存松动,BIOS自检阶段就会报错。

(2)步骤1成功后,便会执行一段小程序用来枚举本地设备并对其初始化。这一步主要是根据我们在BIOS中设置的系统启动顺序来搜索用于启动系统的驱动器,

如:硬盘、光盘、U盘、软盘和网络等。

以硬盘为例:BIOS此时去读取硬盘的第一个扇区(MBR 512字节),然后执行里面的代码。实际上这里BIOS不管第一个扇区里面是什么内容,它只是负责读取该扇区内容并执行。

至此,BIOS的任务就完成了,此后将系统启动的控制权移交MBR部分代码。

2. 系统引导:

MBR(master boot record): 磁盘的0柱面、0磁头、1扇区称为主引导扇区。它由三个部分组成:主引导程序(bootloader)、硬盘分区表DPT、硬盘有效标志

通常情况下,诸如:lilo/grub 这些常见的引导程序都直接安装在MBR的bootloader中。

grub引导也分为两个阶段stage1和stage2

stage1是直接写入到MBR的bootloader中的,机器启动完,就将控制权交给了bootloader, bootloader中就存放着stage1的代码,它的任务很单纯,仅仅是将硬盘0头0道2扇区

读入内存。而0头0道2扇区内容是源代码中的/stage2/start.S编译后的512字节,stage1是没有识别文件系统能力的。

3. 启动内核:

当stage2被载入内存执行,首先会去解析/boot/grub/grub.conf,然后加载内核镜像到内存中,并将控制权转交给内核。而内核会立即初始化系统中各个设备并做相关配置

关于Linux设备驱动程序的加载,一部分是直接编译进内核,另一部分驱动程序则是以模块的形式放在initrd中。

实际上Linux内核仅是包含基本的硬件驱动,在系统安装过程中会检测系统硬件信息,根据安装信息和系统硬件信息将一部分设备驱动写入initrd,这样在以后启动系统时,一部分

设备驱动就放在initrd中来加载。

另一个概念:initramfs 当内核启动时,内核将这个cpio包解开,并且将其中包含的文件系统释放到rootfs中。内核中的一部分初始化代码会放到这个文件系统中,作为用户层进程来执行,

这样带来的明显好处是精简了内核初始化代码,而且使得内核的初始化过程更容易制定。

grub的stage2将initrd加载到内存里,然后将其中的内容释放到内存中,内核便去执行initrd中的init脚本,这时内核将控制权交给了init文件处理。init主要是加载各种存储介质相关的设备驱动程序,

当所需的驱动程序加载完毕后,会创建一个根设备,然后将根文件系统以只读的方式挂载。到这一步,initrd就从内存中释放掉,转换到真正的根文件系统上面去,同时运行/sbin/init程序,执行

系统的1号进程。此后系统的控制权就全权交给了/sbin/init进程。

4. 初始化系统:

/sbin/init --> /etc/inittab --> /etc/rc.d/rc.sysinit --> /etc/rc.d/* --> /etc/rc.local --> login界面(username/passwd) --> /etc/profile.d/file --> /etc/profile

|

|-->/etc/sysctl.conf

|--> /etc/fstab

--> /etc/bashrc --> ~/.bashrc --> ~/.bash_profile

/sbin/init是所有进程的父进程,当它接管了系统的控制权之后:

(1) 它首先会去读取/etc/inittab文件来执行相应的脚本进行系统的初始化,如:设置键盘,字体,装载模块,配置网络。

(2) 获取网络环境和主机类型。首先会读取网络环境配置文件'/etc/sysconfig/network',获取主机名和默认网关等网络环境

(3)    检测与载入内存设备/proc及USB设备/sys 除了/proc外,系统会主动检测是否有usb设备,并主动加载usb驱动,尝试挂载usb文件系统

(4)    决定是否启动selinux

(5)    接口设备的检测和即插即用参数的测试

(6)    用户自定义模块的加载。用户可以在'/etc/sysconfig/modules/*.modules' 加入自定义模块,此时会加载到系统中。

(7)    加载核心相关的设置。按'/etc/sysctl.conf'这个文件的设置值配置功能。

(8) 设置系统时间。

(9) 设置终端控制台的字体。

(10) 设置raid及LVM等硬盘功能

(11) 以只读方式检测磁盘文件系统

(12) 进行磁盘配额quota的转换

(13) 重新以只读方式加入系统磁盘

(14) 启动quota功能

(15) 启动系统随机数设备

(16) 清除启动过程中的临时文件。

(17) 将启动信息加载到'/var/log/dmesg'文件中

当/etc/rc.sysinit执行完毕,系统就可以顺利工作了。只是要需要启动系统所需的各种服务,这样主机才可以提供相关的网络和主机功能。

最后放一张图诠释启动过程:

ad1d4bf3e6297b0e353cce0b1819b791.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值