根文件系统是Linux内核启动后第一个挂载的文件系统,在根文件系统中存放着内核镜像、各种系统配置文件、命令程序等。 根文件创建步骤如下:
- 创建目录
mkdir rootfs
- 创建必要的设备文件
- 安装所需的共享库
- 安装init文件、Shell和各种基本命令(可由busybox提供)
- 创建和编辑配置文件。
由于内核启动命令参数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