모든 커널 매개변수가 실제로 커널에서 사용됩니까?

모든 커널 매개변수가 실제로 커널에서 사용됩니까?

Linux에서 "init=/bin/bash"를 허용하는 이유는 무엇입니까?

나는 이 기사를 읽었고 대답은 이 초기화 프로그램을 실행하는 커널이라고 말합니다.

그런 다음 Linux에는 일반적으로 실제 루트 파일 시스템에 마운트하고 피봇루트를 마운트하는 initramfs가 포함되어 있다고 생각하기 시작했습니다. 그렇다면 이 init주장은 무엇을 의미하는가? initramfs의 경로? 아니면 내가 추측한 대로 커널이 읽지 않고 실제 init를 수행하는 init initramfs가 읽습니다.

또한, root=UUID=xxxx실제 루트 파일 시스템을 찾기 위해 실제로 커널에서 읽는지 아니면 initramfs의 init에서 읽는지 여부에 대한 논쟁도 있습니다.

내가 원하는 모든 매개변수를 커널 매개변수로 전달할 수 있는 것 같습니다. 그러면 커널 매개변수가 모두 읽히나요, 아니면 적어도 일부는 사용자 공간 프로그램에만 의미가 있습니까?

답변1

커널 명령줄에 전달된 인수는 커널에 의미가 있을 필요는 없습니다.커널 매개변수 문서설명하다

커널은 커널 명령줄의 인수를 "--"로 구문 분석합니다. 인수를 인식하지 못하고 "."가 포함되지 않은 경우 인수는 init로 전달됩니다. "="가 있는 인수는 init 환경으로 이동하고 다른 인수는 명령줄 매개변수로 init에 전달됩니다. "--" 이후의 모든 내용은 init에 매개변수로 전달됩니다.

init이는 적용 되지 않으며 root실제로 커널 매개변수이며 커널에 의해 처리됩니다. 에 나타나는 것처럼 사용자 공간에 의해 조작될 수도 있습니다 /proc/cmdline. (예를 들어 systemd는 quiet출력을 줄이기 위해 커널 매개변수를 고려합니다.)

initramfs를 사용하여 커널을 부팅할 때 이 root매개변수는사용된커널에 의해 직접 호출되며 init실패 시에만 사용됩니다. 다음에서 처리 시작rdinitinitkernel_init, 작동 원리는 다음과 같습니다.

  • rdinit액세스 가능한 "ramdisk 실행 명령"(커널 명령줄에 지정된 값 또는 /init)이 있는 경우 커널은 명령 실행을 시도합니다.
  • 실패하고 "실행 명령"(커널 명령줄에 제공된 값 init)이 있는 경우 커널은 이를 실행하려고 시도하고 실행할 수 없으면 패닉 상태가 됩니다.
  • 최후의 수단으로 커널은 /sbin/init, /etc/init, /bin/init/bin/sh가 실행되지 않으면 실행을 시도합니다.공황.

initramfs가 있으면 이 모든 일이 거기서 발생하고 대상 볼륨은 커널에 의해 마운트되지 않습니다. 무슨 일이야뒤쪽에커널이 실행하는 첫 번째 프로그램 init(보통 /initinitramfs의 스크립트)은 커널이 아닌 프로그램에 의해 결정됩니다. 파일 시스템이 마운트된 경우 전달되지 않은 인수를 init계속 사용할 수 있습니다./proc/cmdline/proc

답변2

사용자 정의 커널 매개변수를 전달하는 것은 KickStart 설치 중에 시스템을 사용자 정의하는 한 가지 방법입니다. 예를 들어 PXE 서버를 설정할 수 있습니다:

linuxefi /c7/vmlinuz ks=http://.../ks/c7 lab ksdevice=eth0 net.ifnames=0 biosdevname=0

그런 다음 KickStart 구성의 where를 사용하여 lab다른 시스템 빌드와 다른 작업을 수행합니다.

%pre
...
case " $(cat /proc/cmdline)" in
   ...
   *\ lab*)
      filesystems_lab
      ;;
   *)
      filesystems_common
      ;;
...

여기에서는 다른 시스템 유형과 다른 파일 시스템 레이아웃이 설정됩니다. 관련된 단일 네임스페이스를 고려하면 로컬 사용자 정의에서는 커널이 사용하는 것과 다른 레이블을 사용할 것으로 예상됩니다.

관련 정보