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
실패 시에만 사용됩니다. 다음에서 처리 시작rdinit
init
kernel_init
, 작동 원리는 다음과 같습니다.
rdinit
액세스 가능한 "ramdisk 실행 명령"(커널 명령줄에 지정된 값 또는/init
)이 있는 경우 커널은 명령 실행을 시도합니다.- 실패하고 "실행 명령"(커널 명령줄에 제공된 값
init
)이 있는 경우 커널은 이를 실행하려고 시도하고 실행할 수 없으면 패닉 상태가 됩니다. - 최후의 수단으로 커널은
/sbin/init
,/etc/init
,/bin/init
및/bin/sh
가 실행되지 않으면 실행을 시도합니다.공황.
initramfs가 있으면 이 모든 일이 거기서 발생하고 대상 볼륨은 커널에 의해 마운트되지 않습니다. 무슨 일이야뒤쪽에커널이 실행하는 첫 번째 프로그램 init
(보통 /init
initramfs의 스크립트)은 커널이 아닌 프로그램에 의해 결정됩니다. 파일 시스템이 마운트된 경우 전달되지 않은 인수를 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
;;
...
여기에서는 다른 시스템 유형과 다른 파일 시스템 레이아웃이 설정됩니다. 관련된 단일 네임스페이스를 고려하면 로컬 사용자 정의에서는 커널이 사용하는 것과 다른 레이블을 사용할 것으로 예상됩니다.