Linux系统启动流程


一、大致流程图

在这里插入图片描述


二、硬件启动流程

1. 打开电源

系统通电,CPU首先执行固化在ROM中的BIOS(Basic Input Output System)。

2.BIOS

BIOS最主要的一件事是硬件自检POST,并在启动盘(Windows一般是C盘系统盘)的第一个扇区(MBR)加载执行BootLoader。
BIOS工作在CPU和IO设备之间,因此他总是能知道计算机的所有硬件信息。如果任何的硬盘或IO设备发生变化,只需更新BIOS即可。BIOS被存储在RRPROM/FLASH内存中,BIOS不能存储在硬盘或者其他设备中,因为BIOS是管理这些设备的。BIOS使用汇编语言编写。

POST(Power On Self Test)

初始化硬件设备,检查系统外围主要设备(CPU,内存,硬盘,显卡,I/O设备,键盘鼠标)是否存在故障影响正常开机。

确定启动设备

下一步,根据BIOS设置的启动顺序,检测驱动器(硬盘,光盘,U盘,网络),如果硬盘是启动项,读取硬盘第一个扇区(MBR,512字节)到内存,控制区转给MBR中的BootLoader。

3. MBR(Master Boot Record)

MBR简介

因为我们在给磁盘分区的时候,第一个扇区一般会保留一些初始化启动代码,这里的MBR就是磁盘分区的第一个扇区,大小512Bytes。
MBR由主引导程序、硬盘分区表DPT和有效硬盘标识组成。
MBR的BootLoader中安装有GRUB程序的一部分,因为BootLoader只有446Bytes,容量太小,所以只安装了GRUB中一个小的程序在里面,用于加载剩余的GRUB程序。
在这里插入图片描述
BIOS确认硬件没有问题之后,就要加载执行BootLoader了,BootLoader一般放在外部的存储介质中比如磁盘,也就是我们俗称的启动盘(OS也装在其中),BootLoader并不是一次就可以全部加载的,首先会去寻找加载MBR中的代码,找到GRUB的最小部分,再分阶段进行加载。


三、GRUB启动引导阶段

1.GRUB简介

GRUB程序的作用是,可以在系统中选择性地引导不同的OS,实际上就是加载引导不同的内核镜像,当内核挂载成功之后就将控制权交给内核程序。

2. Stage1阶段

Stage1可以理解为已写入MBR的BootLoader中的小程序部分。因为MBR空间有限,所以MBR当中安装最小程序。其主要作用是装载Stage2,即加载剩余的GRUB程序。

3. Stage1.5阶段

Stage1.5是MBR后面的分区,并不处在MBR中。它是Stage1和Stage2的桥梁,能够识别启动分区文件系统,GRUB访问/boot分区grub目录下的Stage2文件,将Stage2载入内存并执行。

4. Stage2阶段

Stage2运行后,开始解析GRUB的配置文件/boot分区下/grub/grub.conf。然后显示操作系统启动菜单,加载内核镜像到内存,通过/boot/initrd开头文件建立虚拟RAM DISK虚拟内存文件系统,最后将控制权转交给内核程序。


四、内核Kernel引导阶段

依靠Stage2阶段在内存中创建的虚拟文件系统,从中调用虚拟根文件系统中的init程序,进而加载驱动模块来初始化系统中的各设备,并做相关配置,其中包括CPU、I/O、存储设备等。

当所需的驱动程序加载完后,会根据grub.conf配置文件中“root=XXX”部分所指定的内容创建一个根设备,然后将根文件系统以只读的方式挂载,并切换到真正的根文件系统上,同时调用系统进程的/sbin/init程序,进入系统初始化阶段。


五、系统初始化阶段

这一步是通过/sbin/init,init程序准备软件运行环境,启动系统服务。

1. init进程/程序

init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。

2. 运行级别

Linux系统有7个运行级别(runlevel):

  • 运行级别0(关机):系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
  • 运行级别1(单用户root):单用户工作状态,root权限,用于系统维护,禁止远程登陆
  • 运行级别2:多用户状态(没有NFS)
  • 运行级别3(命令行):完全的多用户状态(有NFS),登陆后进入控制台命令行模式
  • 运行级别4(保留):系统未使用,保留
  • 运行级别5(图形):X11控制台,登陆后进入图形GUI模式
  • 运行级别6(重启):系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

默认级别:3,5
切换级别:init #
查看级别:runlevel ; who -r

3. /etc/inittab配置文件

init 程序首先是需要读取配置文件 /etc/inittab。通过/etc/inittab文件确定运行级别,然后去执行系统初始化脚本/etc/rc.sysinit,为用户初始化用户空间环境,在完成初始化后,根据运行级别,系统开始对应级别的目录启动服务,关闭那些不要的服务。

好像Ubuntu没有inittab文件。有了解的朋友评论区给个答案。

[root@centos6 ~]#vim /etc/inittab 
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. 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)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:5:initdefault:

4. /etc/rc.sysinit脚本

init确定了运行级别后,还调用执行了/etc/rc.d/rc.sysinit或/etc/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。

它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。
在这里插入图片描述

5. 加载系统服务

/etc/rc.d/脚本和/etc/rc.d/rc#.d目录

/etc/rc.d/rc是一个Shell脚本,作用是当运行级别切换时用于启动或停止服务。它接受0~6作为参数,去执行/etc/rc.d/rc#.d/目录下的所有的rc启动脚本(#表示0-6任一数字),/etc/rc.d/rc#.d/目录中的这些启动脚本实际上都是一些连接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。
而这些rc启动脚本有着类似的用法,它们一般能接受start、stop、restart、status等参数。
/etc/rc.d/rc#.d/中的rc启动脚本通常是K或S开头的连接文件。对于以 S 开头的启动脚本(例S##*),将以start参数来运行。而如果发现存在相应的脚本也存在K打头的连接(例K##*),而且已经处于运行态了,则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。其中## 是数字,表示优先级,数字越小,越优先启动/关闭。
这样做是为了保证是当init改变运行级别时,所有相关的守护进程都将重启。
至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig或setup中的"System Services"来自行设定。

[root@centos6 ~]#ls /etc/rc.d/rc5.d/
K01smartd        K75quota_nld       S10network           S26acpid
K02oddjobd       K76ypbind          S11auditd            S26haldaemon
K05wdaemon       K84wpa_supplicant  S11portreserve       S26udev-post
K10psacct        K87restorecond     S12rsyslog           S28autofs
K10saslauthd     K88sssd            S13cpuspeed          S50bluetooth
K15htcacheclean  K89netconsole      S13irqbalance        S55sshd
K15httpd         K89rdisc           S13rpcbind           S56xinetd
K50dnsmasq       K92iptables        S15mdmonitor         S70spice-vdagentd
K50kdump         K92pppoe-server    S22messagebus        S80postfix
K60nfs           K95firstboot       S23NetworkManager    S82abrtd
K61nfs-rdma      K99rngd            S24nfslock           S83abrt-ccpp
K69rpcsvcgssd    S01sysstat         S24rpcgssd           S90crond
K73winbind       S02lvm2-monitor    S25blk-availability  S95atd
K74ntpd          S05rdma            S25cups              S99certmonger
K75ntpdate       S08ip6tables       S25netfs             S99local
/etc/rc.local

用于加载用户自定义的服务。


六、启动终端与用户登录

1. 建立终端

rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。

init接下来会打开6个终端,以便用户登录系统。在inittab中的以下6行就是定义了6个终端:

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

从上面可以看出在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。

同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用户的身份。

2. 用户登录系统

一般来说,用户的登录方式有三种:

  1. 命令行登录
  2. ssh登录
  3. 图形界面登录
    对于运行级别为5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入 KDE、Gnome 等窗口管理器。

3. 验证登录

Linux 的账号验证程序是 login,login 会接收 mingetty 传来的用户名作为用户名参数。

/etc/nologin文件:如果用户在该文件中,则不许登录。
/etc/usertty文件:用于对用户作出附加访问限制,如果不存在这个文件,则没有限制。
/etc/securetty文件:登记在其中的终端才允许用户登录,如果不存在该文件,则任何终端上都可以登录。
/etc/passwd & /etc/shadow文件:用来验证密码以及设置账户的主目录是什么、使用何种shell。

4. 登录成功

命令行终端屏幕根据/var/log/lastlog输出最近一次登录的信息,以及根据/var/spool/mail/USERNAME输出用户是否有新邮件。

同时根据文件/etc/profile、.bash_profile、.bash_login、.profile文件加载环境变量。


七、总结图

在这里插入图片描述


参考文章
http://www.yunweipai.com/33942.html
https://www.runoob.com/linux/linux-system-boot.html
https://www.jb51.net/article/145422.htm
https://blog.csdn.net/weixin_42255666/article/details/82501831
https://www.cnblogs.com/quan0311/p/15292110.html#12-post

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值