如何找到正在运行的内核使用的引导参数?

有没有办法找出内核启动时使用了哪些参数?
例如,如果我在grub命令行中指定了noexec=off,系统启动完成后能否查看这类信息?

相关链接:https://unix.stackexchange.com/questions/48601/how-to-display-kernel-command-line-parameters/423563#423563 - Ciro Santilli OurBigBook.com
3个回答

你可以运行cat /proc/cmdline
示例:
[01:31] ~ $ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-2.6.38-7-generic root=UUID=025c4231-b7bb-48bf-93e9-d20c5b5ce123 ro crashkernel=384M-2G:64M,2G-:128M quiet splash bootchart=disable acpi_enforce_resources=lax vga=792 vt.handoff=7

2尝试使用 tr ' ' '\n' < /proc/cmdline 命令获取参数之间的换行符。 - mwfearnley

另一种方法是检查 dmesg 的输出 (这里是第 5 行):

$ dmesg | grep "Command line"
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-3.19.0-33-generic root=UUID=81dba11f-f76e-4ed4-8120-e6da6328b1ee ro

但请注意,如果有很多事情被记录下来(例如,机器运行了很长时间),这可能不起作用,因为初始启动行可能已经被推出环形缓冲区。

实际上,参数位于内核中的__setup_start__setup_end之间。 在下面的代码中,p->str是参数名称。 以下内核代码可在linux-3.4.5/init/main.c:388找到
/* Check for early params. */
static int __init do_early_param(char *param, char *val)
{
    const struct obs_kernel_param *p;
    for (p = __setup_start; p < __setup_end; p++) {
        if ((p->early && parameq(param, p->str)) ||
            (strcmp(param, "console") == 0 &&
             strcmp(p->str, "earlycon") == 0)
        ) {
            if (p->setup_func(val) != 0)
                printk(KERN_WARNING
                       "Malformed early option '%s'\n", param);
        }
    }


    /* We accept everything at this stage. */
    return 0;
}