Linux系统启动流程简介

1,464次阅读
没有评论

Linux系统启动流程简介

开机自检,MBR引导,读取硬盘0柱面0磁道1扇区的前446字节,加载grub菜单,在grub菜单里面加载kernel,启动init进程,init是Linux系统启动时第一个启动的进程,init读取inittab文件,先执行/etc/rc.d/rc.sysinit初始化脚本(设置主机名,加载inittab,设置网卡和一些PCI设备),根据inittab设置的级别执行相对应的脚本,如果是3模式则指向/etc/rc3.d下面的脚本以及程序,执行rc.local,最后启动mingetty进程,进入登陆界面。

1.开机自检

开机之后,检查BIOS设置,硬件自检,如CPU、硬盘、内存、时间日期和启动顺序等设置。

2.读取MBR主引导

读取BIOS设置启动顺序中的第一个,如果第一个扇区的前面512个字的最后字节是ox55和oxAA,那么设个设备就可以启动,如果不是就启动启动顺序中设置的下一个设备。主引导的主要作用就是告诉计算机应该在硬盘的那个位置寻找操作系统,主引导分为三部分:

1) 第1-446字节:调用操作系统的机器码

2) 第447-510字节:分区表(Partition table)

3) 第511-512字节:主引导记录签名(0x55和0xAA)

3.Grub

初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。系统读取内存中的grub配置信息(一般为menu.lst或grub.lst),并依照此配置信息来启动不同的操作系统。

4.加载kernel

根据Grub设定的内核映像所在路径,然后内存读取并进行解压,系统将解压后的内核放在内存当中,并调用start_kernel()函数来启动一些列的初始化函数并初始化各种设备。

5.init经常根据inittab决定运行级别

Init进程是Linux系统进程的所有起点,它的PID是1,然后它会根据/etc/inittab来决定运行级别

<span class="line">1</span>
<span class="line">2</span>
<span class="line">3</span>
<span class="line">4</span>
<span class="line">5</span>
<span class="line">6</span>
<span class="line">7</span>
<span class="line">8</span>
<span class="line">9</span>
<span class="line">10</span>
<span class="line">11</span>
<span class="line">12</span>
<span class="line">[root@localhost ~]<span class="comment"># ps aux</span></span>
<span class="line">USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND</span>
<span class="line">root 1 0.0 0.1 19356 1524 ? Ss 14:05 0:00 /sbin/init</span>
<span class="line">root 2 0.0 0.0 0 0 ? S 14:05 0:00 [kthreadd]</span>
<span class="line">root 3 0.0 0.0 0 0 ? S 14:05 0:00 [migration/0]</span>
<span class="line">root 4 0.0 0.0 0 0 ? S 14:05 0:00 [ksoftirqd/0]</span>
<span class="line">root 5 0.0 0.0 0 0 ? S 14:05 0:00 [stopper/0]</span>
<span class="line">root 6 0.0 0.0 0 0 ? S 14:05 0:00 [watchdog/0]</span>
<span class="line">root 7 0.1 0.0 0 0 ? S 14:05 0:05 [events/0]</span>
<span class="line">root 8 0.0 0.0 0 0 ? S 14:05 0:00 [cgroup]</span>
<span class="line">root 9 0.0 0.0 0 0 ? S 14:05 0:00 [khelper]</span>
<span class="line">root 10 0.0 0.0 0 0 ? S 14:05 0:00 [netns]</span>

Linux七种运行级别(0-6)

a) 0 关机 b) 1 单用户模式(也就是维护模式) c) 2无NFS网络支持的多用户模式 d) 3 文半多用户模式 e) 4预留 f) 5 X Window多用户图形化模式 g) 6重启

6.init进程执行rc.sysinit

rc.sysinit是由init执行的第一个脚本,它主要完成一些系统初始化的工作,比如设置PATH,网卡,设置主机名,加载PCI设备等等。

7.启动内核模块

根据/etc/modules.conf文件或/etc/modules.d目录下面的文件来装在内核模块的。

8.执行不同运行级别脚本

根据不同的运行级别执行不同的级别脚本,如果我启动的是3模式,那么我就会执行rc3.d里面的脚本

<span class="line">1</span>
<span class="line">2</span>
<span class="line">3</span>
<span class="line">4</span>
<span class="line">5</span>
<span class="line">6</span>
<span class="line">7</span>
<span class="line">8</span>
<span class="line">9</span>
<span class="line">10</span>
<span class="line">11</span>
<span class="line">12</span>
13
<span class="line">[root@localhost rc.d]<span class="comment"># ll</span></span>
<span class="line">total 60</span>
<span class="line">drwxr-xr-x. 2 root root 4096 Dec 31 15:39 init.d</span>
<span class="line">-rwxr-xr-x. 1 root root 2617 Oct 16 22:53 rc</span>
<span class="line">drwxr-xr-x. 2 root root 4096 Dec 31 15:39 rc0.d</span>
<span class="line">drwxr-xr-x. 2 root root 4096 Dec 31 15:39 rc1.d</span>
<span class="line">drwxr-xr-x. 2 root root 4096 Dec 31 15:39 rc2.d</span>
<span class="line">drwxr-xr-x. 2 root root 4096 Dec 31 15:39 rc3.d</span>
<span class="line">drwxr-xr-x. 2 root root 4096 Dec 31 15:39 rc4.d</span>
<span class="line">drwxr-xr-x. 2 root root 4096 Dec 31 15:39 rc5.d</span>
<span class="line">drwxr-xr-x. 2 root root 4096 Dec 31 15:39 rc6.d</span>
<span class="line">-rwxr-xr-x. 1 root root 220 Oct 16 22:53 rc.local</span>
<span class="line">-rwxr-xr-x. 1 root root 19914 Oct 16 22:53 rc.sysinit</span>

9.执行/eyc/rc.d/rc.local

初始化的最后一个脚本,用户可以设置在初始化之后登陆之前执行的命令,列如我要在开机之后清空/tmp文件夹里面的文件:

<span class="line">1</span>
<span class="line">2</span>
<span class="line">3</span>
<span class="line">4</span>
<span class="line">5</span>
<span class="line">6</span>
<span class="line">7</span>
<span class="line">8</span>
<span class="line">[root@localhost ~]<span class="comment"># vim /etc/rc.d/rc.local</span></span>
<span class="line"><span class="meta">#!/bin/sh</span></span>
<span class="line"><span class="comment">#</span></span>
<span class="line"><span class="comment"># This script will be executed *after* all the other init scripts.</span></span>
<span class="line"><span class="comment"># You can put your own initialization stuff in here if you don't</span></span>
<span class="line"><span class="comment"># want to do the full Sys V style init stuff.</span></span>
<span class="line">touch /var/lock/subsys/<span class="built_in">local</span></span>
<span class="line">rm -rf /tmp/*</span>

10.执行/etc/login

/etc/login是来判断用户的账号密码是否正确,如果正确就初始化用户的环境变量。

admin
版权声明:本站原创文章,由admin2016-07-11发表,共计2406字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)