概述
內核引導參數大體上可以分爲兩類:一類與設備無關、另一類與設備有關。內核源碼樹下的 Documentation/kernel-parameters.txt 文件列出了所有可用的引導參數,並指明瞭處理每個參數的具體文件。注意:對於模塊而言,引導參數只能用於直接編譯到核心裏的模塊,格式是使用"模塊名.參數=值"模式指定,比如:usbcore.blinkenlights=1 。動態加載的模塊可以在 modprobe 命令行上指定相應的參數值,比如:modprobe usbcore blinkenlights=1 。
可以使用"modinfo -p ${modulename}"命令顯示可加載模塊的所有可用參數。已經加載到內核中的模塊會在 /sys/module/${modulename}/parameters/ 中顯示出其參數,並且某些參數的值還可以在運行時通過"echo -n ${value} > /sys/module/${modulename}/parameters/${parm}"命令修改。
與設備有關的引導參數多如牛毛,需要你自己閱讀內核中的相應驅動程序源碼以獲取其能夠接受的引導參數。比如,如果你想知道可以向 AHA1542 SCSI 驅動程序傳遞哪些引導參數,那麼就到 drivers/scsi 目錄下尋找到 aha1542.c 文件,一般在前面 100 行註釋裏就可以找到所接受的引導參數說明。大多數參數是通過"__setup(... , ...)"函數設置的,逗號前的部分就是引導參數的名稱,後面的部分就是處理這些參數的函數名。[提示]你可以在源碼樹的根目錄下試一試
grep -r '\b__setup *(' *命令。
[注意]多個參數之間用空格分割,而每個參數的值中不能包含空白,參數值是一個逗號分割的列表。
正確:ether=9,0x300,0xd0000,0xd4000,eth0 root=/dev/hda1 錯誤:ether = 9, 0x300, 0xd0000, 0xd4000, eth0 root = /dev/hda1
在內核運行起來之後,可以通過 cat /proc/cmdline 命令查看當初使用的引導參數以及相應的值。
所有引導參數都是大小寫敏感的!
內核如何處理引導參數
絕大部分的內核引導參數的格式如下(每個參數的值列表中最多隻能有十項):
name[=value_1][,value_2]...[,value_10]
如果"name"不能被識別並且滿足"name=value"的格式,那麼則被解譯爲一個環境變量(比如"TERM=linux"或"BOOT_IMAGE=vmlinuz.bak"),否則將被原封不動的傳遞給 init 程序(比如"single")。
內核可以接受的參數個數沒有限制,但是整個命令行的總長度(參數/值/空格全部包含在內)卻是有限制的,一般是 256-4096 之間,定義在 include/asm/setup.h 中的 COMMAND_LINE_SIZE 宏中。
內核引導參數精選
由於引導參數多如牛毛,本文不可能涉及全部,因此下面只列出精選出來的一些(基於 2.6.22 內核),與設備有關的基本上都被忽略了。
標記說明
並不是所有的參數都是永遠可用的,只有在特定的模塊存在並且相應的硬件也存在的情況下才可用。引導參數上面的方括號說明了其依賴關係,其中使用的標記解釋如下:
ACPI 高級配置與電源接口 APIC 高級可編程中斷控制器 HW 相應的硬件設備存在 IA-32 IA-32(i386)體系結構 X86-64 X86-64體系結構,更多參數在 Documentation/x86_64/boot-options.txt 中描述 IOSCHED 啓用了多個IO調度器 LIBATA 啓用了Libata驅動 LOOP 啓用了Loopback設備 NET 啓用了網絡支持 PCI PCI總線支持 PNP 即插即用支持 PS2 PS/2支持 SCSI 許多SCSI設備的參數在 Documentation/scsi/ 中描述 SMP 對稱多處理器 USB USB支持 USBHID USB人機界面設備 VT 虛擬終端(Virtual terminal)
此外,下面的標記的含義與在邏輯上與上面的有所不同:
BUGS= 用於在特定的體系結構上解決某些CPU的bug KNL 是一個內核啓動參數 BOOT 是一個引導程序參數
標記爲"BOOT"的參數實際上由引導程序使用,對內核本身沒有直接的意義。沒有特別的需求,請不要修改此類參數的語法,更多信息請閱讀 Documentation/i386/boot.txt 文檔。
控制檯
這些參數控制着控制檯或內核日誌,在何處顯示內核調試信息和錯誤信息。
- [KNL]
console=tty<N> - 設置輸出控制檯使用第N號虛擬控制檯。
- [IA-32,X86-64]
earlyprintk=vga - 在傳統的控制檯初始化之前,在VGA上顯示內核日誌信息。如果不使用此參數那麼這些信息你可用永遠沒機會看見。
- loglevel={0|1|2|3|4|5|6|7}
- 所有小於該數字的內核信息都將在控制檯上顯示出來。這個級別可以使用 klogd 程序或者修改 /proc/sys/kernel/printk 文件進行調整。取值範圍是"0"(不顯示任何信息)到"7"(顯示所有級別的信息)。建議至少設爲"4"。[提示]級別"7"要求編譯時加入了調試支持。
- [KNL]
initcall_debug - 跟蹤所有內核初始化過程中調用的函數。有助於診斷內核在啓動過程中死在了那個函數上面。
中斷
這些參數影響內核與處理中斷的硬件之間的接口。常見的中斷控制器有兩種:傳統的8259A和新式的APIC,前者也被稱爲"PIC"。8259A只適合單CPU的場合,而APIC則能夠把中斷傳遞給系統中的每個CPU,從而充分挖掘SMP體系結構的並行性。所以8259A已經被淘汰了。
APIC系統由3部分組成:APIC總線、IO-APIC、本地APIC。
每個CPU中集成了一個本地APIC,負責傳遞中斷信號到處理器。而IO-APIC是系統芯片組中一部分,負責收集來自I/O設備的中斷信號併發送到本地APIC。APIC總線則是連接IO-APIC和各個本地APIC的橋樑。
- [APIC,i386]
apic={quiet|verbose|debug} - 在初始化 APIC 和 IO-APIC 組件的時候,顯示調試信息的詳細程度。默認是"quiet"。
- [SMP,APIC]
noapic - 強制內核禁止使用IO-APIC(輸入輸出高級可編程輸入控制器)
- [IA-32,APIC]
lapic - 強制內核啓用 local APIC ,即使 BIOS 已經禁用了。
- [IA-32,APIC]
nolapic - 強制內核禁用 local APIC ,即使 BIOS 已經啓用了。
- [IA-32,SMP,KNL]
noirqbalance - 禁止使用內核中的中斷平衡邏輯
- [HW]
irqfixup - 用於修復基本的中斷問題:當一箇中斷沒有被處理時搜索所有可用的中斷處理器。用於解決某些firmware缺陷。
- [HW]
irqpoll - 用於修復更進一步的中斷問題:當一箇中斷沒有被處理時搜索所有可用的中斷處理器,並且對每個時鐘中斷都進行搜索。用於解決某些嚴重的firmware缺陷。
- [IA-32]
noirqdebug - 默認情況下,內核將探測並且禁止未處理的中斷源,以免引起內核其他部分的響應問題,這個選項禁止該功能。
內存
- [KNL,BOOT]
highmem=nn[KMG] - 強制指定highmem區域的大小,甚至在默認沒有highmem的機器上也能工作。這個選項還可以用來在大內存的機器上強制減少highmem區域的大小。內核使用低於896M的"直接映射物理內存"很方便,但使用大於896M的部分(highmem)卻比較麻煩,所以系統在給用戶進程分配內存時會優先使用highmem。對於小於等於 1G 內存的用戶來說,則無需關心這個問題。
- [HW,IA-32]
hugepages=<NUM> - 指定 HugeTLB 頁的最大數量,僅在內核啓用了CONFIG_HUGETLBFS之後纔有效。大多數現代計算機體系結構提供對多頁面大小的支持,比如IA-32結構支持4K和4M(PAE模式爲2M)兩種頁面。因此Linux將物理內存劃分成許多固定大小的頁面(默認大小爲 4k),每個頁對應一個page結構,這些結構組成一個mem_map[]數組。TLB(Translation Lookaside Buffer)是虛擬地址到物理地址的翻譯緩衝區,這種緩衝區在處理器上是很寶貴的,操作系統總是嘗試將有限的TLB資源發揮到極致。特別是能夠輕鬆獲得若干G內存的時候(>4G),這種優化就顯得尤爲關鍵。而 HugeTLB 特性則允許將某些頁的尺寸增大到 4MB 。用戶可以使用mmap系統調用或者標準的SYSv共享內存調用(shmget,shmat)來使用hugepage。可以使用 grep Huge /proc/meminfo 命令查看是否開啓了 hugepage 支持。
- [KNL]
ihash_entries=<NUM> - 內核會在內存中緩存一定數量的inode結構來加速文件訪問,每個inode對應一個文件(不同於文件系統中的inode概念),包含文件訪問權限/屬主/組/大小/生成時間/訪問時間/最後修改時間等信息。這些inode保存在一個哈希表中。這個值用於指定這個哈希表的最大項數。比如 1G 內存推薦爲 16384 ,4G 及以上內存推薦 131072 ,但你可以根據自己硬盤上可能被訪問的文件數量對默認值進行調整(注意需要考慮哈希值的碰撞)。
- [KNL,BOOT]
max_addr=nn[KMG] - 內核將忽略在該物理地址以上的內存
- [KNL,BOOT]
mem=nn[KMG] - 強制指定內核使用多少數量的內存。缺乏遠見設計的傳統BIOS只能報告最大64MB內存。新的e820規範則突破了這個限制,使得BIOS可以正確報告大於64MB的內存。如果你在老舊的機器上使用大內存就需要指定這個參數(最保險的做法是在實際內存的總數上減掉1MB)。但有時候e820報告的數量並不準確,此時就需要使用下面的memmap參數精確指定內存映射(此時就不要使用"mem="了)。
- [KNL,IA-32,X86_64]
memmap=exactmap - 指定將要使用隨後的"memmap=nn@ss"等參數進行精確的E820內存映射。比如對於一個4G內存的機器可能是:"memmap=exactmap memmap=640K@0 memmap=4095M@1M"。
- [KNL]
memmap=nn[KMG]@ss[KMG] - 強制內核只使用從ss開始的nn長度的特定內存區域。可以多次使用以指定多個區域。
- [IA-32,X86-64]
noexec={on|off} - 允許(on,默認)或禁止(off)內核將部分內存映射爲"不可執行"區域。
- [KNL,BUGS]
reserve=nn[KMG] - 強制內核忽略(預留)一定量的IO內存區域
- [KNL,BOOT]
vmalloc=nn[KMG] - 強制指定vmalloc區域的大小。可用於增加vmalloc區域的最小尺寸(x86默認128MB),也可以用於減少vmalloc的大小,增加更多的空間用於直接映射內核RAM。
- norandmaps
- 默認內核隨機化程序啓動的地址,該選項禁用該功能。該選項等價於"echo 0 > /proc/sys/kernel/randomize_va_space"命令。
CPU
- [BUGS=IA-32]
cachesize=<NUM> - 強制指定 CPU L2 cache 的大小,單位是字節。
- [KNL,BUGS=IA-32]
nmi_watchdog={0|1|2|3} - 設置非屏蔽中斷(NMI)watchdog的特性。"0"表示禁用NMI watchdog;"1"表示使用APIC;"2"表示使用local APIC;"3"表示NMI watchdog有缺陷,因此被禁用。
- [IA-32]
mce
nomce - 啓用/禁用Machine Check Exception功能。
- [SMP]
maxcpus=<NUM> - 明確指定一個SMP內核能夠使用的最大CPU數量。最好使用"maxcpus=0"而不是"maxcpus=1"來禁用SMP功能。
Ramdisk
- [BOOT]
initrd=<filename> - 指定initial ramdisk的位置
- [RAM]
noinitrd - 禁止使用任何initial RAM disk
- [RAM]
ramdisk_blocksize=<NUM> - 指定ramdisk的塊尺寸,默認是"1024"。
- [RAM]
ramdisk_size=<NUM> - RAM disks的大小(kB),默認爲4096(4MB)。
根文件系統
- [KNL]
root=XXxx - 告訴核心啓動時以那個設備作爲根文件系統使用,默認爲編譯內核時使用的設備。設備名由16進制主設備號(XX)與16進制次設備號(xx)組成,比如:root=B401 相當於從 /dev/uba1 啓動;root=0801 相當於從 /dev/sda1 啓動。
- [KNL]
rootdelay=<NUM> - 掛載文件系統前延遲多少秒,當根文件系統在USB或FireWire設備上時常用。
- [KNL]
rootflags= - 設置根文件系統的掛載選項,比如"noatime,ro"。各種不同的文件系統所能使用的選項各不相同(比如 Documentation/filesystems/xfs.txt),也可以參考 mount 程序的選項。
- [KNL]
rootfstype= - 根文件系統的類型,比如"xfs"。
init
- [KNL]
init=<full_path> - 指定內核啓動後運行的第一個程序的絕對路徑。默認爲"/sbin/init"。
- [KNL]
rdinit=<full_path> - 從ramdisk中運行的第一個程序的絕對路徑,默認爲"/init"。指定的文件必須是在ramdisk而不是在根文件系統中進行。
- [KNL]
S - 以單用戶模式運行init,默認是多用戶模式。
ACPI
- [HW,ACPI,X86-64,i386]
acpi={force|off|ht|strict|noirq} - ACPI的總開關。force表示強制啓用;off表示強制禁用;noirq表示不要將ACPI用於IRQ路由;ht表示只運行足夠的ACPI來支持超線程;strict表示降低對不嚴格遵循ACPI規格的平臺的兼容性。
- acpi_sleep={s3_bios,s3_mode}
- ACPI休眠選項。在從S3狀態(掛起到內存)恢復的時候,硬件需要被正確的初始化。這對大多數硬件都不成問題,除了顯卡之外,因爲顯卡是由BIOS初始化的,內核無法獲取必要的恢復信息(僅存在於BIOS中,內核無法讀取)。這個選項允許內核以兩種方式嘗試使用ACPI子系統來恢復顯卡的狀態。
- [HW,ACPI]
acpi_sci={level|edge|high|low} - ACPI系統控制終端觸發器模式(System Control Interrupt trigger mode)。
- [HW,ACPI]
acpi_irq_balance - 使ACPI對中斷請求進行平衡,在APIC模式下爲默認值
- [HW,ACPI]
acpi_irq_nobalance - ACPI不對中斷請求進行平衡(默認),PIC模式下爲默認值
- [HW,ACPI]
acpi_irq_pci=<irq>,<irq>... - 如果啓用了irq_balance則將列出的中斷號標記爲已經被PCI子系統使用,可用於屏蔽某些中斷。
- [HW,ACPI]
acpi_os_name= - 告訴ACPI BIOS操作系統的名稱。常常用來哄騙某些老舊的BIOS以爲運行的是Windows系統。比如"Microsoft 2001"表示WinXP,"Microsoft Windows"表示Win98。
- [HW,ACPI]
acpi_serialize - 強制串行化ACPI機器語言(ACPI Machine Language)方法,操作系統使用這種語言與BIOS打交道。
- [HW,ACPI]
acpi_use_timer_override - 對於某些有毛病的 Nvidia NF5 主板需要使用此選項才能正常使用,不過此時 HPET 將失效。
- [IA-32,X86-64]
acpi_pm_good - 跳過pmtimer的bug檢測,強制內核假設這臺機器的pmtimer沒有毛病。用於解決某些有缺陷的BIOS。
- [KNL,ACPI]
memmap=nn[KMG]#ss[KMG] - 將從ss開始的nn長度的內存區域標記爲ACPI數據。
- [KNL,ACPI]
memmap=nn[KMG]$ss[KMG] - 將從ss開始的nn長度的內存區域標記爲"保留"。
- [ACPI]
pnpacpi=off - 禁用ACPI的即插即用功能,而使用PNPBIOS來代替。
- [HW,ACPI]
processor.max_cstate={0|1|2|3|4|5|6|7|8|9} - 無視ACPI表報告的值,強制制定CPU的最大C-state值。這裏的數字必須是一個有效的C-state值,比如Yonah處理器支持"0-4"五個級別:C0爲正常狀態,其他則爲不同的省電模式(數字越大表示CPU休眠的程度越深/越省電)。"9"表示超越所有的DMI黑名單限制。你的CPU的95%的時間應該處於最深度的idle狀態。
- processor.nocst
- 不使用_CST方法來偵測C-state值,而是使用傳統的FADT方法。
SCSI
這裏只列出了SCSI子系統的通用參數。其他特定於某一種SCSI驅動的參數並未列出,請在 Documentation 目錄下的 kernel-parameters.txt 文件中和 scsi 目錄下尋找它們。
- [SCSI]
max_luns= - 限制SCSI的最大邏輯單元號(LUN,logical unit number)。取值範圍在1到2^32-1之間。
- [SCSI]
max_report_luns= - 限制系統能夠接受的最大邏輯單元號(LUN)。取值範圍在1到16384之間。
PCI
- [PCI]
pci=option[,option...] -
- off
- [IA-32]不檢測PCI總線,也就是關閉所有PCI設備。
- bios
- [IA-32]強制使用PCI BIOS而不是直接訪問硬件,這表示內核完全信任BIOS(大多數情況下它並不可信)。僅在你的機器有一個不標準的PCI host bridge的時候才用。
- nobios
- [IA-32]強制直接訪問硬件而不使用PCI BIOS,2.6.13之後這是默認值。如果你確定在內核引導時的崩潰是由BIOS所致就可以使用它。
- conf1
- [IA-32]強制硬件設備使用PCI Configuration Mechanism 1訪問PCI Memory以與內核中的驅動程序進行通信。
- conf2
- [IA-32]強制硬件設備使用PCI Configuration Mechanism 2訪問PCI Memory以與內核中的驅動程序進行通信。
- nommconf
- [IA-32,X86_64]禁止爲 PCI Configuration 使用 MMCONFIG 表。
- nomsi
- [MSI]如果啓用了PCI_MSI內核配置選項,那麼可以使用這個參數在系統範圍內禁用MSI中斷。
- nosort
- [IA-32]不在檢測階段根據PCI BIOS給出的順序對PCI設備進行排序。進行這樣的排序是爲了以與早期內核兼容的方式獲取設備序號。
- biosirq
- [IA-32]使用PCI BIOS調用來獲取中斷路由表。這些調用在不少機器上都有缺陷,會導致系統在使用過程中掛起。但是在某些機器上卻是唯一獲取中斷路由表的手段。如果內核無法分配IRQ或者發現了第二個PCI總線,就可以嘗試使用這個選項解決問題。
- rom
- [IA-32]爲擴展ROM分配地址空間。使用此選項要小心,因爲某些設備在ROM與其它資源之間共享地址解碼器。
- pirqaddr=0xAAAAA
- [IA-32]指定物理地址位於F0000h-100000h範圍之外的PIRQ表(通常由BIOS產生)的物理地址。
- lastbus=N
- [IA-32]掃描所有總線,直到第N個總線。如果內核找不到第二條總線的時候,你就需要使用這個選項明確告訴它。
- assign-busses
- [IA-32]總是使用你自己指定的PCI總線號(而不是firmware提供的)。
- usepirqmask
- [IA-32]優先使用可能存在於BIOS $PIR表中的IRQ掩碼。某些有缺陷的BIOS需要這個選項,特別是在HP Pavilion N5400和Omnibook XE3筆記本上。如果啓用了ACPI IRQ路由的話,將不會考慮這個選項的設置。
- noacpi
- [IA-32]不爲IRQ路由或者PCI掃描使用ACPI。
- routeirq
- 爲所有PCI設備執行IRQ路由。這個通常在pci_enable_device()中執行,所有這是一個解決不調用此函數的bug驅動程序的臨時解決方法。
- bfsort
- 按照寬度優先的順序對PCI設備進行排序。進行這樣的排序是爲了以與2.4內核兼容的方式獲取設備序號。
- nobfsort
- 不按照寬度優先的順序對PCI設備進行排序。
- cbiosize=nn[KMG]
- 從CardBus bridge 的 IO 窗口接受的固定長度的總線空間(bus space),默認值是256字節。
- cbmemsize=nn[KMG]
- 從CardBus bridge 的 memory 窗口接受的固定長度的總線空間(bus space),默認值是64MB。
網絡
- [NET]
netdev=<irq>,<io>,<mem_start>,<mem_end>,<name> - 網絡設備參數。具體細節取決於不同的驅動程序,請參考各自的驅動程序文檔。該選項通常不用於PCI/USB等即插即用網卡。
- [KNL,NET]
rhash_entries= - 設置內核路由緩衝區哈希表的大小,僅供內核網絡專家使用。
- [NET]
shapers= - 設置內核允許使用的最大網絡Shaper(限制網絡速率的虛擬網絡設備)。
- [KNL,NET]
thash_entries= - 設置內核允許使用的TCP鏈接哈希表的大小。
硬件
- [USB]
nousb - 禁用USB子系統。
定時器
- [i386,x86-64]
enable_timer_pin_1
disable_timer_pin_1 - 啓用/禁用APIC定時器的PIN1,可以用於解決某些有bug的芯片組(特別是ATI芯片組)。內核將盡可能自動探測正確的值。
- [IA32/X86_64]
enable_8254_timer
disable_8254_timer - 啓用/禁用 在通過IO-APIC對IRQ0(時鐘中斷)進行路由之外,還通過8254進行路由。內核將盡可能通過檢測來選擇正確的值。
- [IA-32,HPET]
hpet=disable - 禁用HPET,轉而使用PIT。
- [GENERIC_TIME,IA-32,X86-64,ACPI]
clocksource={hpet|pit|tsc|acpi_pm} - 強制指定clocksource來取代默認值。
其他雜項
- [VT]
default_utf8={0|1} - 在系統範圍內爲將所有tty默認設置爲UTF-8模式。"1"表示UTF-8模式,默認值爲"0"。
- [IOSCHED]
elevator={"anticipatory"|"cfq"|"deadline"|"noop"} - 指定默認IO調度器
- [LOOP]
max_loop=<1-256> - 最大允許掛載的loopback設備數。
- [KNL]
panic=<seconds> - 在內核發生panic之後reboot之前等候的秒數。默認值"0"表示不重啓而停頓在那裏。