嵌入式linux /etc/init.d/rcS文件解读

根文件系统是Linux内核启动后第一个挂载的文件系统,在根文件系统中存放着内核镜像、各种系统配置文件、命令程序等。 根文件创建步骤如下:

  1. 创建目录 mkdir rootfs
  2. 创建必要的设备文件
  3. 安装所需的共享库
  4. 安装init文件、Shell和各种基本命令(可由busybox提供)
  5. 创建和编辑配置文件。

由于内核启动命令参数init=/linuxrc,因此在文件系统挂载后,运行的第一个程序就是根目录下的linuxrc(可执行程序,不是脚本),而这是一个指向/bin/busybox 的链接(或者说linuxrc是BusyBox提供的init程序,和/sbin/init程序的作用是相同的),也就是说,系统启动起来后运行的第一个程序就是busybox本身。busybox开始生成默认的配置,接下来执行rcS脚本。

rcS是文件系统的初始化脚本,位于/etc/init.d/rcS。从开头的代码开始看起。

##rcS文件##


#! /bin/sh                                                                                                          
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:                                                                  
runlevel=S                                                                                                          
prevlevel=N                                                                                                         
umask 022                                                                                                           
export PATH runlevel prevlevel                                                                                      

#                                                                                                                   
mkdir -p /var/run                                                                                                   
mkdir -p /var/tmp                                                                                                   

/sbin/hwclock -s                                                                                                    

syslogd                                                                                                             
/etc/rc.d/init.d/netd start                                                                                         
echo "                   " > /dev/tty1                                                                         
echo "Starting networking" > /dev/tty1                                                                           
sleep 1                                                                                                             
/bin/chmod 0600 /usr/local/etc/ssh_*_key                                                                            
/usr/local/sbin/sshd &                                                                                              
echo "                   " > /dev/tty1                                                                         
echo "Starting ssh daemon" > /dev/tty1                                                                           
sleep 1                                                                                                             
/etc/rc.d/init.d/httpd start                                                                                        
echo "           " > /dev/tty1                                                                         
echo "Starting web server" > /dev/tty1                                                                           
sleep 1                                                                                                             
/etc/rc.d/init.d/leds start                                                                                         
echo "    " > /dev/tty1                                                                         
echo "Starting leds service" > /dev/tty1                                                                         
echo "     "                                                                                     
sleep 1                                                                                                             

/sbin/ifconfig lo 127.0.0.1                                                                                         
/etc/init.d/ifconfig-eth0                                                                                           

/bin/qtopia &                                                                                                       
echo "                      " > /dev/tty1                                                               
echo "Starting Qtopia, please waiting" > /dev/tty1
</pre>

----------------------
+ /bin/sh是ARM开发板中的shell解释器,也可以改为ash。
runlevel是设置linux内核运行级别
+ `/sbin/hwclock -s`用来更新系统时间与时钟芯片的RTC时间同步。linux中有两个时钟,系统时钟和硬件时钟。系统时钟由kernel进行维护,是1969年到现在的秒数。但是这个秒数可能由于很多原因不准确。硬件时钟是RTC芯片的计时值。这个命令可以让系统时钟数数的基准点和RTC一样,相当于纠正。
可以使用date命令查看系统时钟,`hwclock -r`命令查看硬件时钟。
+ syslog启动日志记录,可用来记录应用程序或者设备的日志,日志一般都存储在/var/log。
+ `/etc/rc.d/init.d/netd start`  启动网络服务的看护进程(daemon程序)
+ `echo "Starting networking..." > /dev/tty1`  输出提示字符到串口终端里。tty1虚拟控制终端的驱动。
+ `/bin/chmod 0600 /usr/local/etc/ssh_*_key`  给ssh的秘钥 组用户加读写权限。但是经常使用telnet登陆,ssh登陆不了。
+ `/etc/rc.d/init.d/leds start`  启动leds闪烁的守护进程
+ `/sbin/ifconfig lo 127.0.0.1`   设置本地网络的初始IP
+ `/etc/init.d/ifconfig-eth0`   配置网络,执行ifconfig-eth0脚本,见下文
+ `/bin/qtopia &`  启动qtopia图形界面,qtopia也是一个shell脚本程序,见下文



这就是整个嵌入式linux系统的启动过程。然后再看ifconfig-eth0的执行过程,文件位于`/etc/init.d/ifconfig-eth0`。

----------------------------------

##ifconfig-eth0文件##


#!/bin/sh
echo -n Try to bring eth0 interface up......>/dev/ttySAC0

if [ -f /etc/eth0-setting ] ; then
        source /etc/eth0-setting

        if grep -q "^/dev/root / nfs " /etc/mtab ; then
                echo -n NFS root ... > /dev/ttySAC0
        else
                ifconfig eth0 down
                ifconfig eth0 hw ether $MAC
                ifconfig eth0 $IP netmask $Mask up
                route add default gw $Gateway
        fi

        echo nameserver $DNS > /etc/resolv.conf
else

        if grep -q "^/dev/root / nfs " /etc/mtab ; then
                echo -n NFS root ... > /dev/ttySAC0
        else
        /sbin/ifconfig eth0 192.168.1.230 netmask 255.255.255.0 up
        fi
fi
</pre>


+ `if [ -f /etc/eth0-setting ] eth0-setting` 是IP地址的配置文件
IP=192.168.1.230
Mask=255.255.255.0
Gateway=192.168.1.1
DNS=192.168.1.1
MAC=08:90:90:90:90:90
这个shell语法的意思是如果存在这个文件,用source命令将其生效。
+ `if grep -q "^/dev/root / nfs " /etc/mtab` 如果根文件系统为nfs,则说明网卡已经配置OK,这里什么都不需要配置了。通过判断/etc/mtab中是否有nfs的挂载记录判断是否为nfs文件系统。否则ifconfig配置网络。
+ `/sbin/ifconfig eth0 192.168.1.230 netmask` 如果没有配置文件,则再看是否有NFS文件系统,如果没有NFS文件系统,则默认配置IP地址。


-------------------------------------------------
##qtopia文件##
qtopia脚本文件主要用来进行qt GUI的设置。文件位于/bin/qtopia。


#!/bin/sh
. /bin/ts-device
export TSLIB_PLUGINDIR=/usr/local/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export QTDIR=/opt/Qtopia
export QPEDIR=/opt/Qtopia
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH


TS_INFO_FILE=/sys/devices/virtual/input/input0/uevent
if [ -e $TS_INFO_FILE -a "/bin/grep -q TouchScreen < $TS_INFO_FILE" ]; then
        export QWS_MOUSE_PROTO="TPanel:$TSLIB_TSDEVICE USB:/dev/input/mice"
        if [ -e /etc/pointercal -a ! -s /etc/pointercal ] ; then
                rm /etc/pointercal
        fi
else
        export QWS_MOUSE_PROTO="USB:/dev/input/mice"
        >/etc/pointercal
fi
unset TS_INFO_FILE

export QWS_KEYBOARD=TTY:/dev/tty1
export KDEDIR=/opt/kde

export HOME=/root

exec $QPEDIR/bin/qpe >/dev/null 2>/dev/null
</pre>

+ `if [ -e $TS_INFO_FILE -a "/bin/grep -q TouchScreen < $TS_INFO_FILE"` 通过判断/sys/devices/virtual/input/input0/uevent中是否包含touchscreen信息使Qtopia自动识别touchscreen和USB鼠标。
uevent,即user space even,就是内核向用户空间发出的一个事件通知,使得应用程序能有机会对该event作出反应。
+ `exec $QPEDIR/bin/qpe` 才是真正地调用qpe打开GUI界面
+ `/etc/pointercal` 是屏幕校准的配置文件
+ `>/etc/pointercal `新建pointercal文件

--------------------------------------------
##ARM板自启动DHCP配置IP##
2440ARM开发板上电后不能自动获取动态IP地址,而用网络进行调试需要ARM开发板有公网IP。这就可以利用修改自启动文件rcS实现。在rcS文件中添加下面这段代码:
   
    DHCP_IP = $(udhcpc)
    echo "$DHCP_IP"               >/dev/tty1
    echo "Configuring DHCP IP..." >/dev/tty1

这样就可以调用udhcpc命令获取公网IP。

##配置命令后台执行##
当ARM开发板的网线拔出来时,启动会阻塞在` DHCP_IP = $(udhcpc)`命令上,一直无法进入系统。这时因为shell命令阻塞执行的结果。

可以采用让这条命令后台执行,`DHCP_IP = $(udhcpc)&`。即在命令后加上`&`。

测试命令是否有效,拔出网线,重启开发板发现能进入GUI。这时再插上网线,开发板获取公网IP。说明命令在后台执行。

--------------------------------------------
##Reference##
[1].http://www.linuxidc.com/Linux/2012-09/69914p2.htm

[2].http://wenku.baidu.com/link?url=cYziF1Kkqvc2spIsG17mHy_fTr0TY21hu-zjvoorIjIRJnW7mSJ7FOcsaZCUxmKWsrWPQpNA8qwAesp3rtLFIpbGOfYrPWEN7N1gKz2_9JG

[3].http://blog.csdn.net/tommy_wxie/article/details/8186501

[4].http://www.blogbus.com/gcoder-logs/44554242.html


Previous     Next
tuzhi /
Published under (CC) BY-NC-SA in categories linux  tagged with