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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


原文地址:http://blog.csdn.net/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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值