AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 461535
Accepted
PhilBot
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 1 个回答
  • 1657 Views

1 个回答

  • Voted
  1. 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 命令行参数并不总是那么容易,更新配置文件绝对是配置此设置的更直接的方法。)


    我希望这对您有所帮助,并且它可以帮助您为您的特定用例完成正确的详细程度!

    • 2

相关问题

  • astyle 不会更改源文件格式

  • Linux 内核开发人员如何处理数百万行代码的工作?他们是一种方法吗?[关闭]

  • 通过标签将根文件系统传递给linux内核

  • 以 root 用户身份访问文件系统

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve