根文件系統的啓動及配置linuxrc - linuxrc又來以及解釋

一、內核啓動完之後,首先運行/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').
  • 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設備一般描述爲/dev/hdaXN,X是IDE設備通道 (a, b, or c),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 eth0 192.168.0.1
/sbin/ifconfig lo 127.0.0.1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章