YoungkingWang 2020-06-16
各种硬件通电,电脑开始运作,屏幕开始打印字符
BIOS是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。此外,BIOS还向作业系统提供一些系统参数。系统硬件的变化是由BIOS隐藏,程序使用BIOS功能而不是直接控制硬件。现代系统会忽略BIOS提供的抽象层并直接控制硬件组件。
各大主板制造商都会开发适合自己主板的BIOS,我们只需要知道BIOS最主要的功能就是对自身的硬件做一次自检,只有硬件没有时,才会运行软件(操作系统也是一个软件)这种自检的过程就叫"加电自检(Power On Self Test,简称POST)"
机器自检后,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镜像,运行内核后加载的第一个程序是/sbin/init,这个程序会根据/etc/initab来初始化
这里最主要的就是根据设定好的runlevel(runlevel默认为3)来确定系统的运行级别
Linux系统会根据/etc/inittab中定义的系统初始化配置si::sysinit:/etc/rc.d/rc.sysinit执行/etc/rc.sysinit脚本,该脚本会设置系统变量,网络配置,并启动swap,设定/proc,加载用户自定义模块,加载kernel设置等
如果runlevel的值为3,会运行/etc/rc3.d下的所有脚本;如果为5,则会运行/etc/rc5.d下的脚本
简单的欣赏一下脚本代码
[ ~]$ 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