Linux에서 왜 ‘init = / bin / bash’를 허용합니까?
나는 이것을 읽었고, 대답은이 init 프로그램을 실행하는 커널이라고 말합니다.
그런 다음 Linux에 보통 initramfs가 제공되어 결국 실제 루트 파일 시스템에 마운트하고 pivot_root가 될지 궁금해지기 시작했습니다. 이 init
주장은 무엇을 의미합니까? initramfs의 경로는? 또는 내가 짐작했듯이 커널은 읽지 않지만 initramfs의 init는 실제 init를 실행합니다.
또한, root=UUID=xxxx
실제 루트 파일 시스템을 찾기 위해 커널이나 initramfs의 init에 의해 실제로 읽혀 지는가?
커널 인수로 원하는 인수를 전달할 수있는 것처럼 보이므로 모두 커널에서 읽거나 적어도 일부는 사용자 공간 프로그램에만 의미가 있습니까?
답변
커널 명령 행에 전달 된 매개 변수는 커널에 의미가 될 필요가 없습니다 : 커널 매개 변수 설명서를 말한다
커널은 커널 명령 행에서“-”까지 매개 변수를 구문 분석합니다. 매개 변수를 인식하지 못하고 ‘.’를 포함하지 않으면 매개 변수가 init로 전달됩니다. ‘=’인 매개 변수는 init 환경으로 이동하고 다른 매개 변수는 init에 명령 줄 인수로 전달됩니다. “-”뒤의 모든 것은 init에 대한 인수로 전달됩니다.
이 적용되지 않습니다 init
와 root
정말 커널 매개 변수이며, 커널에 의해 처리한다. 또한 사용자 공간에 표시되기 때문에 사용자 공간에서 작동 할 수 있습니다 /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
/init
init
/proc/cmdline
/proc
답변
사용자 정의 커널 인수를 전달하는 것은 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
;;
...
다른 시스템 유형에서 사용되는 것과 다른 파일 시스템 레이아웃을 설정합니다. 단일 네임 스페이스가 주어지면 커널이 사용하는 것과 다른 레이블이 로컬 사용자 정의에 사용되기를 바랍니다.