首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从InitramFS "UserSpace“修改/添加内核命令行

从InitramFS "UserSpace“修改/添加内核命令行
EN

Unix & Linux用户
提问于 2018-08-09 12:59:08
回答 1查看 2.1K关注 0票数 2

我正在开发一个嵌入式Linux设备。我已经成功地创建了一个InitramFS CPIO存档,它在引导后快速运行。现在,我想更改初始内核命令行,以包含“静默”参数,这样我就可以更快地启动。

但是,一旦启动屏幕显示在InitramFS中,我希望删除内核的静音选项,以便引导的其余部分不安静。

我怎样才能做到这一点?一旦到达InitramFS,如何逆转初始的“静默”内核命令行选项?

谢谢。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-08-14 08:25:49

启动后不能真正更改内核命令行,但您可以做的是通过其他方法复制设置或取消设置quiet命令行的效果,这将实现您在这里想要实现的目标。

简而言之,要想在不再需要quiet时增加详细内容,可以使用以下命令:

代码语言:javascript
复制
# echo 7 >/proc/sys/kernel/printk

为了模仿quiet的功能,您可以使用以下内容:

代码语言:javascript
复制
# echo 4 >/proc/sys/kernel/printk

这应该照顾到设置的核心部分..。但是有时候用户空间也会根据这个内核选项改变行为。例如,systemd将在内核命令行中解析quiet选项,并在/etc/systemd/system.conf中使用ShowStatus=auto。如果您想要恢复它(以强制执行默认设置并忽略quiet选项),请编辑该配置文件并取消对那里的ShowStatus=yes行的注释,该行将负责处理该配置文件。

用户空间中可能会有其他系统来查看该选项,因此您可能需要更仔细地查看它们的行为,以及如何再现(或撤消)内核命令行中存在的选项的行为。

下面是对源代码的深入研究,以解释内核和系统中quiet选项的行为。

内核通过调用quiet来解析quiet_kernel()初始化函数选项,这会:

代码语言:javascript
复制
static int __init quiet_kernel(char *str)
{
    console_loglevel = CONSOLE_LOGLEVEL_QUIET;
    return 0;
}

early_param("quiet", quiet_kernel);

console_loglevel伪变量实际上是的第一个元素。console_printk数组

代码语言:javascript
复制
extern int console_printk[];

#define console_loglevel (console_printk[0])

日志级别“静默”定义为4.

代码语言:javascript
复制
#define CONSOLE_LOGLEVEL_QUIET   4 /* Shhh ..., when booted with "quiet" */

下面几行,默认日志级别是通过内核配置定义的:

代码语言:javascript
复制
/*
 * 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

代码语言:javascript
复制
config CONSOLE_LOGLEVEL_DEFAULT
    int "Default console loglevel (1-15)"
    range 1 15
    default "7"

(您可能需要检查内核是否使用默认配置,无论是在/boot/config-*中还是在/proc/config.gz中。)

有关使用/proc/sys/printk的更多详细信息,请参见它的内核文档。但是,简而言之,只编写一个数字是可能的,在这种情况下,只更新数组的第一个元素,这就是您在这里想要的。

systemd还将解析内核命令行,查找通常名为systemd.*的条目,但结果显示为系统d还识别quiet内核命令行,并使用它设置ShowStatus:

代码语言:javascript
复制
    } else if (streq(key, "quiet") && !value) {

            if (arg_show_status == _SHOW_STATUS_UNSET)
                    arg_show_status = SHOW_STATUS_AUTO;

在这种情况下,它将只在以前没有设置(_SHOW_STATUS_UNSET)的情况下将其设置,并将其设置为"auto“(SHOW_STATUS_AUTO)。

设置ShowStatus的另一种方法是通过配置文件

代码语言:javascript
复制
            { "Manager", "ShowStatus",                config_parse_show_status,      0, &arg_show_status                       },

这一行描述了名为ShowStatus=的配置选项,该选项位于system.conf[Manager]部分。此选项的解析器接受"auto“字符串(在这种情况下,它将其设置为SHOW_STATUS_AUTO)或使用布尔值(可以是”是“、”真“或"1”来启用它,也可以使用“否”、"false“或"0”来禁用它。

系统d文件--show-status=在这里也很有帮助。它还引用了ShowStatus=配置(因为直接传递systemd命令行参数并不总是容易的,因此更新配置文件肯定是配置此设置的一种更简单的方法)。

我希望您发现这有帮助,并希望它帮助您完成正确的详细您的特定用例!

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/461535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档