2014年(18)
分类: LINUX
2014-03-09 19:30:07
在很多嵌入式系统中,由于可用资源较少,常常在系统启动后就直接让应用程序自动启动,以减少用户操作和节省资源。如何让自己的应用程序自动启动呢? 在Linux系统中,配置应用程序自动启动的方法有以下三种:
1.通过/Linuxrc脚本直接启动
Linux内核一旦开始执行,它将通过驱动程序来初始化所有硬件设备,这个初始化过程可以在启动时的PC显示器上看到,每个驱动程序都打印一些相关信息。初始化完成后,通常调用的是init,通过loader调用init内的init=/app_program语句(通过loader向核心传入init=/program可以定制首先运行的程序)。
比
如在桌面Linux系统中,init进程会读取/etc/inittab文件,来决定执行级别和哪些脚本和命令。嵌入式应用开发中,可以根据实际情况决定
是否使用标准的init执行方式,也许这个init是个静态程序,它能够完成我们的嵌入应用的特定任务,那完全不用考虑inittab了,在这里可以采用
比较灵活的措施。
2.在/etc/init.d下添加启动脚本
一般情况下,大多数的Linux操作系统使用/etc/init.d/(或/etc/rc.d/init.d)下的脚本来配置应用程序的自动启动。
例
如,在某些Linux系统中,corn程序通过/etc/init.d/corn脚本启动,Apache通过/etc/init.d/httpd启
动,syslogd通过/etc/init.d/syslogd启动,而sshd则通过/etc/init.d/sshd脚本启动。
通常这些脚本
通过来自特定rc.d目录的符号链接运行。为了配置从哪个rc.d目录运行脚本,Linux系统提供了许多不同的工具,同时也可以手工进行配置。
Linux系统有一个包含所有实际启动脚本文件的目录。它可能是/etc/init.d,也可能是/etc/rc.d/rc.d。同时对应每个运行级别
(runlevel)又有一个另外的目录,它们可能是/etc/rc2.d,也可能是/etc/rc.d/rc2.d。这些目录中的文件通常是指向实际脚
本文件的符号链接。
3.直接在/etc/rc.d/rc.local脚本中添加命令
在Linux系统
中,有一个类似Windows系统中autoexec.bat的文件,它就是/etc/rc.d/rc.local,系统开机后自动运行用户的应用程序或
启动系统服务的命令保存在开发板根文件系统的这个文件中。因此可以编辑rc.local文件,将要执行的程序(命令)添加到该文件夹中。Linux系统在启动后还未登录前,将自动执行该程序(命令),达到开机自动运行用户的应用程序的目的。
下面具体说明:
首先解压ramdisk.image.gz文件,然后挂载到系统中。接着创建自己的应用程序文件夹hello,将所要自动运行的应用程序hello复制到该文件夹。
然后打开/usr/etc/rc.local文件,在最后一行加入:/Myapp/hello/hello
再按上面的顺序将ramdisk.image打包下载到目标板,启动运行,则可以看到用户编写的应用程序一启动就运行起来了。
本文参考《基于ARM9的嵌入式Linux开发技术》,李新峰等编著。
二、Linux系统的启动过程
让我们先了解一下Linux系统启动的过程。当引导程序(如LILO)加载Linux内核映象启动时,它先进行内核的初始化工作,主要是检测整个硬件环
境。内核初始化完成后,系统就启动init进程,它是系统的第一个用户级进程。Linux系统具有许多运行级别,它由文件/etc/inittab文件决
定,各级别的功能如下:
0:终止或停止系统的运行
1:单用户模式
2:多用户模式,但无网络功能
3:多用户模式且有网络功能
4:保留,用户可以定义自己的启动模式
5:图形界面登陆模式
6:重新启动系统
init进程运行后,它会访问/etc/inittab文件,该文件确定系统运行于上面的哪个级别。由于嵌入式系统的特性,我们要让系统运行于级别1上,
即单用户模式,这只要在/etc/inittab文件的id:3:initdefault行,将3改为0即可。同时每个级别还对应了一个启动各种服务的脚
本目录,一般在/etc/rc.d/下面。
接着init进程又分别启动/etc/rc.d/rc.sysinit和与等级n相对应的/etc/rc.d/rcn.d目录里的初始化进程,最后
init会运行用户登陆程序,这时在终端上就会显示login:的登录信息,用户登录成功后会启动shell程序,shell启动后,它会读取并执行文件
/etc/profile,/etc/bashrc,和用户主目录下的文件.bashrc,这些文件负责建立用户自己的环境。
三、设置特定服务及开机启动程序
如前所述,添加指定服务,定制特定的启动程序,就从配置文件/etc/rc.d/rcn.d和/etc/profile入手。
1、添加指定的服务:是指在系统启动时进行一些用户所需要的操作,如初始化用户应用程序或用户开发的新硬件等等。可以增加自己的脚本程序来完成这些工作,主要步骤如下:
(1) 仿照系统目录/etc/rc.d/init.d里的任何一个脚本文件的格式自己编写一个启动服务脚本文件。
(2) 将写好的脚本文件拷贝到/etc/rc.d/init.d目录下。因为/etc/rc.d/rcn.d只是/etc/rc.d/init.d的一个链接,故要将真实的文件先拷到后者的目录下。
(3)
在相应的运行级别n的/etc/rc.d/rcn.d下建立该脚本文件的链接。如运行级别为2,则n=2,目录即为/etc/rc.d/rc2.d。假如
该脚本名为initform,链接名定为my_initform,则键入如下命令即可:ln –s
/etc/rc.d/init.d/initform /etc/rc.d/rc2.d/my_initform。
完成以上几步后,系统开机后就会自动执行脚本initform里的服务。
2、运行特定用户应用程序:这里主要是指GUI应用程序,如果原系统启动后直接进入桌面系统,则要将桌面程序在相应脚本中屏蔽,然后修改/etc/profile脚本定制用户自己的程序。步骤如下:
(1) 在startx脚本中将运行相应的桌面系统程序屏蔽。例如桌面系统程序名为qvwm(红旗嵌入式Linux的桌面系统),则修改内容如下:
……
# xinit /usr/bin/qvwm
#加个“#”表示将这行脚本屏蔽掉
(2) 修改/etc/profile,启动用户应用程序。如用户应用程序名为start_initform,且在目录/root/ 下,则在它的末尾加上如下几行内容:
……
export LC_ALL=zh_CN.GB2312
#设置中文化环境
cd /root/
#切换到应用程序当前目录
xinit ./start_initform
#运行指定的用户应用程序
修改完成后,重新启动系统,则当系统初始化完后,会执行用户指定的服务,且最后运行用户应用程序,达到嵌入式系统的要求。
如何让自己的linux程序开机自启动?
很多开发者都想知道,怎么样在系统启动的时候就直接启动自己编写的应用程序,以2410F开发板为例,分享开发经验: