Linux 從 InitramFS ‘UserSpace’ 修改/添加核心命令行
我正在開發嵌入式 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 命令行參數並不總是那麼容易,更新配置文件絕對是配置此設置的更直接的方法。)我希望這對您有所幫助,並且它可以幫助您為您的特定案例完成正確的詳細程度!