PhilBot Asked: 2018-08-10 04:59:08 +0800 CST2018-08-10 04:59:08 +0800 CST 2018-08-10 04:59:08 +0800 CST Linux 从 InitramFS "UserSpace" 修改/添加内核命令行 772 我正在开发嵌入式 Linux 设备。我已经成功创建了一个启动后快速运行的 InitramFS CPIO 存档。现在,我想更改初始内核命令行以包含“quiet”参数,这样我可以更快地启动。 但是,一旦初始屏幕显示在 InitramFS 中,我想删除内核的安静选项,以便引导的其余部分不是安静的。 我怎样才能做到这一点?到达 InitramFS 后,如何反转初始的“安静”内核命令行选项? 谢谢。 linux kernel 1 个回答 Voted Best Answer filbranden 2018-08-15T00:25:49+08:002018-08-15T00:25:49+08:00 您无法在启动后真正更改内核命令行,但您可以做的是通过其他方式重现设置或取消设置quiet命令行的效果,这应该可以完成您想要在这里实现的目标。 简而言之,一旦你不想quiet再增加冗长,你可以使用这个命令: # echo 7 >/proc/sys/kernel/printk 并模仿什么quiet,这是你可以使用的: # echo 4 >/proc/sys/kernel/printk 这应该注意设置的内核方面......但有时用户空间也会根据此内核选项改变行为。例如,systemd 将解析quiet内核命令行中的选项,并像ShowStatus=auto在/etc/systemd/system.conf. 如果您想恢复它(强制执行默认值并忽略该quiet选项),请编辑该配置文件并取消注释ShowStatus=yes那里的行,这应该会处理它。 用户空间中可能有其他系统会查看此选项,因此您可能需要仔细查看它们以了解它们的行为以及如何重现(或撤消)内核命令行中存在的选项的行为. 以下是对源代码的深入探讨,以解释quiet内核和 systemd 中选项的行为。 quiet内核通过调用quiet_kernel()初始化函数来解析选项,该函数执行以下操作: static int __init quiet_kernel(char *str) { console_loglevel = CONSOLE_LOGLEVEL_QUIET; return 0; } early_param("quiet", quiet_kernel); console_loglevel伪变量实际上是数组的第一个元素console_printk: extern int console_printk[]; #define console_loglevel (console_printk[0]) 日志级别“安静”定义为 4: #define CONSOLE_LOGLEVEL_QUIET 4 /* Shhh ..., when booted with "quiet" */ 下面几行,默认日志级别是通过内核配置定义的: /* * Default used to be hard-coded at 7, we're now allowing it to be set from * kernel config. */ #define CONSOLE_LOGLEVEL_DEFAULT CONFIG_CONSOLE_LOGLEVEL_DEFAULT 并且该内核配置在 Kconfig.debug 中设置,仍默认为 7: config CONSOLE_LOGLEVEL_DEFAULT int "Default console loglevel (1-15)" range 1 15 default "7" (您可能想检查您的内核是否使用默认配置,无论是 in/boot/config-*还是 in /proc/config.gz。) 有关使用的更多详细信息/proc/sys/printk,请参阅它的内核文档。但是,简而言之,可以只写一个数字,在这种情况下,只有数组的第一个元素会被更新,这就是你想要的。 systemd 还将解析内核命令行,查找通常名为 的条目systemd.*,但事实证明systemd 也识别quiet内核命令行并使用它来设置 ShowStatus: } else if (streq(key, "quiet") && !value) { if (arg_show_status == _SHOW_STATUS_UNSET) arg_show_status = SHOW_STATUS_AUTO; 在这种情况下,它只会在之前未设置 ( _SHOW_STATUS_UNSET) 的情况下设置它,并将其设置为“自动” ( SHOW_STATUS_AUTO.) 另一种设置 ShowStatus 的方法是通过配置文件: { "Manager", "ShowStatus", config_parse_show_status, 0, &arg_show_status }, 这一行描述了ShowStatus=在. 此选项的解析器采用“auto”字符串(在这种情况下将其设置为)或采用布尔值,可以是“yes”、“true”或“1”来启用它,或者“no”、“ false" 或 "0" 禁用它。[Manager]system.confSHOW_STATUS_AUTO 这里的systemd 文档--show-status=也很有帮助。它也引用了ShowStatus=配置(因为直接传递 systemd 命令行参数并不总是那么容易,更新配置文件绝对是配置此设置的更直接的方法。) 我希望这对您有所帮助,并且它可以帮助您为您的特定用例完成正确的详细程度!
您无法在启动后真正更改内核命令行,但您可以做的是通过其他方式重现设置或取消设置
quiet
命令行的效果,这应该可以完成您想要在这里实现的目标。简而言之,一旦你不想
quiet
再增加冗长,你可以使用这个命令:并模仿什么
quiet
,这是你可以使用的:这应该注意设置的内核方面......但有时用户空间也会根据此内核选项改变行为。例如,systemd 将解析
quiet
内核命令行中的选项,并像ShowStatus=auto
在/etc/systemd/system.conf
. 如果您想恢复它(强制执行默认值并忽略该quiet
选项),请编辑该配置文件并取消注释ShowStatus=yes
那里的行,这应该会处理它。用户空间中可能有其他系统会查看此选项,因此您可能需要仔细查看它们以了解它们的行为以及如何重现(或撤消)内核命令行中存在的选项的行为.
以下是对源代码的深入探讨,以解释
quiet
内核和 systemd 中选项的行为。quiet
内核通过调用quiet_kernel()
初始化函数来解析选项,该函数执行以下操作:console_loglevel
伪变量实际上是数组的第一个元素console_printk
:日志级别“安静”定义为 4:
下面几行,默认日志级别是通过内核配置定义的:
并且该内核配置在 Kconfig.debug 中设置,仍默认为 7:
(您可能想检查您的内核是否使用默认配置,无论是 in
/boot/config-*
还是 in/proc/config.gz
。)有关使用的更多详细信息
/proc/sys/printk
,请参阅它的内核文档。但是,简而言之,可以只写一个数字,在这种情况下,只有数组的第一个元素会被更新,这就是你想要的。systemd 还将解析内核命令行,查找通常名为 的条目
systemd.*
,但事实证明systemd 也识别quiet
内核命令行并使用它来设置 ShowStatus:在这种情况下,它只会在之前未设置 (
_SHOW_STATUS_UNSET
) 的情况下设置它,并将其设置为“自动” (SHOW_STATUS_AUTO
.)另一种设置 ShowStatus 的方法是通过配置文件:
这一行描述了
ShowStatus=
在. 此选项的解析器采用“auto”字符串(在这种情况下将其设置为)或采用布尔值,可以是“yes”、“true”或“1”来启用它,或者“no”、“ false" 或 "0" 禁用它。[Manager]
system.conf
SHOW_STATUS_AUTO
这里的systemd 文档
--show-status=
也很有帮助。它也引用了ShowStatus=
配置(因为直接传递 systemd 命令行参数并不总是那么容易,更新配置文件绝对是配置此设置的更直接的方法。)我希望这对您有所帮助,并且它可以帮助您为您的特定用例完成正确的详细程度!