在Linux中,給kernel傳遞參數以控制其行爲總共有三種方法:linux
1.build kernel之時的各個configuration選項。shell
2.當kernel啓動之時,能夠參數在kernel被GRUB或LILO等啓動程序調用之時傳遞給kernel。數組
3.在kernel運行時,修改/proc或/sys目錄下的文件。ide
這裏我簡單講的就是第二種方式了,kernel在grub中配置的啓動參數。函數
首先,kernel有哪些參數呢? 在linux的源代碼中,有這樣的一個文檔:oop
https://www.kernel.org/doc/Documentation/kernel-parameters.txt ui
它介紹了kernel的各個參數及其意義。debug
其次,kernel啓動參數以空格分隔,並且是嚴格區分大小寫的(如:mem和MEM是不同的)。日誌
再次,對於module特有的kernel參數寫法是這樣的,[module name].[parameter=XX],例如:igb.max_vfs=7這個kernel啓動參數的效果就是至關於這樣來動態加載:orm
module: modprobe igb max_vfs=7
另外,kernel是怎樣處理這些啓動參數的呢? 啓動參數一般是這樣的形式: name[=value_1][,value_2]...[,value_10]
"name"是關鍵字,內核用它來識別應該把"關鍵字"後面的值傳遞給誰,也就是如何處理這個值,是傳遞給處理進程仍是做爲環境變量或者拋給"init"。值的個數限制爲10,你能夠經過再次使用該關鍵字使用超過10個的參數。 首先,kernel檢查關鍵字是否是 '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"。
下面簡單總結一下我在工做中經常使用到的一些kernel啓動參數。
根磁盤相關啓動參數:
root #指出啓動的根文件系統 如:root=/dev/sda1
ro #指定根設備在啓動過程當中爲read-only,默認狀況下通常都是這樣配的
rw #和ro相似,它是規定爲read-write,可寫
rootfstype #根文件系統類型,如:rootfstype=ext4
Console和kernel log相關啓動參數:
console #console的設備和選項,如:console=tty0 console=ttyS0
debug #enable kernel debugging 啓動中的全部debug信息都會打印到console上
quiet #disable all log messages 將kernel log level設置爲KERN_WARNING,在啓動中只很是嚴重的信息
loglevel #設置默認的console日誌級別,如:loglevel=7 (0~7的數字分別爲:KERN_EMERG,..,KERN_DEBUG)
time #設置在每條kernel log信息前加一個時間戳
內存相關的啓動參數:
mem #指定kernel使用的內存量,mem=n[KMG]
hugepages #設置大頁表頁(4MB大小)的最多個數,hugepages=n
CPU相關的啓動參數:
mce # Enable the machine check exception feature.
nosmp #Run as a single-processor machine. 不使用SMP(多處理器)
max_cpus #max_cpus=n, SMP系統最多能使用的CPU個數(即便系統中有大於n個的CPU)
Ramdisk相關的啓動參數:
initrd #指定初始化ramdisk的位置,initrd=filename
noinitrd #不使用initrd的配置,即便配置了initrd參數
初始化相關啓動參數:
init #在啓動時去執行的程序,init=filename,默認值爲/sbin/init
PCI相關的啓動參數:
pci #pci相關的選項,我常使用pci=assign_buses,也使用過pci=nomsi
SELinux相關啓動參數:
enforcing #SELinux enforcing狀態的開關,enforcing=0表示僅僅是記錄危險而不是阻止訪問,enforcing=1徹底enable,默認值是0
selinux #在啓動時關閉或開啓SELinux,selinux=0表示關閉,selinux=1表示開啓selinux
另外,仍是用max_loop來指定最多可以使用的迴路設備。
在Redhat的系統中,還有個常常看到的kernel啓動參數——rhgb,rhgb表示redhat graphics boot,就是會看到圖片來代替啓動過程當中顯示的文本信息,這些信息在啓動後用dmesg也能夠看到
rhgb = redhat graphical boot - This is a GUI mode booting screen with most of the information hidden while the user sees a rotating activity icon spining and brief information as to what the computer is doing.
quiet = hides the majority of boot messages before rhgb starts. These are supposed to make the common user more comfortable. They get alarmed about seeing the kernel and initializing messages, so they hide them for their comfort.
參考資料:
linux kernel documents
《Linux kernel in a nutshell》