Linux操作系统启动流程浅析
启动BIOS程序
当电源键按下之后,BIOS(Basic nput Output System)就会由主板上的闪存来运行。BIOS程序会把自己解压缩到系统的内存之中,然后读取CMOS(Complementary Metal Oxide Semiconductor)内存储的信息(例如系统时间,启动设备顺序等)来对系统进行配置。同时进行自检(POST:Power-On Self Test)。检测系统的硬件是否存在问题,自检通过之后,BIOS会加载第一启动设备的MBR(Master Boot Record:主引导扇区)中的boot loader程序。
需要说明的一点是,BIOS加载bootloader是通过硬件的INT 13中断功能来加载的。即,BIOS读取到了磁盘之后,通过INT 13这条通道来读取该磁盘的第一个扇区中的boot loader程序!
下面是BIOS程序的几张截图:

图1.1:BIOS程序的基本配置界面

图1.2:BIOS程序调整设备启动顺序的界面
启动Bootloader程序
Linux下面的Bootloader有多种,比如早期默认使用LILO,还有目前主流的grub。下面以目前Linux系统上面主流的grub来说明一下bootloader主要干了哪些事情?
Grub启动时会自动读取/boot/grub/grub.conf这个配置文件,然后执行其中的grub命令!图2.1是在centos6.5上面的一个grub.conf配置文件!Grub命令为红线框内的部分,它主要分为三个部分:

图2.1
1.设置启动的硬盘分区(root命令),传递给这个命令的参数是分区,这个命令会去分析并挂载这个分区,然后读取出其中的/boot文件夹下面的内容。比如图2.2所示,执行了命令之后,就能够读取出boot文件夹下面的内容了!

图2.2
2.选择引导的内核文件,并设置好内核参数(kernel命令)
3.加载initrd文件,设置虚拟文件系统。(initrd命令)
需要特别说明的是这个initrd文件,这个其实是一个虚拟文件系统(Initial RAM Disk)。在Linux系统中,有些磁盘的驱动程序并没有编译在内核中,而是被打包成了模块存放在了/lib/modules目录下面,而当内核启动了之后就需要加载磁盘的驱动程序。可是/lib/modules还没有被挂载,这时就产生矛盾了!为了解决这个矛盾,就产生了虚拟文件系统的这个概念。我们可以讲initrd文件加载到内存中(为了担心影响到磁盘上的文件系统,此时根目录的挂载是以只读的方式来挂载的),虚拟出一个根文件系统出来,然后读取虚拟根文件系统中的磁盘驱动程序,然后再从新挂载真正的根目录。
如图2.3所示,这些文件就是initrd文件所解压出来的内容。

图2.3
加载系统内核与硬件驱动程序
Grub程序运行完上面三个命令之后,内核文件(vmlinuz-$(uname -r))就会被解压到了内存之中开始运行了!此时,内核会自己再来从新检测一遍硬件并加载驱动程序!检查完成之后,内核就会调用Init程序,创建系统的第一个进程!
Init进程进行系统的初始化
Init程序启动之后,会首先去读取/etc/inittab这个文件来获取操作系统的Run Level(运行级别)。什么是运行级别呢,Linux下面系统根据有无网络和X Window来将
系统分为了七个运行级别。它们的内容如图3.1所示:

图3.1
这是在Linux的/etc/inittab文件中关于这其中模式的说明。
模式0代表了关机状态,模式1代表了单用户模式(维护模式),模式2代表了多用户的命令行模式,但是并没有网络。模式3代表了包含网络的多用户的命令行模式。模式4是系统保留的功能。模式5代表了图形界面模式。模式6代表了系统重启的状态。
对应于每个运行级别,/etc目录下面分别设置的不同的目录,如图3.2所示:

图3.2
系统运行某个级别,就会去运行相应目录(/etc/rc[运行级别].d)内的脚本文件。这里那个rc代表的是run command,即开始时要运行的命令,那个.d代表directory,代表的是目录的意思!
Inittab文件中出了能够设置系统的启动级别外,还有一些其他的功能,如图3.3所示:

图3.3
这个是在CentOS6.5上面inittab文件中关于其他配置的说明。
总之,Init程序在获取完了系统的运行等级之后,会继续执行下面这几个功能:
对系统进行初始化(执行/etc/init/rcS.conf这个脚本文件或者通过/etc/init/rc.conf来运行一些自定义的运行等级程序)
加载系统服务项(运行/etc/rc[运行等级].d/中的脚本文件)
设置好Ctrl + Alt + Del键的功能
运行mingetty来设置好六个相应的终端机
运行终端机并接受用户登陆
当系统的初始化内容完成之后,系统就会调用mingetty函数,来设置终端机,并等待用户登陆!它的具体流程是这样的,init进程先fork一个子进程,然后这个子进程来exec一个getty程序。Getty程序会试着去打开一个终端,如果打开成功了,那么就会去屏幕上显示login字样,当用户键入了用户名之后,getty程序的任务就完成了!然后它在以exec的方式来调用login程序。Login程序会去读取用户名和用户密码,然后读取shadow文件来检验用户的密码是否正确。如果密码不正确,则login通过调用exit 1来退出,此时init进程重新fork来重复上述步骤。
如果密码验证成功的话,那么login程序就会设置一些系统运行的环境(比如设置工作目录,设置uid和gid,用户名等)。设置好了这些系统环境之后,login程序就会通过exec来调用shell程序,shell程序执行并读取一些启动脚本(例如/etc/bashrc等)。读取完这些启动脚本之后,shell就打印出提示符,然后等待用户键入命令!此时我们的系统就正常启动了!
Linux操作系统启动流程浅析的更多相关文章
- Linux 操作系统启动流程
1.加载bios bios中包含的硬件CPU 内存 硬盘等相关信息 2.读取MBR 读取完bios信息之后,计算机会查找bios制定的硬盘MBR引导扇区,将其内容复制到 0x7c00 地址所在的物理内 ...
- Linux操作系统启动流程梳理
接触linux系统运维已经好几年了,常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程:一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可以简单总结为以下 ...
- Linux操作系统启动流程
一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可以简单总结为以下几步:1)开机BIOS自检,加载硬盘.2)读取MBR,进行MBR引导.3)grub引导菜单(Boot L ...
- [转] Linux操作系统启动流程
总启动流程 这部分转自:https://www.cnblogs.com/liang-io/p/9651656.html 一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可 ...
- 简述linux操作系统启动流程
Linux启动流程 POST-->BootSequence(BIOS)->Bootloader(MBR,grub)-->kernnel(ramdisk,initrd)-->ro ...
- linux文件系统启动流程、启动脚本
linux文件系统启动流程.启动脚本 下面是一张Linux启动流程图: 在了解启动流程之前,我们应该先知道系统的几个重要脚本和配置文件,他们对应的路径为: 1. /sbin/init 2. /etc/ ...
- Linux操作系统启动故障排错之"/sbin/init"文件被删除恢复案例
Linux操作系统启动故障排错之"/sbin/init"文件被删除恢复案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.删除"/sbin/ini ...
- Linux操作系统启动故障排错之"/etc/fstab"文件被删除恢复案例
Linux操作系统启动故障排错之"/etc/fstab"文件被删除恢复案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.模拟故障 [root@yinzhe ...
- Linux操作系统启动故障排错之/boot目录被删除恢复案例
Linux操作系统启动故障排错之"/boot"目录被删除恢复案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.模拟删除/boot分区 1>.查看/b ...
随机推荐
- ngrok 2016版
1. 先到http://www.ngrok.cc/下载客户端 2.进管理页面 注册登录 3.绑定域名 新增: 复制客户端id 打开该目录 按住shift 右键->在此处打开命令窗口 输入 sta ...
- IIS 之 HTTP 错误 403.14 - Forbidden
错误如下图所示: 其实,这个提示下面已经交代了怎么解决问题,现在告诉大家具体的详细步骤. 方法一:配置" 默认文档 " 方法二:启用" 目录浏览 "
- 下拉选择框加listview删除
package com.downselect; import java.util.ArrayList; import android.R.array; import android.app.Activ ...
- ZBarSDK扫描二维码
1:如果报引用文件错误的话需要在设置一下:project->Build settings->build active architecture only选项设置为No.Valid Arch ...
- android开发之路12(android四大组件&Fragment&AsyncTask类)
一.Activity组件1.简介:Activity组件是Android四大组件之一,通常一个Activity相当于一个用户界面,我们可以通过加载布局文件将Android提供的各种控件及自定义控件显示到 ...
- ionic中input框禁止输入问题
其实这个问题在之后沥青思路之后觉得还是挺好实现的,没有思路的时候真是找不到头绪~ 功能的描述为:当输入框中没有内容时,允许用户编辑:当其中有内容时不允许用户编辑,只有当用户点击编辑按钮后,才可允许编辑 ...
- [转]c# xml.Load() locking file on disk causing errors
本文转自:http://stackoverflow.com/questions/1812598/c-sharp-xml-load-locking-file-on-disk-causing-errors ...
- 【java.math.BigInteger】常用函数
1. /* 返回此BigInteger的函数正负号. 此方法返回-1,0或1作为此BigInteger的值对应是负,零或正数. */ java.math.BigInteger.signum(BigIn ...
- C语言数据类型
1.概述 C 语言包含的数据类型如下图所示: 2.各种数据类型介绍 2.1整型 整形包括短整型.整形和长整形. 2.1.1短整形 short a=1; 2.1.2整形 一般占4个字节(32位),最高位 ...
- phpQuery用法
了解phpQuery使用前了温习jquery.js的选择用法 jquery选择器,还有一个衍生产品QueryList 例: include 'phpQuery.php'; phpQuery::newD ...