linux 內核啓動參數

原文鏈接:https://blog.csdn.net/wdjjwb/article/details/80255585

Linux 內核引導選項簡介
作者:金步國
版權聲明
本文作者是一位開源理念的堅定支持者,所以本文雖然不是軟件,但是遵照開源的精神發佈。

無擔保:本文作者不保證作品內容準確無誤,亦不承擔任何由於使用此文檔所導致的損失。
自由使用:任何人都可以自由的閱讀/鏈接/打印此文檔,無需任何附加條件。
名譽權:任何人都可以自由的轉載/引用/再創作此文檔,但必須保留作者署名並註明出處。
其他作品
本文作者十分願意與他人分享勞動成果,如果你對我的其他翻譯作品或者技術文章有興趣,可以在如下位置查看現有的作品集:

金步國作品集 [ http://www.jinbuguo.com/ ]
聯繫方式
由於作者水平有限,因此不能保證作品內容準確無誤。如果你發現了作品中的錯誤(哪怕是錯別字也好),請來信指出,任何提高作品質量的建議我都將虛心接納。

Email(QQ):70171448在QQ郵箱
概述
內核引導選項大體上可以分爲兩類:一類與設備無關、另一類與設備有關。與設備有關的引導選項多如牛毛,需要你自己閱讀內核中的相應驅動程序源碼以獲取其能夠接受的引導選項。比如,如果你想知道可以向 AHA1542 SCSI 驅動程序傳遞哪些引導選項,那麼就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行註釋裏就可以找到所接受的引導選項說明。大多數選項是通過”__setup()”函數設置的,少部分是通過”early_param()”或”module_param()”或”module_param_named()”之類的函數設置的,逗號前的部分就是引導選項的名稱,後面的部分就是處理這些選項的函數名。

[提示]你可以在源碼樹的根目錄下試一試下面幾個命令:

grep -r ‘\b__setup (’
grep -r ‘\bearly_param (’
grep -r ‘\bmodule_param (’
grep -r ‘\bmodule_param_named (’
格式上,多個選項之間用空格分割,選項值是一個逗號分割的列表,並且選項值中不能包含空白。

正確:ether=9,0x300,0xd0000,0xd4000,eth0 root=/dev/sda2
錯誤:ether = 9, 0x300, 0xd0000, 0xd4000, eth0 root = /dev/sda2
注意,所有引導選項都是大小寫敏感的!

在內核運行起來之後,可以通過 cat /proc/cmdline 命令查看當初使用的引導選項以及相應的值。

內核模塊
對於模塊而言,引導選項只能用於直接編譯到核心中的模塊,格式是”模塊名.選項=值”,比如”usbcore.blinkenlights=1”。動態加載的模塊則可以在 modprobe 命令行上指定相應的選項值,比如”modprobe usbcore blinkenlights=1”。

可以使用”modinfo -p modulename"命令顯示可加載模塊的所有可用選項。已經加載到內核中的模塊會在/sys/module/modulename"命令顯示可加載模塊的所有可用選項。已經加載到內核中的模塊會在/sys/module/ {modulename}/parameters/ 中顯示出其選項,並且某些選項的值還可以在運行時通過”echo -n value>/sys/module/value>/sys/module/ {modulename}/parameters/${parm}”進行修改。

內核如何處理引導選項
絕大部分的內核引導選項的格式如下(每個選項的值列表中最多只能有十項):

name[=value_1][,value_2]…[,value_10]
如果”name”不能被識別並且滿足”name=value”的格式,那麼將被解譯爲一個環境變量(比如”TERM=linux”或”BOOT_IMAGE=vmlinuz.bak”),否則將被原封不動的傳遞給 init 程序(比如”single”)。

內核可以接受的選項個數沒有限制,但是整個命令行的總長度(選項/值/空格全部包含在內)卻是有限制的,定義在 include/asm/setup.h 中的 COMMAND_LINE_SIZE 宏中(對於X86_64而言是2048)。

內核引導選項精選
由於引導選項多如牛毛,本文不可能涉及全部,因此本文只基於 X86_64 平臺以及 Linux-3.13.2 精選了一些與設備無關的引導選項以及少部分與設備有關的引導選項,過時的選項、非x86平臺選項、與設備有關的選項,基本上都被忽略了。

[提示]內核源碼樹下的 Documentation/kernel-parameters.txt 和 Documentation/x86/x86_64/boot-options.txt 文件列出了所有可用的引導選項,並作了簡要說明。

標記說明
並不是所有的選項都是永遠可用的,只有在特定的模塊存在並且相應的硬件也存在的情況下才可用。引導選項上面的方括號說明了其依賴關係,其中使用的標記解釋如下:

ACPI 開啓了高級配置與電源接口(CONFIG_ACPI)支持
AGP 開啓了AGP(CONFIG_AGP)支持
APIC 開啓了高級可編程中斷控制器支持(2000年以後的CPU都支持)
APPARMOR 開啓了AppArmor(CONFIG_SECURITY_APPARMOR)支持
DRM 開啓了Direct Rendering Manager(CONFIG_DRM)支持
EFI 開啓了EFI分區(CONFIG_EFI_PARTITION)支持
EVM 開啓了Extended Verification Module(CONFIG_EVM)支持
FB 開啓了幀緩衝設備(CONFIG_FB)支持
HIBERNATION 開啓了”休眠到硬盤”(CONFIG_HIBERNATION)支持
HPET_MMAP 允許對HPET寄存器進行映射(CONFIG_HPET_MMAP)
HW 存在相應的硬件設備
IOMMU 開啓了IOMMU(CONFIG_IOMMU_SUPPORT)支持
IOSCHED 開啓了多個不同的I/O調度程序(CONFIG_IOSCHED_*)
IPV6 開啓了IPv6(CONFIG_IPV6)支持
IP_PNP 開啓了自動獲取IP的協議(DHCP,BOOTP,RARP)支持
IP_VS_FTP 開啓了IPVS FTP協議連接追蹤(CONFIG_IP_VS_FTP)支持
KVM 開啓了KVM(CONFIG_KVM_*)支持
LIBATA 開啓了libata(CONFIG_ATA)驅動支持
LOOP 開啓了迴環設備(CONFIG_BLK_DEV_LOOP)支持
MCE 開啓了Machine Check Exception(CONFIG_X86_MCE)支持
MOUSE 開啓了鼠標(CONFIG_INPUT_MOUSEDEV)支持
MSI 開啓了PCI MSI(CONFIG_PCI_MSI)支持
NET 開啓了網絡支持
NETFILTER 開啓了Netfilter(CONFIG_NETFILTER)支持
NFS 開啓了NFS(網絡文件系統)支持
NUMA 開啓了NUMA(CONFIG_NUMA)支持
PCI 開啓了PCI總線(CONFIG_PCI)支持
PCIE 開啓了PCI-Express(CONFIG_PCIEPORTBUS)支持
PNP 開啓了即插即用(CONFIG_PNP)支持
PV_OPS 內核本身是半虛擬化的(paravirtualized)
RAID 開啓了軟RAID(CONFIG_BLK_DEV_MD)支持
SECURITY 開啓了多個不同的安全模型(CONFIG_SECURITY)
SELINUX 開啓了SELinux(CONFIG_SECURITY_SELINUX)支持
SLUB 開啓了SLUB內存分配管理器(CONFIG_SLUB)
SMP 開啓了對稱多處理器(CONFIG_SMP)支持
TPM 開啓了可信賴平臺模塊(CONFIG_TCG_TPM)支持
UMS 開啓了USB大容量存儲設備(CONFIG_USB_STORAGE)支持
USB 開啓了USB(CONFIG_USB_SUPPORT)支持
USBHID 開啓了USB HID(CONFIG_USB_HID)支持
VMMIO 開啓了使用內存映射機制的virtio設備驅動(CONFIG_VIRTIO_MMIO)
VT 開啓了虛擬終端(CONFIG_VT)支持
此外,下面的標記在含義上與上面的有所不同:

BUGS 用於解決某些特定硬件的缺陷
KNL 是一個內核啓動選項
BOOT 是一個引導程序選項
標記爲”BOOT”的選項實際上由引導程序(例如GRUB)使用,對內核本身沒有直接的意義。如果沒有特別的需求,請不要修改此類選項的語法,更多信息請閱讀 Documentation/x86/boot.txt 文檔。

說明:下文中的 [KMG] 後綴表示 210, 220, 230 的含義。

控制檯與終端
[KNL]
console=設備及選項
設置輸出控制檯使用的設備及選項。例如:ttyN 表示使用第N個虛擬控制檯。其它用法主要針對嵌入式環境(Documentation/serial-console.txt)。
[KNL]
consoleblank=秒數
控制檯多長時間無操作後黑屏,默認值是600秒,設爲0表示禁止黑屏。
[HW]
no_console_suspend
永遠也不要將控制檯進入休眠狀態。因爲當控制檯進入休眠之後,所有內核的消息就都看不見了(包括串口與VGA)。開啓此選項有助於調試系統在休眠/喚醒中發生的故障。
[VT]
vt.default_utf8={0|1}
是否將所有TTY都默認設置爲UTF-8模式。默認值”1”表示將所有新打開的終端都設置爲UTF-8模式。
日誌與調試
earlyprintk=設備[,keep]
使用哪個設備顯示早期的引導信息,主要用於調試硬件故障。此選項默認並未開啓,因爲在某些情況下並不能正常工作。
在傳統的控制檯初始化之前,在哪個設備上顯示內核日誌信息。不使用此選項,那麼你將永遠沒機會看見這些信息。
在尾部加上”,keep”選項表示在真正的內核控制檯初始化並接管系統後,不會抹掉本選項消息的顯示。
earlyprintk=vga 表示在VGA上顯示內核日誌信息,這是最常用的選項,但不能用於EFI環境。
earlyprintk=efi v3.13新增,表示將錯誤日誌寫入EFI framebuffer,專用於EFI環境。
earlyprintk=xen 僅可用於XEN的半虛擬化客戶機。
loglevel={0|1|2|3|4|5|6|7}
設置內核日誌的級別,所有小於該數字的內核信息(具有更高優先級的信息)都將在控制檯上顯示出來。這個級別可以使用 klogd 程序或者修改 /proc/sys/kernel/printk 文件進行調整。取值範圍是”0”(不顯示任何信息)到”7”(顯示所有級別的信息)。建議至少設爲”4”(WARNING)。[提示]級別”7”要求編譯時加入了調試支持。
[KNL]
ignore_loglevel
忽略內核日誌等級的設置,向控制檯輸出所有內核消息。僅用於調試目的。
[KNL]
debug
將引導過程中的所有調試信息都顯示在控制檯上。相當於設置”loglevel=7”(DEBUG)。
[KNL]
quiet
靜默模式。相當於設置”loglevel=4”(WARNING)。
log_buf_len=n[KMG]
內核日誌緩衝區的大小。”n”必須是2的整數倍(否則會被自動上調到最接近的2的整數倍)。該值也可以通過內核配置選項CONFIG_LOG_BUF_SHIFT來設置。
[KNL]
initcall_debug
跟蹤所有內核初始化過程中調用的函數。有助於診斷內核在啓動過程中死在了那個函數上面。
kstack=N
在內核異常(oops)時,應該打印出內核棧中多少個字(word)到異常轉儲中。僅供調試使用。
[KNL]
kmemleak={on|off}
是否開啓檢測內核內存泄漏的功能(CONFIG_DEBUG_KMEMLEAK),默認爲”on”,僅供調試使用。
檢測方法類似於跟蹤內存收集器,一個內核線程每10分鐘(默認值)掃描內存,並打印發現新的未引用的對象的數量。
[KNL]
memtest=整數
設置內存測試(CONFIG_MEMTEST)的輪數。”0”表示禁止測試。僅在你確實知道這是什麼東西並且確實需要的時候再開啓。
norandmaps
默認情況下,內核會隨機化程序的啓動地址,也就是每一次分配給程序的虛擬地址空間都不一樣,主要目的是爲了防止緩衝區溢出攻擊。但是這也給程序調試增加了麻煩,此選項(相當於”echo 0 > /proc/sys/kernel/randomize_va_space”)的目的就是禁用該功能以方便調試。
[PNP]
pnp.debug=1
開啓PNP調試信息(需要內核已開啓CONFIG_PNP_DEBUG_MESSAGES選項),僅用於調試目的。也可在運行時通過 /sys/module/pnp/parameters/debug 來控制。
show_msr=CPU數
顯示啓動時由BIOS初始化的MSR(Model-Specific Register)寄存器設置。CPU數設爲”1”表示僅顯示”boot CPU”的設置。
printk.time={0|1}
是否在每一行printk輸出前都加上時間戳,僅供調試使用。默認值是”0”(不添加)
boot_delay=毫秒數
在啓動過程中,爲每一個printk動作延遲指定的毫秒數,取值範圍是0-10000,超出這個範圍將等價於”0”(無延遲)。僅用於調試目的。
pause_on_oops=秒數
當內核發生異常時,掛起所有CPU的時間。當異常信息太多,屏幕持續滾動時,這個選項就很有用處了。主要用於調試目的。
異常檢測與處理
[MCE]
mce=off
徹底禁用MCE(CONFIG_X86_MCE)
[MCE]
mce=dont_log_ce
不爲已糾正錯誤(corrected error)記錄日誌。
[MCE]
mce=容錯級別[,超時]
容錯級別(還可通過sysfs設置):
0 在出現未能糾正的錯誤時panic,記錄所有已糾正的錯誤
1(默認值) 在出現未能糾正的錯誤時panic或SIGBUS,記錄所有已糾正的錯誤
2 在出現未能糾正的錯誤時SIGBUS或記錄日誌,記錄所有已糾正的錯誤
3 從不panic或SIGBUS,記錄所有日誌。僅用於調試目的。
超時(單位是微秒[百萬分之一秒]):在machine check時等待其它CPU的時長,”0”表示不等待。
[ACPI]
erst_disable
禁用ERST(Error Record Serialization Table)支持。主要用於解決某些有缺陷的BIOS導致的ERST故障。
[ACPI]
hest_disable
禁用HEST(Hardware Error Source Table)支持。主要用於解決某些有缺陷的BIOS導致的HEST故障。
[KNL]
nosoftlockup
禁止內核進行軟死鎖檢測
[KNL]
softlockup_panic={0|1}
是否在檢測到軟死鎖(soft-lockup)的時候讓內核panic,其默認值由 CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE 確定
[KNL]
nowatchdog
禁止硬死鎖檢測(NMI watchdog)
[KNL,BUGS]
nmi_watchdog={0|panic|nopanic}
配置nmi_watchdog(不可屏蔽中斷看門狗)。更多信息可查看”lockup-watchdogs.txt”文檔。
0 表示關閉看門狗;
panic 表示出現看門狗超時(長時間沒喂狗)的時候觸發內核錯誤,通常和”panic=”配合使用,以實現在系統出現鎖死的時候自動重啓。
nopanic 正好相反,表示即使出現看門狗超時(長時間沒喂狗),也不觸發內核錯誤。
unknown_nmi_panic
在收到未知的NMI(不可屏蔽中斷)時直接panic
oops=panic
在內核oops時直接panic(而默認是僅僅殺死oops進程[這樣做會有很小的概率導致死鎖]),而且這同樣也會導致在發生MCE(CONFIG_X86_MCE)時直接panic。主要目的是和”panic=”選項連用以實現自動重啓。
[KNL]
panic=秒數
內核在遇到panic時等待重啓的行爲:
秒數>0 等待指定的秒數後重啓
秒數=0(默認值) 只是簡單的掛起,而永不重啓
秒數<0 立即重啓
時鐘(Timer)
時鐘(Timer)的功能有兩個:(1)定時觸發中斷;(2)維護和讀取當前時間。x86_64平臺常見的時鐘硬件有以下這些:
RTC(Real Time Clock) 實時時鐘的獨特之處在於,RTC是主板上一塊電池供電的CMOS芯片(精度一般只到秒級),RTC(Clock)吐出來的是”時刻”(例如”2014-2-22 23:38:44”),而其他硬件時鐘(Timer)吐出來的是”時長”(我走過了XX個週期,按照我的頻率,應該是10秒鐘)。
PIT(Programmable Interval Timer) PIT是最古老的時鐘源,產生週期性的時鐘中斷(IRQ0),精度在100-1000Hz,現在基本已經被HPET取代。
APIC Timer 這是PIT針對多CPU環境的升級,每個CPU上都有一個APIC Timer(而PIT則是所有CPU共享的),但是它經常有BUG且精度也不高(3MHz左右),所實際很少使用。
ACPI Timer(Power Management Timer) 它唯一的功能就是爲每個時鐘週期提供一個時間戳,用於提供與處理器速度無關的可靠時間戳。但其精度並不高(3.579545MHz)。
HPET(High Precision Event Timer) HPET提供了更高的精度(14.31818MHz)以及更寬的計數器(64位)。HPET可以替代前述除RTC之外的所有時鐘硬件(Timer),因爲它既能定時觸發中斷,又能維護和讀取當前時間。一個HPET包含了一個固定頻率的數值遞增的計數器以及3-32個獨立計數器,每個計數器又包含了一個比較器和一個寄存器,當兩者數值相等時就會觸發中斷。HPET的出現將允許刪除芯片組中的一些冗餘的舊式硬件。2006年之後的主板基本都已支持HPET。
TSC(Time Stamp Counter) TSC是位於CPU裏面的一個64位寄存器,與傳統的週期性時鐘不同,TSC並不觸發中斷,它是以計數器形式存在的單步遞增性時鐘。也就是說,週期性時鐘是通過週期性觸發中斷達到計時目的,如心跳一般。而單步遞增時鐘則不發送中斷,取而代之的是由軟件自己在需要的時候去主動讀取TSC寄存器的值來獲得時間。TSC的精度(納秒級)遠超HPET並且速度更快,但僅能在較新的CPU(Sandy Bridge之後)上使用。

[HW,ACPI]
acpi_skip_timer_override
用於解決某些有缺陷的Nvidia nForce2 BIOS中的計時器覆蓋問題(例如開啓ACPI後頻繁死機或時鐘故障)。
[HW,ACPI]
acpi_use_timer_override
用於解決某些有缺陷的Nvidia nForce5 BIOS中的計時器覆蓋問題(例如開啓ACPI後頻繁死機或時鐘故障)。
[APIC]
no_timer_check
禁止運行內核中時鐘IRQ源缺陷檢測代碼。主要用於解決某些AMD平臺的CPU佔用過高以及時鐘過快的故障。
pmtmr=十六進制端口號
手動指定pmtimer(CONFIG_X86_PM_TIMER)的I/O端口(16進制值),例如:pmtmr=0x508
acpi_pm_good
跳過pmtimer(CONFIG_X86_PM_TIMER)的bug檢測,強制內核認爲這臺機器的pmtimer沒有毛病。用於解決某些有缺陷的BIOS導致的故障。
[APIC]
apicpmtimer
使用pmtimer(CONFIG_X86_PM_TIMER)來校準APIC timer。此選項隱含了”apicmaintimer”。用於PIT timer徹底壞掉的場合。
[APIC]
apicmaintimer
noapicmaintimer
apicmaintimer 將APIC timer用於計時(而不是PIT/HPET中斷)。這主要用於PIT/HPET中斷不可靠的場合。
noapicmaintimer 不將APIC timer用於計時(而是使用PIT/HPET中斷)。這是默認值。但有時候依然需要明確指定。
[APIC]
lapic_timer_c2_ok
按照ACPI規範的要求,local APIC Timer 不能在C2休眠狀態下關閉,但可以在C3休眠狀態下關閉。但某些BIOS(主要是AMD平臺)會在向操作系統報告CPU進入C2休眠狀態時,實際進入C3休眠狀態。因此,內核默認採取了保守的假定:認爲 local APIC Timer 在C2/C3狀態時皆處於關閉狀態。如果你確定你的BIOS沒有這個問題,那麼可以使用此選項明確告訴內核,即使CPU在C2休眠狀態,local APIC Timer 也依然可用。
[APIC]
noapictimer
禁用CPU Local APIC Timer
enable_timer_pin_1
disable_timer_pin_1
開啓/關閉APIC定時器的PIN1,內核將儘可能自動探測正確的值。但有時需要手動指定以解決某些有缺陷的ATI芯片組故障。
clocksource={jiffies|acpi_pm|hpet|tsc}
強制使用指定的時鐘源,以代替內核默認的時鐘源。
jiffies 最差的時鐘源,只能作爲最後的選擇。
acpi_pm [ACPI]符合ACPI規範的主板都提供的硬件時鐘源(CONFIG_X86_PM_TIMER),提供3.579545MHz固定頻率,這是傳統的硬件時鐘發生器。
hpet 一種取代傳統”acpi_pm”的高精度硬件時鐘源(CONFIG_HPET),提供14.31818MHz固定頻率。2007年以後的芯片組一般都支持。
tsc TSC(Time Stamp Counter)的主體是位於CPU裏面的一個64位TSC寄存器,與傳統的以中斷形式存在的週期性時鐘不同,TSC是以計數器形式存在的單步遞增性時鐘,兩者的區別在於,週期性時鐘是通過週期性觸發中斷達到計時目的,如心跳一般。而單步遞增時鐘則不發送中斷,取而代之的是由軟件自己在需要的時候去主動讀取TSC寄存器的值來獲得時間。TSC的精度更高並且速度更快,但僅能在較新的CPU(Sandy Bridge之後)上使用。
[KNL]
highres={“on”|”off”}
啓用(默認值)還是禁用高精度定時器模式。主要用於關閉主板上有故障的高精度時鐘源。
nohpet
禁用HPET timer(CONFIG_HPET)
[HPET_MMAP]
hpet_mmap
v3.13新增,默認允許對HPET寄存器進行映射,相當於開啓了內核CONFIG_HPET_MMAP_DEFAULT選項。需要注意的是,某些包含HPET硬件寄存器的頁中同時還含有其他不該暴露給用戶的信息。
notsc
tsc=reliable
tsc=noirqtime
設置TSC時鐘源的屬性。
notsc 表示不將TSC用作”wall time”時鐘源,主要用於不能在多個CPU之間保持正確同步的SMP系統。
tsc=reliable 表示TSC時鐘源是絕對穩定的,關閉啓動時和運行時的穩定性檢查。用於在某些老舊硬件/虛擬化環境使用TSC時鐘源。
tsc=noirqtime 不將TSC用於統計進程IRQ時間。主要用於在RDTSC速度較慢的CPU上禁止內核的CONFIG_IRQ_TIME_ACCOUNTING功能。
關於”TSC時鐘源”,詳見”clocksource=”選項的說明。
中斷
常見的中斷控制器有兩種:傳統的8259A和新式的APIC,前者也被稱爲”PIC”。8259A只適合單CPU的場合,而APIC則能夠把中斷傳遞給系統中的每個CPU,從而充分挖掘SMP體系結構的並行性。所以8259A已經被淘汰了。APIC系統由3部分組成:APIC總線(前端總線)、IO-APIC(南橋)、本地APIC(CPU)。每個CPU中集成了一個本地APIC,負責傳遞中斷信號到處理器。而IO-APIC是系統芯片組中一部分,負責收集來自I/O設備的中斷信號併發送到本地APIC。APIC總線則是連接IO-APIC和各個本地APIC的橋樑。

[SMP,APIC]
noapic
禁止使用IO-APIC(輸入輸出高級可編程輸入控制器),主要用於解決某些有缺陷的BIOS導致的APIC故障。
[APIC]
nolapic
disableapic
禁止使用local APIC。主要用於解決某些有缺陷的BIOS導致的APIC故障。”nolapic”是爲了保持傳統習慣的兼容寫法,與”disableapic”的含義相同。
[APIC]
nox2apic
關閉x2APIC支持(CONFIG_X86_X2APIC)
[APIC]
x2apic_phys
在支持x2apic的平臺上使用physical模式代替默認的cluster模式。
[KNL]
threadirqs
強制線程化所有的中斷處理器(明確標記爲IRQF_NO_THREAD的除外)
[SMP,APIC]
pirq=
手動指定mp-table的設置。此選項僅對某些有缺陷的、具備多個IO-APIC的高端主板有意義。詳見Documentation/x86/i386/IO-APIC.txt文檔
[HW]
irqfixup
用於修復簡單的中斷問題:當一箇中斷沒有被處理時搜索所有可用的中斷處理器。用於解決某些簡單的固件缺陷。
[HW]
irqpoll
用於修復高級的中斷問題:當一箇中斷沒有被處理時搜索所有可用的中斷處理器,並且對每個時鐘中斷都進行搜索。用於解決某些嚴重的固件缺陷。
ACPI
高級配置與電源管理接口(Advanced Configuration and Power Interface)是提供操作系統與應用程序管理所有電源管理接口,包括了各種軟件和硬件方面的規範。2004年推出3.0規範;2009年推出4.0規範;2011年推出5.0規範。2013年之後新的ACPI規格將由UEFI論壇制定。ACPI可以實現的功能包括:電源管理;性能管理;配置與即插即用;系統事件;溫度管理;電池管理;SMBus控制器;嵌入式控制器。

[HW,ACPI]
acpi={force|off|noirq|strict|rsdt|nocmcff|copy_dsdt}
ACPI的總開關。
force 表示強制啓用ACPI(即使BIOS中已關閉);
off 表示強制禁用ACPI(即使BIOS中已開啓);
noirq 表示不要將ACPI用於IRQ路由;
strict 表示嚴格要求系統遵循ACPI規格(降低兼容性);
rsdt 表示使用老舊的RSDT(Root System Description Table)代替較新的XSDT(Extended System Description Table);
copy_dsdt 表示將DSDT(Differentiated System Description Table)複製到內存中。
更多信息可參考Documentation/power/runtime_pm.txt以及”pci=noacpi”。
[HW,ACPI]
acpi_backlight={vendor|video}
選擇屏幕背光亮度調節驅動。
video(默認值)表示使用通用的ACPI video.ko驅動(CONFIG_ACPI_VIDEO),該驅動僅可用於集成顯卡。
vendor表示使用廠商特定的ACPI驅動(thinkpad_acpi,sony_acpi等)。
詳見Documentation/acpi/video_extension.txt文檔。
[HW,ACPI]
acpi_os_name=”字符串”
告訴ACPI BIOS操作系統的名稱。
常用於哄騙有缺陷的BIOS,讓其以爲運行的是Windows系統而不是Linux系統。
“Linux” = Linux
“Microsoft Windows” = Windows 98
“Windows 2000” = Windows 2000
“Windows 2001” = Windows XP
“Windows 2001 SP2” = Windows XP SP2
“Windows 2001.1” = Windows Server 2003
“Windows 2001.1 SP1” = Windows Server 2003 SP1
“Windows 2006” = Windows Vista
“Windows 2006 SP1” = Windows Vista SP1
“Windows 2006.1” = Windows Server 2008
“Windows 2009” = Windows 7 / Windows Server 2008 R2
“Windows 2012” = Windows 8 / Windows Server 2012
“Windows 2013” = Windows 8.1 / Windows Server 2012 R2
[HW,ACPI]
acpi_osi=”字符串”
對於較新的內核(Linux-2.6.23之後)而言,當BIOS詢問內核:”你是Linux嗎?”,內核都會回答”No”,但歷史上(Linux-2.6.22及更早版本)內核會如實回答”Yes”,結果造成很多BIOS兼容性問題(主要是電源管理方面)。具體故事的細節請到內核源碼文件drivers/acpi/osl.c中搜索”The story of _OSI(Linux)”註釋。
此選項用於修改內核中的操作系統接口字符串(_OSI string)列表默認值,這樣當BIOS向內核詢問:”你是xxx嗎?”的時候,內核就可以根據修改後的列表中是否存在”xxx”回答”Yes”或”No”了,主要用於解決BIOS兼容性問題導致的故障(例如屏幕亮度調整)。
acpi_osi=”Linux”表示添加”Linux”;
acpi_osi=”!Linux”表示刪除”Linux”;
acpi_osi=!* 表示刪除所有字符串(v3.13新增),可以和多個acpi_osi=”Linux”格式聯合使用;
acpi_osi=! 表示刪除所有內置的字符串(v3.13新增),可以和多個acpi_osi=”Linux”格式聯合使用;
acpi_osi= 表示禁用所有字符串,僅可單獨使用(不能聯合使用)。
[HW,ACPI]
acpi_serialize
強制內核以串行方式執行AML(ACPI Machine Language)字節碼。用於解決某些有缺陷的BIOS導致的故障。
[ACPI]
acpi_enforce_resources={strict|lax|no}
檢查驅動程序和ACPI操作區域(SystemIO,SystemMemory)之間資源衝突的方式。
strict(默認值)禁止任何驅動程序訪問已被ACPI聲明爲”受保護”的操作區域,這是最安全的方式,可以從根本上避免衝突。
lax允許驅動程序訪問已被ACPI聲明的保護區域(但會顯示一個警告)。這可能會造成衝突,但是可以兼容某些老舊且腦殘的驅動程序(例如某些硬件監控驅動)。
no表示根本不聲明任何ACPI保護區域,也就是完全允許任意驅動程序訪問ACPI操作區域。
[ACPI]
pnpacpi=off
禁用ACPI的即插即用功能,轉而使用古董的PNPBIOS來代替。
休眠與喚醒
[HW,ACPI]
acpi_sleep={s3_bios,s3_mode,s3_beep,s4_nohwsig,old_ordering,nonvs,sci_force_enable}
ACPI休眠選項。
(1)s3_bios和s3_mode與顯卡有關。計算機從S3狀態(掛起到內存)恢復時,硬件需要被正確的初始化。這對大多數硬件都不是問題,但因爲顯卡是由BIOS初始化的,內核無法獲取必要的恢復信息(僅存在於BIOS中,內核無法讀取),所以這裏就提供了兩個選項,以允許內核通過兩種不同的方式來恢復顯卡,更多細節請參考Documentation/power/video.txt文檔。
(2)s3_beep主要用於調試,它讓PC喇叭在內核的實模式入口點被調用時發出響聲。
(3)s4_nohwsig用於關閉ACPI硬件簽名功能,某些有缺陷的BIOS會因爲這個原因導致從S4狀態(掛起到硬盤)喚醒時失敗。
(4)old_ordering用於兼容古董級的ACPI 1.0 BIOS
(5)nonvs表示阻止內核在掛起/喚醒過程中保存/恢復ACPI NVS內存信息,主要用於解決某些有缺陷的BIOS導致的掛起/喚醒故障。
(6)sci_force_enable表示由內核直接設置SCI_EN(ACPI模式開關)的狀態,主要用於解決某些有缺陷的BIOS導致的從S1/S3狀態喚醒時的故障。
[HIBERNATION]
noresume
禁用內核的休眠到硬盤功能(CONFIG_HIBERNATION),也就是不從先前的休眠狀態中恢復(即使該狀態已經被保存在了硬盤的swap分區上),並且清楚先前已經保存的休眠狀態(如果有的話)。
[HIBERNATION]
hibernate={noresume|nocompress}
設置休眠/喚醒屬性:
noresume 表示禁用喚醒,也就是在啓動過程中無視任何已經存在的休眠鏡像,完全重新啓動。
nocompress 表示禁止對休眠鏡像進行壓縮/解壓。
[HIBERNATION]
resume={ /dev/swap | PARTUUID=uuid | major:minor | hex }
告訴內核被掛起的內存鏡像存放在那個磁盤分區(默認值是CONFIG_PM_STD_PARTITION)。
假定內存鏡像存放在”/dev/sdc15”分區上,該分區的 UUID=0123456789ABCDEF ,其主設備號是”8”,次設備號是”47”,那麼這4種表示法應該分別這樣表示:
resume=/dev/sdc15 (這是內核設備名稱,有可能與用戶空間的設備名稱不同)
resume=PARTUUID=0123456789ABCDEF
resume=08:47
resume=082F
[HIBERNATION]
resume_offset=整數
指定swap header所在位置的偏移量(單位是PAGE_SIZE),偏移量的計算基準點是”resume=”分區的起點。
僅在使用swap文件(而不是分區)的時候才需要此選項。詳見Documentation/power/swsusp-and-swap-files.txt文檔
[HIBERNATION]
resumedelay=秒數
在讀取resume文件(設備)之前延遲的秒數,主要用於等待那些反應速度較慢的異步檢測的設備就緒(例如USB/MMC)。
[HIBERNATION]
resumewait
在resume設備沒有就緒之前無限等待,主要用於等待那些反應速度較慢的異步檢測的設備就緒(例如USB/MMC)。
溫度控制
[HW,ACPI]
thermal.act=攝氏度
-1 禁用所有”主動散熱”標誌點(active trip point)
正整數 強制設置所有的最低”主動散熱”標誌點的溫度值,單位是攝氏度。
詳見Documentation/thermal/sysfs-api.txt文檔。
[HW,ACPI]
thermal.psv=攝氏度
-1 禁用所有”被動散熱”標誌點(passive trip point)
正整數 強制設置所有的”被動散熱”標誌點的溫度值,單位是攝氏度。
詳見Documentation/thermal/sysfs-api.txt文檔。
[HW,ACPI]
thermal.crt=攝氏度
-1 禁用所有”緊急”標誌點(critical trip point)
正整數 強制設置所有的”緊急”標誌點的溫度值,單位是攝氏度。
詳見Documentation/thermal/sysfs-api.txt文檔。
[HW,ACPI]
thermal.nocrt=1
禁止在ACPI熱區(thermal zone)溫度達到”緊急”標誌點時採取任何動作。
[HW,ACPI]
thermal.off=1
徹底關閉ACPI熱量控制(CONFIG_ACPI_THERMAL)
[HW,ACPI]
thermal.tzp=整數
設置ACPI熱區(thermal zone)的輪詢速度:
0(默認值) 不輪詢
正整數 輪詢間隔,單位是十分之一秒。
CPU節能
[KNL]
nohz={on|off}
啓用/禁用內核的dynamic ticks特性。默認值是”on”。
[KNL,BOOT]
nohz_full=CPU列表
在內核”CONFIG_NO_HZ_FULL=y”的前提下,指定哪些CPU核心可以進入完全無滴答狀態。
“CPU列表”是一個逗號分隔的CPU編號(從0開始計數),也可以使用”-“界定一個範圍。例如”0,2,4-7”等價於”0,2,4,5,6,7”
注意“boot CPU”(通常都是”0”號CPU)會無條件的從列表中剔除。(2)這裏列出的CPU編號必須也要同時列進”rcu_nocbs=…”選項中。
[HW,ACPI]
processor.nocst
不使用_CST方法檢測C-states,而是用老舊的FADT方法檢測。
[HW,ACPI]
processor.max_cstate={0|1|2|3|4|5|6|7|8|9}
無視ACPI表報告的值,強制指定CPU的最大C-state值(必須是一個有效值):C0爲正常狀態,其他則爲不同的省電模式(數字越大表示CPU休眠的程度越深/越省電)。”9”表示無視所有的DMI黑名單限制。
[KNL,HW,ACPI]
intel_idle.max_cstate=[0|正整數]
設置intel_idle驅動(CONFIG_INTEL_IDLE)允許使用的最大C-state深度。”0”表示禁用intel_idle驅動,轉而使用通用的acpi_idle驅動(CONFIG_CPU_IDLE)
idle=poll
idle=halt
idle=nomwait
對CPU進入休眠狀態的額外設置。
poll 從根本上禁用休眠功能(也就是禁止進入C-states狀態),可以略微提升一些CPU性能,但是卻需要多消耗許多電力,得不償失。不推薦使用。
halt 表示直接使用HALT指令讓CPU進入C1/C1E休眠狀態,但是不再繼續進入C2/C3以及更深的休眠狀態。此選項兼容性最好,喚醒速度也最快。但是電力消耗並不最低。
nomwait 表示進入休眠狀態時禁止使用CPU的MWAIT指令。MWAIT是專用於Intel超線程技術的線程同步指令,有助於提升CPU的超線程效能,但對於不具備超線程技術的CPU沒有意義。
[提示]可以同時使用halt和nomwait,也就是”idle=halt idle=nomwait”(但不是:idle=halt,nomwait)
intel_pstate=disable
禁用 Intel CPU 的 P-state 驅動(CONFIG_X86_INTEL_PSTATE),也就是Intel CPU專用的頻率調節器驅動
PCI與PCIE
[PCI]
pci=選項[,選項…]
指定各種PCI子系統選項:
earlydump 在內核做出任何改變之前,首先轉儲出PCI配置空間。主要用於調試目的。
off 不檢測PCI總線,也就是關閉所有PCI設備。
conf1 強制使用”PCI配置機制1”(目前的事實標準)
conf2 強制使用”PCI配置機制2”(已被拋棄的老古董)
noaer [PCIE]禁止使用CONFIG_PCIEAER功能(PCI Express Root Port Advanced Error Reporting)
nodomains 禁止支持多個PCI root domain(也就是PCI總線域[PCI segment])
nommconf 禁止使用通過MMCONFIG(CONFIG_PCI_MMCONFIG)方式訪問PCI配置空間,MMCONFIG是PCI Express引入的新總線枚舉方式。
check_enable_amd_mmconf 在 AMD family 10h CPU 上檢查並啓用正確配置的MMIO以訪問PCI配置空間
nomsi [MSI]在全系統範圍內禁止MSI中斷(CONFIG_PCI_MSI)的使用
noioapicquirk [APIC]禁止屏蔽任何boot中斷(CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS),以確保boot IRQ永遠可用。應該永遠不需要使用此選項。
ioapicreroute [APIC]允許將boot IRQ重新路由到主IO-APIC(相當於開啓CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS),用於修復某些芯片組bug(在某些情況下會發送多餘的”boot IRQ”)。
noioapicreroute [APIC]禁止將boot IRQ重新路由到主IO-APIC(相當於關閉CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS),不建議使用此項。
rom 爲擴展ROM分配地址空間。使用此選項要小心,因爲某些設備在ROM與其它資源之間共享地址譯碼器。
norom 即使BIOS沒有爲擴展ROM分配地址空間,也禁止內核爲擴展ROM分配地址空間。
nobar 即使BIOS沒有爲BAR分配地址空間,也禁止內核爲BAR分配地址空間。
irqmask=0xMMMM 指定允許自動分配到PCI設備的IRQ位掩碼,目的是爲了避免使用那些被ISA設備佔用的IRQ。
pirqaddr=0xAAAAA 如果PIRQ表(通常情況下由BIOS生成)在F0000h-100000h範圍之外,此選項可用於明確指定其物理地址。
lastbus=N 通過掃描N號總線來掃描全部總線。如果內核不能找到第二條總線,可以通過此方法明確告知其位置。
assign-busses 總是使用內核自己生成的PCI總線號碼替代固件自己生成的值。
usepirqmask 優先使用可能存在於BIOS $PIR表中的IRQ掩碼。某些有缺陷的BIOS需要這個選項(例如HP Pavilion N5400和Omnibook XE3筆記本)。此選項僅在noioapicreroute(相當於關閉CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS)的前提下有效。
noacpi 不爲IRQ路由或PCI掃描使用ACPI
use_crs 使用來自ACPI的PCI主橋的窗口信息。在2008年之後的BIOS上,這是默認值,如果需要明確使用此項,請當做bug上報開發者。
nocrs 忽略來自ACPI的PCI主橋的窗口信息,如果需要明確使用此項,請當做bug上報開發者。
routeirq 對所有PCI設備使用IRQ路由。這個通常是由內核的pci_enable_device()函數完成,所以此項僅爲那些忘記調用此函數的驅動提供的臨時解決方案。
skip_isa_align 不對齊ISA IO起始地址,這樣就可以處理更多的PCI卡
noearly 不做任何”early type 1”掃描,這樣許多針對主板缺陷的檢測將被禁止,同時某些IOMMU驅動也會失效。僅用於解決某些有缺陷的主板故障。
bfsort 按照寬度優先(breadth-first)的順序對PCI設備進行排序。目的是爲了以與2.4內核兼容的方式獲取設備序號。
nobfsort 不按寬度優先(breadth-first)的順序對PCI設備進行排序。
pcie_bus_tune_off 不對PCIe MPS(Max Payload Size)進行調整,而是使用BIOS配置好的默認值。
pcie_bus_safe 將每個設備的MPS都設爲root complex下所有設備支持的MPS中的最大值
pcie_bus_perf 將設備的MPS設爲其上級總線允許的最大MPS,同時將MRRS(Max Read Request Size)設爲能支持的最大值(但不能大於設備或總線所支持的MPS值)
pcie_bus_peer2peer 將每個設備的MPS都設爲最安全的”128B”,以確保支持所有設備之間的點對點DMA,同時也能保證熱插入(hot-added)設備能夠正常工作,但代價是可能會造成性能損失。
cbiosize=nn[KMG] 從CardBus橋的IO窗口中保留的固定長度的總線空間(bus space),默認值是256B。
cbmemsize=nn[KMG] 從CardBus橋的內存窗口中保留的固定長度的總線空間(bus space),默認值是64MB。
resource_alignment=[對齊規則@][域:]總線:插槽.功能[; …] 爲重新分配已對齊的內存資源指定對齊方式與設備。如果未指定對齊規則,那麼將使用PAGE_SIZE作爲對齊規則。也可以通過指定PCI-PCI橋來擴展資源窗口(resource windows)。
ecrc={bios|on|off} 啓用/禁用PCIe ECRC(事務層的端對端CRC校驗)。默認值是”bios”(使用BIOS/固件的設定)。
hpiosize=nn[KMG] 爲熱插拔橋的IO窗口保留的固定總線空間的大小,默認值是256B。
hpmemsize=nn[KMG] 爲熱插拔橋的內存窗口保留的固定總線空間的大小,默認值是2MB。
realloc={on|off} 當BIOS分配的PCI橋資源太小而無法滿足所有子設備的需求時,是否由內核重新分配PCI橋資源。沒有默認值(內核的默認值爲”undefined”)
realloc 等價於”realloc=on”
noari 不使用PCIe ARI
pcie_scan_all 掃描所有可能的PCIe設備。默認只在每個PCIe下游端口掃描一個設備。
[PCIE]
pcie_hp=nomsi
禁止PCIe本地熱插拔使用MSI(CONFIG_PCI_MSI),這將導致所有PCIe端口使用INTx中斷提供熱插拔服務。
[PCIE]
pcie_ports={auto|native|compat}
PCIe端口處理方式:
auto 由BIOS來決定是否使用關聯在PCIe端口上的本地PCIe服務(PME, hot-plug, AER)
native 無條件的使用關聯在PCIe端口上的本地PCIe服務(PME, hot-plug, AER)
compat 禁用PCIe端口驅動,同時將PCIe端口當做PCI-to-PCI橋處理。
[PCIE]
pcie_aspm={off|force}
強制啓用/禁用PCIe Active State Power Management(CONFIG_PCIEASPM)。內核的默認值取決於內核”Default ASPM policy”的配置。
off 強制禁用
force 即使設備聲明不支持ASPM也強制啓用(可能會導致系統鎖死)。
[PCIE]
pcie_pme=nomsi
禁止本地PCIe PME信號使用MSI(CONFIG_PCI_MSI),這將導致所有PCIe root端口使用INTx中斷提供所有服務。
LIBATA
[LIBATA]
libata.noacpi
在libata驅動休眠/喚醒過程中禁止使用ACPI。主要用於解決某些有缺陷的BIOS導致的硬盤假死問題。
[LIBATA]
libata.dma=整數
控制DMA特性的使用
libata.dma=0 表示完全禁止所有SATA/PATA端口使用DMA
libata.dma=1 表示僅允許SATA/PATA硬盤使用DMA
libata.dma=2 表示僅允許ATAPI(CDROM)使用DMA
libata.dma=4 表示僅允許CF卡使用DMA
上述1,2,4實際上是位掩碼,可以組合使用,例如 libata.dma=3 表示允許硬盤和CDROM使用DMA,但是禁止CF卡使用DMA
[LIBATA]
libata.ignore_hpa={0|1}
是否忽略HPA(Host Protected Area)的限制。”0”(默認值)表示不忽略;”1”表示忽略(也就是可以使用整個磁盤空間)
[LIBATA]
libata.force=PORT[.DEVICE]:VAL,PORT[.DEVICE]:VAL,…
手動強制指定libata的配置。
其中的”PORT[.DEVICE]”是libata驅動在控制檯上以相同格式顯示出來的ATA ID字符串(PORT和DEVICE都是十進制數字),下面是兩個實例(“1.00”,”2.00”):
ata1.00: ATAPI: VBOX CD-ROM, 1.0, max UDMA/133
ata2.00: ATA-6: VBOX HARDDISK, 1.0, max UDMA/133
如果不指定DEVICE部分,那麼就表示適用於該PORT端口上的所有設備。
VAL部分用來強制設定設備屬性:
40c, 80c, short40c, unk, ign, sata 這些都用於指定線纜類型
1.5Gbps, 3.0Gbps 這些都用於指定SATA連接速度
noncq, ncq 關閉還是開啓NCQ功能
dump_id 轉儲IDENTIFY數據
pio[0-7], mwdma[0-4], udma0-7 數據傳輸模式
nohrst, nosrst, norst 只禁止硬重置,只禁止軟重置,同時禁止硬重置和軟重置
rstonce 在熱拔連接恢復(hot-unplug link recovery)過程中僅嘗試一次重置
atapi_dmadir 開啓 ATAPI DMADIR bridge 支持
disable 禁用該設備
鍵盤/鼠標/觸摸板
[HW]
atkbd.set={2|3}
設置atkbd驅動(CONFIG_KEYBOARD_ATKBD)的鍵盤類型:2(默認值)表示AT鍵盤;3 表示PS/2鍵盤。
[HW]
atkbd.reset
在初始化AT或PS/2鍵盤時重置鍵盤狀態。常用於解決從休眠狀態喚醒後鍵盤失效的故障。
[HW]
atkbd.softraw={0|1}
當鍵盤按鍵被按下時,是返回原始的掃描碼(Scancode)還是經過轉換之後的鍵碼(Keycode)。常用於解決某些功能鍵(例如Fn鍵)故障。
0 表示返回原始的掃描碼(Scancode)
1(默認值)表示返回轉換之後的鍵碼(Keycode)
[USBHID]
usbhid.mousepoll=毫秒數
USB鼠標的輪詢時間間隔,單位是毫秒。默認值是”10”,也就是每秒輪詢100次,相當於100Hz
[MOUSE]
mousedev.tap_time=毫秒數
手指觸碰和離開觸摸板的最大時間間隔,只有小於此間隔的觸碰纔會被當成鼠標左鍵單擊。此選項僅對工作在絕對模式的觸摸板有意義。
[MOUSE]
mousedev.xres=正整數
mousedev.yres=正整數
觸摸板的水平(X)/垂直(Y)方向的分辨率。
USB
[USB]
nousb
禁用USB子系統(CONFIG_USB_SUPPORT)
[USB]
usbcore.authorized_default={-1|0|1}
USB設備的默認授權規則:
-1(默認值) 對除無線USB之外的設備默認授權
0 對所有設備都默認不授權
1 對所有設備都默認授權
[USB]
usbcore.autosuspend=秒數
讓USB設備(新檢測到的設備以及空閒設備)進入自動休眠前的延遲秒數。默認爲2秒。
如果將秒數設爲負數,則表示永不進入自動休眠狀態。
[USB]
usbcore.initial_descriptor_timeout=毫秒數
等待設備迴應初始化64位USB_REQ_GET_DESCRIPTOR請求的超時時間。默認值是”5000”,也就是5秒。
[USB]
usbcore.blinkenlights={0|1}
是否讓所有的USB集線器(HUB)上的LED指示燈閃爍。默認值”0”表示不閃爍,”1”表示閃爍。
[USB]
usbcore.usbfs_snoop={0|1}
是否在在日誌中記錄所有的usbfs traffic信息。默認值”0”表示不記錄,”1”表示記錄。
[USB]
usbcore.old_scheme_first={0|1}
是否優先使用老舊的USB設備初始化方法。默認值”0”表示不優先使用。
[USB]
usbcore.use_both_schemes={0|1}
是否在第一種USB設備初始化方法失敗之後,繼續嘗試第二種方法。默認值”1”表示繼續嘗試第二種方法。
[USB]
usbcore.usbfs_memory_mb=[0-2047]
由usbfs分配的緩存上限。取值範圍是[0-2047],默認值是”16”,單位是”MB”。
[UMS]
usb-storage.delay_use=秒數
在掃描新USB存儲設備上的邏輯單元(Logical Unit)前暫停的秒數。默認值是”5”秒。
[UMS]
usb-storage.quirks=VID:PID:Flags[,VID:PID:Flags]…
設置一系列的修正項(quirk),用於增補或者改寫內核內置的unusual_devs列表內容。該列表用於修正各種有缺陷的USB存儲設備的怪毛病。
多個修正項之間用逗號分隔,修正項的格式是”VID:PID:Flags”,其中VID和PID的含義分別是4位16進制數表示的”Vendor ID”與”Product ID”。
而Flags則是一組字符的組合,其中的每個字符都對應一個具有特定含義的修正(quirk)標記:
a = SANE_SENSE (收集超過18字節的傳感器數據)
b = BAD_SENSE (不收集超過18字節的傳感器數據)
c = FIX_CAPACITY (無條件的將設備報告的扇區數(容量)減少一個扇區)
d = NO_READ_DISC_INFO (不使用 READ_DISC_INFO 命令)
e = NO_READ_CAPACITY_16 (不使用 READ_CAPACITY_16 命令)
h = CAPACITY_HEURISTICS (如果設備報告的扇區數(容量)是奇數,那麼就減少一個扇區)
i = IGNORE_DEVICE (不綁定此設備)
l = NOT_LOCKABLE (不要嘗試鎖定/解鎖可彈出媒體)
m = MAX_SECTORS_64 (每次傳輸最大不超過64個扇區(32KB)的數據)
n = INITIAL_READ10 (強制重試初始的 READ(10) 命令(如果最初一次讀取失敗的話))
o = CAPACITY_OK (完全信任設備報告的扇區數(容量))
p = WRITE_CACHE (默認開啓設備寫入緩存[不怕數據丟失的風險])
r = IGNORE_RESIDUE (不相信設備報告的[容量]剩餘值)
s = SINGLE_LUN (此設備只有一個邏輯單元(Logical Unit))
w = NO_WP_DETECT (不檢測設備是否有寫保護)
例如:usb-storage.quirks=0419:aaf5:rl,0421:0433:rc
[USB]
uhci-hcd.ignore_oc={0|1}
是否忽略”電流超限”(overcurrent)事件。
0(默認值) 不忽略
1 忽略。某些有缺陷的主板會在USB端口未連接任何設備時,報告很多虛假的”電流超限”事件。設爲”1”之後可以避免在內核日誌中出現大量的”電流超限”警告,但同時,真實的”電流超限”事件也會被一併忽略。
IOMMU
IOMMU非常類似於MMU,主要有如下功能:(1)IO地址轉換[在64位系統上支持32位設備];(2)分散-聚集(scatter-gather)支持[簡化驅動程序的編寫];(3)DMA重映射與IRQ重映射[簡化了IO設備的虛擬化]。
Linux內核當前的DMA映射有如下4種具體實現:
(1)在內存不足3G的機器上,根本不使用任何IOMMU功能,因爲根本沒必要。內核消息:”PCI-DMA: Disabling IOMMU”
(2)基於GART(CONFIG_GART_IOMMU)的硬件IOMMU。內核消息:”PCI-DMA: using GART IOMMU”
(3)如果內存大於3G同時機器上又沒有IOMMU硬件(或者用了”iommu=soft”),那麼就使用軟件模擬的IOMMU(CONFIG_BOUNCE)。內核消息:”PCI-DMA: Using software bounce buffering for IO (SWIOTLB)”
(4)基於IBM Calgary硬件的IOMMU,僅用於IBM pSeries/xSeries系列服務器。內核消息:”PCI-DMA: Using Calgary IOMMU”

[IOMMU]
iommu={off,force,noforce,soft}
通用IOMMU設置:
off 徹底關閉IOMMU功能
force 強制使用硬件IOMMU,即使硬件可能有缺陷(例如VIA芯片組)或者根本沒有必要這樣做(例如內存不足3G)。
noforce(默認) 在內存不足3G的機器上,不使用硬件IOMMU,因爲根本沒有必要。
soft(Intel平臺的默認值) 使用通過軟件模擬的IOMMU(SWIOTLB),同時禁止使用硬件IOMMU(即使存在)。
[IOMMU]
iommu=[SIZE][,allowed][,fullflush|nofullflush][,leak[=NUM]][,memaper[=N]|noaperture][,noagp][,merge|nomerge][,forcesac][,panic][,allowdac|nodac][,calgary]
僅適用於硬件IOMMU(GART與Calgary)的設置:
SIZE 重映射區域的大小,單位是字節。
allowed 含義與”force”相同,即使硬件可能有缺陷(例如VIA芯片組)也強制使用硬件IOMMU
fullflush(默認) 每次分配時都刷新IOMMU
nofullflush 不刷新IOMMU
leak=NUM 開啓IOMMU泄漏跟蹤(CONFIG_IOMMU_LEAK),NUM是的泄漏頁數(默認值是20)。
memaper=N 在RAM中分配的固有窗口(own aperture)的大小,算法是 2N*32MB,N的默認值是”1”,也就是64MB。
noaperture 禁止IOMMU使用AGP的”aperture”。
noagp 不初始化AGP驅動,使用完全的”aperture”。
merge 強制”scatter-gather”合併,隱含了”force”,這是一個實驗性選項。
nomerge 禁止”scatter-gather”合併
forcesac 對於少於40位的掩碼強制使用單地址週期(single-address cycle),這是一個實驗性選項。
panic 當IOMMU益處時,允許panic
allowdac 將32位PCI地址用兩個時鐘週期推入64位地址,這就是DAC的作用。
nodac 禁用DAC,也就是所有4GB以上的DMA將強制通過IOMMU(硬件的或模擬的)
calgary 使用IBM Calgary IOMMU
swiotlb=頁數[,force]
僅適用於軟件IOMMU(CONFIG_BOUNCE)的設置:
頁數 爲”IO bounce buffer”預先保留的頁數,每個頁的大小是128K
force 強制所有IO都透過軟件IOMMU
[AMD-IOMMU]
amd_iommu={fullflush|off|force_isolation}
向AMD IOMMU驅動(CONFIG_AMD_IOMMU)傳遞選項
fullflush 表示當IO/TLB項被取消映射的時候立即刷新IO/TLB項(嚴格模式,速度較慢),否則將僅在IO/TLB項被重用之前進行刷新(寬鬆模式,速度更快)
off 表示徹底禁用AMD IOMMU功能
force_isolation 表示爲所有設備強制啓用IOMMU隔離(映射),這樣IOMMU驅動就不再需要自己去發起隔離請求。注意:此選項不會覆蓋”iommu=pt”
[Intel-IOMMU]
intel_iommu={on,off,igfx_off,forcedac,strict,sp_off}
Intel-IOMMU驅動(CONFIG_INTEL_IOMMU)的主要功能就是DMA重映射,該選項用於設置其特性。
on 開啓Intel-IOMMU驅動
off 關閉Intel-IOMMU驅動
igfx_off 關閉Intel集成顯卡的DMA重映射功能(默認值爲開啓)
forcedac 強制PCI設備使用DAC,而禁止進行地址轉換(默認值爲允許)
strict 禁止批量刷寫IOTLB(默認值爲允許)
sp_off 關閉super page支持(默認值爲開啓)
[Intel-IOMMU]
intremap={on,off,nosid,no_x2apic_optout}
設置中斷重映射功能:
on(默認值)開啓中斷重映射
off 關閉中斷重映射
nosid 重映射時不對SID(Source ID)做檢查
no_x2apic_optout 無視BIOS的設置,強制禁用x2APIC特性,主要用於解決某些對x2APIC支持有缺陷的BIOS導致的故障
虛擬化
[PV_OPS]
noreplace-paravirt
禁止使用內核通用的半虛擬化接口paravirt_ops,主要用於解決某些在Virtual PC上安裝或運行Linux的故障。
[VMMIO]
virtio_mmio.device=size@baseaddr:irq[:id]
實例化virtio-mmio設備(CONFIG_VIRTIO_MMIO)。可以多次使用以實例化多個設備。
size 大小(可以使用K,M,G後綴)
baseaddr 物理基準地址(physical base address)
irq 中斷號(將會被傳遞給request_irq())
id(可選) platform設備號(device id)
例子:virtio_mmio.device=1K@0x100b0000:48:7
[KVM]
kvm.ignore_msrs={0|1}
是否忽略客戶機對未經處理的MSR(unhandled MSR)的訪問。”0”(默認值)表示不忽略但是會注入#GP;”1”表示忽略。
[KVM]
kvm.mmu_audit={0|1}
是否允許在運行時對KVM MMU進行審計。”0”(默認值)表示禁止審計;”1”表示允許審計。
[KVM,AMD]
kvm-amd.nested={0|1}
是否允許嵌套虛擬化(在虛擬機內再創建虛擬機)。”0”表示禁止嵌套;”1”(默認值)表示允許嵌套。
[KVM,AMD]
kvm-amd.npt={0|1}
是否允許客戶機使用嵌套頁表(Nested Page Table)。”0”表示禁止使用;”1”(默認值)表示允許使用。
[KVM,Intel]
kvm-intel.ept={0|1}
是否允許客戶機使用擴展頁表(Extended Page Table)。”0”表示禁止使用;”1”(默認值)表示允許使用。
[KVM,Intel]
kvm-intel.emulate_invalid_guest_state={0|1}
是否允許仿真無效的客戶機狀態。”0”(默認值)表示禁止仿真;”1”表示允許仿真。
[KVM,Intel]
kvm-intel.flexpriority={0|1}
是否允許使用FlexPriority技術(TPR[Task Priority Register] shadow)。”0”表示禁止使用;”1”(默認值)表示允許使用。
[KVM,Intel]
kvm-intel.nested={0|1}
是否允許VMX嵌套(nVMX)。”0”(默認值)表示禁止;”1”表示允許。
[KVM,Intel]
kvm-intel.unrestricted_guest={0|1}
是否允許使用”unrestricted guest”技術。”0”表示禁止使用;”1”(默認值)表示允許使用。
[KVM,Intel]
kvm-intel.vpid={0|1}
是否允許使用”Virtual Processor Identification”(tagged TLB)技術。”0”表示禁止使用;”1”(默認值)表示允許使用。
內存
[KNL,BOOT]
mem=nn[KMG]
強制指定內核使用多少數量的內存。僅在你想限定內存使用量時,才需要指定這個選項。同時爲了避免PCI設備使用指定範圍之外的內存,你還應該配合”memmap=”一起使用。
[KNL]
memmap=exactmap
表示將要使用隨後的”memmap=…”等選項進行精確的E820內存映射(因爲有時候E820報告的並不準確),同時禁止內核進行任何自動的探測。比如對於一個4G內存的機器可能是:”memmap=exactmap memmap=640K@0 memmap=4095M@1M”。
[KNL]
memmap=nn[KMG]@ss[KMG]
強制只使用從ss開始的nn長度的特定內存區域。可以多次使用以指定多個區域。
[KNL,ACPI]
memmap=nn[KMG]#ss[KMG]
強制將從ss開始的nn長度的特定內存區域標記爲ACPI數據。
[KNL,ACPI]
memmap=nn[KMG]$ss[KMG]
強制保留(不使用)從ss開始的nn長度的特定內存區域。
[KNL,BUGS]
reserve=起點,長度[,起點,長度]…
禁止設備驅動程序自動探測某些iomem區域,因爲某些設計不良的硬件會導致自動探測失敗或出錯。此外,還可以用於人爲禁止內核初始化某些端口上的設備。
內核會將此處指定的iomem區域標記爲”reserved”(意爲”已經在此處找到設備”),從而將該區域保留。
因爲設備驅動不應該去偵測標記爲”reserved”的區域,除非另一個啓動選項明確地指示它這樣做,所以此選項經常和其它啓動選項一起使用:
用”reserve=”保留一段區域禁止所有其他驅動的探測,同時再明確指定一個驅動去檢測被保留的區域。例如:
reserve=0x300,32 blah=0x300
的意思是:除了允許”blah”驅動探測 0x300 之外,禁止任何其他驅動探測 0x300-0x31f 區域。
絕大部份的機器都不需要此選項。只有真正有缺陷的硬件或特殊情況纔會需要使用它。
[注意]每個”reserve=”選項最多可以指定4個保留區域,如果你有異常複雜的需求,可以使用多重”reserve=”來指定。
reservelow=nn[K]
設置爲BIOS保留的底端地址空間數量。
memory_corruption_check={0|1}
是否開啓低位內存髒數據檢查(CONFIG_X86_CHECK_BIOS_CORRUPTION)。某些有bug的BIOS經常會在執行系統休眠/喚醒之類動作的時候,破壞內存中前64k的內容。如果始終檢查到錯誤,那麼就應該通過”memmap=”選項來避免使用這段內存。
memory_corruption_check_size=字節數
低位內存髒數據檢查(CONFIG_X86_CHECK_BIOS_CORRUPTION)的內存範圍。默認值是”64K”,表示”0-64K”這個內存範圍。
memory_corruption_check_period=秒數
低位內存髒數據檢查(CONFIG_X86_CHECK_BIOS_CORRUPTION)的週期。默認值是60秒。設爲”0”則表示禁止這種週期性的檢查。
[KNL,BOOT]
vmalloc=nn[KMG]
強制指定vmalloc區域的大小。可用於增加vmalloc區域的最小尺寸(x86默認128MB),也可以用於減少vmalloc的大小,增加更多的空間用於直接映射內核RAM。
[SLUB]
slub_min_order=整數
slub_max_order=整數
SLUB頁塊最小與最大order數(默認值分別是”0”與”3”),當然slub_min_order必須小於slub_max_order。每一個slab需要2order個物理頁框。過高的值可能會導致內存溢出錯誤。詳見Documentation/vm/slub.txt
[SLUB]
slub_min_objects=整數
每個slab的最小object總數目(默認值是”4”)。詳見Documentation/vm/slub.txt
[SLUB]
slub_nomerge
禁止合併大小相近的多個slab,主要用於調試目的。
[KNL]
dhash_entries=正整數
設置內核目錄項緩存中哈希表默認項數。僅供內核專家使用。
[KNL]
ihash_entries=正整數
內核會在內存中緩存一定數量的inode結構來加速文件訪問,每個inode對應一個文件(不同於文件系統中的inode概念),包含文件訪問權限/屬主/組/大小/生成時間/訪問時間/最後修改時間等信息。這些inode保存在一個哈希表中。
這個值用於指定這個哈希表的最大項數。你可以根據自己硬盤上可能被訪問的文件數量對默認值進行調整(注意需要考慮哈希值的碰撞)。僅供內核專家使用。
[KNL]
transparent_hugepage={always|madvise|never}
設置透明大內存頁(CONFIG_TRANSPARENT_HUGEPAGE)的默認用法:
always 表示總是對所有應用程序啓用透明大內存頁支持
madvise 表示僅對明確要求該特性的程序啓用
never 表示徹底禁用。
其默認值由內核的編譯時設置決定。詳見”Documentation/vm/transhuge.txt”文檔。
[HW]
default_hugepagesz={2M|1G}
默認的HugeTLB頁大小。若未指定,那麼其默認值就是CPU自身的默認值。
大多數現代計算機體系結構提供對多頁面大小的支持,比如X86_64支持4K和2M(要求CPU帶有”pse”標記)以及1G(要求CPU帶有”pdpe1gb”標記)。
因此Linux將物理內存劃分成許多固定大小的頁面(默認爲4K),每個頁對應一個page結構,這些結構組成一個mem_map[]數組。TLB(Translation Lookaside Buffer)是虛擬地址到物理地址的翻譯緩衝區,這種緩衝區在處理器上是很寶貴的,操作系統總是嘗試將有限的TLB資源發揮到極致。特別是能夠輕鬆獲得若干G內存的時候(大於4G),這種優化就顯得尤爲關鍵。而HugeTLB特性則允許將某些頁的尺寸增大到2MB或1GB,從而大大減小TLB的尺寸,提高緩衝區的命中率,進而提升內存性能。
[HW]
hugepagesz={2M|1G}
指定HugeTLB頁的大小,通常與”hugepages=”聯合使用(可使用多次),爲不同尺寸的大頁分別預留不同的數量。
例如:hugepagesz=2M hugepages=128 hugepagesz=1G hugepages=8
注意:1GB的大頁只能在命令行上使用”hugepages=”預先分配,且分配之後不可在運行時釋放。
[HW]
hugepages=正整數
在啓動時分配的HugeTLB頁數量,僅在內核開啓了CONFIG_HUGETLBFS之後有效。
gbpages
nogbpages
是否允許內核頁表對大小爲1GB的Hugepages進行直接映射(CONFIG_DIRECT_GBPAGES)。當”CONFIG_DIRECT_GBPAGES=y”時,默認值是”gbpages”。
vdso={0|1|2}
vdso=0 禁用VDSO(Virtual Dynamic Shared Object)映射
vdso=1 啓用VDSO(Virtual Dynamic Shared Object)映射,這是”CONFIG_COMPAT_VDSO=n”時的默認值。
vdso=2 將VDSO(Virtual Dynamic Shared Object)映射到舊式的確定性地址,這是”CONFIG_COMPAT_VDSO=y”時的默認值。
vdso32={0|1|2}
vdso32=0 禁用32位VDSO(Virtual Dynamic Shared Object)映射
vdso32=1 啓用32位VDSO(Virtual Dynamic Shared Object)映射,這是”CONFIG_COMPAT_VDSO=n”時的默認值。
vdso32=2 將32位VDSO(Virtual Dynamic Shared Object)映射到舊式的確定性地址,這是”CONFIG_COMPAT_VDSO=y”時的默認值。
MTRR與PAT
enable_mtrr_cleanup
disable_mtrr_cleanup
開啓/關閉MTRR cleanup(CONFIG_MTRR_SANITIZER)特性。
mtrr_chunk_size=nn[KMG]
用於”MTRR cleanup”(CONFIG_MTRR_SANITIZER)功能,設置允許的最大連續塊尺寸(也就是uncacheable項)。
mtrr_gran_size=nn[KMG]
用於”MTRR cleanup”(CONFIG_MTRR_SANITIZER)功能,設置MTRR塊的粒度(每塊的大小)。默認值是”1”。較大的值可以防止小的對齊耗盡MTRR。
mtrr_spare_reg_nr=N
用於”MTRR cleanup”(CONFIG_MTRR_SANITIZER)功能,設置備用MTRR項的編號。也就是告訴內核reg0N可以被清理或改寫(參見”/proc/mtrr”文件),默認值是”1”。
nopat
禁用PAT支持(CONFIG_X86_PAT)。主要用於解決某PAT故障導致的無法正常啓動或者顯卡驅動不能正常工作的問題。
圖形與顯示
[AGP]
agp={off|try_unsupported}
off 表示關閉內核的AGP(CONFIG_AGP)支持;
try_unsupported 表示嘗試驅動那些不受支持的芯片(可能會導致系統崩潰或數據錯誤)
[HW,DRM]
gamma=浮點數
設置顯示器的Gamma值。
video.brightness_switch_enabled={0|1}
[背景知識]如果ACPI video.ko驅動(CONFIG_ACPI_VIDEO)能夠收到用戶通過鍵盤熱鍵觸發的ACPI事件(這需要固件的幫助),video.ko將會把收到的ACPI事件轉化爲一個”key”類型輸入事件,並通過其創建的輸入設備發送到用戶空間,這樣用戶空間的工具就可以通過sysfs接口去修改顯示器的亮度。這是傳統的做法。
但是從v3.13內核開始,新增了此選項,並且其默認值爲”1”,表示video.ko驅動除了向用戶空間傳遞事件之外,還要自己在內核層去改變顯示器的亮度。
如果設爲”0”則表示不在內核層改變顯示器的亮度,依然留給用戶層的工具去通過sysfs接口修改。
詳見Documentation/acpi/video_extension.txt文檔。
[DRM]
i915.invert_brightness={-1|0|1}
反轉顯示器背光亮度控制變量(brightness)的含義。
通常情況下,brightness的值爲”0”表示關閉背光(全黑),隨着brightness的值增大到最大值,表示最大亮度。
但是通過這個選項,可以反轉brightness的含義,讓”0”表示最亮,而隨着brightness值的遞增亮度逐漸降低,直到最大值關閉背光(全黑)。
-1 表示絕不反轉其含義,也就是”0”始終表示關閉,最大值始終表示最亮。
0 表示內核不對此變量的含義加以干預,使用機器自身的默認含義。
1 表示強制反轉其含義,也就是”0”始終表示最亮,最大值始終表示關閉。
此選項常用於解決某些使用Intel集顯/核顯(CONFIG_DRM_I915)的電腦在啓動時黑屏的問題。
[FB]
logo.nologo
在系統啓動時不顯示Linux的企鵝標誌圖(企鵝數=CPU核心數)
網絡
[IPV6]
ipv6.disable={0|1}
ipv6.disable_ipv6={0|1}
是否在所有網絡接口上禁用IPv6支持:0(默認值)表示在所有網絡接口上開啓IPv6支持;1 表示在所有網絡接口上關閉IPv6支持。建議使用”ipv6.disable=1”(徹底禁用ipv6內核模塊)
[IPV6]
ipv6.autoconf={0|1}
是否在所有網絡接口上開啓IPv6地址自動配置。
0 表示禁止自動配置,這樣就只有IPv6迴環地址(::1)和”link-local”地址會被自動添加到網絡接口上。如果你不想從路由器公告(Router Advertisements)中的地址前綴自動生成IPv6地址,可以使用此項。
1(默認值) 表示在所有網絡接口上開啓IPv6地址自動配置
[IP_PNP]
ip=[client-ip:server-ip:gateway-ip:netmask:hostname:device:]autoconf[:dns0-ip:dns1-ip]
此選項告訴內核如何在啓動過程中配置網卡的IP地址及路由表(而不是在啓動完成後依賴用戶空間的腳本去配置)。僅在內核已啓用了CONFIG_IP_PNP的前提下有效。通常用於需要將NFS掛載爲根文件系統(CONFIG_ROOT_NFS)的場合。
此選項有以下4種用法:
(1)ip={off|none}或者沒有使用”ip”選項。這是默認值,表示徹底關閉自動配置功能。
(2)ip={dhcp|bootp|rarp|any} 表示內核全自動完成所有配置工作(也就是將所有字段設爲各自的默認值)。各選項的含義參見下面對autoconf字段的說明。
(3)將autoconf字段設爲{off|none}之一,並明確指定所有其它字段。表示全靜態配置,也就是手動指定各字段的值(禁止自動檢測)。
(4)將autoconf字段設爲{dhcp|bootp|rarp|any}之一,並明將部分字段留空(字段分割符”:”不能省略)。表示半自動配置,也就是將留空的字段設爲各自的默認值(自動檢測),而將手動指定的字段設爲指定的值(禁止自動檢測)。
各字段的說明如下:
client-ip NFS客戶端IP地址。若留空,其默認值將通過自動檢測獲取。
server-ip NFS服務器IP地址。該字段僅在需要將NFS掛載爲根文件系統(root=/dev/nfs)的時候纔是必須的。如果使用RARP檢測client-ip並且此字段非空,那麼將僅接受指定服務器的應答。若留空,其默認值將通過自動檢測獲取(也就是自動配置服務器的地址)。
gateway-ip 網關的IP地址。僅在NFS服務器位於不同子網的時候纔是必須的。若留空,其默認值將通過自動檢測獲取。
netmask 子網掩碼。若留空,其默認值將通過自動檢測獲取(根據client-ip所屬的地址類型[A/B/C之類])。
hostname NFS客戶端的主機名。若留空,其默認值將通過自動檢測獲取(client-ip的ASCII表示形式)。
device 使用的網卡。若留空,其默認值將通過自動檢測獲取:若有多個網卡,那麼將通過所有網卡同時發送自動配置請求包,並將最先接收到應答的網卡設爲默認網卡。
autoconf 自動配置方式。{off|none}表示不使用自動配置(必須手動指定個字段的值);{dhcp|bootp|rarp}分別表示只使用DHCP/BOOTP/RARP協議進行自動配置(當然內核必須支持指定的協議);”any”表示使用內核支持的所有自動配置協議(同時發送不同協議的自動配置請求包,以最先接收到的應答爲準)。 dns0-ip 主DNS服務器IP地址。若留空,其默認值將通過自動檢測獲取。其值將通過 /proc/net/pnp 導出到用戶空間。在嵌入式系統上,/etc/resolv.conf 常常是到 /proc/net/pnp 的軟連接。
dns1-ip 輔DNS服務器IP地址。其它同上。
[KNL,NET]
rhash_entries=正整數
設置內核路由緩衝區哈希表的大小,僅供內核網絡專家使用。
[KNL,NET]
thash_entries=正整數
設置內核允許使用的TCP鏈接哈希表的大小。
[KNL,NET]
uhash_entries=正整數
設置內核允許使用的UDP/UDP-Lite鏈接哈希表的大小。
[NETFILTER]
nf_conntrack.acct={0|1}
是否允許對連接追蹤(CONFIG_NF_CONNTRACK)流進行記賬。”0”(默認值)表示禁止記賬,”1”表示允許記賬。
塊設備與磁盤陣列
blkdevparts=
手動設置塊設備分區表(而不是從塊設備讀取),主要用於嵌入式環境或分區表損壞恢復的場合。詳情參見Documentation/block/cmdline-partition.txt文檔
[EFI]
gpt
強制將擁有有效GPT簽名但同時又包含無效”保護MBR”的磁盤當做GPT格式的磁盤。
[IOSCHED]
elevator={“bfq”|”cfq”|”deadline”|”noop”}
指定默認的IO調度器
[LOOP]
loop.max_loop=[0-256]
在系統啓動時無條件的預先創建的迴環(loopback)設備數,默認值由CONFIG_BLK_DEV_LOOP_MIN_COUNT決定。如果你使用util-linux-2.21以上版本,建議設爲”0”(loop設備將通過/dev/loop-control動態創建)。
[HW,RAID]
raid={autodetect|noautodetect,partitionable|part}
明確向內核的MD驅動(CONFIG_BLK_DEV_MD)傳遞RAID配置屬性
autodetect|noautodetect 表示內核是否應該自動檢測RAID模式(CONFIG_MD_AUTODETECT)。如果關閉了自動檢測,那麼必須使用”md=”明確告訴內核RAID模式及配置。
partitionable|part 兩者含義相同,都表示內核應該將組裝之後得到的RAID設備視爲”可分區”設備。
[HW,RAID]
md=N,dev0,dev1,…
明確向內核的MD驅動(CONFIG_BLK_DEV_MD)傳遞RAID配置信息,並將列出的設備(dev0,dev1,…)組裝爲 /dev/mdN 陣列(表現爲一個塊設備文件)。
建議僅在根文件系統位於RAID上的情況下使用這個選項。其他非根文件系統的RAID最好在系統啓動後(掛載完根之後)再組裝。
N 可以是 0,1,2,3,…,255 中的任意一個整數,表示被創建的md設備的編號,例如:
md=2,/dev/sda,/dev/sdb,/dev/sdc,/dev/sdd
表示將 /dev/sda,/dev/sdb,/dev/sdc,/dev/sdd 組裝成 /dev/md2 塊設備(至於RAID級別之類的信息則由存儲在超級塊中的元數據提供)。
[提示]2.6.28之前的老版本內核對創建的陣列還有所謂”可分區陣列”和”不可分區陣列”的區別,具體表現是:如果在N前加上字母”d”,則表示所創建的陣列是一個可分區陣列,否則就是不可分區陣列。不過現在已經沒有這個區別了,所有創建的陣列都是可分區的,因此”d”也就沒有存在的必要了。
根文件系統
[KNL]
root=字符串
指定根文件系統的所在位置。通常這是一個必須明確設置的選項。
“字符串”可以使用如下幾種形式:
XXxx 一個16進制數,其中”XX”是主設備號,”xx”是次設備號。例如”/dev/sdc15”(主設備號是”8”,次設備號是”47”),可以表示成”082F”。
/dev/nfs 表示使用由nfsroot選項指定的NFS磁盤,僅在根文件系統位於NFS文件系統上的時候才使用。
/dev/disk 表示一塊完整的無分區塊設備。比如:/dev/md0 /dev/loop0 /dev/sdb /dev/mmcblk0
/dev/diskN 表示disk磁盤的第N(十進制)個分區。這是最常見的用法,比如:/dev/sda2 /dev/ubda1 /dev/xvda13
/dev/diskpN 含義與上面的一樣,也表示disk磁盤的第N(十進制)個分區,但是用於disk本身以數字結尾的情況(避免混淆)。比如:/dev/md0p3 /dev/emd/0p2 /dev/mmcblk0p1
PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF 僅用於EFI/GPT格式的磁盤,表示分區表中UUID值爲”00112233-4455-6677-8899-AABBCCDDEEFF”的分區。[提示]可以使用blkid查看”PARTUUID”。
PARTUUID=SSSSSSSS-PP 僅用於傳統的MSDOS分區表。”SSSSSSSS”是用16進製表示的32位”NT disk signature”,”PP”是用16進製表示的分區號。比如:PARTUUID=97531ACF-02 可能相當於 /dev/sda2
PARTUUID=XXXX/PARTNROFF=N 表示以UUID=”XXXX”的分區爲基準,偏移N個分區。假定 /dev/sdb5 的UUID=XXXX,那麼 PARTUUID=XXXX/PARTNROFF=3 就表示 /dev/sdb8 ,而 PARTUUID=XXXX/PARTNROFF=-3 則表示 /dev/sdb2
major:minor 由一對十進制數組成,其中major是主設備號,minor是次設備號。例如”/dev/sdc15”(主設備號是”8”,次設備號是”47”),可以表示成”8:47”。
LABEL=??? 表示卷標爲”???”的分區。比如:root=LABEL=/ 。不過這種格式並不被內核直接支持,僅是發行版通過initramfs中的腳本添加了這種格式的支持而已。所以並不通用。
[KNL]
rootfstype=文件系統類型
指定根文件系統的類型。例如:”xfs”或”ext4”之類
[KNL]
rootflags=掛載選項
設置根文件系統的掛載選項,比如”noatime,ro”。各種不同的文件系統所能使用的選項各不相同,可以參考 mount 程序的選項。
[KNL]
ro
rw
以只讀(ro)/讀寫(rw)模式掛載根文件系統
[KNL]
rootdelay=秒數
在掛載根文件系統前延遲多少秒,主要用於等待那些反應速度較慢的異步檢測的設備就緒(例如USB/MMC/FireWire)。
[KNL]
rootwait
在根文件系統就緒之前無限等待。主要用於等待那些反應速度較慢的異步檢測的設備就緒(例如USB/MMC/FireWire)。
系統初始化(init)
[KNL]
init=文件全路徑
指定內核掛載根文件系統後運行的第一個用戶空間程序的絕對路徑。默認爲”/sbin/init”。
[KNL]
rdinit=全路徑
設置從initramfs中運行的第一個用戶空間程序的絕對路徑,默認爲”/init”。
[注意]一旦使用了initramfs並且成功的運行了其中的”/init”,所有”init”以及與根文件系統相關的選項(包括”nfsroot”)對內核而言都將失效。
initramfs中的腳本必須自己分析各個內核引導選項(/proc/cmdline)並完成根文件系統的掛載與切換,當然也包括啓動真正的”init”進程。
[KNL]
S
以單用戶模式運行”init”。注意,這不是一個真正的內核選項,只是給initramfs中的腳本用的。所以並不通用。
NFS(網絡文件系統)
[NFS]
lockd.nlm_grace_period=秒數
爲NFS鎖管理器指定寬限時間,單位是秒。取值範圍在[0-240]?
[NFS]
lockd.nlm_tcpport=端口號
爲NFS鎖管理器指定TCP端口
[NFS]
lockd.nlm_timeout=秒數
爲NFS鎖管理器指定默認超時時間,單位是秒。默認值是10秒。取值範圍在[3-20]?
[NFS]
lockd.nlm_udpport=端口號
爲NFS鎖管理器指定UDP端口
[NFS]
nfsroot=[server-ip:]root-dir[,nfs-options]
指定NFS根文件系統的位置。如果沒有設置此選項,那麼將使用”/tftpboot/本機IP”(默認值)作爲根文件系統,並使用默認的NFS掛載選項。
server-ip NFS服務器IP地址。其默認值是”ip”選項中的server-ip字段的值。
root-dir 作爲根文件系統掛載的NFS服務器的目錄。如果其中包含”%s”,那麼將會被替換爲本機IP地址的ASCII表示形式。
nfs-options 標準的NFS文件系統掛載選項(例如”ro”),多個選項之間使用逗號分隔。下面是默認使用的值:
port = 由NFS服務器的portmap守護進程給出
rsize = 4096
wsize = 4096
timeo = 7
retrans = 3
acregmin = 3
acregmax = 60
acdirmin = 30
acdirmax = 60
flags = hard,nointr,noposix,cto,ac
[NFS]
nfsrootdebug
在啓動過程中,在內核日誌裏顯示詳細的NFS相關的調試信息(掛載選項、服務器IP地址、根文件系統路徑等),以方便調試和故障診斷。
[NFS]
nfs.callback_tcpport=端口號
設置NFSv4回覆通道(callback channel)監聽的TCP端口
[NFS]
nfs.cache_getent=路徑
設置用於更新NFS客戶端緩存項的程序的路徑。默認值是”/sbin/nfs_cache_getent”。
[NFS]
nfs.cache_getent_timeout=秒數
嘗試更新緩存項超時秒數,超過指定時間仍未更新成功則視爲更新失敗。默認值是15秒。
[NFS]
nfs.idmap_cache_timeout=秒數
設置idmapper緩存項的最大壽命,單位是秒。
[NFS]
nfs.enable_ino64={0|1}
是否開啓64位inode號。”0”表示NFS客戶端將會爲readdir()與stat()系統調用模擬一個32位inode號(而不是返回真實的64位inode號)。”1”(默認值)表示返回真實的64位inode號。
[NFSv4.1]
nfs.max_session_slots=正整數
設置NFS客戶端嘗試和服務器端協商的最大會話slot數。這也同時限定了客戶端能夠像服務器端發送的最大併發RPC請求數。默認值是64。將此值設置爲比max_tcp_slot_table_limit大是沒有價值的。
[NFSv4]
nfs.nfs4_unique_id=字符串
指定NFSv4客戶端插入到nfs_client_id4字符串中的額外的唯一標識字符串。這通常是一個在系統安裝時自動生成的UUID。
[NFSv4.1]
nfs.send_implementation_id={0|1}
是否在exchange_id請求中包含客戶端實現識別信息(implementation identification information)。”0”表示不發送,默認值”1”表示發送。
[NFSv4]
nfs.recover_lost_locks={0|1}
v3.12新增。是否嘗試恢復服務器上由於租約超時而丟失的鎖。需要注意的是,這樣做很有可能會導致數據錯誤,因爲無法保證超時後的鎖文件未被更改。默認值”0”表示不做這樣的嘗試,而”1”則表示嘗試恢復(這是v3.11及之前內核的默認行爲)。
[NFSv4]
nfs.nfs4_disable_idmapping={0|1}
默認值”1”表示在使用了”sec=sys”掛載選項的情況下,RPC身份認證和NFS操作都使用數字化的uid/gid。這會導致idmapping被禁用,從而讓NFSv2/v3向NFSv4的遷移變得更加容易。客戶端將會自動檢測不支持此種操作模式的服務器,並回退到使用idmapper的模式。”0”表示禁止這種行爲。
[NFSv4]
nfsd.nfs4_disable_idmapping={0|1}
默認值”1”表示NFSv4服務器與那些使用auth_sys的客戶端之間只使用數字化的uid/gid(包括髮送與接收),從而讓NFSv2/v3向NFSv4的遷移變得更加容易。”0”表示禁止這種行爲。
模塊功能
nomodule
禁用內核模塊加載功能(CONFIG_MODULES)。
[KNL]
module.sig_enforce
強制內核在加載模塊時檢查模塊簽名(CONFIG_MODULE_SIG),並且只接受具有合法簽名的模塊。如果內核開啓了CONFIG_MODULE_SIG_FORCE,那麼無論是否使用此選項,都將強制檢查模塊的簽名。
安全
no_file_caps
要求內核無視文件的權限。這樣,執行文件的唯一途徑就只有:由root去執行或者setuid root
noexec={on|off}
noexec32={on|off}
是否允許將某部分內存映射爲”禁止執行”,這是一種防止數據緩衝區溢出攻擊的保護措施(也就是WinXP SP2曾經大力宣傳的數據執行保護功能),建議保持默認值”on”。
[說明]noexec對32bit代碼以及64bit代碼都有約束力,而noexec32只針對32bit代碼。
nosmap
禁用SMAP(CONFIG_X86_SMAP)支持。SMAP是Intel從Haswell微架構開始引入的一種新特徵,用途是禁止內核因爲自身錯誤意外訪問用戶空間的數據,以避免一些內核漏洞所導致的安全隱患。
nosmep
禁用SMEP(Supervisor Mode Execution Prevention)支持。SMEP與SMAP類似,也是Intel從Haswell微架構開始引入的一種新特徵,用途是禁止內核因爲自身錯誤意外執行用戶空間的代碼。以避免一些內核漏洞所導致的安全隱患。
nordrand
即使CPU支持(CONFIG_ARCH_RANDOM),也禁止內核使用RDRAND指令(不過用戶空間依然可以使用此指令)。由於很多人懷疑RDRAND指令所依賴的硬件隨機數生成器所使用的加密標準(NIST SP800-90)被NSA植入了後門,所以提供了該選項以禁用它,不過大神Torvalds不以爲然。
vsyscall={emulate|native|none}
控制vsyscall系統調用(調用固定的地址0xffffffffff600x00)的行爲。大多數靜態鏈接的可執行程序和老舊的Glibc會使用這個系統調用。因爲vsyscall始終位於固定的地址,所以很容易被攻擊者利用。
emulate(默認值) 捕捉vsyscalls系統調用,並對其進行安全的模擬。這是比較安全的選項,但效率並不最高。
native 將vsyscall系統調用直接轉變成本地syscall指令,這比模擬方式效率稍微高一些。但是很容易被攻擊。
none 完全禁用vsyscall系統調用。這是最安全的選項,但是有可能會導致系統工作異常。
[EVM]
evm=”fix”
不管當前的完整性狀態如何,都允許更新”security.evm”。
[SECURITY]
security={selinux|smack|tomoyo|apparmor|yama}
選擇啓用的安全模塊。僅在內核同時開啓了多個安全模塊的情況下才有意義。
[SELINUX]
selinux={0|1}
是否在啓動時就開啓SELinux功能(CONFIG_SECURITY_SELINUX_BOOTPARAM):”0”表示關閉,”1”表示開啓。
默認值由內核在編譯時確定(CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE)。
即使設爲”1”,隨後也可以通過 /selinux/disable 在加載安全策略前禁止SELinux功能。
[SELINUX]
enforcing={0|1}
是否在啓動時強制啓用SELinux規則。
“0”(默認值)表示僅僅做記錄違規操作日誌而不真正拒絕違規操作;
“1”表示真正拒絕違規操作並做記錄違規操作日誌。
該選項還可以在運行時通過 /selinux/enforce 進行修改
[SELINUX]
checkreqprot={0|1}
設置”checkreqprot”標記的初始值。
“0”表示由內核強制執行檢查保護(包括其中隱含的所有執行保護)
“1”表示由應用程序自己主動請求執行檢查保護
默認值由內核在編譯時確定,也可以在運行時通過 /selinux/checkreqprot 修改
[APPARMOR]
apparmor={0|1}
是否在啓動時就開啓AppArmor功能(CONFIG_SECURITY_APPARMOR):”0”表示關閉,”1”表示開啓。
默認值由內核在編譯時確定(CONFIG_SECURITY_APPARMOR_BOOTPARAM_VALUE)。
多CPU與CPU間調度
SMP(對稱多處理器)系統中,所有的CPU共享全部資源(總線,內存,I/O等),最大的特點就是所有資源共享,多個CPU之間沒有區別。NUMA(非一致內存訪問)的基本特徵是具有多個CPU節點,每個CPU節點由多個CPU組成,並且具有獨立的本地內存與I/O槽口等。因此,雖然每個CPU都可以訪問整個系統的內存,但是訪問本地節點內存的速度遠遠高於訪問其它節點的內存。詳見《SMP/NUMA/MPP體系結構對比》

[SMP]
nosmp
強制禁用SMP,這是個已被反對使用的舊選項
[SMP]
maxcpus=整數
最大允許使用的CPU核心數。”0”表示禁用SMP特性(等價於已被反對使用的舊”nosmp”選項),同時也禁用IO APIC;正整數”n”表示最大允許使用n個CPU核心。
[SMP]
nr_cpus=正整數
允許SMP內核支持的最大CPU核心數(等價於CONFIG_NR_CPUS)。配合CPU熱插拔(CONFIG_HOTPLUG_CPU),可在運行時增加CPU數目。
cpu0_hotplug
強制允許CPU0(boot CPU)熱插拔(CONFIG_BOOTPARAM_HOTPLUG_CPU0)。下列特性必須依賴於cpu0,所此選項應謹慎使用:
(1)從休眠狀態(S3,S4)喚醒以及從運行狀態進入休眠狀態
(2)PIC中斷,也就是某些情況下,關機和重啓也會依賴於cpu0
[SMP]
additional_cpus=整數
最大允許熱插拔的CPU數量。默認值由BIOS決定。相見Documentation/x86/x86_64/cpu-hotplug-spec
[NUMA]
numa={off|noacpi}
off 關閉NUMA支持,也就是讓所有內存都只屬於同一個節點。
noacpi 不爲NUMA解析ACPI SRAT表
[KNL]
numa_balancing={enable|disable}
啓用/禁用NUMA均衡(CONFIG_NUMA_BALANCING),其默認值由CONFIG_NUMA_BALANCING_DEFAULT_ENABLED決定
[KNL,BOOT]
numa_zonelist_order={zone|node|default}
設置NUMA的zonelist順序。這裏設置的值還可以在運行中通過sysctl來修改。詳見Documentation/sysctl/vm.txt
[KNL,SMP]
isolcpus=CPU編號列表
將列表中的CPU從內核SMP平衡和調度算法中剔除。
[注意]提出後並不是絕對不能再使用該CPU的,操作系統仍然可以強制指定特定的進程使用哪個CPU(可以通過taskset來做到)。
該選項的目的主要是用於實現特定cpu只運行特定進程的目的。
CPU編號從”0”開始計數,列表的表示方法有三種:
numA,numB,…,numN
numA-numN
以及上述兩種表示方法的組合:
numA,…,numM-numN
例如:0,3,4-7,9
[KNL,SMP]
relax_domain_level={-1|0|1|2|3|4|5}
設置CPUSET調度域(sched domain)的默認級別。大於此級別的調度域層次將禁用閒時均衡和喚醒均衡,而其餘級別的調度域都開啓。
-1(默認值) 使用系統的默認值(取決於不同的硬件架構)或者由其他的請求確定,也就是不人爲指定默認級別。
0 禁用所有調度域的閒時均衡和喚醒均衡
1 超線程域(siblings),也就是同一個物理核心內的不同超線程
2 核域(cores),也就是同一個物理CPU中不同的核心
3 節點域(node),對於NUMA系統來說就是同一個NUMA節點內,對於non-NUMA系統來說這是整個系統範圍
4 節點組域(chunk of node),僅適用於NUMA系統,表示在一組特定的NUMA節點範圍內
5 全系統(system wide),全部系統範圍內
詳見Documentation/cgroups/cpusets.txt文檔
控制組(Control Group)
Cgroup(CONFIG_CGROUPS)是一種進程管理機制,也是內核的資源分配框架。

[KNL]
cgroup_disable=”控制器名稱”
禁用cgroup中特定的控制器名稱。目前只支持一個”memory”控制器。
noautogroup
禁止自動創建進程組(CONFIG_SCHED_AUTOGROUP),服務器環境可以考慮使用此選項。
[KNL]
swapaccount={0|1}
是否統計換入(swap in)內存的資源。”0”表示不統計,”1”表示統計。詳見Documentation/cgroups/memory.txt文檔。
EFI/UEFI
noefi
禁用EFI支持(CONFIG_EFI)。
[EFI]
add_efi_memmap
將EFI內存映像包括在內核的可用物理內存映像之中
pstore.backend=efivars
將”efivars”(CONFIG_EFI_VARS_PSTORE)用作pstore內存文件系統的後端。
雜項
[IP_VS_FTP]
ports=portA,portB,…
IPVS(IP Virtual Server) FTP幫助模塊所使用的端口,最多允許指定8個。默認值是”21”。
io_delay={0x80|0xed|udelay|none}
設置IO延遲方式
0x80(CONFIG_IO_DELAY_0X80) 傳統的Linux IO延遲方式,久經考驗,也最安全
0xed(CONFIG_IO_DELAY_0XED) 基於0xed端口的IO延遲方式,主要是爲了避免和基於0x80端口的主板診斷卡衝突
udelay(CONFIG_IO_DELAY_UDELAY) 使用內核端udelay()函數作爲延遲方法(簡單的延遲2微秒).可以不佔用任何IO端口空間.
none(CONFIG_IO_DELAY_NONE) 不使用任何port-IO延遲機制.只要你的機器不是老古董,這個應該是首選.
[KNL]
reboot=[mode][,type][,force]
指定系統重啓的方式:
mode 用於指定重啓模式,可以使用如下2種模式之一:warm(熱重啓[跳過內存檢測]), cold(冷重啓[檢測並重新初始化所有硬件])
type 用於指定重啓類型,可以使用如下4種類型之一:bios(爲熱重啓使用CPU reboot vector), acpi(優先使用FADT中的ACPI RESET_REG,若失敗再轉kbd), kbd(使用鍵盤控制器冷重啓,這是默認值), triple, efi(優先使用EFI提供的reset_system運行時服務,若失敗再轉kbd)
結尾的”force”表示在重啓時不停用其它的CPU,在某些情況下可以讓reboot更可靠。
[KNL]
reset_devices
強制驅動程序在初始化底層設備的過程中重置設備
[KNL]
rcu_nocbs=
在”CONFIG_RCU_NOCB_CPU=y”的情況下,指定哪些CPU是No-CB CPU
[KNL]
nodelayacct
禁止在針對每個進程的統計信息中包含進程等候系統資源(cpu,IO同步,內存交換等)所花費的時間,相當於禁用CONFIG_TASK_DELAY_ACCT模塊。
[KNL]
sysfs.deprecated={0|1}
爲了兼容舊版本的應用程序而保留過時的sysfs特性(CONFIG_SYSFS_DEPRECATED),其默認值由CONFIG_SYSFS_DEPRECATED_V2確定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章