码迷,mamicode.com
首页 > 系统相关 > 详细

Linux启动流程总结

时间:2015-12-27 16:23:34      阅读:353      评论:0      收藏:0      [点我收藏+]

标签:linux 启动流程

第一阶段:硬件引导启动


Power On

计算机上电后,系统会去加载BIOS(Basic Input Output System),在此阶段,BIOS的主要工作是检查主机上某些硬件的状态,以及存在于CMOS的设定,检查那些例行工作是要进行或无法执行的;


POST(Power-on Self Test,加电自检)

当BIOS读取完CMOS中的用户事前已经设置好的设定值之后,接下来就会有一连串的硬件检测动作,即POST;POST的主要任务是检查计算机硬件能否满足运行的基本条件,自检完成后,BIOS开始执行硬件检测的初始化(显卡、内存、磁盘等),此时BIOS需要一个外部存储设备的排序,而排在前面的设备就是启动设备,这样的设备包括硬盘、光盘、U盘、软盘和网络等,这种排序叫做Boot Sequence;


MBR(Master Boot Record,主引导记录)

BIOS按照启动顺序,把加载操作系统的主控权转交给排在第一位的存储设备;

这里我们以磁盘启动为例,BIOS此时去读取磁盘的第一个扇区(MBR,512 bytes)的内容,至此,BIOS的任务就完成了此后将系统启动的控制权转交到MBR部分的代码。

MBR由三部分组成:Bootloader(446 bytes)、Partition Table(64 bytes)与Magic Number(2 bytes);

技术分享


  • Bootloader(引导加载程序)

Bootloader存放于磁盘的第一个扇区,即MBR的0~445字节,其实每个文件系统(filesystem,或者是partition)都会保留一块引导扇区(boot sector)提供操作系统安装booloader,而通常操作系统默认都会安装一份bootloader到它根目录所在的文件系统的boot sector上,这也是多重操作系统安装的原理;

技术分享


Bootloader会获得系统启动的控制权,其主要功能有:

    • 提供菜单:用户可以选择不同的启动项;

    • 加载内核文件:直接指向可启动的程序区段来开始操作系统;

    • 转交其他loader:将引导装在功能转交给其他loader负责;

Bootloader主要有三种:

    • LILO(Linux Loader):早期使用的较多

    • SPFDISK

    • GRUB(Grand Unified Bootloader):主流

                   

  • Partition Table(分区表)

Partition Table记录整块磁盘分区的状态,共64 bytes,分为四组,每组记录了该区段的起始扇区号与扇区数;所以这种分区表只能为容量小于2T的磁盘分区;而GPT(GUID Partition Table)可以解决这个问题;


  • Magic Number

为固定值"55AA",的目的只是让存在于Bootloader区的管理程序在辨认扇区时,可以确认所存储的这个地方就是MBR;


[root@localhost ~]# hexdump -s 446 -n 66 -e ‘8/1 "%02x"2/4 "%10d""\n"‘ /dev/sda
8001010083fe3f18        63    401562
0000011983feffff    401625  20482875
00feffff83feffff  20884500   6136830
00feffff05feffff  27021330  56854035
55aa


第二阶段:GRUB启动引导阶段

GRUB引导分为三个阶段:

Stage 1:Stage 1是直接被写入到MBR中去的(其前446 bytes就是Bootloader),这样系统硬件检测完成后,启动控制权便交给了GRUB的代码,其功能是在系统启动时装载Stage 2;

Stage 1.5Stage 1.5是桥梁,由于Stage 2较大,存放在文件系统中,需要Stage 1.5引导位于文件系统中的Stage 2;

Stage 2Stage 2是GRUB的核心映像,存放在各分区的Boot Sector中,主要功能有:

  • 提供菜单;

  • 读取配置文件(/boot/grub/grub.conf);

  • 连接下一个Boot Sector;


第三阶段:内核引导阶段


kernel:kernel是操作系统的内核程序,也是操作系统最重要的一款程序,所有软硬件都是通过kernel来沟通的(/boot/vmlinuz);

initrd:全名为initial ramdisk,就是激活系统所需加载的文件系统(/boot/initrd);其工作流程也可分为两个阶段:

技术分享


阶段一:在内存中释放供kernel使用的root filesystem; 

阶段二:执行真正的根文件系统中的/sbin/init进程;

在inintrd文件被kernel加载后的开机流程,是依照隐藏在initrd文件中的一个init文件,由它所提供的脚本一步一步往下做,包含之后要从实体硬盘加载实际的操作系统也是由这个文件提供的;

init文件执行的顺序:

  • nash指令;

  • 挂在主要的文件系统;

  • 建立设备文件所需的文件系统;

  • 建立初始所需使用的设备文件;

  • 加载相关模块;

  • 切入实体操作系统;


第四阶段:Sys V init初始化阶段

技术分享


对Linux而言,在进入实体操作系统的第一步便是执行init程序,init的PID是1,代表一个起头程序,其他所有执行中的deamon则都是由init所带起来的程序;运行init程序需要读取配置文件/etc/inittab,以查看下一步做什么;inittab是一个不可执行的文本文件,它由若干指令组成,告诉init要进入那个运行级别,以及在哪里可以找到该运行级别的配置文件;

[root@localhost ~]# less /etc/inittab

id:3:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.  
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"


# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon


init在选择好要进入的runlevel后就直接进入/etc/rc.d/rc.sysinit文件设置大部分和系统相关的环境;rc.sysinit主要的工作有:

  • Run network scripts;

  • Check SELinux status;

  • Print a text banner;

  • Set the system clock;

  • Initialize hardware;

  • Load other user-defined modules;

  • Configure kernel parameters;

  • Set the hostname;

  • Initialize ACPI bits;

  • RAID setup;

  • Device mapper & related initialization(LVM);

  • Update quotas if necessary;

  • Remount the root filesystem read-write;

  • Clean up SELinux labels;

  • Mount all other filesystem(except for NFS and /proc);

  • Reset pam_console permissions;

  • Start up swapping;

  • Initialize the serial ports;

  • Active syslog,write to log file:dmesg;

继rc.sysinit之后所要执行的就是/etc/rc.d/rcX.d/目录,X是当初开机设置的initdefault值,若将initdefault设置为3,则会转向执行/etc/rc.d/rc3.d/下的所有文件,其下的文件都是以S或K开头的,S代表Start即为开机要执行的服务,K则代表Kill即为要关闭的服务,紧接着英文字母后面的是一个两位的数字,这个数字代表了执行的先后顺序,其中绝大多数文件都是链接到/etc/rc.d/init.d/下的实体执行程序,唯独一个例外就是S99local文件,它是最后一个执行的程序,链接到/etc/rc.d/rc.local,主要是帮助用户自行准备的Script File,或是个人化的设定;

[root@localhost ~]# ls /etc/rc.d/
init.d  rc  rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d  rc.local  rc.sysinit


待服务都启动完毕,就进入inittab文件的最后一个阶段--登录操作系统,就是执行mingetty程序(在runlevel 2、3、4、5都要执行mingetty程序),在执行mingetty时,mingetty会接替用户执行login程序以登录;在启动login后,会一并加载/etc/issue文件;在用户输入账号、密码登录后,login会替用户对比/etc下的paaawd及shadow文件以确认身份,然后执行对应的shell;


技术分享




本文出自 “聊聊~梦想” 博客,请务必保留此出处http://baogf92.blog.51cto.com/10869243/1728752

Linux启动流程总结

标签:linux 启动流程

原文地址:http://baogf92.blog.51cto.com/10869243/1728752

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!