/etc/init.d/rcS内容分析

news/2024/7/9 16:19:39 标签: stream, path, library, 脚本, server, file
/etc/init.d/rcS内容分析(1)
2010年08月20日 8:42

        由于init=/linuxrc,因此,在文件系统挂载后,运行的第一个程序就是根目录下的linuxrc,而这是一个指向/bin/busybox 的链接,也就是说,系统起来后运行的第一个程序就是busybox本身。                 

        busybox首先将试图解析/etc/inittab来获取进一步的初始化配置信息(参考busybox源代码init/init.c中的parse_inittab()函数)。而事实上,root_qtopia中并没有/etc/inittab这个配置文件,根据busybox的裸机,它将生成默认的配置。其中最重要的一个,就是new_init_action(SYSINIT,INIT_SCRIPT,""),也就决定了接下来初始化的脚本是INIT_SCRIPT所定义的值,这个宏的默认值是"etc/init.d/rcS"。

        下面是文件系统中/etc/init.d/rcS的内容,也是我们要分析的重点

1.PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:

2.runlevel=S

3.prevlevel=N

4.umask 022

5.export PATH runlevel prevlevel

##为启动环境设置必要的环境变量;

1./bin/hostname FriendlyARM

##设置机器名字;

1./bin/mount -n -t proc none /proc

2./bin/mount -n -t sysfs none /sys

3./bin/mount -n -t usbfs none /proc/bus/usb

4./bin/mount -t ramfs none /dev

##挂载"虚拟"文件系统"/proc"和"/sys",并且在/dev目录下挂载一个ramfs,相当于把原本nandflash上的只读的/dev目录"覆盖"上一块可写的空的SDRAM。

##这里要注意的是,/sys和挂载了ramfs的/dev是正确创建设备节点的关键。对于2.6.29内核来说,已经没有devfs的支持,创建设备节点只有通过两种办法由文件系统完成:

1)制作文件系统镜像前用mknod手动创建好系统所有的(包括可能有的)设备节点,并把这些节点文件一起做进文件系统镜像中;

2)在文件系统初始化过程中,通过/sys目录所输出的信息,在/dev目录下动态的创建系统中当前实际有的设备节点。

        显然,方法1)有很大的局限性,仅限于没有设备动态增加或减少的情况,不适用于很多设备热插拔的情况,比如U盘,SD卡等等。方法2)是目前大多数PC上的linux的做法(基于udev实现)。这种方法有2个前提:/sys目录挂载和一个可写的/dev目录。这也就是为什么我们这里需要挂载/sys和ramfs在/dev目录上,事实上,这种方法最早就是为热插拔设计的,你可以理解为当系统启动时,所有设备一下子全部"插入"了进来。

        这里有一点要说明的是,在文件系统初始化跑到这里之前,原来的/dev目录下必须有一个设备节点:/dev/console。

        其实,要搞清楚"程序"这种东西,没有什么好的办法,无非2个东西,源码和脚本

1.echo /sbin/mdev> /proc/sys/kernel/hotplug

2./sbin/mdev -s

3./bin/hotplug

##这几个就是用来完成上面所说的两个东西:1)通过mdev -s在/dev目录下创建必要的设备节点;2)设置内核的hotplug handler 为mdev,即当设备热插拔时,由mdev接受来自内核的消息并作出相应的回应,比如挂载U盘。

        对于mdev,需要注意的是,文件系统里存在/etc/mdev.conf文件,它包含了medv的配置信息。通过这个文件,我们可以自定义一些设备节点的名称或链接来满足特定的需要。这是root qtopia中mdev.conf的内容:

1.#system all-writable devices

2.full 0:0 0666

3.null 0:0 0666

4.ptmx 0:0 0666

5.random 0:0 0666

6.tty 0:0 0666

7.zero 0:0 0666

8.

9.#console devices

10.tty[0-9]* 0:5 0660

11vc/[0-9]* 0:5 0660

12.     
13.   # serial port devices   
14.   s3c2410_serial0    0:5    0666    =ttySAC0   
15.   s3c2410_serial1    0:5    0666    =ttySAC1   
16.   s3c2410_serial2    0:5    0666    =ttySAC2   
17.   s3c2410_serial3    0:5    0666    =ttySAC3   
18.                                                                                                                                                          19.   # loop devices   
20.   loop[0-9]*    0:0    0660    =loop/   
21.     
22.   # i2c devices   
23.   i2c-0        0:0    0666    =i2c/0   
24.   i2c-1        0:0    0666    =i2c/1   
25.     
26.   # frame buffer devices   
27.   fb[0-9]        0:0    0666   
28.     
29.   # input devices   
30.   mice        0:0    0660    =input/   
31.   mouse.*        0:0    0660    =input/   
32.   event.*        0:0    0660    =input/   
33.   ts.*        0:0    0660    =input/   
34.     
35.   # rtc devices   
36.   rtc0        0:0    0644    >rtc   
37.   rtc[1-9]    0:0    0644   
38.     
39.   # misc devices    

40.   mmcblk0p1    0:0    0600    =sdcard */bin/hotplug   
41.   sda1        0:0    0600    =udisk * /bin/hotplug

可以看到,原本串口驱动注册的设备名是 s3c2410_serial0, s3c2410_serial1 和
s3c2410_serial2,而 mdev 则会在/dev 目录下对应生成 ttySAC0, ttySAC1和ttySAC2以符合
应用程序对于串口设备名称的习惯。同样的,/dev/sdcard和/dev/udisk 永远分别指向 SD 卡和
U盘的第一个分区。(所以,用那些没有分区表的SD卡或U盘的兄弟知道原因了吧...)


/etc/init.d/rcS内容分析(2)
2010年08月20日 10:13

1.#mounting file system specified in /etc/fstab

2.mkdir -p /dev/pts

3.mkdir -p /dev/shm

4./bin/mount -n -t devpts none /dev/pts -o mode=0622

5.     /bin/mount -n -t tmpfs tmpfs /dev/shm   
6.     /bin/mount -n -t ramfs none /tmp   
7.     /bin/mount -n -t ramfs none /var

8.mkdir -p /var/empty

9.mkdir -p /var/log

10.mkdir -p/var/lock

11.mkdir -p/var/run

12.mkdir -p /var/tmp

就像注释中所说的,这是用来挂载其他一些常用的文件系统,并在/var 目录下(同样是
ramfs,可写的)新建必要的目录。

1.     /sbin/hwclock -s 

用来设定系统时间的,从硬件 RTC 中获取,要获取正确的时间,必须先设置好正确的
时间(如何设置 RTC 见用户手册说明),目前友善之臂的开发板出厂时并没有设置实际的时
间,而是系统默认的。

接下来就是启动系统服务了,包括log记录,网络, http server和自定义的"跑马灯服
务"... 
1.     syslogd   
2.     /etc/rc.d/init.d/netd start   
3.     echo "                        " > /dev/tty1                                                                                                      4.     echo "Starting networking..." > /dev/tty1   
5.     sleep 1   
6.     /etc/rc.d/init.d/httpd start   
7.     echo "                        " > /dev/tty1   
8.     echo "Starting web server..." > /dev/tty1   
9.     sleep 1   
10.   /etc/rc.d/init.d/leds start   
11.   echo "                        " > /dev/tty1   
12.   echo "Starting leds service..." > /dev/tty1   
13.   echo "                        "   
14.   sleep 1

启动一系列服务: 
syslog - 用于记录内核和应用程序 debug 信息 
netd -      inetd, 一个挂载启动各种网络相关服务的看守进程 
httpd -    http server看守进程 
leds -   跑马灯看守进程 
其中,inetd的配置文件为/etc/inetd.conf,这是文件内容 
1.     # /etc/inetd.conf: see inetd(8) for further informations.   
2.     echo      stream tcp    nowait    root    internal   
3.     echo      dgram    udp    wait    root    internal    

4.     daytime stream tcp    nowait    root    internal   
5.     daytime dgram    udp    wait    root    internal   
6.     time      stream tcp    nowait    root    internal   
7.     time      dgram    udp    wait    root    internal   
8.       
9.     # These are standard services.   
10. # 
11.   ftp    stream    tcp    nowait    root    /usr/sbin/ftpd        /usr/sbin/ftpd   
12.   telnet    stream    tcp    nowait    root    /usr/sbin/telnetd    /usr/sbin/telnetd -i

可以看到,这里启动的网络服务有两个: 1)ftp server 和 2)telnet server。有关网络
服务的端口和协议等具体信息,可以参考/etc/services, /etc/protocols

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

配置网络设备(网卡): 
1)设定本机回环地址为 127.0.0.1 
2)运行网卡设置脚本/etc/init.d/ifconfig-eth0 
这是/etc/init.d/ifconfig-eth0的内容, 加入了我的一些注释 
复制代码 
1.     #!/bin/sh    

2.       
3.     echo -n Try to bring eth0 interface up......>/dev/ttySAC0   
4.       
5.     #判断/etc/eth0-setting文件是否存在 
6.     if [ -f /etc/eth0-setting ] ; then   
7.                           #读取配置文件信息 
8.         source /etc/eth0-setting   
9.       
10.                         #如果根文件系统为nfs,则说明网卡已经配置OK,这里什么都不需要配置了 
11.       if grep -q "^/dev/root / nfs " /etc/mtab ; then   
12.           echo -n NFS root ... > /dev/ttySAC0   
13.                         #否则,根据配置文件中的MAC, IP, Mask和Gateway通过ifconfig 命令相应地配置网卡 
14.       else   
15.           ifconfig eth0 down   
16.           ifconfig eth0 hw ether $MAC   
17.           ifconfig eth0 $IP netmask $Mask up   
18.           route add default gw $Gateway   
19.       fi   
20.     
21.                         #将配置文件中的DNS设置写入/etc/resolv.conf 使之生效 
22.       echo nameserver $DNS > /etc/resolv.conf    

23.   #配置文件不存在,使用默认配置 
24. else 
25.                            
26.                         #如果根文件系统为nfs,则说明网卡已经配置OK,这里什么都不需要配置了 
27.       if grep -q "^/dev/root / nfs " /etc/mtab ; then   
28.           echo -n NFS root ... > /dev/ttySAC0   
29.       else   
30.                         #将网卡的IP地址设定为192.168.1.230 
31.       /sbin/ifconfig eth0 192.168.1.230 netmask 255.255.255.0 up   
32.       fi   
33. fi 
34.     
35.   echo Done > /dev/ttySAC0 
可以看到,NFS自动识别就是靠判断/etc/mtab中是否有 nfs的挂载记录实现的。 
这是 root qtopia文件系统中/etc/eth0-settings 文件

这是 root qtopia文件系统中/etc/eth0-settings 文件 
复制代码 
1.     IP=192.168.1.230   
2.     Mask=255.255.255.0   
3.     Gateway=192.168.1.1   
4.     DNS=192.168.1.1   
5.     MAC=08:90:90:90:90:90

终于到最后了,启动Qtopia GUI 环境 
复制代码 
1.     /bin/qtopia &   
2.     echo "                                  " > /dev/tty1   
3.     echo "Starting Qtopia, please waiting..." > /dev/tty1

可以看到,这里 Qtopia 是通过运行/bin/qtopia 来启动的。事实上,/bin/qtopia 也是一
脚本,它的任务是设定 Qtopia 运行必要的环境, 最后通过调用 qpe 可执行文件真正启动
Qtopia。这是它的全部内容,我加入了一些注释:

1.     #!/bin/sh

2.
3. #tslib 环境变量设置,包括了touchscreen 设备文件,tslib 配置文件,tslib plug-in 位置和touchscreen 校准数据文件

4. export TSLIB_TSDEVICE=/dev/input/event0
5. export TSLIB_CONFFILE=/usr/local/etc/ts.conf
6. export TSLIB_PLUGINDIR=/usr/local/lib/ts
7. export TSLIB_CALIBFILE=/etc/pointercal

8. #Qtopia 环境变量设置,设定了Qtopia 主要文件位置
9. export QTDIR=/opt/Qtopia
10. export QPEDIR=/opt/Qtopia

11. #设定PATH 和LD_LIBRARY_PATH 以包含Qtopia 的可执行文件和共享库文件,方便Qtopia 正确运行
12. export PATH=$QTDIR/bin:$PATH
13. export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH
14.

15. #通过判断/sys/devices/virtual/input/input0/uevent 中是否包含touchscreen 信息使Qtopia 自动识别touchscreen
和USB 鼠标
16. TS_INFO_FILE=/sys/devices/virtual/input/input0/uevent
17. if [ -e $TS_INFO_FILE -a "/bin/grep -q TouchScreen < $TS_INFO_FILE" ]; then
18. export QWS_MOUSE_PROTO="TPanel:/dev/input/event0 USB:/dev/input/mice"
19. if [ -e /etc/pointercal -a ! -s /etc/pointercal ] ; then
20. rm /etc/pointercal
21. fi
22. else
23. export QWS_MOUSE_PROTO="USB:/dev/input/mice"
24. >/etc/pointercal
25. fi
26. unset TS_INFO_FILE

27.
28. export QWS_KEYBOARD=TTY:/dev/tty1
29. export KDEDIR=/opt/kde
30.
31. export HOME=/root
32.
33. #通过调用/opt/Qtopia/bin/qpe 真正启动Qtopia
34. exec $QPEDIR/bin/qpe 1>/dev/null 2>/dev/null

到此为止,文件系统从初始化到最终启动Qtopia GUI 环境的全部过程就结束了,大家
可以看到,友善之臂的“小秘密”其实都在这里,说穿了很简单:)只要大家能够静下心来认真看
脚本,看看源代码,加上一些背景知识的了解,搞清楚一个嵌入式系统就这么简单




http://www.niftyadmin.cn/n/849761.html

相关文章

为什么匿名类中使用局部变量时要声明为final呢

2019独角兽企业重金招聘Python工程师标准>>> 一个方法内部有两个线程共享内部类对象的时候&#xff0c;这个方法的局部变量如果能被访问&#xff0c; 则就成为临界资源&#xff0c;导致程序不稳定&#xff0c;所以必须是final的。 反正总而言之&#xff0c;java就是…

linux如何将一个正在运行的进程转入到后台执行

要求&#xff1a;将一个正在当前前台执行的进程转入后台执行&#xff0c;并且要求退出shell后依然保持不退出进程。ctrlzto stop (pause) the program and get back to the shellbgto run it in the backgrounddisown -h [job-spec]where [job-spec] is the job number (like%1…

html要指向servlet的路径,HTML JSP Servlet 的 相对路径 绝对路径

HTML相对路径 - 没有最前面的 /&#xff1b; 相对于当前文件&#xff0c;和OS一样绝对路径 - 前面带 / &#xff1b; 相对于 http://:port/Servlet相对路径 - 相对于该 WebApp 的所根在目录 ( 祸根)&#xff1b;但是转发和重定向时和 HTML 一样绝对路径 - 和相对路径一样&…

__stdcalll——调用约定说明符

函数调用过程中&#xff0c;主调函数和被调函数之间需要使用堆栈作为中间缓冲来传递参数&#xff0c;为保证参数传递顺序的正确性&#xff0c;必须对参数的入栈出栈顺序进行约定&#xff0c;常用的有__stdcall和__cdecl。在定义一个函数时&#xff0c;应该在函数名之前&#xf…

linux下echo命令详解

2009-02-22 12:14linux下echo命令详解 linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法echo命令的功能是在显示器上显示一段文字&#xff0c;一般起到一个提示的作用。该命令的一般格式为&#xff1a; echo […

浅谈网络流的基本算法 [转]

引言 过去听起来高深莫测的网络流算法&#xff0c;现在已飞入寻常百姓家了&#xff0c;对于每一个OIER&#xff0c;网络流是一个神圣的东西&#xff08;个人见解&#xff09;&#xff0c;但神圣的同时&#xff0c;它并不是那样抽象&#xff0c;最形象的模型就是水流&#xff0c…

行存储与列存储笔记

在了解HANA的同时遇到了列存储的概念&#xff0c;因此GOOGLE了些资料&#xff0c;作为笔记记录于此。一般的数据库采用行存储&#xff0c;行存储的写入是一次性完成的。由于行存储的存储结构是以数据行为单位聚簇在一起的&#xff0c;这样的实现能够保证数据的完整性&#xff0…

在湖北警官学院学计算机,湖北警官学院计算机科学与技术专业2016年在湖北理科高考录取最低分数线...

类似问题答案湖北警官学院计算机科学与技术专业2016年在山西理科高考录取最低分数线学校 地 区 专业 年份 批次 类型 分数 湖北警官学院 山西 计算机科学与技术 2016 二批 理科 467 学校 地 区 专业 年份 批次 类型 分数 湖北警官学院 山西 计算机科学与技术 2016 二批 理科 46…