內核引導參數大體上可以分為兩類:一類與設備無關、另一類與設備有關。內核源碼樹下的 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 '__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的bugKNL 是一個內核啟動參數BOOT是一個引導程序參數
標記為"BOOT"的參數實際上由引導程序使用,對內核本身沒有直接的意義。沒有特別的需求,請不要修改此類參數的語法,更多信息請閱讀 Documentation/i386/boot.txt 文檔。
控制臺
這些參數控制著控制臺或內核日志,在何處顯示內核調試信息和錯誤信息。
[KNL]
console=tty 設置輸出控制臺使用第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= 指定 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= 內核會在內存中緩存一定數量的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= 強制指定 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= 明確指定一個SMP內核能夠使用的最大CPU數量。最好使用"maxcpus=0"而不是"maxcpus=1"來禁用SMP功能。
Ramdisk
[BOOT]
initrd= 指定initial ramdisk的位置 [RAM]
noinitrd 禁止使用任何initial RAM disk [RAM]
ramdisk_blocksize= 指定ramdisk的塊尺寸,默認是"1024"。 [RAM]
ramdisk_size= RAM disks的大小(kB),默認為4096(4MB)。
根文件系統
[KNL]
root=XXxx 告訴核心啟動時以那個設備作為根文件系統使用,默認為編譯內核時使用的設備。設備名由16進制主設備號(XX)與16進制次設備號(xx)組成,比如:root=B401 相當于從 /dev/uba1 啟動;root=0801 相當于從 /dev/sda1 啟動。 [KNL]
rootdelay= 掛載文件系統前延遲多少秒,當根文件系統在USB或FireWire設備上時常用。 [KNL]
rootflags= 設置根文件系統的掛載選項,比如"noatime,ro"。各種不同的文件系統所能使用的選項各不相同(比如 Documentation/filesystems/xfs.txt),也可以參考 mount 程序的選項。 [KNL]
rootfstype= 根文件系統的類型,比如"xfs"。
init
[KNL]
init= 指定內核啟動后運行的第一個程序的絕對路徑。默認為"/sbin/init"。 [KNL]
rdinit= 從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_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=,,,, 網絡設備參數。具體細節取決于不同的驅動程序,請參考各自的驅動程序文檔。該選項通常不用于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= 在內核發生panic之后reboot之前等候的秒數。默認值"0"表示不重啟而停頓在那里。
?
評論
查看更多