1. 写在前面
Linux系统作为一个高级系统,其调度机理、调度链路非常复杂,仅仅是初启动阶段就非常复杂。如果要深究Linux系统的启动服务,需要理解Linux系统原理、文件管理、脚本链接等。但,如果是作为初学者,以“使用”为目的时,比如“期望在系统启动的时候自动执行指定程序”,则只需知道如何配置启动脚本即可。正比如,学开车,一开始并不需要知道发动机是如何工作的,会操控即可。
2. 启动脚本
2.1 文件位置
“/etc/init.d”下,可以查看到该文件的文件属主和文件属组都是root,只有root的权限可以修改和执行。
2.2 rcS文件格式
rcS文件本质是一个bash shell脚本,因此遵循bash脚本的语法规则。bash shell也是一门复杂的语言,深入研究可以独立出来研究,但我们知道基本的规则即可满足我们应用。
[1] 文件首行必须为“#! /bin/sh”。
[2] 注释一行用“#”。
[3] 基本的赋值语句,如打印字符串。
[4] 打印特殊符号需加“\”。
[5] 逻辑语句、循环语句等。
2.3 实现功能
启动脚本可以做很多事情,只要我们需要初始化时配置或者执行的功能,几乎都满足,总结几点下来及常用的有如下几种。
[1] 启动某个进程程序,最常用的,如启动串口收发进程。
[2] 加载驱动模块(.ko文件);如驱动编译成模块时,可以在这里增加加载(insmod/modprobe)驱动模块命令。
[3] 启动其他模块启动脚本,如网络服务。
[4] 配置功能,该项功能比较实用,实现期望系统起来后进行某些配置,如:配置环境变量、创建临时文件(夹)、挂在文件到指定文件夹、设置默认IP参数,以及配置系统主机名称等基础配置。
[5] 其他,如增加打印功能,方便在调试终端(串口)查看初始化过程,或者两者执行间进行延时(sleep)等。
3. 示例
附上之前使用的一个启动脚本(部分)。
#! /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 Acuity
[ -e /proc/1 ] || /bin/mount -n -t proc none /proc
[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
[ -e /dev/tty ] || /bin/mount -t ramfs none /dev
/bin/mount -n -t usbfs none /proc/bus/usb
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
syslogd
/etc/rc.d/init.d/netd start
#echo " " > /dev/tty1
#echo "Starting networking..." > /dev/tty1
/bin/chmod 0600 /usr/local/etc/ssh_*_key
/usr/local/sbin/sshd &
#echo " " > /dev/tty1
#echo "Starting ssh daemon..." > /dev/tty1
/etc/rc.d/init.d/httpd start
#echo " " > /dev/tty1
#echo "Starting web server..." > /dev/tty1
#echo " " > /dev/tty1
#echo "Starting leds service..." > /dev/tty1
#echo " "
#echo " " > /dev/tty1
/etc/rc.d/init.d/alsaconf start
#echo "Loading sound card config..." > /dev/tty1
#echo " "
# install additional modules
#modprobe ft5x06_ts 2>/dev/null
#modprobe goodix_touch 2>/dev/null
#modprobe ov9650 2>/dev/null
modprobe easycap 2>/dev/null
#modprobe tvp5150_tiny210 2>/dev/null
# install WiFi driver module
modprobe rtl8192cu 2>/dev/null
modprobe ath9k_htc 2>/dev/null
#modprobe rt73usb 2>/dev/null
#modprobe rt2800usb 2>/dev/null
#modprobe zd1211rw 2>/dev/null
#modprobe libertas_sdio 2>/dev/null
insmod /drivers/8188eu.ko
# install drivers
insmod /drivers/led.ko
insmod /drivers/EE_24cxx.ko
/sbin/ifconfig lo 127.0.0.1
#/etc/init.d/ifconfig-eth0
fa-network-service
#hdmi-service autostart
ifconfig eth0 down
# /opt/360box/apktools-service
# /opt/360box/run.sh &
# sys LED
/application/led_w &
# start QT4 component
#bin/qtopia &
#echo " " > /dev/tty1
#echo "Starting Qtopia, please waiting..." > /dev/tty1
/bin/app_gui &