Linux 啓動參數 (轉)

一般的系統是先啓動/sbin/init,但是也可通過啓動參數指定init=來確定,
如:我的系統就是制定的init=/linuxrc,因爲文件系統是採用busybox的,而linuxrc
也是一個指向busybox的文件,不過不確認它指向具體哪個指令。不過可能是/sbin/init。
init進程的主要任務是按照inittab文件所提供的信息創建進程,由於進行系統初始
化的那些進程都由init創建,所以init進程也稱爲系統初始化進程。
    如我的inittab:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/login
::restart:/sbin/init
tty0::askfirst:-/bin/login
::ctrlaltdel:/bin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

inittab的格式如下:
id:rstate:action:process
1.id字段是最多4個字符的字符串,用來唯一標誌表項。
2.rstate(run state)字段定義該記錄項被調用時的運行級別,rstate可以由一個或多個運行級別構成,
也可以是空,空則代表運行級別0~6。當請求init改變運行級別時,那些rstate字段中不包括新運行級
別的進程將收到SIGTERM警告信號,並且最後被殺死;只有a、b、c啓動的命令外(a、b、c不是真正的運行級別)
3.action字段定義了該進程應該運行在何種狀態下:
    代碼:
    boot        在系統啓動時運行,忽略runlevel
    bootwait    在系統啓動時運行,init等待進程完成。忽略runlevel
    ctrlaltdel    當Ctrl+Alt+Del三個鍵同時按下時運行,把SIGINT信號發送給init。忽略    runlevel
    initdefault    不要執行這個進程,它用於設置默認runlevel
    kbrequest    當init從鍵盤中收到信號時運行。這裏要求鍵盤組合符合KeyBoardSigral(參見/usr/share/doc/kbd-*關於鍵盤組合的文檔)
    off        禁止進入,因此該進程不運行
    once        每一個runlevel級別運行一次
    ondemand    當系統指定特定的運行級別A、B、C時運行
    powerfail    當init收到SIGPWR信號時運行
    powerokwait    當收到SIGPWD信號且/etc/文件中的電源狀態包含OK時運行
    powerwait    當收到SIGPWD信號,並且init等待進程結束時運行
    respawn        不管何時終止都重新啓動進程
    sysinit        在運行boot或bootwait進程之前運行
    wait        運行進程等待輸入運行模式
    process 字段包含init執行的進程,該進程採用的格式與在命令行下運行該進程的格式一樣,
    因此process字段都以該進程的名字開頭,緊跟着是運行時,緊跟着是運行時要傳遞給該進程的參數。
    比如/sbin/shutdown -t3 -r now,該進程在按下Ctrl+Alt+Del時執行,在命令行下也可以直接輸入
    來重新啓動系統。
4.Process字段中進程可以是任意的守候進程、可執行腳本或程序。
另外:在任何時候,可以在文件inittab中添加新的記錄項,級別Q/q不改變當前的運行級別,
重新檢查inittab文件,可以通過命令init Q或init q使init進程立即重新讀取並處理文件inittab. 

他會先執行/etc/init.d/rcS
#! /bin/sh

/bin/mount -a
mdev -s
而mount -a會執行/etc/fstab
proc        /proc    proc    defaults    0    0
none        /tmp    ramfs    defaults    0    0 
mdev        /dev    ramfs    defaults    0    0
sysfs        /sys    sysfs    defaults    0    0 
掛載一些ramfs。

如果開機不想採用輸入密碼的話,修改inittab如下:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::restart:/sbin/init
tty0::askfirst:-/bin/sh
::ctrlaltdel:/bin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

-------------------------------------------------------------------------------------------------

Linux內核在啓動的時候,能接收某些命令行選項或啓動時參數。當內核不能識別某些硬件進而不能設置硬件參數或者爲了避免內核更改某些參數的值,可以通過這種方式手動將這些參數傳遞給內核。

如果不使用啓動管理器,比如直接從BIOS或者把內核文件用“cp zImage /dev/fd0”等方法直接從設備啓動,就不能給內核傳遞參數或選項--這也許是我們使用引導管理器比如LILO的好處之一吧。

 

Linux的內核參數是以空格分開的一個字符串列表,通常具有如下形式:

name[=value_1][,value_2]...[,value_10]

“name”是關鍵字,內核用它來識別應該把“關鍵字”後面的值傳遞給誰,也就是如何處理這個值,是傳遞給處理例程還是作爲環境變量或者拋給“init”。值的個數限制爲10,你可以通過再次使用該關鍵字使用超過10個的參數。

 

首先,內核檢查關鍵字是不是 “root=”,“nfsroot=”, “nfsaddrs=”, “ro”, “rw”, “debug”或 “init”,然後內核在bootsetups數組裏搜索於該關鍵字相關聯的已註冊的處理函數,如果找到相關的已註冊的處理函數,則調用這些函數並把關鍵字後面的值作爲參數傳遞給這些函數。比如你在啓動時設置參數name=a,b,c,d,內核搜索bootsetups數組,如果發現“name”已註冊, 則調用“name”的設置函數如name_setup(),並把a,b,c,d傳遞給name_setup()執行。

所有型如“name=value”參數,如果沒有被上面所述的設置函數接收,將被解釋爲系統啓動後的環境變量,比如“TERM=vt100”就會被作爲一個啓動時參數。

所有沒有被內核設置函數接收也沒又被設置成環境變量的參數都將留給init進程處理,比如“single”。

 

常用的設備無關啓動時參數。

1、init=...

設置內核執行的初始化進程名,如果該項沒有設置,內核會按順序嘗試/etc/init,

/bin/init,/sbin/init, /bin/sh,如果所有的都沒找到,內核會拋出 kernel panic:的錯誤。

2、nfsaddrs=...

設置從網絡啓動時NFS的啓動地址,以字符串的形式給出。

3、nfsroot=...

設置網絡啓動時的NFS根名字,如果該字符串不是以 "/"、","、"."開始,默認指向“/tftp-boot”。

以上2、3在無盤站中很有用處。

4、no387

該選項僅當定義了CONFIG_BUGi386時才能用,某些i387協處理器芯片使用32位的保護模式時會有BUG,比如一些浮點運算,使用這個參數可以讓內核忽略387協處理器。

5、no-hlt

該選項僅當定義了CONFIG_BUGi386時才能用,一些早期的i486DX-100芯片在處理“hlt”指令時會有問題,執行該指令後不能可靠的返回操作系統,使用該選項,可以讓linux系統在CPU空閒的時候不要掛起CPU。

6、root=...

該參數告訴內核啓動時使用哪個設備作爲根文件系統。比如可以指定根文件爲hda8:root=/dev/hda8。

7、ro和rw

ro參數告訴內核以只讀方式加載根文件系統,以便進行文件系統完整性檢查,比如運行fsck;rw參數告訴內核以讀寫方式加載根文件系統,這是默認值。

8、reserve=...

保留端口號。格式:reserve=iobase,extent[,iobase, extent]...,用來保護一定區域的I/O端口不被設備驅動程序自動探測。在某些機器上,自動探測會失敗,或者設備探測錯誤或者不想讓內核初始化設 備時會用到該參數;比如: reserve=0x300,32 device=0x300,除device=0x300外所有設備驅動不探測 0x300-0x31f範圍的I/O端口。

9、mem=...

限制內核使用的內存數量。早期BIOS設計爲只能識別64M以下的內存,如果你的內存數量大 於64M,你可以指明,如果你指明的數量超過了實際安裝的內存數量,系統崩潰是遲早的事情。如:mem=0x1000000意味着有16M內存,如果是 mem=0x6000000,就是96M內存了。

注意:很多機型把部分內存作爲BIOS的映射,所以你在指定內存大小的時候一定要預留空間。你也可以在 pentium或者更新的CPU上使用mem=nopentium關閉4M的頁表,這要在內核配置時申明。

10、panic=N

默認情況,內核崩潰--kernel panic 後會宕機而不會重啓,你可以設置宕機多少秒之後重啓機器;也可以在/proc/sys/kernel/panic文件裏設置。

11、reboot=[warm|cold][,[bios|hard]]

該選項僅當定義了CONFIG_BUGi386時才能用。2.0.22的內核重啓默認爲cool reboot,warm reboot 更快,使用"reboot=bios"可以繼承bios的設置。

12、nosmp 和 maxcpus=N

僅當定義了 __SMP__,該選項纔可用。可以用來禁用多CPU或者指明最多支持的CPU個數。

 

內核開發和調試的啓動時參數

這些參數主要用在內核的開發和調試上,如果你不進行類似的工作,你可以簡單的跳過本小節。

1、debug

linux的日誌級別比較多(詳細信息可以參看linux/kernel.h),一般地,日誌的守護進程klogd只把比DEBUG級別高的日誌寫進磁盤;如果使用該選項,klogd也把內核的DEBUG信息寫進日誌。

2、profile=N

在做內核開發的時候,如果想清楚的知道內核在什麼地方耗用了多少CPU的時鐘週期,可以使用 核心的分析函數設置變量prof_shift爲非0值,有兩種方式可以實現:一種是在編譯時指定,另一種就是通過“profile=”來指定;他給出了一個相當於最小單位--即時鐘週期;系統在執行內核代碼的時候, profile[address >;>; prof_shift]的值就會累加,你也可以從 /proc/profile得到關於它的一些信息。

3、swap=N1,N2,N3,N4,N5,N6,N7,N8

設置內核交換算法的八個參數:max_page_age, page_advance, page_decline,page_initial_age, age_cluster_fract, age_cluster_min, pageout_weight,bufferout_weight。

4、buff=N1,N2,N3,N4,N5,N6

設置內核緩衝內存管理的六個參數:max_buff_age, buff_advance, buff_decline,buff_initial_age, bufferout_weight, buffermem_grace。

 

使用 RAMDISK的參數

(僅當內核配置並編譯了 CONFIG_BLK_DEV_RAM)。一般的來說,使用ramdisk並不是一件好事,系統自己會更加有效的使用可用的內存;但是,在啓動或者製作啓 動盤時,使用ramdisk可以很方便的裝載軟盤等設備上的映象(尤其是安裝程序、啓動過程中),因爲在正真使用物理磁盤之前,必須要加載一些必要的模 塊,比如文件系統模塊,scsi驅動等(可以參見我的initrd-x.x.x.img文件分析-製作安裝程序不支持的根文件系統)。

早期的ramdisk(比如1.3.48的核心)是靜態分配的,必須以ramdisk=N來指定ramdisk的大小;現在ramdisk可以動態增加。一共有四個參數,兩個布爾型,兩個整形。

1、load_ramdisk=N

如果N=1,就加載ramdisk;如果N=0,就不加載ramdisk;默認值爲0。

2、prompt_ramdisk=N

N=1,提示插入軟盤;N=0,不提示插入軟盤;默認爲1。

3、ramdisk_size=N或者ramdisk=N

設定ramdisk的最大值爲N KB,默認爲4096KB。

4、ramdisk_start=N

設置ramdisk的開始塊號爲N,當ramdisk有內核的映象文件是需要這個參數。

5、noinitrd

(僅當內核配置了選項 CONFIG_BLK_DEV_RAM和CONFIG_BLK_DEV_INITRD)現在的內核都可以支持initrd了,引導進程首先裝載內核和一個 初始化的ramdisk,然後內核將initrd轉換成普通的ramdisk,也就是讀寫模式的根文件系統設備。然後linuxrc執行,然後裝載真正的 根文件系統,之後ramdisk被卸載,最後執行啓動序列,比如/sbin/init。

選項noinitrd告訴內核不執行上面的步驟,即使內核編譯了initrd,而是把initrd的數據寫到 /dev/initrd,只是這是一個一次性的設備。

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