/etc/rc.common的解释

本文深入探讨了OpenWrt系统中rc.common脚本的使用方式,包括其作为initscript的wrapper的作用,如何管理服务的启动、停止、重启等操作,以及与rcS的交互过程。同时,详细介绍了脚本内部定义的函数及其功能,为理解OpenWrt的初始化脚本系统提供了清晰的指导。

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

1、在shell脚本的头部出现 "#!/bin/sh /etc/rc.common",如果该脚本为x.sh,
如果执行命令为 ./x.sh parameters,即为运行 /etc/rc.common x.sh parameters,这说明 /etc/rc.common用于解析x.sh命令行参数

由于openwrt使用自己的初始script系统,所有的initscript必须使用/etc/rc.common作为wrapper安装在/etc/init.d/<name>下。
如/etc/init.d/httpd:
#!/bin/sh/etc/rc.common
# Copyright (C)2006 OpenWrt.org
START=50
start() {
    [ -d /www ] && httpd -p 80 -h /www-r OpenWrt
}
stop() {
    killall httpd
}
从上可以看出,script本身并不解析命令行参数,而是由/etc/rc.common来完成。
Start和stop是最基本的功能,几乎所有init script都要提供。Start是在运行/etc/init.d/httpdstart时来调用,可以是系统启动时,或用户手动运行此脚本时。
通过/etc/init.d/<name> enable/disable可以启用或禁止模块的初始化脚本,他是通过创建或删除/etc/rc.d中的符号连接来完成,而这些符号连接是/etc/init.d/rcS在启动阶段处理。
脚本运行的顺序是在初始脚本中通过变量START来定义,改变后需要再次运行/etc/init.d/<name>enable。
/etc/rc.common说明
#!/bin/sh                                
# Copyright (C)2006-2011 OpenWrt.org   
                                         
.$IPKG_INSTROOT/lib/functions.sh        
.$IPKG_INSTROOT/lib/functions/service.sh
                  
initscript=$1     
action=${2:-help}   
shift 2            
                    
start() {                                 
        return 0                                
}                                               
                                                
stop() {                                       
        return 0                                
}                                               
                                               
reload() {                                
        return 1                                                           
}                                                                          
                                                                           
restart() {                                                                                            
        trap '' TERM                                                                                 
        stop "$@"                                                                                      
        start "$@"                                                                                    
}                                                                                                     
                                                                                                      
boot() {                                                                                             
        start "$@"                                                   
}                                                                          
                                                                           
shutdown(){                                                               
        stop                                                                                          
}                                                                                                     
                                                                                                      
disable(){          禁止服务开启                                                                                 
        name="$(basename"${initscript}")"                                                            
        rm -f"$IPKG_INSTROOT"/etc/rc.d/S??$name                                                     
        rm -f"$IPKG_INSTROOT"/etc/rc.d/K??$name                           
}                                                                          
                                                                           
enable() {          开启服务                                                                                   
        name="$(basename"${initscript}")"                                                            
        disable                                                                                       
        [ -n "$START" -o -n"$STOP" ] || {                                                            
                echo "/etc/init.d/$namedoes not have a START or STOP value"                           
                return 1                                                                              
        }                                                                                             
        [ "$START" ] && ln -s"../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}"
        [ "$STOP"  ] && ln -s"../init.d/$name""$IPKG_INSTROOT/etc/rc.d/K${STOP}${name##K[0-9][0-9]}"
}
enabled(){                                                                                          
        name="$(basename"${initscript}")"                                                            
        [ -x"$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}" ]                                
}                                                                     
                                                                           
depends(){                                                               
        return 0                                                           
}                                                                                                      
                                                                                                      
help() {                                                                                               
        cat <<EOF                                                                                    
Syntax:$initscript [command]                                                                        
                                                                                                     
Availablecommands:                                                        
        start  Start the service                                          
        stop   Stop the service                                            
        restart Restart the service                                                                  
        reload Reload configuration files (or restart if that fails)                                 
        enable Enable service autostart                                                              
        disable Disable service autostart                                                            
$EXTRA_HELP                                                                                            
EOF                                                                                                   
}                                                                                                     
                                                                                                      
."$initscript"          引用脚本                                                                           
                                                                     
ALL_COMMANDS="startstop reload restart boot shutdown enable disable enabled depends ${EXTRA_COMMANDS}"  所有命令,包括标准的,及定制的
list_containsALL_COMMANDS "$action" || action=help                                                   
["$action" = "reload" ] && action='eval reload"$@" || restart "$@" && :'                             
$action"$@"
重载初始化脚本函数
可以通过如下方式覆盖这些标准的初始化脚本函数:
{boot()},boot时支持的命令,缺省为start。
        Commands to be run at boot time.Defaults to {start()}
{restart()} 重启动服务,缺省为stop然后再start。
        Restart your service. Defaults to{stop(); start()}
{reload()} 重新载入配置文件,缺省是restart。
        Reload the configuration files for yourservice. Defaults to {restart()}
定制脚本命令
也可定制命令,创建功能函数,在EXTRA_COMMANDS变量中引用,Helptext添加在EXTRA_HELP中。
如下:
status() {
    # print the status info
}
EXTRA_COMMANDS="status"
EXTRA_HELP="        status Print the status of the service"
在/etc/rc.common中可以看出,会包含此脚本,从而包含了其中的所有定义,从而可正确地去使用。
<think>好的,用户现在问的是关于执行命令`/bin/sh /etc/rc.common /etc/rc.d/S98configinit boot`的问题。我需要先分析这个命令的各个部分以及它在系统启动过程中的作用。 首先,用户可能是在使用基于OpenWrt的系统,因为`/etc/rc.common`和`/etc/rc.d/S*`脚本常见于这类嵌入式Linux系统中。接下来,分解命令:`/bin/sh`是Shell解释器,后面跟着`/etc/rc.common`,这可能是一个通用的启动脚本,用来定义函数或变量。然后执行`/etc/rc.d/S98configinit`,并传递参数`boot`。这里的S98configinit应该是一个启动脚本,数字98代表启动优先级,后面的configinit可能是配置初始化的服务。 用户可能想知道这个命令的具体作用,或者遇到了启动问题,需要手动执行某个脚本。也有可能是在调试或开发过程中需要了解启动流程。我需要解释每个部分的作用,以及为什么在启动时使用这样的命令结构。 需要确认`/etc/rc.common`的作用,通常是提供标准化的启动、停止、重启等功能,被各个init脚本调用。而`/etc/rc.d/S98configinit`则是具体的服务脚本,可能在启动顺序中排在后面,负责系统配置的初始化。参数`boot`可能触发启动时的特定操作,比如应用配置或启动服务。 还要考虑用户可能存在的误区,比如手动运行这类脚本是否需要特别注意,或者为什么使用`/bin/sh`而不是直接执行脚本。可能需要说明脚本的执行环境和依赖关系,以及参数传递的重要性。 最后,要总结该命令的整体作用,强调在系统启动过程中的位置和功能,并提醒用户修改或执行此类脚本时的注意事项,比如权限、依赖顺序等。</think>--- 在 OpenWrt 等嵌入式 Linux 系统中,命令 `/bin/sh /etc/rc.common /etc/rc.d/S98configinit boot` 是典型的 **初始化脚本执行方式**,其作用与系统启动流程密切相关。以下是分步解析: --- ### **1. 命令结构解析** - **`/bin/sh`**:调用标准的 Bourne Shell 解释器执行脚本。 - **`/etc/rc.common`**:OpenWrt 系统的通用初始化脚本框架,定义了服务管理函数(如 `start()`、`stop()`、`enable()` 等)。 - **`/etc/rc.d/S98configinit`**:具体的初始化脚本(优先级 `98`,服务名 `configinit`)。 - **`boot`**:传递给脚本的动作参数,表示在系统启动时执行。 --- ### **2. 执行逻辑** #### **步骤 1:加载 `/etc/rc.common`** - **功能**: 该文件为所有 `/etc/init.d/` 脚本提供公共函数库,例如: ```sh # 定义服务启动/停止的标准流程 start_service() { ... } stop_service() { ... } boot() { ... } # 专门处理启动时的初始化动作 ``` - **作用**: 通过 `source /etc/rc.common` 将函数注入当前 Shell 环境,使后续脚本能调用这些标准化函数。 #### **步骤 2:执行 `/etc/rc.d/S98configinit`** - **文件性质**: 该文件是 `/etc/init.d/configinit` 的符号链接(通过 `S98` 前缀表示启动顺序为第 98 位)。 - 数字 `98` 决定启动顺序(数值越小越早执行)。 - 文件名 `configinit` 对应服务名称。 - **参数 `boot` 的作用**: 触发脚本中定义的 `boot()` 函数,而非默认的 `start()` 或 `stop()`。 例如: ```sh # /etc/init.d/configinit 示例片段 boot() { # 执行系统启动时的特殊初始化操作 apply_sysconfig generate_device_nodes } ``` --- ### **3. 典型应用场景** #### **(1) 系统启动流程** - **OpenWrt 的 `/etc/rc.local` 阶段**: 在基础服务(如网络、文件系统)启动后,通过类似命令执行高优先级的初始化任务(如加载自定义配置)。 #### **(2) 手动调试或修复** - **重新应用配置**: 若修改了系统配置文件(如 `/etc/config/network`),可手动运行此命令强制重新初始化配置,无需重启设备。 #### **(3) 嵌入式设备初始化** - **生成设备节点**: 某些嵌入式设备在首次启动时,需通过 `configinit` 动态创建设备文件(如 `/dev/gpio`)。 --- ### **4. 关键注意事项** - **依赖顺序**: 若 `S98configinit` 依赖其他服务(如 `S50network`),需确保依赖服务已启动,否则可能失败。 - **权限问题**: 脚本需具有可执行权限(`chmod +x /etc/init.d/configinit`),否则会报错。 - **参数限制**: 不是所有 `/etc/init.d/` 脚本都支持 `boot` 参数,需检查脚本是否定义了 `boot()` 函数。 --- ### **5. 与 SysVinit 的差异** - **OpenWrt 的特殊性**: - 使用简化版的初始化系统(`procd` 进程管理),但兼容 SysVinit 脚本格式。 - `/etc/rc.common` 对传统 SysVinit 脚本进行了轻量级封装,支持 `enable/disable` 服务等扩展功能。 --- ### **总结** 该命令的作用是:**在系统启动阶段(或手动触发时),通过 OpenWrt 的公共框架 `/etc/rc.common`,执行优先级为 98 的 `configinit` 服务的启动专用初始化逻辑(`boot()` 函数)**。 典型用途包括加载系统配置、生成动态设备文件等。理解此机制对调试嵌入式系统或定制 OpenWrt 行为至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值