根文件系统的启动及配置
时间:2024-04-18 05:05:00 点击:291

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

  一、内核启动完之后,首先运行/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 -o remount,ro /dev/mtdblock/2 /

  /bin/mount -f -t ramfs ramfs /etc

  这些命令只是将这些mount信息写到/etc/mtab中,不会实际去mount这些block device,说明你的根文件系统依然是以前的那个/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 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)

  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 域可以使用的动作有:

  respawn:

  该进程只要终止就立重新启动 (如 getty).

  wait

  只要进入指定的运行级就启动本进程, 并且 init 等待该进程的结束.

  once

  只要进入指定的运行级就启动一次本进程.

  boot

  在系统引导期间执行本进程. runlevels 域被忽略.

  bootwait

  在系统引导期间执行本进程. 并且 init 等待该进程的结束 (如 /etc/rc). runlevels 域被忽略.

  off

  什么也不做.

  ondemand

  在进入 ondemand 运行级时才会执行标记为 ondemand 的那些进程. 无论怎样, 实际上没有改变运行级 (ondemand 运行级就是 `a', `b', 和 `c').

#p#副标题#e#

  initdefault

  initdefault 条目给出系统引导完成后进入的运行级, 如果不存在这样的条目, init 就会在控制台询问要进入的运行级. process 域被忽略.

  sysinit

  系统引导期间执行此进程. 本进程会在 boot 或 bootwait 条目之前得到执行. runlevels 域被忽略.

  powerwait

  本进程在电源不足时执行. 通常在有进程把 UPS 和计算机相连时通知 init 进程, Init 在继续其它工作之前要等待此进程结束.

  powerfail

  类似 powerwait, 但是init 不等待此进程完成.

  powerokwait

  在 init 收到电源已经恢复的通知后立即执行此进程.

  powerfailnow

  本进程在 init 被告知 UPS 电源快耗尽同时外部电源失败 (无效) 时被执行. (假设 UPS 和监视进程能够发现这样的情况).

  ctrlaltdel

  在 init 收到 SIGINT 信号时执行此进程. 这意味着有人在控制台按下了 CTRL-ALT-DEL 组合键, 典型地, 可能是想执行类似 shutdown 然后进入单用户模式或重新引导机器.

  kbrequest

  本进程在 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设备

展开 ↓

最新游戏更多

最新软件更多

  • 玩家推荐
  • 游戏攻略

诚捷手游网 Copyright(C) 2008- tynpfw.cn All Rights Reserved!

闽ICP备2023006241号-3| 免责声明