Linux 内核引导选项简介 *********很多常用的受益匪浅
內核引導選項大體上可以分為兩類:一類與設備無關、另一類與設備有關。與設備有關的引導選項多如牛毛,需要你自己閱讀內核中的相應驅動程序源碼以獲取其能夠接受的引導選項。比如,如果你想知道可以向 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}/parameters/ 中顯示出其選項,并且某些選項的值還可以在運行時通過"echo -n ${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=設備及選項
consoleblank=秒數
no_console_suspend
vt.default_utf8={0|1}
日志與調試
earlyprintk=設備[,keep]在傳統的控制臺初始化之前,在哪個設備上顯示內核日志信息。不使用此選項,那么你將永遠沒機會看見這些信息。
在尾部加上",keep"選項表示在真正的內核控制臺初始化并接管系統后,不會抹掉本選項消息的顯示。
earlyprintk=vga 表示在VGA上顯示內核日志信息,這是最常用的選項,但不能用于EFI環境。
earlyprintk=efi v3.13新增,表示將錯誤日志寫入EFI framebuffer,專用于EFI環境。
earlyprintk=xen 僅可用于XEN的半虛擬化客戶機。
ignore_loglevel
debug
quiet
initcall_debug
kmemleak={on|off}
檢測方法類似于跟蹤內存收集器,一個內核線程每10分鐘(默認值)掃描內存,并打印發現新的未引用的對象的數量。
memtest=整數
pnp.debug=1
異常檢測與處理
[MCE]mce=off
mce=dont_log_ce
mce=容錯級別[,超時]
0 在出現未能糾正的錯誤時panic,記錄所有已糾正的錯誤
1(默認值) 在出現未能糾正的錯誤時panic或SIGBUS,記錄所有已糾正的錯誤
2 在出現未能糾正的錯誤時SIGBUS或記錄日志,記錄所有已糾正的錯誤
3 從不panic或SIGBUS,記錄所有日志。僅用于調試目的。
超時(單位是微秒[百萬分之一秒]):在machine check時等待其它CPU的時長,"0"表示不等待。
erst_disable
hest_disable
nosoftlockup
softlockup_panic={0|1}
nowatchdog
nmi_watchdog={0|panic|nopanic}
0 表示關閉看門狗;
panic 表示出現看門狗超時(長時間沒喂狗)的時候觸發內核錯誤,通常和"panic="配合使用,以實現在系統出現鎖死的時候自動重啟。
nopanic 正好相反,表示即使出現看門狗超時(長時間沒喂狗),也不觸發內核錯誤。
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之后)上使用。
acpi_skip_timer_override
acpi_use_timer_override
no_timer_check
apicpmtimer
apicmaintimer
noapicmaintimer
noapicmaintimer 不將APIC timer用于計時(而是使用PIT/HPET中斷)。這是默認值。但有時候依然需要明確指定。
lapic_timer_c2_ok
noapictimer
disable_timer_pin_1
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之后)上使用。
highres={"on"|"off"}
hpet_mmap
tsc=reliable
tsc=noirqtime
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
nolapic
disableapic
nox2apic
x2apic_phys
threadirqs
pirq=
irqfixup
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}
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"。
acpi_backlight={vendor|video}
video(默認值)表示使用通用的ACPI video.ko驅動(CONFIG_ACPI_VIDEO),該驅動僅可用于集成顯卡。
vendor表示使用廠商特定的ACPI驅動(thinkpad_acpi,sony_acpi等)。
詳見Documentation/acpi/video_extension.txt文檔。
acpi_os_name="字符串"
常用于哄騙有缺陷的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
acpi_osi="字符串"
此選項用于修改內核中的操作系統接口字符串(_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= 表示禁用所有字符串,僅可單獨使用(不能聯合使用)。
acpi_serialize
acpi_enforce_resources={strict|lax|no}
strict(默認值)禁止任何驅動程序訪問已被ACPI聲明為"受保護"的操作區域,這是最安全的方式,可以從根本上避免沖突。
lax允許驅動程序訪問已被ACPI聲明的保護區域(但會顯示一個警告)。這可能會造成沖突,但是可以兼容某些老舊且腦殘的驅動程序(例如某些硬件監控驅動)。
no表示根本不聲明任何ACPI保護區域,也就是完全允許任意驅動程序訪問ACPI操作區域。
pnpacpi=off
休眠與喚醒
[HW,ACPI]acpi_sleep={s3_bios,s3_mode,s3_beep,s4_nohwsig,old_ordering,nonvs,sci_force_enable}
(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狀態喚醒時的故障。
noresume
hibernate={noresume|nocompress}
noresume 表示禁用喚醒,也就是在啟動過程中無視任何已經存在的休眠鏡像,完全重新啟動。
nocompress 表示禁止對休眠鏡像進行壓縮/解壓。
resume={ /dev/swap | PARTUUID=uuid | major:minor | hex }
假定內存鏡像存放在"/dev/sdc15"分區上,該分區的 UUID=0123456789ABCDEF ,其主設備號是"8",次設備號是"47",那么這4種表示法應該分別這樣表示:
resume=/dev/sdc15 (這是內核設備名稱,有可能與用戶空間的設備名稱不同)
resume=PARTUUID=0123456789ABCDEF
resume=08:47
resume=082F
resume_offset=整數
僅在使用swap文件(而不是分區)的時候才需要此選項。詳見Documentation/power/swsusp-and-swap-files.txt文檔
resumedelay=秒數
resumewait
溫度控制
[HW,ACPI]thermal.act=攝氏度
正整數 強制設置所有的最低"主動散熱"標志點的溫度值,單位是攝氏度。
詳見Documentation/thermal/sysfs-api.txt文檔。
thermal.psv=攝氏度
正整數 強制設置所有的"被動散熱"標志點的溫度值,單位是攝氏度。
詳見Documentation/thermal/sysfs-api.txt文檔。
thermal.crt=攝氏度
正整數 強制設置所有的"緊急"標志點的溫度值,單位是攝氏度。
詳見Documentation/thermal/sysfs-api.txt文檔。
thermal.nocrt=1
thermal.off=1
thermal.tzp=整數
0(默認值) 不輪詢
正整數 輪詢間隔,單位是十分之一秒。
CPU節能
[KNL]nohz={on|off}
nohz_full=CPU列表
"CPU列表"是一個逗號分隔的CPU編號(從0開始計數),也可以使用"-"界定一個范圍。例如"0,2,4-7"等價于"0,2,4,5,6,7"
[注意](1)"boot CPU"(通常都是"0"號CPU)會無條件的從列表中剔除。(2)這里列出的CPU編號必須也要同時列進"rcu_nocbs=..."選項中。
processor.nocst
processor.max_cstate={0|1|2|3|4|5|6|7|8|9}
intel_idle.max_cstate=[0|正整數]
idle=halt
idle=nomwait
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)
PCI與PCIE
[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_hp=nomsi
pcie_ports={auto|native|compat}
auto 由BIOS來決定是否使用關聯在PCIe端口上的本地PCIe服務(PME, hot-plug, AER)
native 無條件的使用關聯在PCIe端口上的本地PCIe服務(PME, hot-plug, AER)
compat 禁用PCIe端口驅動,同時將PCIe端口當做PCI-to-PCI橋處理。
pcie_aspm={off|force}
off 強制禁用
force 即使設備聲明不支持ASPM也強制啟用(可能會導致系統鎖死)。
pcie_pme=nomsi
LIBATA
[LIBATA]libata.noacpi
libata.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.ignore_hpa={0|1}
libata.force=PORT[.DEVICE]:VAL,PORT[.DEVICE]:VAL,...
其中的"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], udma[0-7](或者這么寫也一樣:udma[16,25,33,44,66,100,133]) 數據傳輸模式
nohrst, nosrst, norst 只禁止硬重置,只禁止軟重置,同時禁止硬重置和軟重置
rstonce 在熱拔連接恢復(hot-unplug link recovery)過程中僅嘗試一次重置
atapi_dmadir 開啟 ATAPI DMADIR bridge 支持
disable 禁用該設備
鍵盤/鼠標/觸摸板
[HW]atkbd.set={2|3}
atkbd.reset
atkbd.softraw={0|1}
0 表示返回原始的掃描碼(Scancode)
1(默認值)表示返回轉換之后的鍵碼(Keycode)
usbhid.mousepoll=毫秒數
mousedev.tap_time=毫秒數
mousedev.xres=正整數
mousedev.yres=正整數
USB
[USB]nousb
usbcore.authorized_default={-1|0|1}
-1(默認值) 對除無線USB之外的設備默認授權
0 對所有設備都默認不授權
1 對所有設備都默認授權
usbcore.autosuspend=秒數
如果將秒數設為負數,則表示永不進入自動休眠狀態。
usbcore.initial_descriptor_timeout=毫秒數
usbcore.blinkenlights={0|1}
usbcore.usbfs_snoop={0|1}
usbcore.old_scheme_first={0|1}
usbcore.use_both_schemes={0|1}
usbcore.usbfs_memory_mb=[0-2047]
usb-storage.delay_use=秒數
usb-storage.quirks=VID:PID:Flags[,VID:PID:Flags]...
多個修正項之間用逗號分隔,修正項的格式是"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
uhci-hcd.ignore_oc={0|1}
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={off,force,noforce,soft}
off 徹底關閉IOMMU功能
force 強制使用硬件IOMMU,即使硬件可能有缺陷(例如VIA芯片組)或者根本沒有必要這樣做(例如內存不足3G)。
noforce(默認) 在內存不足3G的機器上,不使用硬件IOMMU,因為根本沒有必要。
soft(Intel平臺的默認值) 使用通過軟件模擬的IOMMU(SWIOTLB),同時禁止使用硬件IOMMU(即使存在)。
iommu=[SIZE][,allowed][,fullflush|nofullflush][,leak[=NUM]][,memaper[=N]|noaperture][,noagp][,merge|nomerge][,forcesac][,panic][,allowdac|nodac][,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
頁數 為"IO bounce buffer"預先保留的頁數,每個頁的大小是128K
force 強制所有IO都透過軟件IOMMU
amd_iommu={fullflush|off|force_isolation}
fullflush 表示當IO/TLB項被取消映射的時候立即刷新IO/TLB項(嚴格模式,速度較慢),否則將僅在IO/TLB項被重用之前進行刷新(寬松模式,速度更快)
off 表示徹底禁用AMD IOMMU功能
force_isolation 表示為所有設備強制啟用IOMMU隔離(映射),這樣IOMMU驅動就不再需要自己去發起隔離請求。注意:此選項不會覆蓋"iommu=pt"
intel_iommu={on,off,igfx_off,forcedac,strict,sp_off}
on 開啟Intel-IOMMU驅動
off 關閉Intel-IOMMU驅動
igfx_off 關閉Intel集成顯卡的DMA重映射功能(默認值為開啟)
forcedac 強制PCI設備使用DAC,而禁止進行地址轉換(默認值為允許)
strict 禁止批量刷寫IOTLB(默認值為允許)
sp_off 關閉super page支持(默認值為開啟)
intremap={on,off,nosid,no_x2apic_optout}
on(默認值)開啟中斷重映射
off 關閉中斷重映射
nosid 重映射時不對SID(Source ID)做檢查
no_x2apic_optout 無視BIOS的設置,強制禁用x2APIC特性,主要用于解決某些對x2APIC支持有缺陷的BIOS導致的故障
虛擬化
[PV_OPS]noreplace-paravirt
virtio_mmio.device=size@baseaddr:irq[:id]
size 大小(可以使用K,M,G后綴)
baseaddr 物理基準地址(physical base address)
irq 中斷號(將會被傳遞給request_irq())
id(可選) platform設備號(device id)
例子:virtio_mmio.device=1K@0x100b0000:48:7
kvm.ignore_msrs={0|1}
kvm.mmu_audit={0|1}
kvm-amd.nested={0|1}
kvm-amd.npt={0|1}
kvm-intel.ept={0|1}
kvm-intel.emulate_invalid_guest_state={0|1}
kvm-intel.flexpriority={0|1}
kvm-intel.nested={0|1}
kvm-intel.unrestricted_guest={0|1}
kvm-intel.vpid={0|1}
內存
[KNL,BOOT]mem=nn[KMG]
memmap=exactmap
memmap=nn[KMG]@ss[KMG]
memmap=nn[KMG]#ss[KMG]
memmap=nn[KMG]$ss[KMG]
reserve=起點,長度[,起點,長度]...
內核會將此處指定的iomem區域標記為"reserved"(意為"已經在此處找到設備"),從而將該區域保留。
因為設備驅動不應該去偵測標記為"reserved"的區域,除非另一個啟動選項明確地指示它這樣做,所以此選項經常和其它啟動選項一起使用:
用"reserve="保留一段區域禁止所有其他驅動的探測,同時再明確指定一個驅動去檢測被保留的區域。例如:
reserve=0x300,32 blah=0x300的意思是:除了允許"blah"驅動探測 0x300 之外,禁止任何其他驅動探測 0x300-0x31f 區域。
絕大部份的機器都不需要此選項。只有真正有缺陷的硬件或特殊情況才會需要使用它。
[注意]每個"reserve="選項最多可以指定4個保留區域,如果你有異常復雜的需求,可以使用多重"reserve="來指定。
vmalloc=nn[KMG]
slub_min_order=整數
slub_max_order=整數
slub_min_objects=整數
slub_nomerge
dhash_entries=正整數
ihash_entries=正整數
這個值用于指定這個哈希表的最大項數。你可以根據自己硬盤上可能被訪問的文件數量對默認值進行調整(注意需要考慮哈希值的碰撞)。僅供內核專家使用。
transparent_hugepage={always|madvise|never}
always 表示總是對所有應用程序啟用透明大內存頁支持
madvise 表示僅對明確要求該特性的程序啟用
never 表示徹底禁用。
其默認值由內核的編譯時設置決定。詳見"Documentation/vm/transhuge.txt"文檔。
default_hugepagesz={2M|1G}
大多數現代計算機體系結構提供對多頁面大小的支持,比如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的尺寸,提高緩沖區的命中率,進而提升內存性能。
hugepagesz={2M|1G}
例如:hugepagesz=2M hugepages=128 hugepagesz=1G hugepages=8
注意:1GB的大頁只能在命令行上使用"hugepages="預先分配,且分配之后不可在運行時釋放。
hugepages=正整數
nogbpages
vdso=1 啟用VDSO(Virtual Dynamic Shared Object)映射,這是"CONFIG_COMPAT_VDSO=n"時的默認值。
vdso=2 將VDSO(Virtual Dynamic Shared Object)映射到舊式的確定性地址,這是"CONFIG_COMPAT_VDSO=y"時的默認值。
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_cleanupdisable_mtrr_cleanup
圖形與顯示
[AGP]agp={off|try_unsupported}
try_unsupported 表示嘗試驅動那些不受支持的芯片(可能會導致系統崩潰或數據錯誤)
gamma=浮點數
但是從v3.13內核開始,新增了此選項,并且其默認值為"1",表示video.ko驅動除了向用戶空間傳遞事件之外,還要自己在內核層去改變顯示器的亮度。
如果設為"0"則表示不在內核層改變顯示器的亮度,依然留給用戶層的工具去通過sysfs接口修改。
詳見Documentation/acpi/video_extension.txt文檔。
i915.invert_brightness={-1|0|1}
通常情況下,brightness的值為"0"表示關閉背光(全黑),隨著brightness的值增大到最大值,表示最大亮度。
但是通過這個選項,可以反轉brightness的含義,讓"0"表示最亮,而隨著brightness值的遞增亮度逐漸降低,直到最大值關閉背光(全黑)。
-1 表示絕不反轉其含義,也就是"0"始終表示關閉,最大值始終表示最亮。
0 表示內核不對此變量的含義加以干預,使用機器自身的默認含義。
1 表示強制反轉其含義,也就是"0"始終表示最亮,最大值始終表示關閉。
此選項常用于解決某些使用Intel集顯/核顯(CONFIG_DRM_I915)的電腦在啟動時黑屏的問題。
logo.nologo
網絡
[IPV6]ipv6.disable={0|1}
ipv6.disable_ipv6={0|1}
ipv6.autoconf={0|1}
0 表示禁止自動配置,這樣就只有IPv6回環地址(::1)和"link-local"地址會被自動添加到網絡接口上。如果你不想從路由器公告(Router Advertisements)中的地址前綴自動生成IPv6地址,可以使用此項。
1(默認值) 表示在所有網絡接口上開啟IPv6地址自動配置
ip=[client-ip:server-ip:gateway-ip:netmask:hostname:device:]autoconf[:dns0-ip:dns1-ip]
此選項有以下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地址。其它同上。
rhash_entries=正整數
thash_entries=正整數
uhash_entries=正整數
nf_conntrack.acct={0|1}
塊設備與磁盤陣列
blkdevparts=gpt
elevator={"bfq"|"cfq"|"deadline"|"noop"}
loop.max_loop=[0-256]
raid={autodetect|noautodetect,partitionable|part}
autodetect|noautodetect 表示內核是否應該自動檢測RAID模式(CONFIG_MD_AUTODETECT)。如果關閉了自動檢測,那么必須使用"md="明確告訴內核RAID模式及配置。
partitionable|part 兩者含義相同,都表示內核應該將組裝之后得到的RAID設備視為"可分區"設備。
md=N,dev0,dev1,...
建議僅在根文件系統位于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中的腳本添加了這種格式的支持而已。所以并不通用。
rootfstype=文件系統類型
rootflags=掛載選項
ro
rw
rootdelay=秒數
rootwait
系統初始化(init)
[KNL]init=文件全路徑
rdinit=全路徑
[注意]一旦使用了initramfs并且成功的運行了其中的"/init",所有"init"以及與根文件系統相關的選項(包括"nfsroot")對內核而言都將失效。
initramfs中的腳本必須自己分析各個內核引導選項(/proc/cmdline)并完成根文件系統的掛載與切換,當然也包括啟動真正的"init"進程。
S
NFS(網絡文件系統)
[NFS]lockd.nlm_grace_period=秒數
lockd.nlm_tcpport=端口號
lockd.nlm_timeout=秒數
lockd.nlm_udpport=端口號
nfsroot=[server-ip:]root-dir[,nfs-options]
server-ip NFS服務器IP地址。其默認值是"ip"選項中的server-ip字段的值。
root-dir 作為根文件系統掛載的NFS服務器的目錄。如果其中包含"%s",那么將會被替換為本機IP地址的ASCII表示形式。
nfs-options 標準的NFS文件系統掛載選項(例如"ro"),多個選項之間使用逗號分隔。下面是默認使用的值:
port = 由NFS服務器的portmap守護進程給出rsize = 4096wsize = 4096timeo = 7retrans = 3acregmin = 3acregmax = 60acdirmin = 30acdirmax = 60flags = hard,nointr,noposix,cto,ac
nfsrootdebug
nfs.callback_tcpport=端口號
nfs.cache_getent=路徑
nfs.cache_getent_timeout=秒數
nfs.idmap_cache_timeout=秒數
nfs.enable_ino64={0|1}
nfs.max_session_slots=正整數
nfs.nfs4_unique_id=字符串
nfs.send_implementation_id={0|1}
nfs.recover_lost_locks={0|1}
nfs.nfs4_disable_idmapping={0|1}
nfsd.nfs4_disable_idmapping={0|1}
模塊功能
nomodulemodule.sig_enforce
安全
no_file_capsnoexec32={on|off}
[說明]noexec對32bit代碼以及64bit代碼都有約束力,而noexec32只針對32bit代碼。
emulate(默認值) 捕捉vsyscalls系統調用,并對其進行安全的模擬。這是比較安全的選項,但效率并不最高。
native 將vsyscall系統調用直接轉變成本地syscall指令,這比模擬方式效率稍微高一些。但是很容易被攻擊。
none 完全禁用vsyscall系統調用。這是最安全的選項,但是有可能會導致系統工作異常。
evm="fix"
security={selinux|smack|tomoyo|apparmor|yama}
selinux={0|1}
默認值由內核在編譯時確定(CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE)。
即使設為"1",隨后也可以通過 /selinux/disable 在加載安全策略前禁止SELinux功能。
enforcing={0|1}
"0"(默認值)表示僅僅做記錄違規操作日志而不真正拒絕違規操作;
"1"表示真正拒絕違規操作并做記錄違規操作日志。
該選項還可以在運行時通過 /selinux/enforce 進行修改
checkreqprot={0|1}
"0"表示由內核強制執行檢查保護(包括其中隱含的所有執行保護)
"1"表示由應用程序自己主動請求執行檢查保護
默認值由內核在編譯時確定,也可以在運行時通過 /selinux/checkreqprot 修改
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
maxcpus=整數
nr_cpus=正整數
(1)從休眠狀態(S3,S4)喚醒以及從運行狀態進入休眠狀態
(2)PIC中斷,也就是某些情況下,關機和重啟也會依賴于cpu0
additional_cpus=整數
numa={off|noacpi}
noacpi 不為NUMA解析ACPI SRAT表
numa_balancing={enable|disable}
numa_zonelist_order={zone|node|default}
isolcpus=CPU編號列表
[注意]提出后并不是絕對不能再使用該CPU的,操作系統仍然可以強制指定特定的進程使用哪個CPU(可以通過taskset來做到)。
該選項的目的主要是用于實現特定cpu只運行特定進程的目的。
CPU編號從"0"開始計數,列表的表示方法有三種:
numA,numB,...,numN
numA-numN
以及上述兩種表示方法的組合:
numA,...,numM-numN
例如:0,3,4-7,9
relax_domain_level={-1|0|1|2|3|4|5}
-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="控制器名稱"
swapaccount={0|1}
EFI/UEFI
noefiadd_efi_memmap
雜項
[IP_VS_FTP]ports=portA,portB,...
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延遲機制.只要你的機器不是老古董,這個應該是首選.
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更可靠。
reset_devices
rcu_nocbs=
nodelayacct
sysfs.deprecated={0|1}
總結
以上是生活随笔為你收集整理的Linux 内核引导选项简介 *********很多常用的受益匪浅的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux内核中的GPIO系统之(4):
- 下一篇: Linux cpuidle framew