根文件系统的启动及配置 系统配置启动项

busybox 的init主要用于嵌入式系统,所以没有运行级别。

::respawn:-/bin/login -froot 自动作为root用户登录。

在Linux内核中找到/init/main.c看到如下内容:

run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");

这里就是执行系统的启动,当满足上面其中之一后,系统就会执行启动进程。一般通过busybox编译后的init在/sbin/下,所以通过第一条命令,下面就需要找到init,分析源码。

在busybox源码的/init/init.c中,有#defineINITTAB"/etc/inittab"的定义,inittab的作用自不必再说了,系统会根据inittab的提示进行启动加载。但在在解析inittab时,若没有该文件,便会执行新的启动脚本#defineINIT_SCRIPT"/etc/init.d/rcS"。

rcS就是整个系统启动的关键。

在内核初始化完成后,嵌入式linux 文件系统的启动过程主要包含以下几个步骤:

1. 执行/sbin/init 文件

2. 执行/etc/inittab 文件

3. 执行/etc/init.d/rcS 文件

4. 执行挂载文件系统脚本

5. 执行内核模块脚本

6. 执行网络初始化脚本

7. 执行应用程序启动等脚本,如qtopia的启动

系统启动流程图:

1. 内核启动init

内核启动的最后一步就是启动init 进程,init 进程是由内核启动的第一个(也是唯一一个和)用户进程(进程ID 为1),它根据配置文件决定启动哪些程序,比如某些脚本, 启动shell ,运行用户指定的程序等,,那么init进程又是怎么启动的呢---是由内核调用/sbin/init 文件而启动的,那有人就有人想知道内核是如何找到需要执行的init文件呢。下面看一下内核代码中init/main.c ,如下所示:

static int noinline init_post(void)

{

free_initmem();

unlock_kernel();

mark_rodate_ro();

system_state=SYSTEM_RUNNING;

numa_default_policy();

if(sys_open((const char __user*) “/dev/console”,O_RDWR,0)<0)

printk(KERN_WARNING “Waring :unable to open an initialconsole.n”);

(void)sys_dup(0);

(void)sys_dup(0);

if(ramdisk_execute_command) {

run_init_process(ramdisk_execute_command);

printk(KERN_WARNING “Failed to execute%sn”,ramdisk_execute_command);

}

if(execute_command) {

run_init_process(execute_command);

printk(KERN_WARNING “Failed to execute%sn”,execute_command);

}

run_init_process(“/sbin/init”);

run_init_process(“/etc/init”);

run_init_process(“/bin/init”);

run_init_process(“/bin/sh”);

panic(“No init found . Try passing init=option to kernel.”);

内核启动init 进程的过程如下:

先打开控制台设备/dev/console ,并复制了两个handle, 这样stdout,stdin,stderr都指向/dev/console,这样就打开了标准设备输入,输出,标准错误设备,然后执行几个外部程序。这几个程序中任何一个加载成功就进入了用户态,内核启动就宣告结束。

2. 执行/etc/inittab 文件

当init 启动成功后,需要做的就是分析/etc/inittab 文件并执行它。其内容如下:

# /etc/inittab

::sysinit:/etc/init.d/rcS

# 启动shell 以/dev/ttySAC0 作为控制台

ttySAC0::askfirst:-/bin/sh

# 按下ctrl+alt+del 之后执行的程序,不过在串口控制台中无法输入ctrl+alt+del 组合键

::ctrlaltdel:/sbin/reboot

# 重启关机前执行的程序

::shutdown:/bin/umount -a -r

3. 执行/etc/init.d/rcS 文件

这是一个脚本文件,可以在里面添加想自动运行的命令。内容如下:

#! /bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:

runlevel=S

prevlevel=N

umask 022

export PATH runlevel prevlevel

# 网络配置脚本

. /etc/init.d/network.sh

# load zlg_fs

insmod /bin/zlg_fs.ko

insmod /bin/zlg_ffs.ko

mknod /dev/zlg_fsa b 125 0

mknod /dev/zlg_fsa1 b 125 1

mknod /dev/zlg_fsa2 b 125 2

mount -t vfat /dev/zlg_fsa /usr

mount -a

4. 执行/etc/fstab( 挂载文件系统脚本)

在文件 /etc/init.d/rcS 中执行 mount –a 时,就会按照文件 /etc/fstab 内容挂载相应的文件系统.

#device mount-point type options dump fsck order

none /proc proc defaults 0 0

none /dev/pts devpts mode=0622 0 0

tmpfs /dev/shm tmpfs defaults 0 0

(1)device : 要挂接的设备,如 /dev/hda2

mount-point: 挂接点

type: 文件系统类型,如 pro,jffs2,nfs

options: 挂接参数,以逗号隔开

dump 和 fsck order :用来决定控制 dump,fsck 程序的行为。

5. 接着就会执行一些内核模块和网络俄配置脚本,最后执行应用程序启动等脚本,如 qtopia 的启动。

==================================================================================

按启动顺序依次介绍相关的文件:

一、内核启动完之后,首先运行/linuxrc。
根文件系统的启动及配置 系统配置启动项

/linuxrc内容:


#!/bin/sh
echo "mount /etc as ramfs"
/bin/mount -n -t ramfs ramfs/etc
/bin/cp -a /mnt/yaffs/etc/* /etc//关机的时候我们会保存/etc的内容到/mnt/yaffs/etc.

echo "re-create the /etc/mtab entries"
# re-create the /etc/mtab entries
/bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/2 /
/bin/mount -f -t ramfs ramfs /etc

exec /sbin/init
首先你要看懂这个linuxrc,
1. /bin/mount -n -t ramfs ramfs/etc

这句话的作用加载一个ramfs作为/etc目录。这样/etc就是一个可写目录。
看这个脚本,得出你的根文件系统是一个cramfs,是一个只读文件系统中,而/etc作为系统运行配置文件的存放地点,可能会写一些运行状态在这里, linuxrc第一件事情就是将一个ramfs mount 到/etc只读目录中,使得/etc/目录可写,指定参数-n的目的是告诉mount不要写/etc/mtab, 这个文件存放当前系统mount了的所有文件系统中。因为现在/etc/目录还是只读,所以这次mount不要写这个文件,否则会失败。

而你问到的 ramfs在哪里,这个在你的 /etc/fstab文件中应该有ramfs一项, mount会去找这项,如果没有,mount会失败。后面就执行不下去。

2. /bin/cp -a /mnt/yaffs/etc/*/etc

/etc成为可写目录后,将所有/mnt/yaffs/etc中的配置文件拷贝到/etc/中,这说明你的ramfs可能是一个空的ramfs,没有配置文件,或者配置文件比较老。同时也说明你这个系统是一个只读系统,每次系统运行中写入的配置不会保留。

将以前mount的那些信息重新写到/etc/mtab中,命令就是下面这些。
3. /bin/mount -f -t cramfs -oremount,ro /dev/mtdblock/2 /
/bin/mount -f -t ramfs ramfs/etc

这些命令只是将这些mount信息写到/etc/mtab中,不会实际去mount这些blockdevice,说明你的根文件系统依然是以前的那个/dev/bon/2

4. exec/sbin/init
执行根文件系统中的init执行程序,使其成为1号进程。shell正式运行。

###################################################################################
/etc/mtab介绍:
mtab同/etc/fstab的格式一样,它用于记录已经挂载的分区信息。
注意:
如果没有/linuxrc这个文件,系统默认首先运行/sbin/init。
###################################################################################

二、从/linuxrc文件中我们看到它最后运行了/sbin/init,而init又会根据/etc/inittab来运行。

inittab 文件条目格式:

id:runlevels:action:process

id:
inittab 文件中条目的唯一标识, 限于 1-4 个字符 (如果是用版本号小于 5.2.18 或 a.out 的库编译生成的sysvinit 程序, 则仅限于 2 个字符).
注意: 对于 getty 或其它的注册进程, id 必须是响应的终端线路的 tty 后缀, 如 1 响应 tty1, 否则,注册过程不能正常的工作.
runlevels:
# 0 - halt (Do NOT setinitdefault to this)
# 1 - Single usermode
# 2 - Multiuser, without NFS(The same as 3, if you do not have networking)
# 3 - Full multiusermode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT setinitdefault to this)
action
描述要发生的动作.
process
要执行的进程. 如果 process 域以一个 `+' 开头, init 不会在 utmp 和 wtmp 文件中为此进程记帐.这是由于 getty 自己主持 utmp/wtmp 记帐的需要, 同时这也是一个历史遗留的漏洞.

runlevels 域可以包含表示不同运行级的多个字符, 例如 123 表示本进程在运行级为 1, 2 和 3 时都要启动. 用于ondemand 条目的 runlevels 域可以包含 A, B, 或 C. 用于 sysinit, boot, 和bootwait 条目的 runlevels 域被忽略.
当改变运行级时, 在新运行级中没有给出的那些正在运行的进程被杀死, 先使用 SIGTERM 信号, 然后是SIGKILL.

action域可以使用的动作有:
该进程只要终止就立重新启动 (如 getty).
只要进入指定的运行级就启动本进程, 并且 init 等待该进程的结束.
只要进入指定的运行级就启动一次本进程.
在系统引导期间执行本进程. runlevels 域被忽略.
在系统引导期间执行本进程. 并且 init 等待该进程的结束 (如 /etc/rc). runlevels域被忽略.
什么也不做.
在进入 ondemand 运行级时才会执行标记为 ondemand 的那些进程. 无论怎样, 实际上没有改变运行级 (ondemand运行级就是 `a', `b', 和 `c').
initdefault 条目给出系统引导完成后进入的运行级, 如果不存在这样的条目, init 就会在控制台询问要进入的运行级.process 域被忽略.
系统引导期间执行此进程. 本进程会在 boot 或 bootwait 条目之前得到执行. runlevels域被忽略.
本进程在电源不足时执行. 通常在有进程把 UPS 和计算机相连时通知 init 进程, Init在继续其它工作之前要等待此进程结束.
类似 powerwait, 但是init 不等待此进程完成.
在 init 收到电源已经恢复的通知后立即执行此进程.
本进程在 init 被告知 UPS 电源快耗尽同时外部电源失败 (无效) 时被执行. (假设 UPS和监视进程能够发现这样的情况).
在 init 收到 SIGINT 信号时执行此进程. 这意味着有人在控制台按下了 CTRL-ALT-DEL 组合键, 典型地,可能是想执行类似 shutdown 然后进入单用户模式或重新引导机器.
本进程在 init 收到一个从控制台键盘产生的特殊组合按键信号时执行.
inittab实例:

#/etc/inittab

::sysinit:/etc/init.d/rcS
tty0::respawn:/sbin/getty 38400 tty0
tty2::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/cp /etc /mnt/yaffs/etc-ra//因为我们的根文件 系统只读,需要保存/etc的内容
::shutdown:/bin/umount ar
::shutdown:/bin/mount / o remount,ro//mount -o remount就是重新加载的意思


三、从inittab中我们可以看到现在系统启动/etc/init.d/rcS!

下面我们介绍一下rcS文件
//rcS的内容

#!/bin/sh
/bin/mount -a
/sbin/ifconfig 192.168.0.1
/bin/echo "I am xiaoshou! "

首先我们看到 mount -a这个命令。这个命令依据/etc/fstab来进行挂载的操作。
接着我们来看看/etc/fstab这个文件。


#/etc/fstab

none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
tmpfs /dev/shm tmpfs defaults 0 0


现在介绍一下此文件的格式:

# fstab文件的作用

文件/etc/fstab存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过"mount/directoryname"命令来加载一个文件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。同时fsck、mount、umount的等命令都利用该程序。

# fstab文件格式

下面是/etc/fatab文件的一个示例行:

fs_spec | fs_file| fs_type|fs_options| fs_dump| fs_pass

/dev/hda1|/|ext2|defaults|1|1

fs_spec-该字段定义希望加载的文件系统所在的设备或远程文件系统,对于一般的本地块设备情况来说:IDE设备一般描述为/dev/hdaXN,X是IDE设备通道(a, b, orc),N代表分区号;SCSI设备一描述为/dev/sdaXN。对于NFS情况,格式一般为<host>:<dir>,例如:`knuth.aeb.nl:/'。对于procfs,使用`proc'来定义。

  fs_file-该字段描述希望的文件系统加载的目录点,对于swap设备,该字段为none;对于加载目录名包含空格的情况,用40来表示空格。

fs_type-定义了该设备上的文件系统,一般常见的文件类型为ext2(Linux设备的常用文件类型)、vfat(Windows系统的fat32格式)、NTFS、iso9600等。

fs_options-指定加载该设备的文件系统是需要使用的特定参数选项,多个参数是由逗号分隔开来。对于大多数系统使用"defaults"就可以满足需要。其他常见的选项包括:

选项 含义

ro以只读模式加载该文件系统

sync不对该设备的写操作进行缓冲处理,这可以防止在非正常关机时情况下破坏文件系统,但是却降低了计算机速度

user允许普通用户加载该文件系统

quota强制在该文件系统上进行磁盘定额限制

 noauto不再使用mount-a命令(例如系统启动时)加载该文件系统

fs_dump-该选项被"dump"命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0

fs_pass-该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统"/"对应该字段的值应该为1,其他文件系统应该为2。若该文件系统无需在启动时扫描则设置该字段为0

四、在挂载完所有分区后,我们可以在/etc/init.d/rcS文件中添加我们自己的命令。
如:/sbin/ifconfig eth0192.168.0.1
/sbin/ifconfig lo 127.0.0.1

  

爱华网本文地址 » http://www.413yy.cn/a/25101014/227655.html

更多阅读

如何查看Windos系统开机启动项 dos开机启动项

????今天我们看一看如何查看Windos系统开机启动项,有很多方法可以查看Windos系统开机启动,各有优缺点。以下我就给大家介绍几个我经常用的方法:????方法1:一般情况下,我们的电脑都装有体检软件,这些软件基本上都有"加速开机"的功能,在这里

怎么删除开机系统启动项 相册看小视频没声音

怎么删除开机系统启动项——简介 开机自启动的程序过多会引起系统启动变慢,去除不需要开机自启动的启动项有利于加快开机时间,接下来亲看清除开机启动项的方法吧。怎么删除开机系统启动项——方法/步骤怎么删除开机系统启动项 1、 按

休眠文件hiberfil.sys的作用及删除是否安全 hiberfil.sys无法删除

和内存一样大小的硬盘空间对于电脑系统盘不大的人和追求系统快速的朋友来说,十分重要和迫切,下面我们来看看 和内存一样大小的 休眠文件hiberfil.sys的作用 及如何 删除它的方法,还有恢复方法。由于休眠一般这个功能永远用不到.而且对

ant的安装,配置及验证 ant 1.9.6 安装 配置

ant的安装,配置及验证——简介Ant是一个Apache基金会下的跨平台的构件工具,在实际开发项目中经常会用到,可以实现项目的自动构建和部署等功能。在本文中,主要熟悉怎样将Ant安装成功。ant的安装,配置及验证——方法/步骤ant的安装,配置及

声明:《根文件系统的启动及配置 系统配置启动项》为网友加糖的威士忌分享!如侵犯到您的合法权益请联系我们删除