这里主要分析使用BIOS的MBR分区的启动流程
启动流程概览:
- 加载BIOS的硬件信息,进行自检查,获取第一个启动设备(如:硬盘)
- 读取第一个启动设备MBR的boot loader(grub)的启动信息
- 加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备。
- 核心执行init程序,并获取默认的运行信息(runlevel)
- init程序执行/etc/rc.d/rc.sysinit文件,准备操作系统环境(如网络,时区等信息)
- 启动核心的外挂模块
- init执行获取到的runlevel对应的服务脚本
- init执行/etc/rc.d/rc.local
- 执行/bin/login程序,等待用户登录
- 登录之后开始以Shell控制主机
1、BIOS
BIOS是英文"Basic Input Output System"的缩写,直译过来后中文名称就是"基本输入输出系统"。
其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 ——百度百科
POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、 串并行接口、键盘、 CD-ROM光驱等硬件情况的检测。
这部分主要是硬件的启动和检测,就不细究了。
最关键的一部分是,BIOS要获取到第一个启动设备。
2、引导程序和grub
当BIOS完成自检并指定启动设备后,就会将对系统的控制权过渡到引导程序(Boot Loader)。
Linux用的引导程序用的是grub。
grub通常分为两个阶段,分别是第1阶段和第2阶段。
- 1阶段
包含在MBR(第一个启动设备的0扇区)中。由于受MBR的大小限制,第1阶段所做的几乎只是装载GRUB的下一阶段(存放在硬盘的其它位置)。- - - 1.5阶段
包含在MBR后面的30千字节中,一般使用的文件名是/boot/initrd,它能够通过Boot Loader加载到内存当中,然后在内存中仿真成一个虚拟的一个根目录。 - 2阶段
通过1.5阶段提供的虚拟文件系统,kernel就能够加载需要的驱动程序,最终释放虚拟文件系统,并挂载实际的根目录文件系统。
3、runlevel
当内核加载完整后,系统就会执行第一个进程init。
init进程首先通过/etc/inittab获取到系统默认的runlevel。
-
runlevel等级
- 0 -halt 关机
- 1 -single user mode 单用户模式
- 2 -multi-user,without NFS 没有NFS的多用户模式
- 3 -Full Multi-user mode 多用户模式
- 4 -unsed 保留
- 5 -X11 桌面模式
- 6 -reboot 重启
-
/etc/inittab文件在Cenos6后基本上只保留了定义默认runlevel这个功能。其格式如下:
[root@CentOS6 boot]#vim /etc/inittab
# 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)
# 设置默认runlevel为5模式
id:5:initdefault:
4、执行/etc/rc.d/rc.sysinit
/etc/rc.d/rc.sysinit脚本执行一系列的命令,去配置整个系统环境:
1、网络环境、主机名
2、挂载内存、usb设备等等
3、设置终端字体
...
5、执行/etc/rc.d/rc$runlevel.d
根据之前获取的runlevel,执行对应的运行级别的服务
init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit
[root@CentOS6 rc.d]#[root@CentOS6 boot]#cd /etc/rc.d/
-bash: [root@CentOS6: command not found
[root@CentOS6 rc.d]#[root@CentOS6 rc.d]#ls
-bash: [root@CentOS6: command not found
[root@CentOS6 rc.d]#init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit^C
[root@CentOS6 rc.d]#ls rc3.d
K01smartd K60nfs K88sssd S10network S24rpcgssd S80postfix
K02oddjobd K61nfs-rdma K89netconsole S11auditd S25blk-availability S82abrt-ccpp
K05wdaemon K69rpcsvcgssd K89rdisc S11portreserve S25cups S82abrtd
K10psacct K73winbind K92pppoe-server S12rsyslog S25netfs S90crond
K10saslauthd K74ntpd K95firstboot S13cpuspeed S26acpid S95atd
K15htcacheclean K75ntpdate K95rdma S13irqbalance S26haldaemon S99certmonger
K15httpd K75quota_nld K99rngd S13rpcbind S26udev-post S99local
K30spice-vdagentd K76ypbind S01sysstat S15mdmonitor S27pcscd
K36mysqld K84NetworkManager S02lvm2-monitor S22messagebus S28autofs
K50dnsmasq K84wpa_supplicant S08ip6tables S24nfslock S50bluetooth
K50kdump K87restorecond S08iptables S24openct S55sshd
例如/etc/rc.d/rc3.d目录下有很多K或者S开头的文件,这些文件会被一一执行。其中K表示杀死对应服务,S表示启动对应复位。后面的数字字符串表示执行顺序。先执行K,后执行S。
网友评论