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


11

Linux에서 왜 'init = / bin / bash'를 허용합니까?

나는 이것을 읽었고, 대답은이 init 프로그램을 실행하는 커널이라고 말합니다.

그런 다음 Linux에 보통 initramfs가 제공되어 결국 실제 루트 파일 시스템에 마운트하고 pivot_root가 될지 궁금해지기 시작했습니다. 이 init주장은 무엇을 의미합니까? initramfs의 경로는? 또는 내가 짐작했듯이 커널은 읽지 않지만 initramfs의 init는 실제 init를 실행합니다.

또한, root=UUID=xxxx실제 루트 파일 시스템을 찾기 위해 커널이나 initramfs의 init에 의해 실제로 읽혀 지는가?

커널 인수로 원하는 인수를 전달할 수있는 것처럼 보이므로 모두 커널에서 읽거나 적어도 일부는 사용자 공간 프로그램에만 의미가 있습니까?

답변:


18

커널 명령 행에 전달 된 매개 변수는 커널에 의미가 될 필요가 없습니다 : 커널 매개 변수 설명서를 말한다

커널은 커널 명령 행에서“-”까지 매개 변수를 구문 분석합니다. 매개 변수를 인식하지 못하고 '.'를 포함하지 않으면 매개 변수가 init로 전달됩니다. '='인 매개 변수는 init 환경으로 이동하고 다른 매개 변수는 init에 명령 줄 인수로 전달됩니다. “-”뒤의 모든 것은 init에 대한 인수로 전달됩니다.

이 적용되지 않습니다 initroot정말 커널 매개 변수이며, 커널에 의해 처리한다. 또한 사용자 공간에 표시되기 때문에 사용자 공간에서 작동 할 수 있습니다 /proc/cmdline. (예를 들어 systemd는 quiet커널 매개 변수를 고려하여 출력을 줄입니다.)

커널이 initramfs로 부팅 될 때, root매개 변수는 커널에서 직접 사용 되지 않으며 , 실패한 init경우에만 사용됩니다 rdinit. init시작은에서 처리 kernel_init되며 다음과 같이 작동합니다.

  • 접근 가능한 "ramdisk execute command"( rdinit커널 명령 행에 지정된 값 또는 /init)가 있으면 커널은이를 실행하려고 시도합니다.
  • 만약 이것이 실패하고 "실행 명령"( init커널 명령 행에 주어진 값 )이 있다면, 커널은 그것을 실행하려고 시도하고, 실패하면 패닉을 시도합니다;
  • 최후의 수단으로, 커널은 실행하려고 /sbin/init, /etc/init, /bin/init, 그리고 /bin/sh; 실행할 수없는 경우 패닉 상태가 됩니다.

initramfs가 있으면이 모든 것이 발생하며 대상 볼륨은 커널에 의해 마운트되지 않습니다. 커널이 첫 번째 프로그램 (일반적으로 initramfs 의 스크립트)을 실행 한 후 발생 하는 일은 커널이 아닌 프로그램에 달려 있습니다. 파일 시스템이 마운트 된 경우 전달되지 않은 인수를 계속 사용할 수 있습니다 .init/initinit/proc/cmdline/proc


init-in-the-initramfs가 set-uid-non-root 파일이라면 어떻게 궁금하십니까? 실행 비트가없는 파일? 어쨌든 루트로 실행됩니까? ELF가 깨 졌거나 ld-linux.soELF 또는 재귀가 너무 깊은 스크립트를 찾을 수 없거나 실행할 수없는 것이 있으면 어떻게합니까?
炸鱼 薯条 德里克

3
커널이 initramfs에서 "init ="에 지정된 프로그램을로드하지 않을 것이라고 확신합니다. initramfs가 사용 중이면 사용자 지정 init 프로그램이 실행되기 전에 정상적으로 실행되는 것 같습니다 (initramfs 에서이 작업을 수행하는 커널인지 또는 initramfs의 코드인지는 확실하지 않습니다).
plugwash

@ 炸鱼 薯条 德里克/init램 디스크에서 부팅 할 때 대신 대체 프로그램을 지정하려면 rdinit=/path/toboot 매개 변수를 사용하십시오 .
pizdelect 2016 년

3

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

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

여기서 lab다음 다른 시스템 빌드를 위해 다른 일을하는 킥 스타트 구성에 사용됩니다 :

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

다른 시스템 유형에서 사용되는 것과 다른 파일 시스템 레이아웃을 설정합니다. 단일 네임 스페이스가 주어지면 커널이 사용하는 것과 다른 레이블이 로컬 사용자 정의에 사용되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.