PID 1의 스플래시

PID 1의 스플래시

저는 방금 Linux의 프로세스에 대해 배우기 시작했습니다.

ps -ef(실행 중인 모든 프로세스가 표시됨)이라는 명령을 발견했습니다 .

나는 이렇게 출력된다

UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
root         1     0     1  0    1 Apr17 ?        00:00:18 /sbin/init splash

무엇인가요튀김여기 대표님? 나는 init이것이 컴퓨터를 시작할 때 실행되는 첫 번째 프로세스라는 것을 알고 있습니다. 하지만 무엇입니까 splash? 그것은 무엇을 합니까?

또한 이것이 첫 번째 실행 프로세스라고 불리는 이유를 알려주실 수 있는 분 계시나요 init? 그런데 컴퓨터를 시작할 때 가장 먼저 실행되는 것은 BIOS나 UEFI 프로그램입니다. 그렇다면 BIOS나 UEFI가 아닌 첫 번째 프로세스를 init로 호출하는 이유는 무엇일까요?

답변1

여기서 스플래시는 무엇을 의미하나요? 나는 init가 컴퓨터를 시작할 때 실행되는 첫 번째 프로세스라는 것을 알고 있습니다. 그런데 스플래시란 무엇인가? 그것은 무엇을 합니까?

첫째, 부팅 중에 스플래시 화면을 표시할 수 있는 ubuntu 를 사용하여 실행 중이므로 systemd스플래시 매개변수가 있습니다. 보다스플래시.c소스 코드.

[편집] 내가 아는 한 systemd가 부팅 매개 변수를 지원하는 유일한 초기화이기 때문에 컴퓨터에서 systemd를 실행하고 있습니다. 다른 것도 있을 수 있지만 Ubuntu에서도 기본값이므로 이것이 안전한 추측이라고 가정합니다. . Ubuntu에서는 기본적으로 로드된 커널인 에 /sbin/init대한 심볼릭 링크가 있습니다 . 여기에서 프로세스의 명령줄을 사용하면 이것이 표시됩니다./usr/lib/systemd/systemd/sbin/init splashps/sbin/init splash

또한 누군가 init가 실행되는 첫 번째 프로세스라고 말하지만 컴퓨터를 시작할 때 가장 먼저 실행되는 것은 BIOS 또는 UFEI 프로그램이라고 말할 수 있습니까? 그렇다면 BIOS나 UFEI 대신 첫 번째 프로세스를 init로 호출하는 이유는 무엇일까요?

간단하게 설명하면 BIOS/UEFI는 부팅 시 로드되는 프로그램이며 추가 시스템 부팅을 위한 구성 데이터가 포함되어 있습니다. 결국에는 부팅 관리자(예: grub)와 같이 부팅할 다음 프로그램을 찾아 커널을 부팅할 수 있게 됩니다. 여기서는 간단하게 설명하려고 노력하고 있지만 이에 대해 읽어보실 수 있습니다. Linux 및 Unix 시스템에서 init는 커널에 의해 생성된 첫 번째 프로그램이므로 PID 1을 얻습니다.

더 읽어보실 수 있습니다여기, 사실 그 기사는 꽤 오래되었습니다. 나는 다음 내용이 100% 정확하다고 주장하지 않습니다.

x86 컴퓨터를 부팅하려면 가장 먼저 해야 할 일은 전원 버튼을 누르는 것입니다. 전원 공급 장치는 마더보드에 전원을 공급하고 충분한 전원을 공급하기 위해 SMPS(스위치 모드 전원 공급 장치)의 신호를 기다립니다. 예를 들어, PCIe 그래픽 카드의 전력이 충분한지, CPU와 RAM이 있는지 확인합니다.

이것인텔 관리 엔진(나)/AMD 보안 기술이 시점부터 IME는 알려지지 않은 minix 3 운영 체제를 갖춘 별도의 Intel CPU이며, AMD의 동급 제품은 중앙 CPU에 내장된 ARM 코어를 사용합니다.

마더보드가 SMPS를 수신하면 CPU의 지속적인 재설정이 중단되고 이제 CPU는 ROM의 주소를 읽습니다. 여기에는 일반적으로 FFFF:0000h펌웨어 코드(예: 바로가기)로의 점프가 포함됩니다.

펌웨어는 키보드에서만 사용할 수 있는 BIOS라고 하는 모놀리식 코드 블록이었습니다. 그리고UEFI, 이는 이제 미니 파일 시스템을 갖춘 완전한 운영 체제입니다. 현재 점프 포인트는 압축이 풀린 UEFI 부팅 코드(아마도 BIOS라고 함)입니다. UEFI는 마우스 지원, 네트워크 부팅, SCSI, RAID, 디스크 및/또는 메모리 검사기 및 기타 여러 기능을 갖춘 미니 운영 체제와 같습니다.

UEFI가 로드된 후 POST(Power-On Self-Test)를 수행하여 모든 하드웨어가 정상인지 확인합니다.

전체 POST는 CMOS, 비디오 ROM, 컨트롤러, DMA(장치가 RAM에 직접 액세스할 수 있음), CPU, 메모리 및 기타 장치와 같은 많은 장치를 검사합니다. PC를 초기화할 때(즉, 재설정 버튼을 누르거나 재부팅 명령을 실행하는 경우) CMOS에 문제가 있는지 등의 문제를 인지하지 못한 채 간단한 POST가 수행됩니다. CMOS는 휘발성 메모리(전원이 차단되면 메모리가 손실됨)와 시계를 포함하는 마더보드의 작은 칩입니다. 이 칩은 작은 배터리로 전원을 공급받으며 UEFI의 모든 설정을 포함합니다.

UEFI는 이러한 설정을 읽고 시스템에 필요한 변경을 수행한 다음 시스템 부팅을 계속 진행합니다. UEFI는 드라이브에서 부팅 레코드를 찾아 기존 부팅을 수행하거나 보다 현대적인 UEFI 부팅 방법을 사용할 수 있습니다. 이를 위해서는 로드할 수 있는 UEFI 부팅 코드가 포함된 FAT32 형식의 파티션이 필요합니다.리눅스 커널,부트 매니저(Windows) 또는 부트로더 grub(예:

UNIX 시스템의 커널은 필요한 모든 장치 드라이버를 로드한 다음 init 프로세스를 로드합니다. 초기화 systemd는 다른 프로그램일 수 있습니다. 예를 들어 bash커널 매개변수에서 구성할 수 있습니다. UEFI를 사용하여 커널을 직접 로드하도록 선택한 경우 커널 매개변수를 설정하는 것이 훨씬 더 어려워집니다. 일단 로드되면 init는 PID 1을 얻은 다음 사용자 공간(시스템 셸 및 선택적 그래픽 사용자 인터페이스)을 로드합니다.

답변2

여기서 스플래시는 무엇을 의미하나요?

부팅된 커널 이미지/파일의 이름입니다. 또는 커널 명령줄에 대한 첫 번째 인수만 사용하면 됩니다.

cat /proc/cmdline

이것은 일반적으로 세 가지 주장을 제공합니다.

[커널 이름] [initrd=...] [루트=...]

커널의 기본 이름은 vmlinuz입니다. 스플래시는 시작 화면이 내장된 우분투 커널의 이름임에 틀림없을 것 같습니다.

이("splash" 표시)는 시스템 기능입니다. sysvinit의 경우 "/sbin/init"입니다. 이것은 훌륭하지만 약간의 속임수가 있습니다. 왜냐하면 init가 커널 이미지를 통해 호출되지 않고 커널과 나머지 부팅 매개변수를 통해 호출되기 때문입니다.

/sbin/init는 systemd 바이너리 /lib/systemd/systemd에 대한 링크(systemd 아래의 pid#1)입니다.

그렇다면 BIOS 대신 첫 번째 프로세스를 init로 호출하는 이유는 무엇입니까?UFEI?

[UEFI! UE-펌웨어-인터페이스]

"Init"은 단지 첫 번째일 뿐입니다리눅스 프로세스. /sbin/init를 시작하는 것은 커널이 수행하는 마지막 작업입니다.

Linux의 원래 아이디어는 386-CPU의 보호 모드를 활용하는 것이었습니다. 이 모델이 없으면 실제 프로세스가 없습니다.

어느 정도까지는 Linux 커널 자체가 효율적인 프로세스 생성 시스템을 구축하는 것뿐입니다. 사용 방법은 귀하에게 달려 있습니다. init=/bin/bash를 사용하여 크기가 1~2MB에 불과한 시스템으로 부팅할 수 있습니다. 그런 다음 백그라운드에서 bash 작업을 시작하거나 필요에 따라 분기되는 바이너리를 시작할 수 있습니다. 또는 첫 번째 bash의 "위"에서 다른 bash를 시작하십시오. 그러나 쉘에서 너무 많이 "종료"하면 커널로 돌아가서 즉시 당황하게 됩니다.

...또는 sysvinit를 첫 번째 프로세스로 사용할 수 있습니다. 이 고전적인 초기화는 정의한 각 tty에 대한 로그인 프로세스를 시작합니다. 여기에서 Alt 키를 사용하여 한 프로세스에서 다른 프로세스로 전환할 수 있습니다. 그런 다음 tty에서 다른 프로세스를 시작할 수 있으며 /etc/inittab은 그래픽 "쉘"을 직접 시작하도록 구성할 수 있습니다.

...또는 추가 기능과 함께 systemd를 "init"로 사용할 수 있습니다(2012년 기준). 이 작업의 대부분은 다른 시스템 바이너리에 의해 수행됩니다.

따라서 정의에 따르면 init는 커널에 의해 실행되는 첫 번째 바이너리입니다. 커널은 init를 시작한 다음 하나 이상의 프로세스(로그인, 데몬)를 시작합니다.

초기 CPU 활동으로 인해 프로세서가 코드를 처리하고 있음에도 불구하고 Visual UEFI-BIOS 및 UEFI-Shell(물론 동시에는 아님)이 프로세스로 호출되지 않게 됩니다. :-)

@스티븐:

initrd=, rdinit= 및 init= 시작 매개변수가 있습니다. initrd=는 램디스크의 파일/이미지 이름을 지정합니다. rdinit=를 사용하면 /init(램디스크가 먼저 실행해야 하는 파일)를 변경할 수 있고, init=를 사용하면 /sbin/init를 변경할 수 있습니다.

링크에서 이것을 혼동하신 것 같습니다. 이는 initrd-fs의 /init가 rdinit=에 의해 제어되는 반면 sbin의 init는 init=에 의해 제어되기 때문일 수 있습니다.

저는 최근에 배포판이나 심지어 부트로더와 상관없이 이러한 옵션을 많이 사용해 왔습니다. 저는 부트로더처럼 작동하는 UEFI-Shell로 시작했습니다. 단, 커널과 initrd가 EFI 시스템 파티션 내에 있는 한 동적으로 선택할 수 있습니다.

그래서:

fedora\vmlinuz root=/dev/sda2

Fedora 29 커널을 성공적으로 부팅할 수 있습니다. initrd가 필요하지 않습니다.

내가 시도한 다른 모든 커널에는 sata/scsi 모듈이 없기 때문에 initrd가 필요합니다.

arch5\vmlinuz-linux initrd=arch5\initramfs-linux.img root=/dev/sda3 init=/usr/bin/sysvinit

이것이 현재 시스템을 부팅하는 방법입니다. 단, /sbin/init(/lib/systemd/systemd에 대한 링크) 대신 이전 sysvinit를 사용합니다. 다음은 Archlinux의 경우 /init입니다. root= switch_root root=를 /dev/sda3에 사용하고 init=를 사용하여 /sbin/init 이외의 다른 항목을 시작합니다.

또한 /init를 수행하여 부팅한 후 다시 아카이브하고 들어갔습니다.

arch\vmlinuz.4.20.6 initrd=arch\archsam.cpio

/init에 루트 파티션이 하드코딩되어 있기 때문에 여기에는 root=가 없습니다.

첨부된:

[    0.000000] Linux version 5.1.12-arch1-1-ARCH (builduser@heftig-24809) (gcc version 9.1.0 (GCC)) #1 SMP PREEMPT Wed Jun 19 09:16:00 UTC 2019
[    0.000000] Command line: arch5\vmlinuz-linux initrd=arch5\initramfs-linux.img root=/dev/sda3

다음은 처음 두 개의 커널 메시지 라인입니다. Arch5\vmlinuz-linux에서 백슬래시를 다시 확인하세요!

ps axf는 다음을 제공합니다(커널 스레드 2 ~ 약 200 없음).

    1 ?        Ss     0:01 /sbin/init arch5\vmlinuz-linux
  291 ?        Ss     0:00 /usr/lib/systemd/systemd-journald
  304 ?        Ss     0:00 /usr/bin/lvmetad -f
  315 ?        Ss     0:00 /usr/lib/systemd/systemd-udevd
  321 ?        Ss     0:00 /usr/lib/systemd/systemd-networkd
  453 ?        Ssl    0:00 /usr/lib/systemd/systemd-timesyncd
  456 ?        Ss     0:05 /usr/lib/systemd/systemd-resolved
  466 ?        Ss     0:02 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
  467 ?        Ss     0:00 /usr/lib/systemd/systemd-logind
  469 ?        Ss     0:00 login -- root
  484 tty1     Ss     0:00  \_ -bash
  922 tty1     S+     0:00      \_ xinit fvwm
  923 tty2     S<sl+   8:08          \_ /usr/lib/Xorg :0
  930 tty1     S      0:00          \_ xterm -geometry +1+1 -n login fvwm
  932 pts/0    Ss+    0:08              \_ fvwm
  937 pts/0    S+     0:00                  \_ /usr/lib/fvwm/2.6.8/FvwmButtons 9 4 none 0 8 RightPanel
  938 pts/0    S+     0:00                  \_ /usr/lib/fvwm/2.6.8/FvwmEvent 11 4 none 0 8 EventNewDesk
  939 pts/0    S+     0:00                  \_ /usr/lib/fvwm/2.6.8/FvwmPager 13 4 none 0 8 *
  940 pts/0    S+     0:01                  \_ /usr/lib/fvwm/2.6.8/FvwmIconMan 15 4 none 0 8
  941 pts/0    S+     0:04                  \_ /usr/lib/fvwm/2.6.8/FvwmScript 17 4 none 0 8 FvwmScript-DateTime
  955 pts/0    Sl    22:28                  \_ /usr/lib/firefox/firefox
 1049 pts/0    Sl    18:08                  |   \_ /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 179366 -parentBuildID 20190620195126 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 955 true tab
 1129 pts/0    Sl     0:46                  |   \_ /usr/lib/firefox/firefox -contentproc -childID 2 -isForBrowser -prefsLen 5850 -prefMapSize 179366 -parentBuildID 20190620195126 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 955 true tab
 8411 pts/0    Sl     0:24                  |   \_ /usr/lib/firefox/firefox -contentproc -childID 5 -isForBrowser -prefsLen 7065 -prefMapSize 179366 -parentBuildID 20190620195126 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 955 true tab
31147 pts/0    Sl     0:00                  |   \_ /usr/lib/firefox/firefox -contentproc -childID 10 -isForBrowser -prefsLen 9059 -prefMapSize 179366 -parentBuildID 20190620195126 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 955 true tab
32497 pts/0    Sl     0:04                  |   \_ /usr/lib/firefox/firefox -contentproc -childID 11 -isForBrowser -prefsLen 9059 -prefMapSize 179366 -parentBuildID 20190620195126 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 955 true tab
11810 pts/0    S      0:00                  \_ xterm
11812 pts/1    Ss     0:00                      \_ bash
  406 pts/1    R+     0:00                          \_ ps axf

우분투를 확인했는데...splash는 몇 가지 문제를 일으키는 grub 매개변수입니다. 나에게

/sbin/init 시작 옵션

말이 안되지만

/sbin/init cmd 줄의 첫 번째 부분

말이 되네요.

그런데, LILO가 명령줄에 "auto"를 전달하는 것에 대한 init/main.c의 설명을 알고 계십니까? 부트로더, 커널, initrd/init 및 /sbin/init(런레벨 또는 systemd-target의 경우)를 통한 명령줄 구문 분석은 그렇게 간단하지 않습니다.

다음에 추가:

"남자 추신"이 말했다 :

   args        COMMAND   command with all its arguments as a string.
                         Modifications to the arguments may be shown.
                         The output in this column may contain spaces.
                         A process marked <defunct> is partly dead,
                         waiting to be fully destroyed by its parent.
                         Sometimes the process args will be unavailable;
                         when this happens, ps will instead print the
                         executable name in brackets.

이것이 pid 2의 [kthreadd]와 그 하위 프로세스가 대괄호를 얻는 방법입니다! 왜 "인수 수정"이 표시될 수 있는지 궁금합니다.

관련 정보