이전에 릴리님의 Voodoo 때부터 init.d지원이 됩니다~라는 등의 Guide를 보셨을겁니다.
또, 이번 테그라크님의 Tegrak Build9버전부터도 init.d를 지원하게끔 커널을 제작하였습니다.
표준리눅스에서는 그 안에들어 있는 것이 약100여개 가량됩니다만, 안드로이드에서는 얼마 있지 못합니다. init.d폴더자체도 없구요.
그래서 릴리님이나, 테그라크님이 커널작업하실 때 때려넣어 지원하게끔 만들어주시고 있습니다.
init.d의 개념을 저보다도 잘 알고 계시는 분들이 있겠지만, 몇몇분들이 왜 init.d안에 스크립트를 넣을 때 S99~~~~.sh 와 같은 S와 그다음에 숫자를 넣고, 왜 그렇게 하는지 등, 궁금해 하시는 것 같아서 나름대로 이해하실 만한 내용으로만 정리해보았습니다.
init.d 는 리눅스에서 데몬을 구동시킬수 있는 스크립트들을 저장할수 있는 서비스디렉토리로 initialization demon의 약자입니다.
어떤 프로그램을 구동시키기 위해서는 먼저 데몬을 올리고나서 구동하게 되는데, 바로 이 데몬을 먼저 상주시키거나 실행, 중지, 다시 실행시킬 수 있는 공간이 바로 init.d 입니다. 보통 스크립트를 만들어서 이곳에 저장하여 부팅시 자동실행하게 해줍니다.
init.d의 개념을 간단하게 설명하자면, 먼저 init프로세서등에 대해 대출이라도 아셔야 합니다.
1. init 프로세서란? 그리고 프로세서와의 관계는?
모든 프로세서는 각각 고유의 ID가 있습니다. PID란 (Process identifier)의 약어입닙니다.
겔럭시도 리눅스기반의 안드로이드 를 채택하고 있으므로, adb shell에서 한번 "top" 를 쳐보세요.
top는 시스템의 프로세스 상황 모니터링, 프로세스별 CPU사용량, 메모리와 스왑 사용량등을 볼수 있는 명령어이며, 제일 첫행에 PID, UID, processer등이 보일것입니다.
해당 프르세서에 대한 고유ID가 바로 PID입니다.
여기서 모든 프로세서의 부모프로세서는 PID번호가 "1"번인 init 프로세서입니다. 즉, init프로세서는 PID가 1번입니다.
PID가 0번인 Swapper 라는 프로세스가 있는데, 이는 부팅되면서 잠시 실행되어 init프로세스를 실행시킨 후에 몇몇가지만 수행한후 부팅이 완료되기 전에 자동종료됩니다.
즉, 부팅중에 Swapper에 의해서 init 프로세스가 호출되고, 부팅후에도 init프로세스는 부팅이후에도 계속 PID 1번으로 남아 있습니다.
그리고나서, 시스템상에서 실행 및 생성되는 모든 프로세서들은 바로 PID 1번인 init프로세스에 의해서 실행됩니다.
2. init프로세서와 init.d 디렉토리
- 디렉토리의 모든 파일들은 링크파일 형태로 존재하며, 링크파일들은 모두 /etc/init.d 디렉토리의 실제파일로 릴크되어 있음.
- 바로 이 링크(link)에 의해서 각각의 프로세스들을 실행,중지, 재시작을 할 수 있음.
- 우리들이 쉽게 사용할수 있는 init.d 디렉토리에 존재하는 링크관련 파일들은 K 나 S로 시작함
(-> 사실 표준 리눅스에서는 a~z까지 약 100개정도의 서비스데몬스크립트파일이 존재함)
- K로시작하는 스크립트 파일들은 부팅레벨에서는 실행이 안되는 프로세스들임
- S로 시작하는 스크립트 파일들은 해당 부팅레벨에서 부팅시 실행되는 프로세스들임
- K와 S 각가 뒤에 있는 숫자들은 (ex. S98icarus01.sh)들은 실행될 순서를 의미함
- 겔스의 외장SD마운트나 관련 스크립트들을 바로 이 init.d폴더에 스크립트형태로 저장하되, S98icarus.sh 등으로 S뒤의 실행순서 숫자는 제일 뒤에 실행되게끔 높은 숫자로 스크립트를 만들어서 init.d에 넣어줌. 만약 이러한 외장마운트패치와 같은 스크립트를 낮은 숫자로 된 이름으로 스크립트를 저장하여 init.d에 넣을시, 다른 중요한 프로세서들보다 먼저 실행되어 중요한 서비스의 호출을 막을수 있음.
최대한 이해하기 쉽게 설명을 드렸습니다.
어느정도 머리속으로 그려가시면서 읽어보시면, 이해되시리라 생각됩니다.
-끝-
무슨 말인지 몰랐는데 덕분에 개념이나마 좀 잡았네요.