Linux作業系統核心啟動引數詳細解析

2021-07-09 11:56:52 字數 4190 閱讀 2684

原文:

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,只是這是乙個一次性的裝置。

Linux作業系統核心啟動引數詳細解析

linux核心在啟動的時候,能接收某些命令列選項或啟動時引數。當核心不能識別某些硬體進而不能設定硬體引數或者為了避免核心更改某些引數的值,可以通過這種方式手動將這些引數傳遞給核心。如果不使用啟動管理器,比如直接從bios或者把核心檔案用 cp zimage dev fd0 等方法直接從裝置啟動,就不...

Linux作業系統核心啟動引數詳細解析

linux作業系統核心啟動引數詳細解析 linux 核心在啟動的時候,能接收某些命令列選項或啟動時引數。當核心不能識別某些硬體進而不能設定硬體引數或者為了避免核心更改某些引數的值,可以通過這種方式手動將這些引數傳遞給核心。如果不使用啟動管理器,比如直接從bios 或者把核心檔案用 cp zimage...

Linux作業系統核心啟動引數詳細解析

linux核心在啟動的時候,能接收某些命令列選項或啟動時引數。當核心不能識別某些硬體進而不能設定硬體引數或者為了避免核心更改某些引數的值,可以通過這種方式手動將這些引數傳遞給核心。如果不使用啟動管理器,比如直接從bios或者把核心檔案用 cp zimage dev fd0 等方法直接從裝置啟動,就不...