SysV Init
2015-10-10 11:31
856 查看
RunLevel
在提及Unix System-V Init之前,让我们想一想Windows的安全模式与Android的不同启动模式。①在Windows启动的时候,可以按下F8,然后选择“安全模式”启动,而安全模式启动又分为带有网络和不适用网络的安全启动。显然,以不同的安全模式启动,系统在初始化时做的事情也不一样,带有网络的安全模式需要额外的初始化网卡等工作。我不了解Windows加载器(bootloader)是如何将不同启动模式的信息(bootmode)告诉Windows的,但是显然他们有约定一种方式来传递信息。或许是类似于u-boot总的bootargs,或许是在磁盘某个特殊的位置写下了对应的信息。
![](http://www.hexiongjun.com/wp-content/uploads/2015/04/WindowsSafeMode.png)
②经常刷机或者对Android启动熟悉的同学,应该知道Android有几种不同的启动模式,例如:recovery mode、 fastmode。不同的启动模式作用各不相同,例如fastmode一般用于烧写Image。Android或者由Android系统更改的OS,启动模式一般都是由u-boot(bootloader)通过bootargs传递给内核,或者是在Flash中设置Flag。在Android的init程序(第一个被启动的应用程序,可能由init=来指定)启动后根据标志位或者Flasg启动不同的程序,或者使用uramdisk中不同的init.*.rc文件,从而达到不同bootmode下启动不同service,做不同设置的功能。
对于Linux/Unix系统,对于服务器,或许在它正常运行的时候不应该启动X(GUI),对于桌面Destop则需要启动X,因此不同的bootmode的需求一样存在;Unix SystemV的Init使用runlevel来决定启动不同的程序。符合LBS 4.1.0的系统不同的runlevel的约定如下表(来源于Wikipedia
Runlevel词条):
ID | Name | Description |
---|---|---|
0 | Halt | Shuts down the system. |
1 | Single-user Mode | Mode for administrative tasks.[2][2] |
2 | Multi-user Mode | Does not configure network interfaces and does not export networks services.[3] |
3 | Multi-user Mode with Networking | Starts the system normally.[4] |
4 | Not used/User-definable | For special purposes. |
5 | Start the system normally with appropriate display manager. ( with GUI ) | Same as runlevel 3 + display manager. |
6 | Reboot | Reboots the system. |
Single-User Mode
Multi-User Mode without GUI
Multi-User Mode with GUI
Reboot/Halt Mode
对于前面提到的不启动GUI的Server,很可能的runlevel很可能为3,而一个desktop系统则很可能是5。
Subsystem
Unix SystemV 的init的执行过程按照如下:在/etc/inittab中获取runlevel
根据runlevel来读取指定的文件夹的文件,当runlevel为X时,读取的是/etc/rcX.d中的文件
根据读取的链接文件的文件名来获取不同脚本的执行顺序与传入到脚本中的是参数(start或者stop)
对于/etc/inittab中的runlevel设定,一般形如:
# The default runlevel. id:5:initdefault:
其中id:5指定了runlevel为5。
①例如一个使用Yocto编译出来的rootfs中,runlevel=6的etc/rc6.d文件夹中软连接文件列表如下:
$ ls rc6.d/ -l | awk -F' ' '{print $9 $10 $11}' K10dropbear->../init.d/dropbear K19avahi-daemon->../init.d/avahi-daemon K20apmd->../init.d/apmd K20dbus-1->../init.d/dbus-1 K20hwclock.sh->../init.d/hwclock.sh K20psplash.sh->../init.d/psplash.sh K20syslog->../init.d/syslog K20weston->../init.d/weston K21rc.pvr->../init.d/rc.pvr K22ofono->../init.d/ofono K31alsa-state->../init.d/alsa-state K60rpcbind->../init.d/rpcbind K64neard->../init.d/neard K80networking->../init.d/networking S20sendsigs->../init.d/sendsigs S25save-rtc.sh->../init.d/save-rtc.sh S30urandom->../init.d/urandom S31umountnfs.sh->../init.d/umountnfs.sh S40umountfs->../init.d/umountfs S90reboot->../init.d/reboot
②例如,一个使用Yocto编译出来的Rootfs中,runlevel=0的etc/rc6.d文件夹文件列表如下:
$ ls rc0.d/ -l | awk -F' ' '{print $9 $10 $11}' K10dropbear->../init.d/dropbear K19avahi-daemon->../init.d/avahi-daemon K20apmd->../init.d/apmd K20dbus-1->../init.d/dbus-1 K20hwclock.sh->../init.d/hwclock.sh K20psplash.sh->../init.d/psplash.sh K20syslog->../init.d/syslog K20weston->../init.d/weston K21rc.pvr->../init.d/rc.pvr K22ofono->../init.d/ofono K31alsa-state->../init.d/alsa-state K60rpcbind->../init.d/rpcbind K64neard->../init.d/neard K80networking->../init.d/networking S20sendsigs->../init.d/sendsigs S25save-rtc.sh->../init.d/save-rtc.sh S30urandom->../init.d/urandom S31umountnfs.sh->../init.d/umountnfs.sh S40umountfs->../init.d/umountfs S90halt->../init.d/halt
从①②例子中可以看到如下特征:
rcX.d中的文件都是指向/etc/init.d/中的软连接
软连接的名字与被指向的target的文件名多出来3个char
多出来的3个char可以分为:S/K 加上一个 两位数的数字
其中:
软连接文件名前面的S/K代表Start与Kill(stop),如果是S,那么使用“start”作为$1 参数传入到init.d对应的脚本中
后面的数字表示优先级,越小优先级越高,优先级越高越先执行
在①中,runlevel=6,所以是restart模式,根据优先级,可以知道先是停止dropbear服务,然后发送restart信号通知(需要从/etc/init.d/sendsig从看出),最后是reboot。
在②中,runlevel=6,所以是restart模式,根据优先级,可以知道先是停止dropbear服务,然后发送restart信号通知(需要从/etc/init.d/sendsig从看出),最后是halt。
另外有一个图片可以很好的表示启动解析执行文件顺序:
![](http://www.hexiongjun.com/wp-content/uploads/2015/04/SysV_Init_BootSeq.gif)
图片来源于washington.edu
图中的黑实线表示目录层次结构,虚线表示软连接,而带阴影的曲线表示的是启动过程中所解析和执行了的文件。
添加一个开机启动的程序
要在系统的时候启动一个程序,只需要在/etc/init.d中添加一个service,并能够根据传进来的参数(例如start、stop、restart,对于启动时start)做出相应的处理即可。然后再根据程序需要在哪个runlevel下面自动运行,在对应的rcX.d中的建立一个名字正确(S/K + Priority)软链接指向service。参考:
[1] Boot to runlevel 3
[2] Change
Runlevels at Boot time
[3] The init process and init.rc
[4] Starting Your Software Automatically
on Boot
如果文章有格式问题,请移步:http://www.hexiongjun.com/?p=103
转载请注明出处。作者:TonyHo hexiongjun.com
相关文章推荐
- Linux socket 初步
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区