INIT(8)

명칭
init - 프로세스 제어의 초기화를 실시한다

서식
init init [ 0 | 1 | 6 | c | q]

해설
init 유틸리티는 부트 처리의 마지막에 기동됩니다. init (은)는 통상, rc(8) 그리고 설명되고 있는 자동 리부트 순차 순서를 실행합니다. 그것이 성공하면(자), 시스템은 multiuser 모드가 됩니다. 리부트 스크립트의 실행에 실패하면(자), init (은)는 슈퍼 유저가 사용하는 쉘을 기동해 싱글 유저 모드를 개시시킵니다. init 유틸리티는, 부트 프로그램으로부터의 파라미터의 지시를 받아, multiuser 모드로 이행하지 않고, 일반의 demon를 기동하는 일 없이 싱글 유저 모드의 쉘을 기동시킬 수가 있습니다. 그 경우, 시스템은 메인트넌스를 위한 모드가 되어, 쉘을 빠지는 (^D 를 입력한다) 일로 싱글 유저 모드로부터 multiuser 모드가 됩니다. 이것에 의해, init 하 /etc/rc (을)를 퍼스트 부트 모드 (디스크 체크 생략)로 실행합니다.

만약 ttys(5) 파일의 console 의 엔트리가 “insecure” 에 마크 되고 있었을 경우에는, init (은)는 싱글 유저 모드의 쉘을 기동하기 전에, 슈퍼 유저의 패스워드를 요구합니다. 패스워드 체크는, console 하지만 “secure” 에 마크 되고 있으면 스킵 됩니다.

커널은 4 종류의 보안 레벨로 주행합니다. 어느 슈퍼 유저 프로세스도 보안 레벨을 올릴 수가 있습니다만, 레벨을 내리는 것이 할 수 있는 프로세스는 없습니다. 보안 레벨은 이하와 같이 정의됩니다:

-1  항상 위험한 모드 - 시스템은 항상 레벨 0 모드로 주행합니다. 이것은 초기치의 디폴트입니다.

0   위험한 모드 - 변경 불가 (immutable) 플래그나 추가만 (append-only) 플래그는 오프로 할 수 있습니다. 모든 디바이스는, 그 퍼미션에 따라 읽고 쓰기됩니다.

1   안전한 모드 - 변경 불가 플래그나 추가만의 플래그는 오프로 할 수 없습니다. mount 된 파일 시스템의 디스크 및 /dev/mem (이)나 /dev/kmem (은)는 read-only 가 됩니다. 커널 모듈 ( kld(4) 참조)는, 로드 및 언로드할 수 없습니다.

2   안전도의 높은 모드 - 레벨 1 의 모드의 효과에 가세해 디스크는 mount 되고 있든지 있지 않든지, ( mount(2) (을)를 제외해) 항상 read-only 가 됩니다. 이 레벨은, 파일 시스템을 언마운트 해 변경을 더하는 것을 불가능하게 합니다. 또, 시스템이 multiuser로 실행 중에 newfs(8) (을)를 실행하는 일도 할 수 없게 됩니다.

    더욱, 커널 시간의 변경은 1 초 이내에 제한되고 있습니다. 더 이상 변경하려고 하면(자), “Time adjustment clamped to +1 second” 그렇다고 하는 메세지를 로그 합니다.

3   네트워크의 안전 모드 - 안전도의 높은 모드에 가세해 IP 패킷 필터 룰 ( ipfw(8) 및 ipfirewall(4) 참조)를 변경 불가능으로 해, dummynet(4) 의 설정을 수정 불가능으로 합니다.

초기의 보안 레벨이 비 0 이었던 경우, init (은)는 보안 레벨을 변경하지 않습니다. 그 이외의 경우, init (은)는, 최초로 레벨 1 에 올립니다. 레벨은 줄일 수 없기 때문에, 그 후의 조작에 대해 레벨은 최저 1 이며, 이것은 싱글 유저 모드로 돌아오는 경우에 대해도 성립합니다. multiuser 모드에 대해 레벨 2 로 시스템을 달리게 하고 싶은 경우는, 싱글 유저 상태의 사이에, sysctl(8) (을)를 사용해, 변수 “kern.securelevel” 에 필요한 보안 레벨의 값을 설정합니다.

multiuser 모드의 경우, init 하 ttys(5) 파일로 지시받은 단말 포트를 위한 프로세스를 관리합니다. init 유틸리티는 이 파일을 읽어들여, 2 번째의 필드에 지시받은 명령을 실행합니다. 다만, 1 번째의 필드가 /dev 안의 디바이스를 참조해, 그 디바이스가 설정되어 있지 않은 경우는 예외입니다. 1 번째의 필드는, 명령에 건네받는 마지막 인수가 됩니다. 그 명령은 통상, getty(8) 그리고, getty (은)는 tty 를 오픈, 초기화해, login(1) 프로그램을 실행합니다. login 프로그램은, 유저가 로그인하면(자) 쉘을 기동합니다. 유저가 로그아웃 하는지 이상종료(ABEND) 하는 등 해, 그 쉘이 종료하면(자), init 유틸리티가 일으켜져 utmp(5) 파일로부터 유저를 지워, wtmp(5) 파일에 로그아웃을 기록합니다. 이 사이클은, init 프로그램이 그 단말에 새롭다 getty (을)를 실행하는 것으로 반복해집니다.

init 유틸리티는 임의의 demon를 주행계속 시키기 위해서(때문에) 도 사용 가능하고, demon가 죽었을 경우에는 자동적으로 재개합니다. 이 경우, ttys(5) 파일의 1 번째의 필드는, 설정된 디바이스 노드에의 패스를 참조해 안되어, demon에 대한 마지막 명령행 인수로서 건네받습니다. 이것은 AT&T UNIX /etc/inittab 에 있는 기능과 같습니다.

라인 상태 (on, off, secure, getty, 윈도우의 정보)는, ttys(5) 파일을 고쳐 써 “kill -HUP 1” 에 의해 시그널 SIGHUP (을)를 init 에 보내는 것으로, 리부트하지 않고 로 변경할 수 있습니다. 이 시그널을 받으면(자) init 하 ttys(5) 파일을 재차 읽어들입니다. ttys(5) 그리고 라인이 오프로 되면(자), init (은)는 그 라인에 관계하는 세션의 제어 프로세스에 SIGHUP 시그널을 보냅니다. 오프인 라인이 ttys(5) 파일로 온으로 되면(자), init (은)는 2 번째의 필드에서 지정되는 명령을 기동합니다. 라인의 명령나 윈도우 필드가 변경되었을 경우, 그 변경은 현재 의 로그인 세션이 종료할 때까지 유효하게는 되지 않습니다. (예를 들면, init 에 의해 새로운 프로세스가 기동될 때까지 유효하게 안 된다. ) ttys(5) 안이 있는 라인을 comment out 혹은 삭제했을 경우는, init (은)는 그 라인에 관해서는 아무것도 실행하지 않습니다. 그러나 이 경우, ttys(5) 파일과 utmp(5) 파일내의 기록 정보가 일치하지 않게 되기 (위해)때문에, 시험하는 것은 추천하지 않습니다.

“kill -TERM 1” 등에 의해 terminate 시그널 (TERM) (을)를 받으면(자), init 유틸리티는 multiuser 모드를 종료해, 싱글 유저 모드에 복귀합니다. 하드웨어 또는 소프트웨어의 문제로 데드 록 한 프로세스가 있는 경우, init (은)는 모든 프로세스의 종료를 기다리지 않고 (이것은 무한하게 끝나지 않을지도 모릅니다 ), 30 초간으로 타임 아웃 해 경고의 메세지를 출력합니다.

terminal stop 시그널 (TSTP) (을)를 보내면(자) ( “kill -TSTP 1” ), init 유틸리티는 새롭다 프로세스 (을)를 기동하는 것을 그만두어 서서히 시스템 정지 가능한 상태로 합니다. 그 후, hangup 시그널로 완전한 multiuser 모드로 돌아와, terminate 시그널 그리고 싱글 유저 모드로 옮깁니다. 이 hook 는 reboot(8) (와)과 halt(8) 그리고 사용되고 있습니다.

interrupt 시그널 (INT) (을)를 보내면(자) ( “kill -INT 1” ), init 유틸리티는 모든 프로세스를 (데드 록 프로세스를 기다리지 않고 ) 종료시켜, 리부트를 실행합니다. 이 조작은, 머신이 헹 했을 때에, 커널중에서, 혹은, X 로부터, 시스템을 안전하게 셧다운 하는데 편리합니다.

init 유틸리티는 같이 유저 정의 시그널 1 (USR1) (을)를 보내졌을 경우는 머신을 정지해, 유저 정의 시그널 2 (USR2) (을)를 보내졌을 경우는 머신을 정지하고 나서 전원을 끕니다 (하드웨어가 허락하는 경우).

머신을 셧다운 할 때, init 하 /etc/rc.shutdown 스크립트를 실행하려고 합니다. 이 스크립트는 innd (인터넷 뉴스 서버) (와)과 같은 특정의 프로그램을 깨끗이 종료시키기 위해서(때문에) 사용 가능합니다.

init 의 역할은 매우 중요해, 만약 init 하지만 죽으면(자) 시스템이 자동적으로 리부트됩니다. 만약 부트시에 init 프로그램을 찾아낼 수 없으면, 시스템은 “panic: init died (signal %d, exit %d)” (와)과 같은 메세지를 출력해 panic 로 종료합니다.

2 번째의 서식행과 같이 유저 프로세스로서 실행하는 경우, init 하 AT&T UNIX 의 동작을 에뮤레이트 합니다. 즉, 슈퍼 유저가 명령행으로 런 레벨 (을)를 지정 가능하고, init (은)는 오리지날의 (PID 1) init 에 다음과 같은 시그널을 보냅니다:
런 레벨 시그널 동작
0 | SIGUSR2 | 정지해 전원 절단
1 | SIGTERM | 싱글 유저 모드에 이행
6 | SIGINT | 머신을 재기동
c | SIGTSTP | 한층 더 로그인을 억제
q | SIGHUP | 파일
ttys(5) (을)를 재스캔

진단

getty repeating too quickly on port %s, sleeping. 라인에 서비스를 제공하는 프로세스가, 기동될 때마다 곧 종료해 버린다. 이것은, 단말 라인에 착신이 있을까 노이즈가 큰 경우에 자주 일어납니다. init 는 30 초간 sleeve 해, 그 후, 프로세스를 개시 계속 시키려고 합니다.

some processes would not die; ps axl advised. 셧다운때, 헹 하고 있어 종료 시킬 수 없는 프로세스가 있습니다. 이 상태는, 통상, 디바이스에 이상이 있을 때 디바이스 드라이버로 붙여 첨부 있고 (이)라고 끝내는 것으로 일어납니다.

관련 파일
/dev/console
    시스템의 콘솔 디바이스
/dev/tty*
    ttys(5) 안에 있는 단말 포트
/var/run/utmp
    현재 로그인하고 있는 것 유저의 정보
/var/log/wtmp
    모든 로그인·로그아웃의 정보
/etc/ttys
    단말의 초기화 정보가 쓰여진 파일
/etc/rc
    시스템 시작용 스크립트
/etc/rc.shutdown
    시스템 셧다운용 스크립트

관련 항목
kill(1), login(1), sh(1), dummynet(4), ipfirewall(4), kld(4), ttys(5), crash(8), getty(8), halt(8), ipfw(8), rc(8), reboot(8), shutdown(8), sysctl(8)

역사
init 유틸리티는 AT&T UNIX (으)로부터 등장했습니다.

경고
sysctl (을)를 가지지 않는 시스템은, 보안 레벨 -1 로 동작합니다.

부트 순차 순서에 대해, 보안 레벨을 1 보다 높게 설정하는 것이 별로 에도 너무 빠르면(자), fsck(8) 하지만 일관성의 없는 파일 시스템을 보수하는 것을 방해해 버릴 가능성이 있습니다. 보안 레벨 설정을 실시하는 장소로서 적절한 곳은, 모든 multiuser 시작 처리가 완료한 다음에 있는, /etc/rc 의 말미입니다.