关于生成 /etc/etc init.dd/ 下的启动脚本,有什么比较好的工具推荐么

经验2590 米
在线时间441 小时
温哥华MIUI粉丝
积分 3418, 距离下一级还需 1582 积分
积分 3418, 距离下一级还需 1582 积分
机型Galaxy Nexus
签到次数19
本帖最后由 网特 于
05:09 编辑
MS的MIUI升级到2.3以后就把CM的/system/etc/init.d/10overclock也继承过来了。原来2.2的时候CM也是用10overclock的,MIUI就没有继承。我倒认为缺省情况下不要缺省启动超频的比较好。
每台MS的体质不同,使用统一的超频(尤其是MIUI 1.4.8和CM7 RC4以后的新超频缺省设置启用极其不稳定的125MHz频率)后有些手机会发生电池发热、耗电大、低频不稳定导致低电压(电量低于20%)时应用程序崩溃甚至手机重启。
建议将目前的/system/etc/init.d/10overclock脚本删除或改名为非数字开头的文件名(开机不会自动启动)。用户可以根据自己的喜好使用各种工具箱超频。
希望开发组慎重考虑,谢谢!
遇到的人越多,MIUI开发组会越关注
经验345 米
在线时间50 小时
版本2.4.13
积分 431, 距离下一级还需 69 积分
积分 431, 距离下一级还需 69 积分
机型未知设备
MIUI版本2.4.13
嗯,过来顶一下你,我的机器就是发热量大,充电时,开GPS时及WIFI时都发热!
经验7197 米
在线时间1731 小时
版本4.11.14
积分 9133, 距离下一级还需 10867 积分
积分 9133, 距离下一级还需 10867 积分
机型小米手机2/2S
签到次数124
MIUI版本4.11.14
经验166 米
在线时间69 小时
积分 311, 距离下一级还需 189 积分
积分 311, 距离下一级还需 189 积分
机型MOTO Milestone
签到次数13
的确……发热很严重……
堕落方能自由
让欲望在放纵中升华
让梦想在沉沦中超越
经验407 米
在线时间136 小时
积分 592, 距离下一级还需 1408 积分
积分 592, 距离下一级还需 1408 积分
机型MOTO XT912
1.4.8超频工具失效………………
刷机刷累了,就来这里看看吧!
经验1742 米
在线时间373 小时
版本3.12.27
积分 1850, 距离下一级还需 150 积分
积分 1850, 距离下一级还需 150 积分
机型小米手机1/1S
签到次数105
MIUI版本3.12.27
希望miui越做越好!
经验891 米
在线时间139 小时
积分 1304, 距离下一级还需 696 积分
积分 1304, 距离下一级还需 696 积分
机型MOTO DEFY
的确……发热很严重……
已关注微信
关注腾讯微博
已关注腾讯微博
关注新浪微博
已关注新浪微博
小米手机元器件合体活动勋章
小米求合体勋章
小米手机1终身荣誉勋章
小米手机1终身荣誉勋章
Copyright (C) 2014 MIUI 京ICP备号arm-linux:/etc/init.d/rcS脚本内容分析(转)
/etc/init.d/rcS内容分析
&&&&&&&&由于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
9.#console&devices
10.tty[0-9]*&0:5&0660
11vc/[0-9]*&0:5&0660
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/&&&
22.&&&#&i2c&devices&&&
23.&&&i2c-0&&&&&&&&0:0&&&&0666&&&&=i2c/0&&&
24.&&&i2c-1&&&&&&&&0:0&&&&0666&&&&=i2c/1&&&
26.&&&#&frame&buffer&devices&&&
27.&&&fb[0-9]&&&&&&&&0:0&&&&0666&&&
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/&&&
35.&&&#&rtc&devices&&&
36.&&&rtc0&&&&&&&&0:0&&&&0644&&&&&rtc&&&
37.&&&rtc[1-9]&&&&0:0&&&&0644&&&
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盘的兄弟知道原因了吧...)
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&&&
9.&&&&&#&These&are&standard&services.&&&
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&&&&
3.&&&&&echo&-n&Try&to&bring&eth0&interface&up......&/dev/ttySAC0&&&
5.&&&&&#判断/etc/eth0-setting文件是否存在&
6.&&&&&if&[&-f&/etc/eth0-setting&]&;&then&&&
7.&&&&&&&&&&&&&&&&&&&&&&&&&&&#读取配置文件信息&
8.&&&&&&&&&source&/etc/eth0-setting&&&
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&&&
21.&&&&&&&&&&&&&&&&&&&&&&&&&#将配置文件中的DNS设置写入/etc/resolv.conf&使之生效&
22.&&&&&&&echo&nameserver&$DNS&&&/etc/resolv.conf&&&&
23.&&&#配置文件不存在,使用默认配置&
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&&&
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&
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
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
23.&export&QWS_MOUSE_PROTO="USB:/dev/input/mice"
24.&&/etc/pointercal
26.&unset&TS_INFO_FILE
28.&export&QWS_KEYBOARD=TTY:/dev/tty1
29.&export&KDEDIR=/opt/kde
31.&export&HOME=/root
33.&#通过调用/opt/Qtopia/bin/qpe&真正启动Qtopia
34.&exec&$QPEDIR/bin/qpe&1&/dev/null&2&/dev/null
到此为止,文件系统从初始化到最终启动Qtopia&GUI&环境的全部过程就结束了,大家
可以看到,友善之臂的“小秘密”其实都在这里,说穿了很简单:)只要大家能够静下心来认真看
看脚本,看看源代码,加上一些背景知识的了解,搞清楚一个嵌入式系统就这么简单
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。1135人阅读
对于mini2440,虽然root_qtopia这个文件系统的GUI是基于Qtopia的,但其初始化启动过程却是由大部分由busybox完成,Qtopia(qpe)只是在启动的最后阶段被开启。&
由于默认的内核命令行上有init=/linuxrc,
因此,在文件系统被挂载后,运行的第一个程序是根目录下的linuxrc。这是一个指向/bin/busybox的链接,也就是说,系统起来后运行的第一个程序也就是busybox本身。这种情况下,busybox首先将试图解析/etc/inittab来获取进一步的初始化配置信息(参考busybox源代码init/init.c中的parse_inittab()函数)。而事实上,root_qtopia中并没有/etc/inittab这个配置文件,根据busybox的逻辑,它将生成默认的配置(部分):&
static void parse_inittab(void)&
#if ENABLE_FEATURE_USE_INITTAB&
&&&&&& char *token[4];&
&&&&&&& parser_t *parser = config_open2(&/etc/inittab&,
fopen_for_read);&
&&&&&&& if (parser == NULL)&
&&&&&&& {&
&&&&&&&&&&&&&&& /* No inittab file - set up some default
behavior */&
&&&&&&&&&&&&&&& /* Reboot on Ctrl-Alt-Del */&
&&&&&&&&&&&&&&& new_init_action(CTRLALTDEL, &reboot&,
&&&&&&&&&&&&&&& /* Umount all filesystems on halt/reboot
&&&&&&&&&&&&&&& new_init_action(SHUTDOWN, &umount -a -r&,
&&&&&&&&&&&&&&& /* Swapoff on halt/reboot */&
&&&&&&&&&&&&&&& if (ENABLE_SWAPONOFF)&
&&&&&&&&&&&&&&&&&&&&&&& new_init_action(SHUTDOWN, &swapoff
-a&, &&);&
&&&&&&&&&&&&&&& /* Prepare to restart init when a QUIT
is received */&
&&&&&&&&&&&&&&& new_init_action(RESTART, &init&, &&);&
&&&&&&&&&&&&&&& /* Askfirst shell on tty1-4 */&
&&&&&&&&&&&&&&& new_init_action(ASKFIRST, bb_default_login_shell,
//TODO: VC_1 instead of &&? && is console -& ctty problems
-& angry users&
&&&&&&&&&&&&&&& new_init_action(ASKFIRST, bb_default_login_shell,
&&&&&&&&&&&&&&& new_init_action(ASKFIRST, bb_default_login_shell,
&&&&&&&&&&&&&&& new_init_action(ASKFIRST, bb_default_login_shell,
&&&&&&&&&&&&&&& /* sysinit */&
&&&&&&&&&&&&&&& new_init_action(SYSINIT, INIT_SCRIPT,
&&&&&&&&&&&&&&&&
&&&&&&& }&
其中, 最重要的一个,就是new_init_action(SYSINIT, INIT_SCRIPT, &&),
也就决定了接下去初始化的脚本是INIT_SCRIPT所定义的值。这个宏的默认值是&/etc/init.d/rcS&。&
下面是文件系统中/etc/init.d/rcS的内容, 也是我们要分析的重点&
#! /bin/sh&
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:&
runlevel=S&
prevlevel=N&
umask 022&
export PATH runlevel prevlevel&
#&&&&&& Trap CTRL-C &c only in this shell so we can interrupt
subprocesses.&
trap &:& INT QUIT TSTP&
/bin/hostname FriendlyARM&
/bin/mount -n -t proc none /proc&
/bin/mount -n -t sysfs none /sys&
/bin/mount -n -t usbfs none /proc/bus/usb&
/bin/mount -t ramfs none /dev&
echo /sbin/mdev & /proc/sys/kernel/hotplug&
/sbin/mdev -s&
/bin/hotplug&
# mounting file system specified in /etc/fstab&
mkdir -p /dev/pts&
mkdir -p /dev/shm&
/bin/mount -n -t devpts none /dev/pts -o mode=0622&
/bin/mount -n -t tmpfs tmpfs /dev/shm&
/bin/mount -n -t ramfs none /tmp&
/bin/mount -n -t ramfs none /var&
mkdir -p /var/empty&
mkdir -p /var/log&
mkdir -p /var/lock&
mkdir -p /var/run&
mkdir -p /var/tmp&
/sbin/hwclock -s&
/etc/rc.d/init.d/netd start&
echo & && & /dev/tty1&
echo &Starting networking...& & /dev/tty1&
/etc/rc.d/init.d/httpd start&
echo & &&&&& & /dev/tty1&
echo &Starting web server...& & /dev/tty1&
/etc/rc.d/init.d/leds start&
echo & && & /dev/tty1&
echo &Starting leds service...& & /dev/tty1&
echo &&&&&&&&&&&&&&&&&&&&&&&& &&
/sbin/ifconfig lo 127.0.0.1&
/etc/init.d/ifconfig-eth0&
/bin/qtopia &&
echo &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & & /dev/tty1&
echo &Starting Qtopia, please waiting...& & /dev/tty1&
下面就逐个来分析:&
<span style="color:#.&&&&&&&&& 启动环境设置必要的环境变量;&
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin: runlevel=S
prevlevel=N umask 022 export PATH runlevel prevlevel&
<span style="color:#.&&&&&&&&& 设置机器名字;&
/bin/hostname FriendlyARM&
<span style="color:#.&&&&&&&&& 挂载“虚拟”文件系统,&
/bin/mount -n -t proc none /proc&
/bin/mount -n -t sysfs none /sys&
/bin/mount -n -t usbfs none /proc/bus/usb&
/bin/mount -t ramfs none /dev&
这里是挂载/proc, /sys,并且在/dev目录上挂载一个ramfs,相当于把原本NAND Flash上的只读的/dev目录“覆盖”上一块可写的空的SDRAM。&
这里要注意的是,/sys和挂载了ramfs的/dev是正确创建设备节点的关键。对于2.6.29内核来说,已经没有了devfs的支持,创建设备节点只有通过两种办法由文件系统完成:&
1) 制作文件系统镜像前用mknod手动创建好系统中所有的(包括可能有的)设备节点,并把这些节点文件一起做进文件系统镜像中;&
2)在文件系统初始化过程中,通过/sys目录所输出的信息,在/dev目录下动态的创建系统中当前实际有的设备节点。&
显然,方法1)有很大的局限性,仅限于没有设备动态增加或减少的情况,不适用于很多设备热插拔的情况,比如U盘,SD卡等等。方法2)是目前大多数PC上Linux的做法(基于udev实现)。这种方法有两个前提:/sys目录挂载和一个可写的/dev目录。&
这也就是为什么我们在这里需要挂载/sys和ramfs在/dev目录上。事实上,这种方法最早就是为热插拔设计的,你可以理解为当系统启动是,所有设备一下子全部“插入”了进来。&
这里有一点要说明的是,在文件系统初始化跑到这里之前,原本的/dev目录下必须有一个的设备节点:/dev/console。&
<span style="color:#.&&&&&&&&& 支持热插拔&
echo /sbin/mdev & /proc/sys/kernel/hotplug&
/sbin/mdev –s&
/bin/hotplug&
这几个就是用来完成我上面所说的两个东西:&
1)通过mdev -s 在/dev目录下建立必要的设备节点;&
2)设置内核的hotplug handler为mdev, 即当设备热插拔时,由mdev接收来自内核的消息并作出相应的回应,
比如挂载U盘。&
对于mdev,需要注意的是,文件系统里存在/etc/mdev.conf文件,它包含了mdev的配置信息。通过这个文件,我们可以自定义一些设备节点的名称或链接来满足特定的需要。这是root
qtopia中mdev.conf的内容:&
# system all-writable devices&&&&&&&&&&&&&&&&&&&&
full&&&&&&&&&&& 0:0&&&& 0666&
null&&&&&&&&&&& 0:0&&&& 0666&
ptmx&&&&&&&&&&& 0:0&&&& 0666&
random&&&&&&&&& 0:0&&&& 0666&
tty&&&&&&&&&&&& 0:0&&&& 0666&
zero&&&&&&&&&&& 0:0&&&& 0666&
# console devices&
tty[0-9]*&&&&&& 0:5&&&& 0660&&&&
vc/[0-9]*&&&&&& 0:5&&&& 0660&&&&
# serial port devices&
s3c2410_serial0 0:5&&&& 0666&&& =ttySAC0&
s3c2410_serial1 0:5&&&& 0666&&& =ttySAC1&
s3c2410_serial2 0:5&&&& 0666&&& =ttySAC2&
s3c2410_serial3 0:5&&&& 0666&&& =ttySAC3&
# loop devices&
loop[0-9]*&&&&& 0:0&&&& 0660&&& =loop/&&
# i2c devices&
i2c-0&&&&&&&&&& 0:0&&&& 0666&&& =i2c/0&&
i2c-1&&&&&&&&&& 0:0&&&& 0666&&& =i2c/1&&
# frame buffer devices&
fb[0-9]&&&&&&&& 0:0&&&& 0666&&&&
# input devices&
mice&&&&&&&&&&& 0:0&&&& 0660&&& =input/&
mouse.*&&&&&&&& 0:0&&&& 0660&&& =input/&
event.*&&&&&&&& 0:0&&&& 0660&&& =input/&
ts.*&&&&&&&&&&& 0:0&&&& 0660&&& =input/&
# rtc devices&
rtc0&&&&&&&&&&& 0:0&&&& 0644&&& &rtc&
rtc[1-9]&&&&&&& 0:0&&&& 0644&
# misc devices&
mmcblk0p1&&&&&& 0:0&&&& 0600&&& =sdcard */bin/hotplug.sh&
sda1&&&&&&&&&&& 0:0&&&& 0600&&& =udisk * /bin/hotplug.sh&
可以看到,原本串口驱动注册的设备名是s3c2410_serial0,s3c2410_serial1和s3c2410_serial2,而mdev则会在/dev目录下对应生成ttySAC0,ttySAC1和ttySAC2以符合应用程序对于串口设备名称的习惯。&
同样的,/dev/sdcard和/dev/udisk永远分别指向SD卡和U盘的第一个分区。(所以,用那些没有分区表的SD卡或U盘的兄弟知道原因了吧...)&
<span style="color:#.&&&&&&&&& 挂载一些其它的常用文件系统&
# mounting file system specified in /etc/fstab&
mkdir -p /dev/pts&
mkdir -p /dev/shm&
/bin/mount -n -t devpts none /dev/pts -o mode=0622&
/bin/mount -n -t tmpfs tmpfs /dev/shm&
/bin/mount -n -t ramfs none /tmp&
/bin/mount -n -t ramfs none /var&
mkdir -p /var/empty&
mkdir -p /var/log&
mkdir -p /var/lock&
mkdir -p /var/run&
mkdir -p /var/tmp&
就像注释中所说的,这是用来挂载其他一些常用的文件系统,并在/var目录下(同样是ramfs,可写的)新建必要的目录。&
<span style="color:#.&&&&&&&&& 设定系统时间&
/sbin/hwclock -s&
从硬件RTC中获取,不过&#20284;乎有问题接下来就是启动系统服务了,包括log记录,网络, http server和自定义的&跑马灯服务&...&
【关于mdev.conf的补充说明】&
# misc devices&
mmcblk0p1 0:0 0600 =sdcard */bin/hotplug&
sda1 0:0 0600 =udisk * /bin/hotplug&
这两句配置的意思是当SD卡或者U盘插入/拔出时,将这个消息传递给自定义的热插拔handler, /bin/hotplug.&
这个程序是友善之臂开发的用于自动挂载可移动设备的,目前是SD卡和U盘。它的逻辑很简单,将SD卡或者U盘的第一个分区作为FAT/FAT32挂载到/sdcard或者/udisk。
但这也同时带来一个问题,当SD卡或者U盘上没有分区表或者第一个分区不是FAT/FAT32&#26684;式的时候,它就玩不转了,兄弟们要小心了:)&
<span style="color:#.&&&&&&&&& 启动一系列服务:&
/etc/rc.d/init.d/netd start&
echo & & & /dev/tty1&
echo &Starting networking...& & /dev/tty1&
/etc/rc.d/init.d/httpd start&
echo & & & /dev/tty1&
echo &Starting web server...& & /dev/tty1&
/etc/rc.d/init.d/leds start&
echo & & & /dev/tty1&
echo &Starting leds service...& & /dev/tty1&
n&&&syslog - 用于记录内核和应用程序debug信息&
n&&&netd - inetd, 一个挂载启动各种网络相关服务的看守进程&
n&&&httpd - http server看守进程&
n&&&leds- 跑马灯看守进程&
其中,inetd的配置文件为/etc/inetd.conf,这是文件内容:&
# /etc/inetd.conf:& see inetd(8) for further informations.&
echo&&&& stream& tcp&&& nowait& root&&& internal&
echo&&&& dgram&& udp&&& wait&&& root&&& internal&
daytime& stream& tcp&&& nowait& root&&& internal&
daytime& dgram&& udp&&& wait&&& root&&& internal&
time&&&& stream& tcp&&& nowait& root&&& internal&
time&&&& dgram&& udp&&& wait&&& root&&& internal&
# These are standard services.&
ftp&&&& stream& tcp&&&& nowait& root&&& /usr/sbin/ftpd&&&&&&&&&
/usr/sbin/ftpd&
telnet& stream& tcp&&&& nowait& root&&& /usr/sbin/telnetd&&&&&&
/usr/sbin/telnetd -i&
可以看到,这里启动的网络服务有两个:&
1)ftp server 和&
2)telnet server。&
有关网络服务的端口和协议等具体信息,可以参考/etc/services, /etc/protocol。&
<span style="color:#.&&&&&&&&& 配置网络设备(网卡)&
/sbin/ifconfig lo 127.0.0.1/etc/init.d/ifconfig-eth0:&
1)设定本机回环地址为127.0.0.1&
2)运行网卡设置脚本/etc/init.d/ifconfig-eth0&
这是/etc/init.d/ifconfig-eth0的内容, 加入了我的一些注释&
#!/bin/sh&
echo -n Try to bring eth0 interface up......&/dev/ttySAC0&
#判断/etc/eth0-setting文件是否存在&
if [ -f /etc/eth0-setting ] ; then&
#读取配置文件信息&
source /etc/eth0-setting&
#如果根文件系统为nfs,则说明网卡已经配置OK,这里什么都不需要配置了&
if grep -q &^/dev/root / nfs & /etc/ then echo -n
NFS root ... & /dev/ttySAC0&
#否则,根据配置文件中的MAC, IP, Mask和Gateway通过ifconfig命令相应地配置网卡&
ifconfig eth0 down&
ifconfig eth0 hw ether $MAC&
ifconfig eth0 $IP netmask $Mask up&
route add default gw $Gateway fi&
#将配置文件中的DNS设置写入/etc/resolv.conf使之生效&
echo nameserver $DNS & /etc/resolv.conf&
#配置文件不存在,使用默认配置else&
#如果根文件系统为nfs,则说明网卡已经配置OK,这里什么都不需要配置了&
if grep -q &^/dev/root / nfs & /etc/ then&
echo -n NFS root ... & /dev/ttySAC0&
#将网卡的IP地址设定为192.168.1.230&
/sbin/ifconfig eth0 192.168.1.230 netmask 255.255.255.0
echo Done & /dev/ttySAC0&
可以看到,NFS自动识别就是靠判断/etc/mtab中是否有nfs的挂载记录实现的。&
这是root qtopia文件系统中/etc/eth0-settings文件:&
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&
终于到最后了,启动Qtopia GUI环境&
/bin/qtopia &&
echo & & & /dev/tty1&
echo &Starting Qtopia, please waiting...& & /dev/tty1&
可以看到,这里Qtopia是通过运行/bin/qtopia来启动的。事实上,/bin/qtopia也是一个脚本,它的任务是设定Qtopia运行必要的环境,
最后通过调用qpe可执行文件真正启动Qtopia。这是它的全部内容,我加入了一些注释:&
#!/bin/sh&
export TSLIB_TSDEVICE=/dev/input/event0&
export TSLIB_CONFFILE=/usr/local/etc/ts.conf&
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&
&&&&&&& export QWS_MOUSE_PROTO=&TPanel:/dev/input/event0
USB:/dev/input/mice&&
&&&&&&& if [ -e /etc/pointercal -a ! -s /etc/pointercal
&&&&&&&&&&&&&&& rm /etc/pointercal&
&&&&&&& fi&&&&&&
&&&&&&& export QWS_MOUSE_PROTO=&USB:/dev/input/mice&&
&& &&&&&&/etc/pointercal&
unset TS_INFO_FILE&
export QWS_KEYBOARD=TTY:/dev/tty1&
export KDEDIR=/opt/kde&
export HOME=/root&
exec $QPEDIR/bin/qpe 1&/dev/null 2&/dev/null&
#!/bin/sh&
#(1)tslib环境变量设置,包括了touchscreen设备文件,tslib配置文件,tslib plug-in位置和touchscreen校准数据文件&
export TSLIB_TSDEVICE=/dev/input/event0&
export TSLIB_CONFFILE=/usr/local/etc/ts.conf&
export TSLIB_PLUGINDIR=/usr/local/lib/ts&
export TSLIB_CALIBFILE=/etc/pointercal&
#(2)Qtopia环境变量设置,设定了Qtopia主要文件位置&
export QTDIR=/opt/Qtopia&
export QPEDIR=/opt/Qtopia&
#(3)设定PATH和LD_LIBRARY_PATH以包含Qtopia的可执行文件和共享库文件,方便Qtopia正确运行&
export PATH=$QTDIR/bin:$PATH&
export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH&
#(4)通过判断/sys/devices/virtual/input/input0/uevent中是否包含touchscreen信息使Qtopia自动识别touchscreen和USB鼠标&
TS_INFO_FILE=/sys/devices/virtual/input/input0/uevent&
if [ -e $TS_INFO_FILE -a &/bin/grep -q TouchScreen & $TS_INFO_FILE&
export QWS_MOUSE_PROTO=&TPanel:/dev/input/event0 USB:/dev/input/mice&&
if [ -e /etc/pointercal -a ! -s /etc/pointercal ] ; then&
rm /etc/pointercal&
export QWS_MOUSE_PROTO=&USB:/dev/input/mice& &/etc/pointercal&
unset TS_INFO_FILE&
export QWS_KEYBOARD=TTY:/dev/tty1export KDEDIR=/opt/kde&
export HOME=/root&
#(5)通过调用/opt/Qtopia/bin/qpe真正启动Qtopia&
exec $QPEDIR/bin/qpe 1&/dev/null 2&/dev/null&
到此为止,文件系统从初始化到最终启动Qtopia GUI环境的全部过程就结束了,大家可以看到,友善之臂的“小秘密”其实都在这里,说穿了很简单:)只要大家能够静下心来认真看看脚本,看看源代码,加上一些背景知识的了解,搞清楚一个嵌入式系统就这么简单。&
通常/linuxrc这个文件只有在&
1. 使用了Initial Ramdisk (initrd)&
2. 内核命令行上指定了init=/linuxrc&
这两种情况下才有用,mini2440的root_qtopia属于情况2),&
在root_qtopia中,/linuxrc是指向/bin/busybox的符号链接,也就是说,整个文件系统的入口就变成了busybox的main()函数,busybox支持这种方式来启动busybox本身和整个文件系统的初始化。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:62328次
积分:1112
积分:1112
排名:第17647名
原创:28篇
转载:111篇
(2)(1)(3)(1)(6)(5)(28)(11)(34)(24)(2)(7)(15)}

我要回帖

更多关于 init.d脚本 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信