• 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下的脚本
    简单的欣赏一下脚本代码

    [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
    
    
    

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

  • 相关阅读:
    吴裕雄--天生自然ANDROID开发学习:2.4.1 ScrollView(滚动条)
    吴裕雄--天生自然ANDROID开发学习:2.3.9 RatingBar(星级评分条)
    吴裕雄--天生自然ANDROID开发学习:2.3.8 SeekBar(拖动条)
    吴裕雄--天生自然ANDROID开发学习:2.3.7 ProgressBar(进度条)
    吴裕雄--天生自然ANDROID开发学习:2.3.6 开关按钮ToggleButton和开关Switch
    吴裕雄--天生自然ANDROID开发学习:2.3.5.RadioButton(单选按钮)&Checkbox(复选框)
    吴裕雄--天生自然ANDROID开发学习:2.3.4 ImageView(图像视图)
    吴裕雄--天生自然ANDROID开发学习:2.3.3 Button(按钮)与ImageButton(图像按钮)
    吴裕雄--天生自然ANDROID开发学习:2.3.2 EditText(输入框)详解
    吴裕雄--天生自然ANDROID开发学习:2.3.1 TextView(文本框)详解
  • 原文地址:https://www.cnblogs.com/hxlinux/p/13138627.html
Copyright © 2020-2023  润新知