Linux的启动流程
第一步:开启开机按钮,计算机加载BIOS自检。
打开计算机电源,计算机首先会加载BIOS信息,进而对CPU信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息等进行自检。当正确检查完所有硬件信息后,计算机就会根据BIOS里的设置去读取相应的启动系统里的硬件设备,如果预先设定了从硬盘启动加载系统,那么BIOS就会读取硬盘的MBR(即0磁道0柱面1扇区的前446字节),接下来才开始加载内核文件,然后交由Linux来控制系统运行。
第二步:读取MBR信息。
MBR全称为Master Boot Record,中文的意思是主引导记录,它位于磁盘上的0柱面0磁道1扇区,整个大小是512字节,MBR里面存放了系统预启动信息、分区表信息及分区标志等。 在MBR的512字节中,第一部分为引导记录区,占有前446字节大小,其作用是找到标记为活动的分区,并将活动分区的引导记录读入内存。 第二部分为分区表,占有后面剩下全部的66字节大小,用于记录磁盘的分区信息,这其中,前64字节是磁盘分区表信息,后2字节是分区的结束标志"AA"。 计算机读取BIOS所指定的磁盘MBR信息之后,就会将其读入到内存中。被读入到内存中执行的其实就是Boot Loader(引导加载程序),对应于Linux系统,就是加载Grub信息。
第三步:加载Grub菜单(Boot Loader,引导加载程序)。
引导加载程序(Boot Loader)是计算机在加载操作系统内核之前运行的一段小程序。这段小程序可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境加载到一个适合的状态,以便为最终调用操作系统内核做好准备。通常,引导加载的程序依赖于硬件实现,早期的Linux系统常见的引导加载程序包含2种,即Grub和Lilo,现如今Grub已经成为了主流(类似于Windows下的boot.ini引导文件)。
引导加载程序读取grub.conf文件的配置信息,然后根据对应的配置信息来启动不同的操作系统,grub.conf的配置信息及详解如下所示:
[root@node1 boot]# cat /etc/grub.conf #<==也可读取/boot/grub/menu.lst或/boot/grub/grub.conf。 ...此处省略多行注释信息,其实这里的注释已经解释得很清楚了,只是90%的初学者不会看这里... default=0 #<==默认情况下如何加载系统,0表示加载菜单中对应的第一个名字,多系统时可以调节默认加载项。 timeout=5 #<==表示多少秒之后开始加载默认的系统,为管理员提前选择留出时间。 splashimage=(hd0,0)/grub/splash.xpm.gz #<==启动时显示的背景图标,(hd0,0)代表/boot分区。 hiddenmenu #<==系统启动时,会隐藏启动菜单信息,按默认设置即可启动系统,除非用户按键干预。 password [–md5|–encrypted ] STRING #<==编辑Grub菜单时需要认证,Linux优化之一,默认为没有。 title CentOS 6 (2.6.32-696.el6.x86_64) #<==要启动的系统对应的项目名称,可按需修改。 root (hd0,0) #<==引导内核文件和内核所需驱动文件所在的分区,(hd0,0)代表/boot分区。 #<==其中hd0表示计算机的第一块磁盘,(hd0,0)中逗号后面的0表示第一个分区,即(hd0,0)表示第一块磁盘的第一个分区,即/dev/sda1(分区通常是最先独立分出的/boot分区,对应的设备名就是sda1)。 kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=491eabe5-e6c0-4457-9bdb-b37cc6751308 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet #<==位于boot分区上的内核文件,及一堆可选内核参数。 #<==/vmlinuz-2.6.32-696.el6.x86_64为内核文件。root=UUID=后面一串数字表示根对应的设备信息(/dev/sda3),其他介绍的作用不大,忽略即可。 initrd /initramfs-2.6.32-696.el6.x86_64.img #<==内核启动所需的驱动文件的所在地,存在于boot区。
第四步:加载kernel内核以及驱动程序。
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=491eabe5-e6c0-4457-9bdb-b37cc6751308 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet #此外,还会加载内核所需的驱动程序文件,进而挂载并读取根分区的信息,加载操作系统文件。示例代码如下: initrd /initramfs-2.6.32-696.el6.x86_64.img
第五步:启动init进程,读取inittab文件。
加载完内核的相关文件以后,系统第一个运行的程序为/sbin/init,因此,init进程对应的进程号永远为1,相当于是所有Linux进程的祖先。 此时init程序会读取/etc/inittab文件,并依据此文件来进行初始化工作。其实CentOS6以来的/etc/inittab文件最主要的作用就是设定了Linux以什么样的运行等级启动,其设定配置是“id:3:initdefault:”,其中的3就是表明Linux需要运行在3级别上。
第六步:init进程执行rc.sysinit初始化系统。
init进程会根据inittab的设置加载/etc/rc.d/rc.sysinit,并进行初始化,系统设置包括但不限于如下内容。 设置主机名、设置欢迎信息、激活udev和selinux、加载/etc/fstab(挂载磁盘设备等)、设置系统时钟、读取/etc/sysctl.conf设置内核参数、激活lvm及software raid设备、加载额外设备的驱动程序、各种清理操作(如清理日志)等。 #注意:CentOS6以后,init进程不再读取inittab加载/etc/rc.d/rc.sysinit了,而是读取/etc/init/rcS.conf文件加载/etc/rc.d/rc.sysinit,并对系统进行初始化系统设置
第七步:init进程加载内核相关模块。
CentOS5下是读取/etc/modules.conf文件或/etc/modules.d目录下的文件来加载内核模块,而在CentOS6下则是加载/etc/sysconfig/modules/下的内核模块。
第八步:init进程执行对应运行级别下的脚本。
根据系统设定运行级别的不同,系统会运行rc0.d到rc6.d中的相应脚本程序,从而完成相应的初始化工作,以及启动相应的服务。
#注意:需要特别说明的是,在CentOS6以后的版本中,init进程不再读取inittab加载运行级别对应的脚本了,而是读取/etc/init/rc.conf加载指定运行级别下的脚本
第九步:加载/etc/rc.local。
rc.local就是在系统做好一切初始化工作之后,留给管理员自主设置的一个文件。可以将需要跟随计算机启动的程序启动命令放置到这里。
第十步:启动mingetty,进入登录前的状态。
系统读取/etc/init/tty.conf(早期也是读取inittab进行设置的),设置对应运行级别的终端,启动mingetty,进入登录前的状态
第一步:开启开机按钮,计算机加载BIOS自检。
第二步:读取MBR信息。
第三步:加载Grub菜单(Boot Loader,引导加载程序)。
第四步:加载kernel内核以及驱动程序。
1)执行initrd.target(/usr/lib/systemd/system/initrd.target)包含挂载/etc/fstab文件中的文件系统。 2)systemd执行默认的target配置。 CentOS7已经淡化了CentOS6的运行级别概念,但是为了兼容6以前的用户习惯,仍然以运行级别文件来进行标记,并且每个运行级别文件都有相应的软连接指向,默认的启动文件是/etc/systemd/system/default.target,根据它的指向可以找到系统要进入哪个模式。 早期的7种运行级别对应于5个启动模式: runlevel0.target -> poweroff.target runlevel1.target -> rescue.target runlevel2.target -> multi-user.target runlevel3.target -> multi-user.target runlevel4.target -> multi-user.target runlevel5.target -> graphical.target runlevel6.target -> reboot.target 3)systemd执行sysinit.target,初始化系统及加载basic.target准备启动系统。 4)systemd启动multi-user.target(生产工作模式)下的服务程序,即开机自启动的程序,程序目录为/etc/systemd/system和/usr/lib/systemd/system。 5)systemd执行multi-user.target下的/etc/rc.d/rc.local内容。 6)systemd执行multi-user.target下的getty.target及登录服务。 7)systemd执行graphical所需要的服务(如果安装了图形桌面功能)。
I have a dream so I study hard!!!