linux 开机启动详细流程

来源:互联网 发布:金蝶软件erp 编辑:程序博客网 时间:2024/05/19 20:40

一、BIOS 加电自检

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

BIOS的工作

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

2.寻找启动磁盘,每一种BIOS都会有开机启动菜单,可以在菜单里设置以哪个设备启动系统

比如:光驱,硬盘,网络等等,这个菜单可以设置多个选项,依照设置次序在设备上寻找启动信息

3.找到了启动硬盘,接着BIOS就会在磁盘上找启动扇区,找到内核启动系统

1)先试着寻找第一个扇区,也就是主引导记录MBR(Main Boot Record)

2) 如果第一个扇区上没有存在操作系统,再去寻找标记为BOOT的分区

不论是MBR还是BOOT分区,存储操作系统的空间都只有446字节

如果没有在上面提到的位置找到操作系统的内核,那么BIOS就无法继续启动工作

而我们的内核往往会大于446个字节,存放在磁盘的其他位置,既然446装不下内核,又为了能顺利的找到

放在其他位置的内核

人们想出了一个办法就是在446字节里写了一个小程序,当BIOS试着启动操作系统时就会执行这个小程序,

然后再由小程序来载入其他位置的内核。这个小程序就是启动载入器(boot loader)

二、BOOT Loader

linux的boot loader 常见的有两种:lilo  grub

因为lilo存在着一个1024柱面的限制,并且更改了磁盘上的启动信息文件后需要重新启动系统才能同步446字节的内容,因为

lilo的缺陷,已经被grub所取代。现在绝大多数类Linux系统都采用grub做boot loader;

grub则没有了lilo各种限制,而且方便到能修改系统文件的启动内容就可以立刻与446内容同步。

那么我们就看看grub的内容 它存在于  /boot/grub中

GRUB有几个重要的文件,STAGE1、STAGE1.5、STAGE2

STAGE1:他只有512字节,通常放在MBR中,他的作用很简单,就是在系统启动时用于装载STAGE2并将控制权交给它。

STAGE2:GRUB的核心,所有的功能都是由他实现

STAGE1.5: 介于STAGE1和STAGE2之间,是他们的桥梁,因为STAGE2较大,通常都是放在一个文件系统当中的,但是

STAGE1并不能识别文件系统的格式,所以才需要STAGE1.5来引导位于某个文件系统中的STAGE2。更具文件系统格式的

不同,STAGE1.5也需要相应的文件,比如:e2fs_stage1_5,fat_stage1_5,分别用于识别ext和fat的文件系统格式。他存

放在1-63的柱面之间。

引导顺序如下:STAGE->STAGE1.5->STAGE2

主要的配置文件是 grub.cfg

里面选项含义:

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

root:指明所需文件存在于哪个磁盘那个分区上(hd0,0)表示第一个硬盘,第一个分区,可参考/boot/grub/device.map

kernel:内核文件的名字,并且会有一些加载内核时的参数 or代表只读方式加载

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

三、内核启动

内核启动后会向bios查询电脑的所有硬件信息,然后自己就手下来管理这些设备,以便提供给linux使用,内核会试着驱动这些

设备,这些设备的驱动一部分包含在内核中,叫做静态驱动,一部分一模块的方式(动态)存放在文件系统中,由于此时还未

挂载任何文件系统,因此还不能使用文件系统中的模块,这里只能驱动在内核中存在的硬件驱动程序的对应设备。想驱动内核

中未包含的硬件驱动就需要加载文件系统。


内核会尝试着挂载根文件系统,根文件系统至少包含 /etc    /bin   /sbin  /lib   /dev  这5大目录

他们5个缺一不可,都会导致系统无法启动

根文件系统挂载是以只读方式挂载的,因为这时Linux还在启动阶段,并不稳定,避免破坏系统资料

四、启动INIT服务

顺利的挂载了根文件系统后,就会启动init服务

内核会按  /sbin/init     /etc/init      /bin/init  顺序寻找init  程序,

如果找不到则内核报错  这里存在一个参数 init=/bin/sh  如果启动时指定了则最后执行  /bin/sh 而不会产生内核报错。也被称为

快速启动,因为他忽略了很多启动初始化工作。


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


init做了什么?

他会读取  /etc/inittab 文件,根据这个文件的信息来进行初始化工作。

具体会执行三个脚本  /etc/rc.d/rc.sysinit  /etc/rc.d/rc  /etc/rc.d/rc.local

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

启动udev selinux子系统

udev负责产生  /dev中的文件

selinux负责增强系统的安全性

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

设定系统时间  将硬件时间设定为系统时间

加载键盘和交换分区  swapon  -a -e

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

加载动态驱动模块

USB设备与RAID & LVM

卸载 /initrd/ 目录

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

根据rc的参数会对应执行  /etc/rc.d/rc[0-6].d/中的连接脚本文件  以S开头的则启动

rc.local  

前两个脚本都是系统至关重要的脚本,如果我们想在启动过程中放置一些其他程序应该使用rc.local脚本 因为s99

local存在于rc[2-5].d中

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


所有的启动就都已经完毕

用户环境初始化

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

/etc/profile

/etc/profile.d/*.sh $HOME/.bash_profile

/etc/bashrc

$HOME/.bashrc

启动级别

0 关机

1 单用户

2 多用户但带网络但不能远程登录

3 不受限 多用户模式 TUI

4 保留

5 图形模式

6 重启模式

查看启动级别

 # runlevel

N 3

N 是上次的级别, 3是当前级别 也就是说机器开机就是3级别


切换级别

initi 5


挂载文件系统

/etc/fstab

第一项 是要mount 的存储装置的实体位置或者用卷标

第二项 要挂在到那个目录

第三项 指定挂载的系统格式

第四项 mount时要设定的状态, 只读或default

第五项 提供DUMP功能,在系统DUMP时需要BACKUP的标志位,其内定位置是0

第六项 设定开机时文件系统是否要check

除了root的文件系统其必要的check为1  其他视需要而定 默认是0

LABEL=/boot  /boot ext3 default 1 2