Linux系统启动原理

第一步,打开电源键

各种硬件通电,电脑开始运作,屏幕开始打印字符

第二步,系统加载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下的脚本
简单的欣赏一下脚本代码

[ ~]$ 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

第七步,运行/etc/rc.local生成终端或X Windows等待用户登录

相关推荐