Init 는 모든 프로세스의 부모입니다. 주된 역할은 / etc / inittab 파일에 저장된 스크립트로 프로세스를 만드는 것입니다 ( inittab (5) 참조). 이 파일에는 일반적으로 사용자가 로그인 할 수있는 각 행에 getty 를 생성하도록하는 항목이 있으며, 특정 시스템에서 필요로하는 자율 프로세스도 제어합니다.
런레벨
런레벨 은 선택한 프로세스 그룹 만 존재하도록 허용하는 시스템의 소프트웨어 구성입니다. 각 런레벨에 대해 init 에 의해 생성 된 프로세스는 / etc / inittab 파일에 정의됩니다. Init 는 8 개의 런레벨 중 하나가 될 수 있습니다 : 0-6 과 S 또는 s . 런레벨은 특권을 가진 사용자가 telinit 을 실행하게함으로써 변경됩니다.이 명령은 적절한 신호를 init 에게 보내어 어떤 런레벨을 변경할 지 알려줍니다.
런레벨 0 , 1 및 6 은 예약되어 있습니다. 런레벨 0은 시스템을 정지시키는 데 사용되고, 런레벨 6은 시스템을 재부팅하는 데 사용되며, 런레벨 1은 시스템을 단일 사용자 모드로 다운시키는 데 사용됩니다. 런레벨 S 는 직접적으로 사용되는 것이 아니라 런레벨 1에 들어갈 때 실행되는 스크립트에 더 많이 사용됩니다. 자세한 내용은 shutdown (8) 및 inittab (5)의 맨 페이지를 참조하십시오.
런레벨 7-9도 유효하지만 실제로 문서화되지는 않습니다. 이것은 "전통적인"유닉스 변종이 그들을 사용하지 않기 때문이다. 궁금한 점이있을 때, 런레벨 S 와 S 는 사실 동일합니다. 내부적으로 이들은 동일한 런레벨에 대한 별명입니다.
부팅
init 이 커널 부트 시퀀스의 마지막 단계로 호출 된 후 / etc / inittab 파일을 찾아서 initdefault 유형의 항목이 있는지 확인합니다 ( inittab (5) 참조). initdefault 항목은 시스템의 초기 런레벨을 결정합니다. 해당 항목이 없거나 ( / etc / inittab 을 전혀 사용하지 않는 경우) 시스템 콘솔에 런레벨을 입력해야합니다.
런레벨 S 또는 s 는 시스템을 단일 사용자 모드로 가져오고 / etc / inittab 파일을 필요로하지 않습니다. 단일 사용자 모드에서는 / dev / console 에 루트 셸이 열립니다.
단일 사용자 모드로 들어가면 init 은 /etc/ioctl.save 에서 콘솔의 ioctl (2) 상태를 읽습니다 . 이 파일이 존재하지 않으면 init 은 9600 baud 및 CLOCAL 설정으로 행을 초기화합니다. init 이 단일 사용자 모드를 떠날 때 콘솔의 ioctl 설정을이 파일에 저장하여 다음 단일 사용자 세션에서 다시 사용할 수있게합니다.
처음으로 다중 사용자 모드로 들어가면, init 은 boot 및 bootwait 항목을 수행하여 사용자가 로그인하기 전에 파일 시스템을 마운트 할 수있게합니다. 그러면 런레벨과 일치하는 모든 항목이 처리됩니다.
새로운 프로세스를 시작할 때 init은 먼저 / etc / initscript 파일이 존재하는지 확인합니다. 이 경우,이 스크립트를 사용하여 프로세스를 시작합니다.
자식이 종료 할 때마다 init 는 / var / run / utmp 및 / var / log / wtmp 에 파일이 존재할 경우 사실과 이유를 기록합니다.
런레벨 변경하기
지정된 모든 프로세스를 생성 한 후, init 은 자손 프로세스 중 하나가 죽을 때까지 기다리고, powerfail 시그널을 받거나, telinit 에 의해 시스템의 런레벨을 변경할 때까지 기다린다. 위의 세 가지 조건 중 하나가 발생하면 / etc / inittab 파일을 다시 검사합니다. 언제든지 새 항목을이 파일에 추가 할 수 있습니다. 그러나 init 은 위의 세 조건 중 하나가 발생하기를 기다립니다. 즉각적인 응답을 제공하기 위해, telinit Q 또는 q 명령은 init 를 깨우고 / etc / inittab 파일을 다시 검사 할 수 있습니다.
init 이 단일 사용자 모드가 아니고 powerfail 신호 (SIGPWR)를 받으면 / etc / powerstatus 파일을 읽습니다. 그런 다음이 파일의 내용을 기반으로 명령을 시작합니다.
실패)
전원이 공급되지 않습니다. UPS가 전원을 공급하고 있습니다. powerwait 및 powerfail 항목을 실행하십시오.
승인)
전원이 복원되면 powerokwait 항목을 실행하십시오.
낮은)
전원이 공급되지 않고 UPS의 배터리가 부족합니다. powerfailnow 항목을 실행하십시오.
/ etc / powerstatus가 없거나 F , O 또는 L 문자가있는 경우 init은 문자 F를 읽은 것처럼 작동합니다.
SIGPWR 및 / etc / powerstatus의 사용 은 권장하지 않습니다. init 과 상호 작용하기를 원하는 누군가는 / dev / initctl 제어 채널을 사용해야한다. 이에 대한 더 많은 문서는 sysvinit 패키지의 소스 코드를 보라.
init 이 런레벨을 변경하도록 요청되면, 새로운 런레벨에서 정의되지 않은 모든 프로세스에 경고 신호 SIGTERM 을 보냅니다. 그런 다음 SIGKILL 신호를 통해 이러한 프로세스를 강제 종료하기 전에 5 초 동안 대기합니다. init 은 이러한 모든 프로세스 (및 하위 프로세스)가 init이 원래 만든 프로세스 그룹에 남아 있다고 가정합니다. 프로세스가 프로세스 그룹을 변경하면 이러한 신호를 수신하지 않습니다. 이러한 프로세스는 별도로 종료해야합니다.
텔리 니트
/ sbin / telinit 는 / sbin / init에 링크됩니다. 1 문자의 인수를 취해 적절한 동작을 실행하기 위해서 (때문에) init 에 신호를 보낸다 . 다음은 telinit의 지시어입니다.
0 , 1 , 2 , 3 , 4 , 5 또는 6
지정된 실행 레벨로 전환하도록 init 에 지시하십시오.
a , b , c
런레벨 a , b 또는 c가 있는 / etc / inittab 파일 항목 만 처리하도록 init에 지시하십시오.
Q 또는 q
init 에게 / etc / inittab 파일을 다시 검사하도록 지시하십시오.
S 또는 s
단일 사용자 모드로 전환하도록 init에 지시하십시오.
U 또는 u
init 에게 스스로를 재실행 (상태를 보존)하도록 지시하십시오. / etc / inittab 파일을 다시 검사 할 필요가 없습니다. 실행 수준은 Ss12345 중 하나 여야합니다 . 그렇지 않으면 요청이 자동으로 무시됩니다.
telinit 은 init 에게 SIGTERM과 SIGKILL 신호를 보내는 프로세스를 기다려야하는 시간을 알려줄 수있다. 기본값은 5 초이지만 -t sec 옵션을 사용하여 변경할 수 있습니다.
telinit 은 적절한 권한을 가진 사용자 만 호출 할 수 있습니다.
init 바이너리는 프로세스 ID를 보고 init 또는 telinit 인지 확인합니다. 실제 init 의 프로세스 id는 항상 1 입니다. 이것으로 telinit 를 호출하는 대신 init 을 바로 가기로 사용할 수 있습니다.