X86平台
预留。。。
ARM平台
Bootloader
预留。。。
根文件系统
一般而言,在Linux系统有两种init程序: BSD init和 System V init。
BSD和 SysterV是两种版本的UNIX系统。这两种init程序各有优缺点,现在大多 Linux的发行版本使用 System V init。但是在嵌入式领域,通常使用 Busybox集成的init程序。
Busybox
busybox制作过程查看《内核调试技术》中arm系统制作章节。
/etc/inittab文件详解:
Linux系统的启动过程为:
加电自检-->根据BIOS中的设置从指定的设备启动-->找到设备MBR中的bootloader引导启动系统-->启动kernel-->启动init进程
init进程启动后,根据/etc/inittab文件从不同的运行级别启动相应的进程或执行相应的操作。
/etc/inittab这个文件中定义的登记项都是以:隔开的四个段,即:
id:runlevels:action:process
id:它是每个登记项的标识符,用于唯一标识每个登记项,不能重复
runlevels:系统的运行级别,表示process的action要在哪个级别下运行,该段中可以定义多个运行级别,各级别之间直接写不用分隔符;如果为空,表示在所有的运行级别运行。Linux的运行级别有:
0:表示关机
1:表示单用户模式,在这个模式中,用户登录不需要密码,默认网卡驱动是不被加载,一些服务不能用。
2:表示多用户模式,NFS服务不开启
3,表示命令行模式
4,这个模式保留未用
5,表示图形用户模式
6,表示重启系统
action:表示对应登记项的process在一定条件下所要执行的动作。
具体动作有:
respawn:当process终止后马上启动一个新的
askfirst : 这个类似于上面的respawn,但是在运行process之前,它会打印"Please press Enter to activate this console.",然后等待用户按下Enter来启动该process。通常askfirst是用于启动终端设备的,如果不想看到这个提示,就像我那样使用respawn,而非askfirst.
wait:当进入指定的runlevels后process才会启动一次,并且到离开这个runlevels终止
initdefault:设定默认的运行级别,即我们开机之后默认进入的运行级别,不能是0,6,你懂的
sysinit:系统初始化,只有系统开机或重新启动的时候,这个process才会被执行一次
powerwait:当init接收到电源失败信号的时候执行相应的process,并且如果init有进程在运行,会等待这个进程完成之后,再执行相应的process
powerfail:当init接收到电源失败信号的时候执行相应的process,并且如果init有进程在运行,不会等待这个进程完成,它会直接执行相应的process
powerokwait:电源已经故障,但是在等待执行对应操作的时候突然来电了就执行对应的process
powerfailnow:当电源故障并且init被通知UPS电源已经快耗尽执行相对应的process
ctrlaltdel:当用户按下ctrl+alt+del这个组合键的时候执行对应的process
boot:只有在引导过程中,才执行该进程,但不等待该进程的结束;当该进程死亡时,也不重新启动该进程
bootwait:只有在引导过程中,才执行该进程,并等待进程的结束;当该进程死亡时,也不重新启动该进程
off:如果process正在运行,那么就发出一个警告信号,等待20秒后,再通过杀死信号强行终止该process。如果process并不存在那么就忽略该登记项
once:启动相应的进程,但不等待该进程结束便继续处理/etc/inittab文件中的下一个登记项;当该进程死亡时,init也不重新启动该进程
process:表示启动哪个程序或脚本或执行哪个命令等
::sysinit:/bin/chmod 777 /etc/init.d/rcS
::sysinit:/bin/sh /etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
::shutdown:/bin/umount -a -r
/etc/init.d/rcS
一般使用init进程读取/etc/inittab文件时,第一个就是调用sh命令用来初始化系统。
#!/bin/sh
/bin/mkdir -p /proc
/bin/mkdir -p /tmp
/bin/mkdir -p /sys
/bin/mkdir -p /mnt
/bin/mount -a
/bin/mkdir -p /dev/pts
/bin/mount -t devpts devpts /dev/pts
/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
/etc/fstab
用来将系统设备挂载到某个文件夹。
在/etc/init.d/rcS文件中调用mount -a时开始挂载。
proc /proc proc defaults 0 0 #挂载proc文件系统
tmpfs /tmp tmpfs defaults 0 0 #挂载tmpfs文件系统
sysfs /sys sysfs defaults 0 0 #挂载sysfs文件系统
tmpfs /dev tmpfs defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0
详情系统启动示例请查看《内核调试技术》arm文件系统制作步骤。
制作文件系统映像文件
预留。。。