Meego系统全面解析

  Meego从上电复位,bootloader执行,到kernel启动的过程不在该文包含之内,另有文章专门介绍。本文专注于kernel启动后第一个进程init的执行,系统先期初始化到桌面启动过程的分析。
  
  Meego是一款比较纯正的Linux移动OS。Kernel内的初始化线程最终退化成系统内的第一个进程init。init进程是系统内所有进程的祖先进程,也就是所有的进程都直接或者间接是这个进程的子进程或者子孙进程。
  init进程会解析/etc/inittab中的配置文件,根据该配置决定不容的初始化路线。现在介绍下这个文件的结构。
如下:
#
# inittab       This file describes how the INIT process should set up
#               the system in a certain run-level.
#
# Author:       Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
#               Modified for RHS Linux by Marc Ewing and Donnie Barnes
#               Modified for moblin by Auke Kok
#

# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault: #默认情况下系统会进入level 5也就是x11桌面,更改此处的数值就能够控制系统进入的level。不同的level系统相对于win的安全模式,受限模式等。

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit #rc.sysinit是一个系统初始化shell script,它是系统初始化的起点

l0:0:wait:/etc/rc.d/rc 0  #针对不同的runlevel会执行不同的/etc/rc.d/rc文件夹里面的初始化脚本(Meego采用Redhat类似的chkconfig系统来配置服务的启动状态,这点类似于win的msconfig)
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now #用于捕捉系统运行中的一些中断以便控制系统

# Run gettys in standard runlevels
1:235:respawn:/sbin/mingetty --noclear tty1 #根据不同的runlevel获取一个登录terminal来show登录界面
2:23:respawn:/sbin/mingetty tty2
3:23:respawn:/sbin/mingetty tty3
4:23:respawn:/sbin/mingetty tty4
5:23:respawn:/sbin/mingetty tty5
6:23:respawn:/sbin/mingetty tty6
# For debugging and testing only, should always be disabled and only enabled
# when needed
#s0:23:respawn:/sbin/agetty -L 115200 ttyS0 vt100

x1:4:once:/sbin/boot-and-install

# Run X in runlevel 5
x:5:respawn:/usr/sbin/meego-dm

以上是init进程。接下来我们看看init进程执行了哪些script以及程序。
现在我们来看看/etc/rc.d/rc.sysinit这个脚本做了些什么事情。

1)为了加速系统的启动速度(主要是提升由于磁盘io delay造成的时间浪费),一般会根据OS的启动历史(debugfs),在并未使用磁盘设备的时候开启几个thread将启动历史中的文件事先buffer到mem中,使用的时候就会速度大升,该部分的知识感兴趣的人可以自己查找学习下。

     9 [ -x /sbin/sreadahead ] && /sbin/sreadahead >/dev/null 2>&1
2)我们知道kernel与userspace沟通的一个很重要的渠道就是procfs以及sysfs。由于系统早期的初始化需要很多kernel的参数以及调整kernel工作状态的途径,因此需要及时mount上来(Android中也是如此)
     11 if [ ! -e /proc/mounts ]; then
     12         mount -n -t proc /proc /proc
     13         mount -n -t sysfs /sys /sys >/dev/null 2>&1
     14 fi
3)该部分export出很多初始化函数,等会专门研究。
15 . /etc/init.d/functions
4)从prcfs中提取kernel的启动参数为初始化做准备。
     17 cmdline=$(cat /proc/cmdline)
     18 if strstr "$cmdline" quiet ; then
     19         quiet="yes"
     20 fi
     21 if strstr "$cmdline" nosplash ; then
     22         nosplash="yes"
     23 fi
5)让光标开始闪烁
     25 if [ -e /sys/devices/virtual/graphics/fbcon/cursor_blink ]; then
     26     echo 0 > /sys/devices/virtual/graphics/fbcon/cursor_blink
     27 fi
6)chvt 2切换到terminal模式下,并开启spalsh程序
     29 if [ -z "$nosplash" ]; then
     30     [ -x /usr/bin/chvt ] && /usr/bin/chvt 2
     31     [ -x /usr/bin/ply-p_w_picpath ] && /usr/bin/ply-p_w_picpath
     32 fi
7)设置接网络相关的配置
45 if [ -f /etc/sysconfig/network ]; then
     46     . /etc/sysconfig/network
     47 fi

8)如果该kernel支持usb设备,则mount usbfs
 48 if grep -q usbfs /proc/filesystems ; then
     49         mount -n -t usbfs /proc/bus/usb /proc/bus/usb
     50 fi
     51 
9)调整系统log的level。对于系统的log系统大家可以自己找些资料学习下
 if [ -n "$LOGLEVEL" ]; then
     64         /bin/dmesg -n $LOGLEVEL
     65 fi
10)建立文件标志,为后面的初始化作判断使用(该文件是空文件,仅仅作为一个标志使用)
     67 touch /dev/.in_sysinit >/dev/null 2>&1
     68 
     69 nice -n 20 /sbin/start_udev
开启udev系统,为外设的hotplug系统建立环境

     70 
     71 mount -n /dev/pts >/dev/null 2>&1
     72 
     73 
     74 # Configure kernel parameters
     75 sysctl -e -p /etc/sysctl.conf >/dev/null 2>&1
根据配置文件,调整系统的运行参数,详细内容可以参考相关的man page
11)这部分code应该是作系统文件系统check之类的事情的。
     81 if [ -f /fsckoptions ]; then
     82         fsckoptions=`cat /fsckoptions`
     83 fi
     84 
     85 if [ -f /forcefsck ] || strstr "$cmdline" forcefsck ; then
     86         fsckoptions="-f $fsckoptions"
     87 elif [ -f /.autofsck ]; then
     88         [ -f /etc/sysconfig/autofsck ] && . /etc/sysconfig/autofsck
     89         if [ "$AUTOFSCK_DEF_CHECK" = "yes" ]; then
     90                 AUTOFSCK_OPT="$AUTOFSCK_OPT -f"
     91         fi
     92         if [ -n "$AUTOFSCK_SINGLEUSER" ]; then
     93                 echo
     94                 echo $"*** Warning -- the system did not shut down cleanly. "
     95                 echo $"*** Dropping you to a shell; the system will continue"
     96                 echo $"*** when you leave the shell."
     97                 sulogin
     98         fi
     99         fsckoptions="$AUTOFSCK_OPT $fsckoptions"
    100 fi