linux启动流程

第一部分 Linux启动基础知识

1.1 linux centos6.8启动流程图

 

                            spacer.gif

 

BIOS加电自检à加载MBRà加载启动grubà加载内核à启动/sbin/init进程à启动/bin/login进程à进入登陆页面

 

1.2 BIOSBasic Input/Output System )基础输入输出系统

BIOS是加载在电脑硬件系统上的最基本的软件代码。它的主要功能是为计算机提供最底层的、最直接的硬件设置和控制。它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启程序。BIOS程序一般被存放在主板ROM(只读存储芯片)之中,即使在关机或者掉电以后,程序也不会丢失。

BIOS的主要作用可以分为以下三点:

  • 自检及初始化程序POST(Power On Self Test):

            计算机接通电源后,POST程序将对内部所有设备进行检查,完整的自检包括了对CPU、640K基本内存、1M以上拓展内存、ROM、主板、CMOS存储器、串并口、显示卡、软硬盘子系统及键盘的测试。在自检过程中若发现有问题,BIOS将给出提示信息或鸣笛警告。若没有问题,完成自检后BIOS将按照系统CMOS设置中的启动顺序搜寻软、硬盘驱动器及CDROM、网络服务器等有效的启动驱动器,读取操作系统引导记录,然后将系统控制权交给主引导记录,由主引导记录完成系统的启动。

  • 硬件中断处理:

  计算机通电时,BIOS会告诉CPU等硬件设备的中断号,在进入操作系统之前输入某个硬件的命令,它就会根据中断号使用相应的硬件来完成命令的工作。

  • 程序服务请求:

  通过特定的端口发出指令,实现发送和接受外部设备的数据,从而实现对硬件的控制。

在安装操作系统之前,BIOS便存在于硬件系统之中,故BIOS并不属于内核kernel。

 

1.3 MBRMaster Boot Record)主引导记录

MBR主引导记录

组成

大小

主引导程序

446byte

分区表

64byte

有效标识符

(又称幻数 magic number)

2byte

 

  MBR是硬盘上的一个扇区,由主引导程序、硬盘分区表DPT和分区有效标志三部分组成。

MBR共有512字节的空间,第一部分的主引导程序(boot loader)占446个字节;第二部分的分区表DPT(Disk Partition Table)占64个字节,每十六个字节记录一个分区,记录分区数量及其大小;第三部分的分区有效标志占2个字节,标志磁盘已被格式化,操作系统可正确加载。

由MBR的组成及其作用,亦可知MBR并不属于linux内核kernel。

 

 

1.4 linux内核Kernel组成

1.4.1 kernel组成图解

spacer.gif

 

1.4.1 kernel组成详解

    linux内核kernel主要有五个子系统组成,分别为进程调度(SCHED)、内存管理(MM)、虚拟文件系统(Virtual File System,VFS)、网络接口(NET)和进程间通讯(IPC)。

 

  • 进程调度:控制进程对CPU的访问。当许需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其他资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。

  • 内存管理:内存管理(MM)允许多个进程安全共享主内存区域。Linux的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。必要时,操作系统负责在磁盘和内存间交换程序块。内存管理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关部分为内存管理硬件提供了虚拟接口。

  • 虚拟文件系统:隐藏了各种硬件的具体细节,为所有的设备提供了统一接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

  • 网络接口:提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。

  • 进程间通信:支持进程间多种通信机制,包括信号量、共享内存、管道等。这些机制可以协助多个进程、多资源的互斥访问、进程间的同步的消息传递。

 (由于篇幅原因,不再在这里讨论内核kernel,但在之后的文章中会详细讨论内核的组成和运行机制)

1.5 linux系统划分----内核空间(Kernelspace)和用户空间(Userspace)

  内核空间:存放内核源代码和数据

  用户空间:存放用户应用程序和数据。

 

第二部分 centos6.8详细启动过程

2.1 BIOS

   系统通电,加载BIOS,开启POST(Power On Self Test)加电自检程序,识别并检测所有主板硬件,若发现问题,系统将给出提示信息或鸣笛警告,若没有发现问题,则按照启动顺序(Bootsequence)依次寻找可引导设备。自检结束后,将MBR主引导记录加载到内存中。

2.2 MBR

    MBR加载进入内存,即引导程序GRUB和分区信息家在进入内存,将加载启动多重系统引导装载程序GRUB(GRand Unified Bootloader)。

2.3 GRUB

    GRUB引导分为两个阶段:

第一阶段,运行MBR中的stage1(存在于MBR中,用汇编语言编写):

  • 初始化基本硬件;

  • 为加载stage2(存在于磁盘中,用C语言编写)准备空间。

  • 将stage2加载进入RAM空间中;

  • 设置好堆栈;

  • 跳转到stage2的C程序入口

第二阶段,启动/boot/grub/stage2,读取/boot/grub/grub.conf配置文件:

  • 初始化本阶段要用到的硬件设备;

  • 检测系统内存映射;

  • 将kernel映像(/boot/vmlinuz)和虚拟根文件系统映像(/boot/intramfs)从flash加载到RAM空间;

  • 为内核设置启动参数;

  • 调用内核。

 

2.4 内核空间

2.4.1 启动内核

第一阶段:访问虚拟根文件系统(/boot/intramfs),执行init进程,完成加载驱动模块等任务;

       第二阶段:以只读方式挂载真实根文件系统,执行用户空间的/sbin/init进程。

2.5用户空间

2.5.1 /sbin/init进程

  • 根据/etc/inittab设置默认系统运行级别;

  • 执行/etc/rc.d/rc.sysinit系统初始化脚本;

  • 加载/lib/modules系统内核模块;

  • 根据之前设定的运行级别,相应地执行/etc/rc.d/rc脚本,完成相应的初始化工作和启动相关服务;

  • 执行/etc/rc.d/rc.local脚本,执行用户个性化的设置或程序。

       进入登录状态。

 

第三部分 启动过程重要文件

3.1 stage1

  • MBR中:

x86 boot sector;

GRand Unified Bootloader, stage1 version 0x3, boot drive 0x80, 1stsector stage2 0x6224, GRUB version 0.94;

partition 1: ID=0x83, active, starthead 32, startsector 2048, 409600sectors;

partition 2: ID=0x82, starthead 159, startsector 411648, 1572864sectors;

partition 3: ID=0x83, starthead 135, startsector 1984512, 18987008sectors, code offset 0x48

 

  • /boot/grub/stage1中:

x86 boot sector;

GRand Unified Bootloader, stage1 version 0x3, GRUB version 0.94,code offset 0x48

 

  • 将MBR中的引导记录信息加载出来,以及查看方法:

[root@oldboy grub]# dd if=/dev/sda count=1 of=/tmp/MBR

1+0 records in

1+0 records out

512 bytes (512 B) copied, 4.9834e-05 s, 10.3 MB/s

[root@oldboy grub]# file /tmp/MBR

/tmp/MBR: x86 boot sector; GRand Unified Bootloader, stage1 version0x3, boot drive 0x80, 1st sector stage2 0x6224, GRUB version 0.94; partition 1:ID=0x83, active, starthead 32, startsector 2048, 409600 sectors; partition 2:ID=0x82, starthead 159, startsector 411648, 1572864 sectors; partition 3:ID=0x83, starthead 135, startsector 1984512, 18987008 sectors, code offset 0x48

 

 

3.2 /boot/ *stage1_5/boot/grub/stage2

 1)  stage1_5:

e2fs_stage1_5  ffs_stage1_5      jfs_stage1_5    reiserfs_stage1_5  vstafs_stage1_5

fat_stage1_5  iso9660_stage1_5 minix_stage1_5  ufs2_stage1_5      xfs_stage1_5

 

2)  stage2:

GRand Unified Bootloader stage2 version 3.2,

installed partition 65535,

identifier 0x0,

GRUB version 0.97,

configuration file (hd0,0)/grub/grub.conf

 

 

3.3 /boot/grub/grub.conf

 

 GRUB的配置文件。

# Note that you do nothave to rerun grub after making changes to this file 不需要在更改该文件之后重新运行,也可完成配置修改

# NOTICE:  You have a /boot partition.  This means that  指定内核和虚拟文件系统的位置

#          all kernel and initrd paths arerelative to /boot/, eg.

#          root (hd0,0)

#          kernel /vmlinuz-version roroot=/dev/sda3

#          initrd /initrd-[generic-]version.img

#boot=/dev/sda

default=0

timeout=5

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS 6 (2.6.32-573.el6.x86_64)

       root (hd0,0)

       kernel /vmlinuz-2.6.32-573.el6.x86_64 roroot=UUID=f6eff611-2e35-4d5e-bf28-06f5fca7fc59 rd_NO_LUKS rd_NO_LVMLANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgbquiet    #内核版本,默认系统字符集

       initrd /initramfs-2.6.32-573.el6.x86_64.img  #虚拟文件系统的版本

 

 

3.4 /etc/inittab

 

# Defaultrunlevel. The runlevels used are:

#   0 - halt(Do NOT set initdefault to this) 停机状态

#   1 -Single user mode 单用户模式

#   2 -Multiuser, without NFS (The same as 3, if you do not have networking) 多用户模式(没有NFS)

#   3 - Fullmultiuser mode 多用户模式

#   4 –unused 未使用

#   5 - X11 桌面模式

#   6 -reboot (Do NOT set initdefault to this) 重启

#

id:3:initdefault: (这一行便是设置的默认运行级别)

 

 

3.5 /etc/rc.d/rc.sysinit

  • 设置主机名;

  • 设置欢迎信息;

  • 激活Udex和selinux/;

  • 挂载/etc/fstab文件中定义的文件系统;

  • 设置系统时钟;

  • 根据/etc/sysctl.conf文件设置内核参数;

  • 激活LVM以及软RAID设备;

  • 激活SWAP分区;

  • 加载额外设备的驱动程序;

  • 执行清理操作

 

 

3.6 /etc/fstab

     设置的文件系统,包括文件系统的名称、类型、地址。

# Created by anaconda onTue Apr 25 14:56:28 2017

#

# Accessible filesystems,by reference, are maintained under '/dev/disk'

# See man pages fstab(5),findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=f6eff611-2e35-4d5e-bf28-06f5fca7fc59/                       ext4    defaults        1 1

UUID=97012ecf-af98-4063-9839-722e0e06a30f/boot                   ext4    defaults        1 2

UUID=dbf823e7-030f-4ef5-b27d-04408b7e3b8fswap                    swap    defaults        0 0

tmpfs                   /dev/shm                tmpfs   defaults        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

 

 

 

3.7 /etc/rc.d/rc.local

       这个进程在其他的init脚本执行完毕后在执行,可以在这里设置自己想要执行的操作。

#!/bin/sh

#

# This script will beexecuted *after* all the other init scripts.

# You can put your owninitialization stuff in here if you don't

# want to do the full SysV style init stuff.

 

touch /var/lock/subsys/local  #创建一个/var/lock/subsys/local的文件

 

参考文献:

《从BIOS到内核的过程分析》,seek_0380,CSDN博客;

《BIOS》,百度百科;

《BIOS的主要作用》,若木,学习啦网;

《MBR》,百度百科;

《linux内核的组成部分》,leafhunter,新浪博客;

《MBR&/BOOT和GRUB三者关系总结》,dale_chenjiawen,CSDN博客;

《linux系统启动流程详解》,wang7396,CSDN博客;

《什么是BIOS?BIOS的作用是什么?》,hix747810800,百度经验;




  由于水平有限,在总结过程中难免有一些错误,希望各位能在发现问题之后或有哪些不解,可以留言评论,我会及时更改错误和回复大家,不胜感激。