Linux启动流程

BIOS ->MBR-> BOOT LOADER ->KERNEL -> INIT process -> login

1、BIOS 加电自检

按电源开机,电脑首先启动BIOS(基本输入输出系统),BIOS一般是集成在主板上的。

BIOS 的工作。

1)检测链接硬件,比如显卡,内存,磁盘等等,检测的目的是以后把这些设备信息提供给操作系统。

2)寻找启动磁盘,第一种BIOS都会有开机启动菜单,可以在菜单里设置以哪个设备上启动系统。比如:光驱,硬盘,网络等等,这个菜单可以设置多个选项,依照设置次序在设备上寻找启动信息。

3)找到了启动硬盘,接着BIOS就会在磁盘上寻找第一个启动扇区,也就是主引导记录MBRMaster Boot Record)。

但是MBR中,存储操作系统的空间只有446字节;MBR总共是512字节(=stage1)(其中引导程序占446字节+分区表64字节,每16个字节记录一个分区,标识符即校验码占2个字节,以55.aa结尾)

如果没有在MBR中找到操作系统的内核,那么BIOS就无法继续启动工作。

而我们的内核往往会大于446字节,存放在磁盘的其他位置上,既然446字节装不下内核,又为了能顺利的找到放到其他位置的内核,人们想出了一个办法,就是在这446字节里写一个小程序,当BIOS试着启动操作系统时会执行这个小程序,然后再由小程序来载入位于其他位置的内核。这个小程序就是启动载入器(boot loader)

查看MBR

dd if=/dev/sda of=./mbr.bin bs=1count=512

然后用 hexdump �CC mbr.bin 查看

2、BOOTloader

linux boot loader 常见有两种:lilogrub

由于lilo 存在着一个1024柱面的限制,并且更改了磁盘上的启动信息文件后需要重新启动系统才能同步446字节的内容,因此已经被grub所取代,现在绝大多数类Linux系统都采用grub bootloader

 grub 没有lilo各种限制,而且修改系统文件的启动内容后立刻就会与446内容同步。

 grub 存在与/boot/grub

wKioL1NSfOnity2CAAD_Ab4ww48749.jpg

GRUB有几个重要文件:stage1 , stage1_5 ,stage2

stage1 :它只有512字节,通常放在MBR中,它的作用很简单,就是在系统启动时用于装载stage2并�⒖刂迫�交给它。

stage2GRUB的核心,所有的功能都是由它实现。

stage1_5:介于stage1stage2之间,是他们的桥梁,因为stage2较大,通常都是放在一个文件系统当中的,但是stage1并不能识别文件系统格式,所以才需要stage1_5来引导位于某个文件系统当中的stage2 。根据文件系统格式的不同,stage1_5也需要相应的文件,如e2fs_stage1_5fat_stage1_5分别用于识别extfat的文件系统格式。它存放于1-63柱面之间。

引导顺序:stage1à stage1_5 à stage2

主要的配置文件是grub.conf

里面选项含义:

title一个操作系统引动的标头,可以使多个。

root:指明所需文件存在于哪个磁盘哪个分区上(hd0,0)表示第一个硬盘,第一个分区

kernel :内核文件的名字,并且会有一些加载内核时的参数

initrd :包含一些附加的驱动程序,一些静态驱动

wKioL1NSfNayLaGGAAObEWeEt5E707.jpg

3、内核启动

内核启动后会向BIOS查询电脑的所有硬件信息,然后自己接手过来管理这些设备,以便提供给Linux使用。

内核试着驱动这些设备,这些设备的驱动一份在内核中,叫静态驱动;一部分以模块的方式(动态)存放文件系统中,由于此事还未挂载任何文件系统,因此还不能使用文件系统中的模块,这里只能驱动在内核中存在的硬件驱动程序的对应设备,想驱动内核中未包含的硬件驱动就需要加载文件系统。

4、启动INIT服务

顺利的挂在了根文件系统后,就会启动INIT服务,init 内核启动的第一个用户级进程。

内核会按/sbin/init /etc/init /bin/init 顺序查找init程序。

如果找不到则内核报错。

启动init的目的就是为了初始化系统环境,启动了init就证明了内核已经顺利启动,接下来就有Init服务来建立Linux使用环境。

init做了什么?它会读取/etc/inittab文件,根据这个文件的信息来进行初始化工作。

会执行三个脚本 /etc/rc.d/rc.sysinit  /etc/rc.d/rc[0-6].d/* /etc/rc.d/rc.local(万能配置文件,系统启动完毕后,最后运行此文件内的命令)

rc.sysinit 主要的功能用来建立系统的基本环境,比如:

启动udev selinux 子系统

udev 负责产生/dev中的文件,selinux 负责增强系统的安全性

设定核心参数 sysctl-p 加载/etc/sysctl.conf

设定系统时间�⒂布�时间设定为系统时间

加载键盘和交换分区 swapon �Ca �Ce

设置主机名,挂载文件系统,并将根重新挂载为可读写

加载动态驱动模块

usb设备与RAID&LVM


rc脚本设置启动级别,Linux中有许多不同的启动级别,不同的启动级别会制定不同的服务。

根据指定rc的参数会对应执行/etc/rc.d/rc.[0-6].d/中的连接脚本文件以s开头的则启动,k开头的不随机自启动。rc.local前两个脚本都是系统至关重要的脚本,如果我们想在启动过程中放置一些其他程序,应该使用rc.local 脚本中。

三个RC脚本执行完毕后,就会建立虚拟主控制台,执行/bin/login 就提供了用户登录界面了

如果是图形L5级别的话,会启动XWindows 登陆界面

所有的启动就都已经完毕。


初始化 /sbin/init

vim /etc/inittab  初始化配置文件

wKiom1NSfTaQt38oAAE9Q9mtEL4012.jpg

wKioL1NSfQ2wGrSPAABN82GLLow735.jpg

wKiom1NSfTeAqq4AAAIj29GZYZ4425.jpg



其中rc.sysinit (启动初始化) rc0~6为运行级别脚本,启动或关闭的控制文件,s启动,k关闭。启动或关闭的数字越小,优先级越高。

5、登录,加载用户环境变量

输入用户和密码系统验证,然后会执行

/etc/bashrc

/etc/profile

$HOME/.bashrc

$HOME/.bash_profile

查看当前的启动级别: runlevel

切换级别:init 3

wKiom1NSfVjhyCF-AAA_eZg9YLw421.jpg


用户模版:/etc/skel

wKiom1NSfWnTSsKpAABKYT4EgD8205.jpg

wKioL1NSfT-jO4vfAABilksXqUY215.jpg

wKiom1NSfWmA5rAJAAGU7PWFe5M709.jpg

注:部分转自http://www.lishiming.net/forum.php?mod=viewthread&tid=6664&extra=page%3D1%26filter%3Dtypeid%26typeid%3D3

你可能感兴趣的:(linux,操作系统,程序,process,电脑)