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]
- 设置输出控制台使用的设备及选项。例如:ttyN 表示使用第N个虚拟控制台。其它用法主要针对嵌入式环境( Documentation/serial-console.txt)。
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(CONFIG_X86_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之后)上使用。
-
[HW,ACPI]
- 用于解决某些有缺陷的Nvidia nForce2 BIOS中的计时器覆盖问题(例如开启ACPI后频繁死机或时钟故障)。
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]
- 禁止使用IO-APIC(输入输出高级可编程输入控制器),主要用于解决某些有缺陷的BIOS导致的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 表示强制启用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={force|off|noirq|strict|rsdt|nocmcff|copy_dsdt}
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休眠选项。
(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状态唤醒时的故障。
acpi_sleep={s3_bios,s3_mode,s3_beep,s4_nohwsig,old_ordering,nonvs,sci_force_enable}
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]
-
-1 禁用所有"主动散热"标志点(active trip point)
正整数 强制设置所有的最低"主动散热"标志点的温度值,单位是摄氏度。
详见 Documentation/thermal/sysfs-api.txt文档。
thermal.act=摄氏度
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]
- 启用/禁用内核的dynamic ticks特性。默认值是"on"。
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下游端口扫描一个设备。
pci=选项[,选项...]
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驱动休眠/唤醒过程中禁止使用ACPI。主要用于解决某些有缺陷的BIOS导致的 硬盘假死问题。
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驱动(CONFIG_KEYBOARD_ATKBD)的键盘类型:2(默认值)表示AT键盘;3 表示PS/2键盘。
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]
- 禁用USB子系统(CONFIG_USB_SUPPORT)
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]
-
通用IOMMU设置:
off 彻底关闭IOMMU功能
force 强制使用硬件IOMMU,即使硬件可能有缺陷(例如VIA芯片组)或者根本没有必要这样做(例如内存不足3G)。
noforce(默认) 在内存不足3G的机器上,不使用硬件IOMMU,因为根本没有必要。
soft(Intel平台的默认值) 使用通过软件模拟的IOMMU(SWIOTLB),同时禁止使用硬件IOMMU(即使存在)。
iommu={off,force,noforce,soft}
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)的大小,算法是 2 N*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]
- 禁止使用内核通用的半虚拟化接口 paravirt_ops,主要用于解决某些在Virtual PC上安装或运行Linux的故障。
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]
- 强制指定内核使用多少数量的内存。仅在你想限定内存使用量时,才需要指定这个选项。同时为了避免PCI设备使用指定范围之外的内存,你还应该配合"memmap="一起使用。
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_cleanup
- 开启/关闭MTRR cleanup(CONFIG_MTRR_SANITIZER)特性。
disable_mtrr_cleanup
图形与显示
-
[AGP]
-
off 表示关闭内核的AGP(CONFIG_AGP)支持;
try_unsupported 表示尝试驱动那些不受支持的芯片(可能会导致系统崩溃或数据错误)
agp={off|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支持:0(默认值)表示在所有网络接口上开启IPv6支持;1 表示在所有网络接口上关闭IPv6支持。建议使用"ipv6.disable=1"(彻底禁用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=
- 手动设置块设备分区表(而不是从块设备读取),主要用于嵌入式环境或分区表损坏恢复的场合。详情参见 Documentation/block/cmdline-partition.txt文档
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]
-
指定根文件系统的所在位置。通常这是一个必须明确设置的选项。
"字符串"可以使用如下几种形式:
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中的脚本添加了这种格式的支持而已。所以并不通用。
root=字符串
rootfstype=文件系统类型
rootflags=挂载选项
ro
rw
rootdelay=秒数
rootwait
系统初始化(init)
-
[KNL]
- 指定内核挂载根文件系统后运行的第一个用户空间程序的绝对路径。默认为"/sbin/init"。
init=文件全路径
rdinit=全路径
[注意]一旦使用了initramfs并且成功的运行了其中的"/init",所有"init"以及与根文件系统相关的选项(包括"nfsroot")对内核而言都将失效。
initramfs中的脚本必须自己分析各个内核引导选项(/proc/cmdline)并完成根文件系统的挂载与切换,当然也包括启动真正的"init"进程。
S
NFS(网络文件系统)
-
[NFS]
- 为NFS锁管理器指定宽限时间,单位是秒。取值范围在[0-240]?
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 = 4096 wsize = 4096 timeo = 7 retrans = 3 acregmin = 3 acregmax = 60 acdirmin = 30 acdirmax = 60 flags = 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}
模块功能
-
nomodule
- 禁用内核模块加载功能(CONFIG_MODULES)。
module.sig_enforce
安全
-
no_file_caps
- 要求内核无视文件的权限。这样,执行文件的唯一途径就只有:由root去执行或者setuid root
noexec32={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]
- 强制禁用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中特定的控制器名称。目前只支持一个"memory"控制器。
cgroup_disable="控制器名称"
swapaccount={0|1}
EFI/UEFI
-
noefi
- 禁用EFI支持(CONFIG_EFI)。
add_efi_memmap
杂项
-
[IP_VS_FTP]
- IPVS(IP Virtual Server) FTP帮助模块所使用的端口,最多允许指定8个。默认值是"21"。
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}