您的位置:首页 > 运维架构 > Linux

Linux启动流程详解

2017-05-14 09:39 330 查看

linux启动流程

第一部分 Linux启动基础知识

1.1 linux centos6.8启动流程图



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

1.2 BIOS(Basic 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 MBR(Master 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组成图解


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/MBR1+0 records in1+0 records out512 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_5fat_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
splashimage=(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,百度经验;

由于水平有限,在总结过程中难免有一些错误,希望各位能在发现问题之后或有哪些不解,可以留言评论,我会及时更改错误和回复大家,不胜感激。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 详解 启动流程