Linux

Linux 從 InitramFS ‘UserSpace’ 修改/添加核心命令行

  • August 14, 2018

我正在開發嵌入式 Linux 設備。我已經成功創建了一個啟動後快速執行的 InitramFS CPIO 存檔。現在,我想更改初始核心命令行以包含“quiet”參數,這樣我可以更快地啟動。

但是,一旦初始螢幕顯示在 InitramFS 中,我想刪除核心的安靜選項,以便引導的其餘部分不是安靜的。

我怎樣才能做到這一點?到達 InitramFS 後,如何反轉初始的“安靜”核心命令行選項?

謝謝。

您無法在啟動後真正更改核心命令行,但是您可以做的是通過其他方式重現設置或取消設置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.conf``SHOW_STATUS_AUTO

這裡的systemd 文件--show-status=也很有幫助。它也引用了ShowStatus=配置(因為直接傳遞 systemd 命令行參數並不總是那麼容易,更新配置文件絕對是配置此設置的更直接的方法。)


我希望這對您有所幫助,並且它可以幫助您為您的特定案例完成正確的詳細程度!

引用自:https://unix.stackexchange.com/questions/461535