先把我的rcS文件贴出来,然后逐行解析:
*****************************************************************************
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
mkdir /dev/fb /dev/v4l
ln -s /dev/fb0 /dev/fb/0
ln -s /dev/video0 /dev/v4l/video0
#ln -s /dev/ts0 /dev/h3600_tsraw
hwclock -s
feed_wdg &
qtopia &
insmod /lib/input-polldev.ko
insmod /lib/mac80211.ko
#TL-WN321G+
insmod /lib/rt2x00lib.ko
insmod /lib/rt2x00usb.ko
insmod /lib/rt73usb.ko
#TL-WN322G+
insmod /lib/zd1211rw.ko
insmod /lib/ov9650.ko
ifconfig lo 127.0.0.1
net_set &
/etc/rc.d/init.d/leds start
/etc/rc.d/init.d/netd start
/etc/rc.d/init.d/httpd start
/bin/hostname -F /etc/sysconfig/HOSTNAME
********************************************
PATH=/sbin:/bin:/usr/sbin:/usr/bin
这个熟悉吧,设置命令的路径
runlevel=S
设置运行级别,由上一篇日志知道,busybox会忽略这个相,所以这个设置在这里不起作用
S代表运行级别1,即single-user(单用户)模式
prevlevel=N
umask 022
不了解这两个是干嘛用的,了解的大神还请告知一下
但是把这两个注释掉也会正常启动,猜想也不会用到
mount -a
挂载文件/etc/fstab中设置的所有设备,这里都是基于内存的虚拟文件系统,用于查看系统信息或优化性能
看一下/etc/fstab的内容:
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
ramfs /dev ramfs defaults 0 0
挂载虚拟文件系统,mdev -s运行的前提
挂载的设备名没什么意义,有意义的是文件系统类型,因为这些文件系统全部是从内存里挂载,划分一块内存挂载到
文件系统上,设备名只是容易区分是哪种文件类型。虚拟文件系统基本上是提供与内核交互的一种通道。
这些的意思都是把内存挂载到这些文件,我们看到的proc、tmp、dev都是内存挂载的,里面创建的文件重启就
不存在了,用du也查看不到大小
但以tmpfs挂载的/tmp里的文件(新建或拷贝进去),用du可以查看到大小,而且重启之后文件就消失了,不知为何。
从上面可以看出dev下的节点都是启动之后由“mdev -s”创建的,存在于内存中。大部分构建文件系统的教程里都说console
和null节点时必须的,手动创建的,这里可以不需要。原因如下:
系统在启动之后在rcS文件里执行“mdev -s”会创建这两个节点,以后终端操作的节点都是这个时候创建的,原根文件系统里的
节点会被覆盖。但是在执行“mdev -s”终端将是不可用的。做了一个小实验,如果根文件系统里有console和null节点,在“mdev -s”
之前就可以使用echo输出。如果根文件系统里没有这两个节点,启动时会打印“Warning: unable to open an initial console.”,并且
在“mdev -s”之前不可以使用echo输出。
之所以打印“Warning: unable to open an initial console.”,是因为:
static noinline int init_post(void)
__releases(kernel_lock)
if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
printk(KERN_WARNING "Warning: unable to open an initial console.\n");
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
第一条是创建/dev/pts目录,-p的意思是创建多级目录,即如果父亲目录不存在,则创建
第二条/dev/pts也是从内存挂载一个虚拟的文件系统,作用是可以了解目前远程虚拟终端(telnet,ssh等)的基本情况
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
第一条指定热插拔的处理函数。把“/sbin/mdev”写到/proc/sys/kernel/hotplug,内核会读取里面的内容,当有热插拔
事件时,会调用这个函数。
第二条,自动在/dev下创建设备节点。“mdev -s”会扫描/sys/class/xxx,在目录中查找dev文件
。例如:/sys/class/tty/tty0/dev,它的内容为"4:0"。目录名作为设备名。/sys/class/下的每个文件夹都代表着一个子系统。
然后mdev创建/dev/设备名的设备节点。所以系统启动后你在/dev下看到的设备节点全都来源于这条指令。
至于class里面的文件是怎么生成的,这就涉及到设备模型的内容了,这里不讲。
关于热插拔可参考其他博文。
hwclock -s
设置系统时间,从RTC获取
如果时间不正确,可在系统启动之后用date命令修改系统时间,然后通过“hwclock -w”写入RTC,下次启动就正确了
feed_wdg &
内核配置启动了看门狗,让这个应用程序一直运行来喂狗,不然程序会隔一段时间就重启
qtopia &
后台运行qt程序
insmod /lib/input-polldev.ko
insmod /lib/mac80211.ko
#TL-WN321G+
insmod /lib/rt2x00lib.ko
insmod /lib/rt2x00usb.ko
insmod /lib/rt73usb.ko
#TL-WN322G+
insmod /lib/zd1211rw.ko
insmod /lib/ov9650.ko
手动添加各种驱动模块
ifconfig lo 127.0.0.1
net_set &
配置自环ip和运行网卡设置脚本
/etc/rc.d/init.d/leds start
/etc/rc.d/init.d/netd start
/etc/rc.d/init.d/httpd start
运行初始化用户程序
/bin/hostname -F /etc/sysconfig/HOSTNAME
设置主机名(使用的是HOSTNAME文件里的内容)
阅读(6275) | 评论(0) | 转发(1) |