Init

커널이 장치 드라이버들과 내부 구조를 초기화한 다음 사용자 공간 환경을 초기화하는 일은 시스템에서 가장 중요한 일 중 하나다. 2장에서도 논의했지만 이것이 커널에서 시작된 init가 하는 역할이다. 안드로이드는 독자적인 init을 사용하기 때문에 기능 면에서도 독자적인 부분이 있다.



동작원리

 [그림 6-4]는 init가 다른 안드로이드 컴퍼넌트들과 어떻게 통합되어 있는지를 보여준다.

커널에서 시작된 다음 설정 파일을 읽어들이고, 부트 로고 또는 텍스트를 화면에 출력하고, 속성 서비스용 소켓을 열고, 전체 안드로이드 사용자 공간을 이루는 데몬들과 서비스들을 시작한다.


init은 /dev, /proc, /sys를 생성하고 마운트한다. 이 디렉터리와 파일들은 init가 다음으로 할 일들에 큰영향을 준다. init은 이제 /init.rc와 /init.<기기명>.rc 파일을 읽어 그 내용을 내부 구조에 반영한다. 그런 후 설정 파일과 내장 규칙에 따라 시스템을 초기화한다.


모든 초기화 작업이 완료되면, init은 무한 반복을 수행하면서 종료되었거나 재시작이 필요한 서비스를 다시 실행한다. 또한 속성 서비스의 소켓과 같이 자신이 처리해야 할 파일 디스크립터들을 폴링하면서 처리할 입력이 없는지 확인한다. 이것이 setprop 속성 설정 요청이 서비스 되는 원리다.




설정파일

init의 동작은 주로 설정 파일로 제어한다. 안드로이드가 전용 init를 사용하므로 이 설정 파일에 관해서도 여러가지 알아보자.


-위치

init과 관련한 모든것은 루트 디렉터리(/)에 있다. 여기에 실제 init 바이너리와 설정 파일인 init.rc와 init.<기기명>.rc도 물론 여기에 있다. 첫 번째 설정 파일의 이름은 절대로 변경할 수 없지만 두 번째 파일명은 하드웨어에 따라 달라진다.

중요한 사항은 init가 명령을 실행하기 전에 두 파일을 모두 읽어들인다는 점이다.

 


-문법

init의 .rc 파일 안에는 액션과 서비스가 잔뜩 선언되어 있다. on키워드로 시작하는 선언은 액션을, service 키워드로 시작하는 선언은 서비스를 뜻한다.



보통 액션과 서비스는 왼쪽정렬, 이어지는 명령과 옵션은 위와 같이 들여쓰기 해놓았다.


액션은 실제 명령을 실행할 수 있다. 반면 서비스 선언은 서비스를 설명만 할 뿐, 실제로는 아무것도 실행하지 않는다.

서비스는 보통 액션이 시작되면 시작되거나 정지한다.


액션이 시작되는 유형은 두가지로 하나는 미리 정의된 트리거에 의해서, 다른 하나는 속성값이 변하여 트리거가 활성화 되는 경우다. init는 일정한 수의 미리 정의된 트리거를 가지고 있으며 이 트리거들은 특정한 순서로 동작한다. 반면, 속성으로 활성화되는 트리거는 해당 속성이 init.rc 파일이 정의한 특정한 값으로 변경될 때마나 활성화된다. 



init가 설정 파일을 해석한 후 미리 정의된 트리거와 내장 액션을 실행하는 순서를 살펴보자.


<미리 정의된 트리거>

    - early-init

    - init

    - early-fs

    - fs

    - post-fs

    - early-boot

    - boot

   

속성이 특정 값으로 설정되었을 때 정의해둔 명령들을 실행할 수 있게 해주는 것이 핵심이다.


다음은 대표적으로 기기의 설정 앱에서 'USB 디버깅' 메뉴를 껐다 켜면 기본 init.rc에 의해 adbd 데몬이 시작하거나

정지 한다.






-init.rc

 init.rc 는 여러 시스템 동작의 기반이 된다. 최소한 주석부분(설명부분)이라도 살펴보는 것이 좋다.



-보드 전용.rc 파일

보드에 특화된 init 설정이 필요한 경우, 사용하는 시스템에 맞춘 init.<기기명>.rc를 사용하는 것이 가장 바람직하다.

이 파일에서 어떤 명령을 수행한으가는 작성하는 사람에 달렸다.


init은 init.rc와 보드전용 .rc 파일에 정의된 액션을 실행하기 앞서 두 파일의 내용을 모두 확인한다. 그래서 보드 전용 파일에서 선언한 boot 액션과 fs 액션은 주 init.rc 파일의 같은 액션에 선언된 명령이 실행된 직후에 바로 실행된다. 파일이 달라도 여전히 같은 액션으로 실행된다는 뜻이다. 그러므로 어느 파일에서 선언했는지와는 상관없이 fs 액션 명령이 먼저 실행되고 그 뒤에 boot액션 명령이 실행된다.



 







+ Recent posts