Linux 启动脚本 完全注释 1 -- 整…

这篇博客详细解读了Linux系统的启动脚本,涵盖了启动流程的关键步骤和脚本功能,帮助读者理解Linux系统如何从开机到运行服务的全过程。


原文地址:http://blog.youkuaiyun.com/soulxu/archive/2008/05/11/2432942.aspx

Linux 启动脚本 完全注释 1 -- 整体流程
      Linux太伟大了,什么东西都可以由你来做主,Linux加载完内核后,所有的其他系统服务,进程,都是靠脚本来加载的。所以Linux是这么的透明,你可以清除的指导你的系统做了什么。
     下面我就对Linux的启动脚本做了注释,该脚本是属于LFS的,因为该系统比较小,所以可以很清楚的看清楚框架。其他的发行版本的脚本,肯定也会有所不同,但是大框架还是差不多的。
     首先对整体流程,叙述一遍。要想了解整体流程,看/etc/inittab就可以了,启动过程全是依赖于该配置文件。
1.由引导程序(grub)加载内核,内核初始化
2.由内核调用初始化程序由内核参数 init="" 指定,默认为"/sbin/init"
3.init依照"/etc/inittab", 启动系统


先执行 K 开头的(按从低到高),再执行S开头的(从低到高)

------------------------------------------------------------------------------
#默认为6个运行级别,加上一个系统初始化脚本,同过传递参数给rc脚本,来运行各个级别的初始化,个级别的脚本放在"/etc/rc.d/rcX.d".
#"/etc/rc.d/rcX.d"中的脚本都为/etc/rc.d/init.d中的链接文件,脚本命名为 Sxxxx和Kxxxx, S为start,,K为Stop, xxxx为数字,是调用的顺序,从小到大,由rc传递个给该脚本,并按顺序调用.
#"/etc/rc.d/init.d"中的脚本,都可以接受三种参数start, stop, restart.

#记录格式
#   id:rstate:action:process

#        id: 4个字符的唯一标识

#        rstate: 被调用的运行级别, 可以为多个级别,为空则是所有级别

#        action: 执行的动作。    
#            respawn: 如果该进程不存在,则运行,并继续扫描inittab,执行其他项目。如果改进程结束,init将,重启该进程
#            wait:    运行该进程,并等待结束,在处理其他记录
#            once: 运行该进程,并继续其他记录,进程中止了也不在运行
#            sysinit: 只有在启动或重启并首先进入单用户模式时调用。并等待结束,不指定运行界别
#            initdefault: 指定默认级别,如果没指定,则要求用户指定一个
#            ctrlaltdel: 同时按下ctrl+alt+del键执行

#            boot: 系统启动时调用,并继续其他记录,进程中止,不在运行
#            bootwait: 第一次从单用户到多用户模式时调用,并等待结束,中止不再运行
#            powerfail: 当接到断电信号(SIGPWR), 运行
#            powerwait: 同上,并等待结束
#            off: 如果指定进程存在,则向它发出SIGTERM
#            ondemand: 同respawn, 但与运行级别无关,只用于a,b,c字段

#        process: 指定要运行的进程

# Begin /etc/inittab

id:3:initdefault:                                                    # 默认初始化级别
si::sysinit:/etc/rc.d/init.d/rc sysinit        # 系统初始化运行的脚本

10:0:wait:/etc/rc.d/init.d/rc 0                        # 0-6运行界别 0为关机,6为重启,1为单用户,3为多用户,5为x
11:S1:wait:/etc/rc.d/init.d/rc 1
12:2:wait:/etc/rc.d/init.d/rc 2
13:3:wait:/etc/rc.d/init.d/rc 3
14:4:wait:/etc/rc.d/init.d/rc 4
15:5:wait:/etc/rc.d/init.d/rc 5
16:6:wait:/etc/rc.d/init.d/rc 6

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now        # ctrl+alt+del时,重启

su:S016:once:/sbin/sulogin                                                    # ?

1:2345:respawn:/sbin/agetty tty1 9600                                #控制台,agetty初始化控制台,然后调用login程序,当用户退出时,重新调用agetty
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600

# End /etc/inittab
------------------------------------------------------------------------------


------------------------------------------------------------------------------
init初始化的脚本过程

所有启动脚本            /etc/rc.d/init.d/
运行级别控制函数        /etc/rc.d/init.d/function
主要运行级别控制脚本    /etc/rc.d/init.d/rc
rc脚本配置                /etc/sysconfig/rc    设置启动脚本的目录,运行级别控制函数脚本目录位置,网络配置目录

------------------------------------------------------------------------------
由inittab指定运行agetty,agetty运行login程序,等待登录
启动 login shell (默认是 /bin/sh),并执行 ~/.bashprofile 
~/.bashprofile 会自动执行 ~/.bashrc ,而 ~/.bashrc 又调用 /etc/bashrc



Linux 启动脚本 完全注释2 --- rc脚本注释 
从/etc/inittab中可以看出,启动的核心就是rc脚本.
首先init程序调用rc脚本,并将级别传递给rc脚本.
其次rc脚本去调用该级别内(/etc/rcX.d)各项服务的脚本.

rc脚本的注释如下:
#!/bin/sh
########################################################################
# Begin $rc_base/init.d/rc
#
# Description : Main Run Level Control Script
#
# Authors     : Gerard Beekmans  - gerard@linuxfromscratch.org
#
# Version     : 00.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc        #指定rc_bash=/etc/rc.d rc_functions = ${rc_bash}/init.d/functions network_devices=/etc/sysconfig/network-devices
. ${rc_functions}

# This sets a few default terminal options.
stty sane

# These 3 signals will not cause our script to exit
trap "" INT QUIT TSTP    #trap是bash内建的命令,用来指定信号的行为,“”为忽略该信号

[ "${1}" != "" ] && runlevel=${1}        #从参数中得到运行级别,在/etc/inittab中指定的

if [ "${runlevel}" = "" ]; then            #运行级别为空则退出
    echo "Usage: ${0} <runlevel>" >&2
    exit 1
fi

previous=${PREVLEVEL}                    #前一个级别
[ "${previous}" = "" ] && previous=N    #没有前一级别则为n

if [ ! -d ${rc_base}/rc${runlevel}.d ]; then    #是否有该级别的目录
    boot_mesg "${rc_base}/rc${runlevel}.d does not exist." ${WARNING}
    boot_mesg_flush
    exit 1
fi

# Attempt to stop all service started by previous runlevel,
# and killed in this runlevel
#结束该级别中K开头的脚本
if [ "${previous}" != "N" ]; then        #如果有前一个级别
    for i in $(ls -v ${rc_base}/rc${runlevel}.d/K* 2> /dev/null)
    do
        check_script_status

        suffix=${i#$rc_base/rc$runlevel.d/K[0-9][0-9]}        #脚本的名称,除去路径和K**
        prev_start=$rc_base/rc$previous.d/S[0-9][0-9]$suffix    #前一级别
        sysinit_start=$rc_base/rcsysinit.d/S[0-9][0-9]$suffix    #系统初始化

        if [ "${runlevel}" != "0" ] && [ "${runlevel}" != "6" ]; then        #不是重启和关机
            if [ ! -f ${prev_start} ] && [ ! -f ${sysinit_start} ]; then    #如果不存在
                boot_mesg -n "WARNING: ${i} can't be" ${WARNING}            #前一级别并没有启动该脚本
                boot_mesg -n " executed because it was not"
                boot_mesg -n " not started in the previous"
                boot_mesg -n " runlevel (${previous})."
                boot_mesg "" ${NORMAL}
                boot_mesg_flush
                continue
            fi
        fi
        ${i} stop        #脚本执行stop
        error_value=${?}    #返回值

        if [ "${error_value}" != "0" ]; then
            print_error_msg
        fi
    done
fi

#Start all functions in this runlevel
#开始所有S开头的脚本
for i in $( ls -v ${rc_base}/rc${runlevel}.d/S* 2> /dev/null)        #获得每个脚本
do
    if [ "${previous}" != "N" ]; then                #如果有前一个级别
        suffix=${i#$rc_base/rc$runlevel.d/S[0-9][0-9]}    #脚本文件名
        stop=$rc_base/rc$runlevel.d/K[0-9][0-9]$suffix    
        prev_start=$rc_base/rc$previous.d/S[0-9][0-9]$suffix

        [ -f ${prev_start} ] && [ ! -f ${stop} ] && continue    #如果前一个级别中没有该脚本的stop,则说明该进程已经存在
    fi

    check_script_status    #检查脚本是否存在

    case ${runlevel} in    #0或6则直接stop
        0|6)
            ${i} stop
            ;;
        *)
            ${i} start
            ;;
    e
const unsigned char systemsettingpage[] = { "<html>\r\n" "<head>\r\n" "<meta charset=\"gb2312\">\r\n" // 20210421LWD "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EmulateIE7\" />\r\n" // 20210421LWD "<title>智能蓄电池监控系统</title>" //"<Meat http-equiv=Content-Type content=text/html charset=gb2312>"//2021-03-19 "<script type=\"text/javascript\"> \r\n" "function validate()\r\n" "{\r\n" "var CT=document.getElementById(\"CT\").value\r\n" "var MT=document.getElementById(\"MT\").value\r\n" "var RT=document.getElementById(\"RT\").value\r\n" "var AD=document.getElementById(\"AD\").value\r\n" "var DA=document.getElementById(\"DA\").value\r\n" "var TM=document.getElementById(\"TM\").value\r\n" "var ED=document.getElementById(\"ED\").value\r\n" "var testtm=\"(([0-1][0-9])|(2[0-3])):[0-5][0-9]:[0-5][0-9]\"\r\n" "var testda=\"[2][0][0-9][0-9]-(([0][0-9])|([1][0-2]))-(([0-2][0-9])|([3][0-1]))\"\r\n" "submitOK=\"true\"\r\n" "if (isNaN(ED) || ED<0.0 || ED>0.2)\r\n" "{\r\n" "alert(\"均衡差异输入错误!\")\r\n" "submitOK=\"false\"\r\n" "}\r\n" "if (isNaN(CT) || CT<1 || CT>65535)\r\n" "{\r\n" "alert(\"充电记录周期输入错误!\")\r\n" "submitOK=\"false\"\r\n" "}\r\n" "if (isNaN(MT) || MT<29 || MT>65535)\r\n" "{\r\n" "alert(\"模块关机时间输入错误!\")\r\n" "submitOK=\"false\"\r\n" "}\r\n" "if (isNaN(AD) || AD<0 || AD>255)\r\n" "{\r\n" "alert(\"RS485地址超出范围!\")\r\n" "submitOK=\"false\"\r\n" "}\r\n" "if (isNaN(RT) || RT<0.1 || RT>65535.0)\r\n" "{\r\n" "alert(\"内阻测试周期输入错误!\")\r\n" "submitOK=\"false\"\r\n" "}\r\n" "if (DA.match(testda)==null)\r\n" "{\r\n" "alert(\"日期输入错误!\")\r\n" "submitOK=\"false\"\r\n" "}\r\n" "if (TM.match(testtm)==null)\r\n" "{\r\n" "alert(\"时间输入错误!\")\r\n" "submitOK=\"false\"\r\n" "}\r\n" "if(submitOK==\"false\")\r\n" "{\r\n" "return false\r\n" "}\r\n" "document.getElementById(\"RT\").value *=10\r\n" "document.getElementById(\"ED\").value *=100\r\n" "}\r\n" "function validate1()\r\n" "{\r\n" "var MA=document.getElementById(\"MA\").value\r\n" "var IP=document.getElementById(\"IP\").value\r\n" "var NG=document.getElementById(\"NG\").value\r\n" "var SM=document.getElementById(\"SM\").value\r\n" "var PN=document.getElementById(\"PN\").value\r\n" "var PR=document.getElementById(\"PR\").value\r\n" "var testma=\"[F][4].[0][E].[1][1].([0-9]|[A-F])([0-9]|[A-F]).([0-9]|[A-F])([0-9]|[A-F]).([0-9]|[A-F])([0-9]|[A-F])\"\r\n" "var testip=\"(([0-1][0-9][0-9])|([0-2][0-5][0-5])).(([0-1][0-9][0-9])|([0-2][0-5][0-5])).(([0-1][0-9][0-9])|([0-2][0-5][0-5])).(([0-1][0-9][0-9])|([0-2][0-5][0-5]))\"\r\n" "submitOK=\"true\"\r\n" "if (MA.match(testma)==null)\r\n" "{\r\n" "alert(\"MAC地址输入错误!\")\r\n" "submitOK=\"false\"\r\n" "}\r\n" "if (IP.match(testip)==null)\r\n" "{\r\n" "alert(\"IP地址输入错误!\")\r\n" "submitOK=\"false\"\r\n" "}\r\n" "if (NG.match(testip)==null)\r\n" "{\r\n" "alert(\"网关地址输入错误!\")\r\n" "submitOK=\"false\"\r\n" "}\r\n" "if (SM.match(testip)==null)\r\n" "{\r\n" "alert(\"子网掩码输入错误!\")\r\n" "submitOK=\"false\"\r\n" "}\r\n" "if (isNaN(PN) || PN<0 || PN>65535)\r\n" "{\r\n" "alert(\"SOCKET1端口输入错误!\")\r\n" "submitOK=\"false\"\r\n" "}\r\n" "if (isNaN(PR) || PR<0 || PR>65535)\r\n" "{\r\n" "alert(\"SOCKET2端口输入错误!\")\r\n" "submitOK=\"false\"\r\n" "}\r\n" "if(submitOK==\"false\")\r\n" "{\r\n" "return false\r\n" "}\r\n" "}\r\n" "</script>\r\n" "</head>\r\n" "<body style=\"background-color:#f4f4f4\">\r\n" // "<h1>\r\n" // "<span style=\"color:#FFFFFF;background-color:#E53333;\"><strong><span style=\"font-size:34px;line-height:1;\">深圳市海德森科技股份有限公司</span></strong></span><br />\r\n" // "</h1>\r\n" "<span style=\"color:#000FFF;font-size:24px\">智能蓄电池监控系统</span>\r\n" "<p align=\"center\">\r\n" "<b>[&nbsp</b>" "<a href=\"/9.html\">主页</a>" "<b>&nbsp|&nbsp</b>" "<a href=\"/4.html\">实时数据</a>" //---------------------------------------------------20210421LWD "<b>&nbsp|&nbsp</b>" "<a href=\"/C.html\">初始内阻</a>" "<b>&nbsp|&nbsp</b>" "<a href=\"/7.html\">报警记录</a>" "<b>&nbsp|&nbsp</b>" "<a href=\"/1.html\">电池设置</a>" "<b>&nbsp|&nbsp</b>" "<a href=\"/2.html\" style=\"color:#ff0000\">系统设置</a>" "<b>&nbsp|&nbsp</b>" "<a href=\"/3.html\">报警设置</a>" "<b>&nbsp|&nbsp</b>" "<a href=\"/G.html\">安装调试</a>" "<b>&nbsp]</b>\r\n" "</p>\r\n" "<hr size=\"1\">\r\n" "<br />" "<form action=\"/2.html\" name=\"fm\" onsubmit=\"return validate()\">" "<p align=\"center\" style=\"color:#000FFF\">系统参数设置</p>" "<p align=\"center\">" "<table width=\"800\" bgcolor=\"#f0ffff\" border=\"0\" cellpadding=\"10\" cellspacing=\"10\">" "<tr>" "<hr size=\"1\" width=\"800\">" "<hr size=\"1\" width=\"800\">" "<td>" "<br />" "RS485设备地址:&nbsp&nbsp&nbsp&nbsp<input type=\"text\" value=%Number name=\"AD\" id=\"AD\" size=\"10\">" "</td>" "<td>" "<br />" "RS485设备速率:&nbsp&nbsp&nbsp&nbsp<select name=\"BD\">" "<option value=\"0\" %Number__>&nbsp&nbsp4800&nbsp&nbsp</option>" "<option value=\"1\" %Number__>&nbsp&nbsp9600</option>" "<option value=\"2\" %Number__>&nbsp&nbsp19200</option>" "</select>" "</td>" "</tr>" "<tr>" "<td>" "充电记录间隔(Min):<input type=\"text\" value=%Number name=\"CT\" id=\"CT\" size=\"10\">" "</td>" "<td>" "内阻测试周期(H):&nbsp&nbsp<input type=\"text\" value=%Number name=\"RT\" id=\"RT\" size=\"10\">" "</td>" "</tr>" "<tr>" "<td>" "FLASH数据清空:&nbsp&nbsp&nbsp&nbsp<select name=\"FR\">" "<option value=\"0\">&nbsp&nbsp禁止&nbsp&nbsp</option>" "<option value=\"1\">&nbsp&nbsp使能</option>" "</select>" "</td>" "<td>" "恢复出厂设置:&nbsp&nbsp&nbsp&nbsp&nbsp<select name=\"RS\">" "<option value=\"0\">&nbsp&nbsp禁止&nbsp&nbsp</option>" "<option value=\"1\">&nbsp&nbsp使能</option>" "</select>" "</td>" "</tr>" "<tr>" "<td>" "主机日期设置:&nbsp&nbsp&nbsp&nbsp&nbsp<input type=\"text\" value=%Number____ name=\"DA\" id=\"DA\" size=\"10\">" "</td>" "<td>" "主机时间设置:&nbsp&nbsp&nbsp&nbsp&nbsp<input type=\"text\" value=%Number__ name=\"TM\" id=\"TM\" size=\"10\">" "</td>" "</tr>" "<tr>" "<td >" "电池均衡:&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<select name=\"EQ\">" "<option value=\"0\"%Number__>&nbsp&nbsp禁止&nbsp&nbsp</option>" "<option value=\"1\"%Number__>&nbsp&nbsp开启</option" "</select>" "</td>" "<td>" "均衡差异(V):&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<input type=\"text\"value=%Number name=\"ED\" id=\"ED\" size=\"10\">" "</td>" "</tr>" "<tr>" "<td >" "模块通信速率:&nbsp&nbsp&nbsp&nbsp&nbsp<select name=\"MB\">" //--------------------------------------------------------20210421LWD "<option value=\"0\"%Number__>&nbsp&nbsp4800&nbsp&nbsp</option>" "<option value=\"1\"%Number__>&nbsp&nbsp9600&nbsp&nbsp</option>" "<option value=\"2\"%Number__>&nbsp&nbsp19200&nbsp&nbsp</option>" "<option value=\"3\"%Number__>&nbsp&nbsp38400</option" "</select>" "</td>" "<td>" "模块关机时间(Min):<input type=\"text\" value=%Number name=\"MT\" id=\"MT\" size=\"10\">" "</td>" "</tr>" "<tr>" "<td >" "内阻测试模式:&nbsp&nbsp&nbsp&nbsp&nbsp<select name=\"RM\">" //--------------------------------------------------------20210421LWD "<option value=\"0\"%Number__>&nbsp&nbsp自动快测&nbsp&nbsp</option>" "<option value=\"1\"%Number__>&nbsp&nbsp手动快测&nbsp&nbsp</option>" "<option value=\"2\"%Number__>&nbsp&nbsp自动慢测&nbsp&nbsp</option>" "<option value=\"3\"%Number__>&nbsp&nbsp手动慢测</option" "</select>" "</td>" "<td>" "组压模块:&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<select name=\"GV\">" "<option value=\"0\"%Number__>&nbsp&nbsp禁止&nbsp&nbsp</option>" "<option value=\"1\"%Number__>&nbsp&nbsp开启</option" "</select>" "</td>" "</tr>" "<tr>" "<td>" "</td>" "<td align=\"right\">" "<input type=\"submit\" value=\"保存\">&nbsp" "<input type=\"reset\" value=\"取消\">" "<br />" "</td>" "</tr>" "</table>" "<hr size=\"1\" width=\"800\">" "<hr size=\"1\" width=\"800\">" "</p>" "</form>" "<form action=\"/2.html\" name=\"fm1\" onsubmit=\"return validate1()\">" "<p align=\"center\" style=\"color:#000FFF\">TCP/IP网络参数设置</p>" "</tr>" "<tr>" "<p align=\"center\">" "<table width=\"800\" bgcolor=\"#f0ffff\" border=\"0\" cellpadding=\"10\" cellspacing=\"10\">" "<tr>" "<hr size=\"1\" width=\"800\">" "<hr size=\"1\" width=\"800\">" "<td>" "<br />" "本机MAC地址:&nbsp<input type=\"text\" value=%Number___________ name=\"MA\" id=\"MA\" size=\"20\">" //----------------------------------20210421LWD "</td>" "<td>" "<br />" "本机IP地址:<input type=\"text\" value=%Number_________ name=\"IP\" id=\"IP\" size=\"18\">" "</td>" "</tr>" "<tr>" "</tr>" "<tr>" "<td>" "本地网关:&nbsp&nbsp&nbsp&nbsp<input type=\"text\" value=%Number_________ name=\"NG\" id=\"NG\" size=\"18\">" "</td>" "<td>" "子网掩码:&nbsp&nbsp<input type=\"text\" value=%Number_________ name=\"SM\" id=\"SM\" size=\"18\">" "</td>" "</tr>" "<tr>" "<td>" "Socket1端口号:<input type=\"text\" value=%Number name=\"PN\" id=\"PN\" size=\"10\">" "</td>" "<td>" "Socket2端口号:<input type=\"text\" value=%Number name=\"PR\" id=\"PR\" size=\"10\">" "</td>" "</tr>" "<tr>" "<td align=\"right\">" "<input type=\"submit\" value=\"保存\">&nbsp" "<input type=\"reset\" value=\"取消\">" "<br />" "</td>" "</tr>" "</table>" "<hr size=\"1\" width=\"800\">" "<hr size=\"1\" width=\"800\">" "</p>" "</form>" // "<script language=\"JavaScript\">\r\n" // "function reloadpg()\r\n" // "{\r\n" "<td align=\"right\">" "<input type=\"submit\" value=\"保存\">&nbsp" "<input type=\"reset\" value=\"取消\">" "<br />" "</td>" // // "setTimeout(\"reloadpg()\",5000)\r\n" // "document.location.href=\"/2.html\"\r\n" // // "}\r\n" // "setTimeout(\"reloadpg()\",5000)\r\n" // // "</script>\r\n" "</body>" "</html>" };转化为完16进制数组
09-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值