第一步,打开电源键
各种硬件通电,电脑开始运作,屏幕开始打印字符
第二步,系统加载BIOS(Basic Input Output System,基本输入输出系统)
BIOS是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。此外,BIOS还向作业系统提供一些系统参数。系统硬件的变化是由BIOS隐藏,程序使用BIOS功能而不是直接控制硬件。现代系统会忽略BIOS提供的抽象层并直接控制硬件组件。
各大主板制造商都会开发适合自己主板的BIOS,我们只需要知道BIOS最主要的功能就是对自身的硬件做一次自检,只有硬件没有时,才会运行软件(操作系统也是一个软件)这种自检的过程就叫"加电自检(Power On Self Test,简称POST)"
第三步,BIOS引导操作系统
机器自检后,BIOS默认从磁盘的零柱面,零磁道,第一个扇区中读取一个叫MBR的东西
硬盘的主引导记录区(MBR)
MBR位于硬盘的0磁头0柱面1扇区,其中存放着硬盘主引导程序和硬盘分区表。在总共512字节的硬盘主引导记录扇区中,446字节属于硬盘主引导程序,64字节属于硬盘分区表(DPT),两个字节(55 AA)属于分区结束标志。
这512字节的空间内容由专门的分区程序产生,比如Windows的fdisk.exe和Linux下的fdisk命令,所以他不是依赖于任何操作系统,而MBR中的引导程序也是可以修改的,因此我们可以利用这个特性实现多系统共存即所谓的双系统。
CentOS,RedHat默认会使用Grub作为引导操作系统的程序,因为Grub本身比较大,所以一般是在MBR中写入Grub的地址,这样BIOS就会引导操作系统就会载入Grub作为操作系统的引导程序。
GNU GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
用于引导Red Hat Linux的菜单配置文件
default=linux
timeout=10
color=green/blacklight-gray/blue
#sectiontoloadlinux
titlelinux
root(hd0,1)这里制定了grub的根。并且挂载。
kernel/vmlinuzroot=/dev/hda5内核是grub根下的vmlinuz。
并且内核载入后,内核的根是在/dev/hda5
boot
#sectiontoloadWindows2000
titlewindows
rootnoverify(hd0,0)rootnoverify就是指定根,但是不要挂载。
chainloader+1使用(hd0,0)的第一扇区来引导。
第四步,Grub加载Kernel(内核)
Grub最重要的功能就是根据配置文件加载Kernel镜像,运行内核后加载的第一个程序是/sbin/init,这个程序会根据/etc/initab来初始化
这里最主要的就是根据设定好的runlevel(runlevel默认为3)来确定系统的运行级别
第五步,执行系统初始化配置
Linux系统会根据/etc/inittab中定义的系统初始化配置si::sysinit:/etc/rc.d/rc.sysinit执行/etc/rc.sysinit脚本,该脚本会设置系统变量,网络配置,并启动swap,设定/proc,加载用户自定义模块,加载kernel设置等
第六步,根据读取的runlevel值来确定启动的脚本文件
如果runlevel的值为3,会运行/etc/rc3.d下的所有脚本;如果为5,则会运行/etc/rc5.d下的脚本
简单的欣赏一下脚本代码
[hx@centos8 ~]$ cat /etc/rc3.d/S80aegis |more
#!/bin/bash
### BEGIN INIT INFO
# Provides: aegis
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: aegis update.
# Description: aegis client.
### END INIT INFO
AEGIS_INSTALL_DIR="/usr/local/aegis"
if [ `id -u` -ne "0" ]; then
echo "ERROR: Permission denied." 1>&2
exit 1
fi
start() {
"${AEGIS_INSTALL_DIR}"/aegis_update/AliYunDunUpdate &
}
stop() {
if [ -n "$1" ]; then
pkill AliYunDun 2>/dev/null
pkill AliHids 2>/dev/null
else
echo "Disable Stop Aegis"
fi
}
status() {
if [ -n "$(ps -ef | grep AliYunDunUpdate | grep -v grep)" ]; then
echo "Aegis is running"
else
echo "Aegis stopped"
fi
}
var=0
path="/etc/debian_version"
if [ `uname -n` = "debian" ];
then
if [ -f "$path" ];
then
var=`awk -F. ‘{print $1}‘ $path`
fi
fi
uninstall() {
stop 1
sleep 1
rm -rf $AEGIS_INSTALL_DIR/aegis_update
rm -rf $AEGIS_INSTALL_DIR/aegis_client
rm -rf $AEGIS_INSTALL_DIR/alihids
rm -f /etc/init.d/aegis
for ((var=2; var<=5; var++))
do
if [ -d "/etc/rc${var}.d/" ];
then
rm -f "/etc/rc${var}.d/S80aegis"
elif [ -d "/etc/rc.d/rc${var}.d" ];
then
rm -f "/etc/rc.d/rc${var}.d/S80aegis"
fi
done
path="/etc/debian_version"
if [ -f "$path" -a -s "$path" ];
then
var=`awk -F. ‘{print $1}‘ $path`
if [ -z $(echo $var|grep "[^0-9]") ];
then
if [ $var -ge 6 ];
then
echo "insserv -r aegis: remove aegis server"
insserv -r aegis >/dev/null 2>&1
fi
fi
fi
echo "uninstall successful"
}
case "$1" in
start)
start
sleep 1
status
;;
stop)
stop
status
;;
restart)
stop 1
status
echo "Aegis restarting..."
sleep 1
start
status
;;
status)
status
;;
uninstall)
uninstall
;;
*)
echo $"Usage: $0 {start|stop|restart|status|uninstall}"
exit 1
;;
esac