qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Linux操作系統內核啟動參數詳細解析

          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,32device=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,只是這是一個一次性的設備。


          posted on 2013-11-13 10:06 順其自然EVO 閱讀(652) 評論(0)  編輯  收藏 所屬分類: linux

          <2013年11月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 太湖县| 郁南县| 阿巴嘎旗| 贞丰县| 沽源县| 栾城县| 阳西县| 搜索| 鄄城县| 武定县| 保定市| 松阳县| 新邵县| 平塘县| 三穗县| 兴海县| 行唐县| 会东县| 堆龙德庆县| 桓仁| 广南县| 巴青县| 云南省| 宜兴市| 舒城县| 霍山县| 安平县| 大方县| 乐安县| 桦川县| 都匀市| 航空| 元阳县| 乌兰察布市| 延川县| 容城县| 阳原县| 溧阳市| 盱眙县| 鄂州市| 威信县|