linux檔案系統啟動分析

來源:互聯網
上載者:User

檔案:
一、核心啟動完之後,首先運行/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情況,格式一般為:,例如:
`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
續:我將會在我的後續文章中介紹ramfs tmpfs ramdisk cramfs jffs yaffs 等檔案系統的格式。

文章出處:http://www.diybl.com/course/6_system/linux/Linuxjs/200871/129571.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.