标签: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.5:Stage 1.5是桥梁,由于Stage 2较大,存放在文件系统中,需要Stage 1.5引导位于文件系统中的Stage 2;
Stage 2:Stage 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 启动流程
原文地址:http://baogf92.blog.51cto.com/10869243/1728752