ps axf는 PID1의 "/sbin/init 스플래시"를 표시합니다.

ps axf는 PID1의 "/sbin/init 스플래시"를 표시합니다.

나는 Thelostcause가 제기한 매우 흥미로운 질문을 다시 말하고 싶습니다(“PID = 1일 때 스플래시"):

어떻게 그리고 어떻게 할 수 있니? "/sbin/init 시작"나타나다ps 명령?

나는 또한 묻습니다: 우리("리눅스 시스템"을 운영하는 우리들)는 어느 나라 출신입니까?

"init [2]"               in old sysvinit, to

"/sbin/init vmlinuz"     in new systemd init ?

여기서 [2]는 sysv 실행 수준을 나타내고, vmlinuz는 KCL(커널 명령줄)의 첫 번째 매개변수를 나타냅니다.

ps 명령을 사용하여 시스템의 init 프로세스에 대해 PID=1(일명 다른 이름 또는 멋진 이름)을 본 사람이 있습니까?

주의하세요: "ps"는 ​​매우 까다롭습니다. ps -p1단지 "systemd"를 CMD로 제공하고 ps p1"/sbin/init arch5\vmlinuz-linux"를 COMMAND 출력 필드에 제공합니다. 나는 ps axf개요를 얻는 데 사용합니다.

내 질문에 대해 몇 가지 가정이 있음을 인정합니다. "splash" 이벤트는 grub과 systemd 사이의 문제입니다. 이는 systemd가 두 번째 이름으로 ps 출력을 예쁘게 만들기로 결정할 때까지 커널과 initrd에서 무시한 초기(음, 첫 번째) KCL 매개변수였습니다(아래 세 번째 예 참조). .


추가됨(Documentation/x86/boot.rst에서 직접):

부트로더 자체 내에서 추가 명령줄 옵션이 필요한 부트로더 작성자는 현재 또는 미래에 실제 커널 옵션과 충돌하지 않도록 Documentation/admin-guide/kernel-parameters.rst에 해당 옵션을 등록해야 합니다.

  initrd=<file>
    An initrd should be loaded.  The meaning of <file> is
    obviously bootloader-dependent, and some boot loaders
    (e.g. LILO) do not have such a command.

또한 일부 부트로더는 사용자 지정 명령줄에 다음 옵션을 추가합니다.

  BOOT_IMAGE=<file>
    The boot image which was loaded.  Again, the meaning of <file>
    is obviously bootloader-dependent.

  auto
    The kernel was booted without explicit user intervention.

이러한 옵션이 부트로더에 의해 추가된 경우 해당 옵션을 다음 위치에 배치하는 것이 좋습니다.첫 번째, 사용자 지정 또는 구성 지정 명령줄 앞에. 그렇지 않으면 "init=/bin/sh"가 "auto" 옵션과 혼동됩니다.

...또는 init=[link to systemd] "splash" 옵션을 통해!

boot.rst 근처에서 initrd= 및 init=가 어떻게 언급되는지 확인하세요.

kernel.org, boot-parameters.html:여기서 initrd=부팅 옵션은 [BOOT]("부팅 로더 매개변수")로 표시되어 있습니다. 이것은 [BOOT] 외에 아무것도 없는 유일한 옵션입니다(locktorture.x 및 rcuperf.x 중 하나 제외). 그리고 vga=그것은 특별한 경우인 것 같습니다:

이는 실제로 부트로더 매개변수입니다. 값은 특수 프로토콜을 사용하여 커널에 전달됩니다.

일반적인 커널 매개변수에는 [KNL]("커널 시작 매개변수")이 포함됩니다: root=, rw, init=, rdinit=, audit, debug 등——심지어 "S"

Stephen과 내가 혼란스러웠던 것은 당연합니다. bootloader, initrd=, init= 그리고 이 "스플래시"는 실제로 밀접하게 관련되어 있습니다.

S               [KNL] Run init in single mode

이것은 나에게 이해가 되지 않습니다. 아니면 커널이 "S"를 검색하여 사전에 init에 전달합니까?

아시다시피 저는 (아직) "S"에 대해 systemd를 테스트하지 않을 것입니다. 재부팅 후 심각한 충돌(메시지 없음)과 "인증 오류"가 발생했습니다( pacman -S pam적어도 이번에는 쉽게 수정할 수 있었습니다). 내가 한 일은 rdinit=xxxxx(기본값은 /init)이었습니다. 커널이 나에게 "필수 RDINIT를 찾을 수 없습니다." 또는 이와 유사한 것을 알려주면 안 됩니까 init=xxxx? "NO INIT FOUND" 역시 패닉 상태이지만 메시지가 포함된 제어된 패닉 상태입니다.


섹션 추가 끝


내 실제 질문 중 하나는 다음과 같습니다.

이것을 어떻게 설명합니까? 내 초기화가 다음 초기화를 시작합니다!

(이 질문은 내 주제와 약간 다르지만 이 모든 예를 보여주고 싶었습니다.)

    1 ?        Ss     0:01 init [S]
  214 tty1     Ss     0:00 init [S]
  215 tty1     S      0:00  \_ bash
  238 tty1     R+     0:00      \_ ps axf
  239 tty1     R+     0:00      \_ tail

이것이 Uefi 셸에서 NUC를 부팅하는 방법입니다. "S"는 이 특수 긴급 sysvinit 실행 수준(/etc/inittab이 없는 경우 입력되는 inittab 항목 없음)을 나타냅니다. 안녕하세요, 어디로 갔는지 보고 싶었어요.

fedora\vmlinuz root=/dev/sda3 init=/usr/bin/sysvinit S HELLO

이 KCL은 dmesg 및 /proc/cmdline에서 영향을 받지 않은 것으로 나타납니다. 여기 dmesg:

[    0.000000] Command line: fedora\vmlinuz root=/dev/sda3 init=/usr/bin/sysvinit S HELLO
[    0.000000] Kernel command line: fedora\vmlinuz root=/dev/sda3 init=/usr/bin/sysvinit S HELLO

이제 내 커널에는 이중 "[커널] 명령줄"이 표시되지 않습니다. 이것은 "명령줄"일 뿐입니다. 만약 의도적으로 이것을 바꾼다면, 나는 그들이 옳을 것이라고 말하고 싶습니다. (페도라 커널은 앤틱하지 않습니다...4.18과 비슷합니다)

이는 4개의 tty가 있는 일반적인 런레벨입니다.

    1 ?        Ss     0:00 init [2]
  286 tty1     Ss     0:00 /bin/bash -l
  303 tty1     R+     0:00  \_ ps axf
  304 tty1     D+     0:00  \_ /bin/bash -l
  287 tty2     Ss+    0:00 /sbin/agetty -J tty2
  288 tty3     Ss+    0:00 /bin/bash
  289 tty4     Ss+    0:00 /bin/bash

이전 sysvinit는 "init[2]"로 표시됩니다. "2"는 물론 (기본) 런레벨이고 /sbin/init에 대한 인수이지만 보기 좋게 보이려면 sysvinit에서 대괄호를 추가해야 합니다. 이 ps 출력에서 ​​"/bin/bash"와 "/bin/bash -l"의 차이점을 볼 수 있습니다.

initrd를 사용하는 systemd에서(archlinux):

    1 ?        Ss     0:01 /sbin/init arch5\vmlinuz-linux

    ...        ..     .... snip systemd-journald etc.
  469 ?        Ss     0:00 login -- root
  484 tty1     Ss     0:00  \_ -bash
  922 tty1     S+     0:00      \_ xinit fvwm
  ...                           ...

어디서 구한 사람 있나요?"튀김", 이건 말도 안되는 일입니다. 이해합니다"arch5\vmlinuz-linux". Arch5는 EFI 부팅 파티션에 생성한 디렉터리이고, vmlinuz-linux는 설치 후 /boot에서 커널을 찾는 방법입니다. 방금 initrd 파일과 함께 Arch5에 복사했습니다.

실제 부트로더(예: grub)에서 systemd init를 부팅하는 경우: "/sbin/init" 다음에 무엇을 얻게 됩니까? 나와 같은 다른 커널 파일 이름이 있습니까? 아니면 물놀이나 조용함, 아니면 그냥 남은 것들인가요?


@Stephen: 커널이 매개변수를 "소비"한다는 것이 무슨 뜻인지 궁금합니다. 내 initrd= 예제에서 커널은 전혀 아무것도 소비하지 않습니다. 커널은 initrd 파일과 함께 부트로더 또는 Uefi Shell에 의해 로드됩니다.

(저는 Stephen이 시작 시 명령줄에서 initrd=, root= 및 init=를 처리한다고 여기에서 논쟁하고 있습니다.)

좋습니다. 이 경우 initrd=는 커널 자체에 의해 로드되지만(EFI 스텁, Uefi 지원 사용) 매개변수가 "사용"됩니까? 아니요, 아직 거기 있어요. 모든 것이 여전히 존재하며 /proc/cmdline에 "종료"됩니다. 모듈이 거기에서 명령줄 옵션을 찾으라는 지시를 받지 않았나요?


내 현재 결론은 다음과 같습니다: sbin/init Splash? 무슨 상관이야! 부팅 인수에 대한 규칙이 있습니다. init가 사용되지 않은 "스플래시"를 인수로 가져오면 ps가 이를 표시합니다.

제 생각에는 이 대답이 완전히 틀렸다고 생각합니다... 하지만 명령줄(일명 부팅 옵션)과 bootloader/Uefi 쉘에서 /sbin/init까지의 부팅 프로세스에 대한 좋은 설명이 있다면 찾을 수 있을 것 같습니다.


그건 그렇고, 내가 여기 있는 이유는 다음과 같습니다.

처음으로 디스크에서 부팅하는 데 문제가 많았습니다(내 NUC는 키트이므로 시작할 때 실제로 비어 있었습니다). 저는 GPT 파티션으로 시작하고, "레거시 BIOS"로 부팅할 수 있도록 이 "보호 MBR"을 얻더라도 물론 레거시/MBR을 떠나 순수 Uefi/GPT를 사용하고 싶습니다. 그러나 GPT의 grub 설치는 나를 너무 혼란스럽게 만듭니다! 내 "비주얼" BIOS에 부팅 가능한 항목이 표시되지 않습니다. 이제 알겠습니다. Uefi는 장치를 부팅하지 않고 BOOTX64.EFI와 같은 EFI 응용 프로그램을 부팅합니다. 먼저 efibootmgr(Linux에서) 또는 bcfg(Uefi Shell에서)를 사용하여 등록해야 합니다.

SSD를 MBR로 다시 파티션하려고 합니다.

그런 다음 다음과 같은 매우 짧은 게시물(여기 또는 stackoverflow)을 발견했습니다.

"Uefi BIOS가 있으면 부트로더가 필요하지 않습니다."

나는 그것이 그렇게 쉽다는 것을 믿을 수 없었다. 부팅 옵션으로 "Uefi Shell"을 활성화하고 부팅한 다음 "fs0:"을 입력하여 실제로 부팅 파티션에 "들어간" 다음 "vmlinuz"만 입력했습니다. 짜잔, root= 누락으로 인해 빠른 커널 패닉이 발생했지만 커널 패닉을 보고 더 기뻤던 사람이 있나요?

어쩌면 며칠 후에 "초기화를 찾을 수 없음"을 발견했을 수도 있습니다. (나는 전통을 유지하기 위해 그에게 /bin/bash를 먼저 주었다).

답변1

귀하가 보고 있는 (새로운) 동작은 다음 질문에 대한 답변에 설명되어 있습니다.모든 커널 매개변수가 실제로 커널에서 사용됩니까?

Grub과 같은 부트로더로 부팅할 때 커널 명령줄은 일반적으로 다음과 같습니다.

BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=/dev/mapper/vg--fast-root ro single

/proc/cmdline나중에 처리되는 방식에 관계없이 항상 전체 커널 명령줄을 표시한다는 점 에서 이를 확인할 수 있습니다 . 모듈 매개변수는 여기에서 구문 분석됩니다 modprobe(참조커널 문서더 알아보기).

rootro옵션은 커널에 의해 "소비"됩니다. 값 은 환경에서 설정 BOOT_IMAGE됩니다 ( 참조 ). 에 매개변수로 전달됩니다 .init/proc/1/environsingleinit커널 문서에 설명되어 있습니다.:

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

root및 는 ro커널에 의미가 있으므로 커널은 이를 유지하고 에 전달하지 않습니다 init.

귀하의 경우 UEFI 셸에서 부팅하게 됩니다. Arch 시나리오는 위의 설명과 정확하게 일치합니다. arch5\vmlinuz-linux initrd=arch5\initramfs-linux.img root=/dev/sda3명령줄 결과는 initrd커널 에 의해 소비되고 root인수로 전달됩니다 arch5\vmlinuz-linux. initinitrd는 파일을 찾기 위해 EFI 서비스를 사용하여 커널 내부의 EFI 스텁에 의해 로드됩니다. "커널에서 나온 것이 아닌 것 같습니다" 오류 메시지는 커널의 EFI 지원으로 인해 생성됩니다.여기"파일을 열 수 없습니다" 및여기"더 높은 주소로 파일을 로드해 보세요."efi_printkEFI를 사용하여 텍스트를 출력합니다.

를 사용하고 있는 Fedora의 경우 현재 런레벨을 나타내기 위해 sysvinit명령줄(그림 참조)이 변경됩니다 .ps

Thelostcause의 경우 splashGrub 빌드용 커널 명령줄의 일부이며 궁극적으로 init동일한 규칙을 따릅니다.

이중 시나리오에서는 두 번째 것이 시스템 전체가 아닌 세션 관리자인 init것처럼 보입니다 .initinit

관련 정보