1. 程式人生 > >核心配置命令列引數以及Uboot設定環境變數bootargs裡面的init=/linuxrc解析

核心配置命令列引數以及Uboot設定環境變數bootargs裡面的init=/linuxrc解析

根檔案系統的啟動及配置!(小壽原創)
www.diybl.com 時間:2008-07-03 作者:佚名 編輯:本站 點選: 314 [評論]
-
-

按啟動順序依次介紹相關的檔案:

一、核心啟動完之後,首先執行/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 - 該欄位描述希望的
根檔案系統的啟動及配置!(小壽原創)
www.diybl.com 時間:2008-07-03 作者:佚名 編輯:本站 點選: 316 [評論]
-
-
檔案系統載入的目錄點,對於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

相關推薦

核心配置命令引數以及Uboot設定環境變數bootargs裡面的init=/linuxrc解析

根檔案系統的啟動及配置!(小壽原創)www.diybl.com 時間:2008-07-03 作者:佚名 編輯:本站 點選: 314 [評論] - - 按啟動順序依次介紹相關的檔案: 一、核心啟動完之後,首先執行/linuxrc。 /linuxrc內容: ----------

springboot原始碼分析5-springboot之命令引數以及原理

摘要:本文我們重點分析一下Springboot框架中的命令列引數的使用以及框架內部處理的命令列引數的原理。眾所周知,springboot專案可以有兩種方式啟動,第一種使用jar包;第二種使用war包。在使用jar方式的時候,我們可以在啟動jar包的時候設定一些命令引數。1.1

[uboot] (第六章)uboot流程——命令模式以及命令處理介紹

轉自https://blog.csdn.net/ooonebook/article/details/53164198   以下例子都以project X專案tiny210(s5pv210平臺,armv7架構)為例 [uboot] uboot流程系列: [project

.NET Core採用的全新配置系統[5]: 聊聊預設支援的各種配置源[記憶體變數,環境變數命令引數]

較之傳統通過App.config和Web.config這兩個XML檔案承載的配置系統,.NET Core採用的這個全新的配置模型的最大一個優勢就是針對多種不同配置源的支援。我們可以將記憶體變數、命令列引數、環境變數和物理檔案作為原始配置資料的來源,如果採用物理檔案作為配置源,我們可以選擇不同的格式(比如XML

tensorflow__第一章:命令引數設定(flags=tf.app.flags)

在執行main函式之前首先進行flags的解析,也就是說TensorFlow通過設定flags來傳遞tf.app.run()所需要的引數,我們可以直接在程式執行前初始化flags,也可以在執行程式的時候設定命令列引數來達到傳參的目的。 tf.app.flags的使用 flags = tf.a

Pycharm下執行除錯Python專案時,當除錯既需要給除錯的程式傳入命令引數又需要程式在設定的斷點處停下里檢視變數時的解決方法

  今天在除錯了一個複雜的Python專案,其中這個專案的除錯需要事先從命令列讀取引數,並且在除錯期間需要再事先設定的斷點處停下來。檢查相關的變數。   問題是,在Pycharm的Terminal 輸入檔名+引數後,程式就處於執行狀態,除非程式出錯,否則程式會一

springboot學習總結(一)外部配置命令引數配置、常規屬性配置、型別安全的配置之基於properties)

學習的內容主要是汪雲飛的《Spring Boot實戰》 (一)命令列引數配置 springboot專案可以基於jar包執行,開啟jar的程式可以通過下面命令列執行: java -jar xxx.jar 可以通過以下命令修改tomcat埠號 java -jar xxx.jar --server.por

u-boot到kernel命令引數設定及傳遞

軟體配置env的情況(CONFIG_ENV_IS_NO_WHERE=y) 1, 在u-boot/include/configs/xxx_config.h配置檔案中我們可以找到CONFIG_BOOTARGS配置項,在這裡我們可以設定要傳遞的到核心的命令列引數 u-boot/i

嵌入式 SQLite3 命令引數設定與顯示引數設定

Customer text); INSERT INTO Orders(OrderPrice, Customer) VALUES(1200, 'Williamson'); INSERT INTO Orders(OrderPrice, Customer) VALUES(200, 'Robertson'); INS

Python IDLE中如何設定命令引數

1.命令列引數在哪個選單中設定啊?我看那個《Python簡明教程》裡說用IDLE要去選單裡找,但是沒找到我只能在doc中用執行.py後面跟上命令列引數沒有這項設定,命令列引數只是幾段文字,可以自己填 新增 sys.argv =[sys.argv[0],'argume

centos7如何設定成開機預設命令模式以及登陸賬戶為root

1,設定啟動為命令模式 systemctl set-default multi-user.target 2,設定啟動為圖形模式 systemctl set-default graphi

(二)NS3如何編譯、執行指令碼和 Command Line命令引數設定

二、編譯、執行指令碼和Command Line命令列引數設定 7. 編譯和執行指令碼主要步驟 1) 將編寫的指令碼複製到ns-3.22/scratch目錄下(可以在ubuntu視窗介面直接複製) 進入ns3目錄: /ns-3.22 $ cp examples/tutori

uboot命令模式以及命令處理

AM335X中的巨集定義 1、需要開啟哪些巨集 CONFIG_CMDLINE 表示是否支援命令列模式,定義如下: configs/am335x_evm_defconfig :CONFIG_CMDLINE=y CONFIG_SYS_GENERIC

實現uboot 命令自動補全 及 修正設定環境變數時自啟動核心

語文地址:http://blog.csdn.net/liukun321/article/details/6641478 習慣了了linux下的命令自動補全,換做uboot下的單個字元的輸入長串命令,實在是不太習慣。常常在uboot下習慣性的按TAB鍵。為了習慣,下面來

【Python】讀取命令引數、在PyDev中設定Python執行時的引數

有時候,我們寫的命令列程式需要批次執行,這裡可以讓Python程式讀取命令列引數,再編寫一個命令列批次執行指令碼.bat,實際上就是一個充滿命令的、改了字尾名的文字檔案,在多個測試用例扔進Python程式中是非常有用的。 例如,如下圖,有一個cmdArgs.py程式,當在p

golang同時使用命令引數配置檔案

golang同時使用命令列引數和配置檔案 [toc] 之前使用過spring-boot框架,在配置引數傳遞上可以使用配置檔案--a

ssdeep命令引數說明

ssdeep 下載地址: http://ssdeep.sourceforge.net/ ssdeep 中文介紹: http://blog.claudxiao.net/2012/02/fuzzy_hashing/#comment-489

x265 命令引數大全

除非一個引數被標記為 CLI ONLY,否則該引數也被x265_param_parse() 支援。CLI使用getopt 函式來解釋命令列引數,長短版本的引數都可以使用,長引數在不引起歧義的情況下可以截斷成短引數。API使用者必須把完整的引數名傳遞給 x265_param_parse()。 Pres

MFC解析啟動命令引數——CCommandLineInfo類

MFC中CCommandLineInfo類被用於分析啟動應用時的命令列引數。 MFC應用一般都會在它的應用物件中使用函式InitInstance()建立這個類的一個本地例項。然後把該物件傳給CWinApp::ParseCommandLine(),ParseCommandLine()又重複呼叫

argparse配合pycharm命令引數

1、未新增命令列引數的時候 import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display a square of a given number")