首页 > 代码库 > Linux启动流程详解
Linux启动流程详解
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/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
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,百度经验;
由于水平有限,在总结过程中难免有一些错误,希望各位能在发现问题之后或有哪些不解,可以留言评论,我会及时更改错误和回复大家,不胜感激。
本文出自 “零容忍” 博客,请务必保留此出处http://lingrongren.blog.51cto.com/12744457/1925425
Linux启动流程详解