저는 임베디드 Linux 장치를 개발 중입니다. 부팅 시 빠르게 실행되는 InitramFS CPIO 아카이브를 성공적으로 만들었습니다. 이제 더 빠르게 부팅할 수 있도록 "quiet" 매개변수를 포함하도록 초기 커널 명령줄을 변경하고 싶습니다.
그러나 InitramFS에 부팅 화면이 표시되면 나머지 부팅이 조용하지 않도록 커널의 자동 옵션을 제거하고 싶습니다.
이 목표를 어떻게 달성할 수 있나요? InitramFS에 도달한 후 초기 "자동" 커널 명령줄 옵션을 어떻게 되돌리나요?
감사해요.
답변1
부팅 후에 커널 명령줄을 변경할 수는 없지만 변경할 수는 있습니다.할 수 있는하는 일은 다른 방법으로 명령줄을 설정하거나 설정 해제하는 효과를 재현하는 것뿐입니다 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"
/boot/config-*
(커널이 .NET 내부 또는 외부에서 기본 구성을 사용하고 있는지 확인하고 싶을 수도 있습니다 /proc/config.gz
.)
사용법에 대한 자세한 내용은 /proc/sys/printk
다음을 참조하세요.커널 문서. 그러나 간단히 말해서 숫자만 쓰는 것도 가능합니다. 이 경우 배열의 첫 번째 요소만 업데이트되며 이는 원하는 대로 됩니다.
systemd는 또한 커널 명령줄을 구문 분석하여 일반적으로 이름이 지정된 항목을 찾습니다 systemd.*
.quiet
systemd는 커널 명령줄 도 인식합니다.그리고 이를 사용하여 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=
이 줄은 [Manager]
섹션 아래에 명명된 구성 옵션을 설명합니다 system.conf
. 이것이 옵션에 대한 파서"auto" 문자열(이 경우 로 설정됨 SHOW_STATUS_AUTO
)을 취하거나 부울 값("yes", "true" 또는 "1"을 사용하여 활성화하거나 "no", "false" 또는 "0")을 사용합니다. 비활성화합니다.
이것시스템 문서--show-status=
여기에서도 도움이 됩니다. 또한 구성을 참조 합니다 ShowStatus=
. systemd 명령줄 인수를 직접 전달하는 것이 항상 쉬운 것은 아니므로 구성 파일을 업데이트하는 것이 이 설정을 구성하는 더 직접적인 방법입니다.
이 내용이 귀하의 특정 사용 사례에 적합한 세부 정보 수준을 얻는 데 도움이 되기를 바랍니다.