이카루스
10.12.24
조회 수 5169
추천 수 3
댓글 14

이전에 릴리님의 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에 넣을시, 다른 중요한 프로세서들보다 먼저 실행되어 중요한 서비스의 호출을 막을수 있음.






최대한 이해하기 쉽게 설명을 드렸습니다.


어느정도 머리속으로 그려가시면서 읽어보시면, 이해되시리라 생각됩니다.


-끝-









댓글 14
  • ?
    쫑이~
    10.12.24
    아...그렇군요. 잘 읽었습니다.
    무슨 말인지 몰랐는데 덕분에 개념이나마 좀 잡았네요.
  • ?
    lne
    10.12.24
    수고하십니다
    메리크리스맛스 :>
  • ?
    firefox
    10.12.24
    조은정보감사함니다
  • ?
    [Travis]
    10.12.24
    알면 알수록 어렵네요.ㅜ_ㅜ 네번째 정독중..@_@
  • ?
    young
    10.12.24
    메리 크리스마스 데몬 낮익은듯 ㅋ.ㅋ
  • ?
    영웅2
    10.12.24
    정독해두 몰겠네요ㅠㅠ
    감사합니다
  • ?
    dydx™
    10.12.24
    감사합니다!
    메리크리스마스!
  • ?
    이거 한번 읽어 봐서 이해 한다면 제가 천재이겠죠..
    여하튼 일일이 신경써주셔서 감사합니다.
  • ?
    언제나 좋은 정보 감사합니다.^^ 따듯한 크리스 마스 보내세요 ^^
  • ?
    레이지
    10.12.24
    궁금했었는데, 감사합니다 ^^;
    여러가지 init.d에 넣어서 쓰는 스크립트들이 웹검색으로 나오더군요.
    일반 리눅스에서는 init.d에서 부팅/종료 스크립트를 사용할 수 있는것 같던데요.
    역시 문외한이라 어렵군요. 히히
    K는 첨알았네요.
    검색해서 공부 좀 해야겠네요.
    메리크리스마스!
  • ?
    완벽히 이해하지는 못했지만
    다른것들을 알아가다보면 윗 글이 하나하나씩
    이해가 되겠지요 ㅎㅎ
    좋은 정보 감사합니다. ^^
  • ?
    자양
    10.12.24
    안드로이드는 리눅스에서 사용하는 init과 다르므로 rc 스크립트 또는 init.d의 구현이 어렵지 않나요?

    init.d에서 사용되는 start, stop에 대한 구현도 안될거 같고, K 스크립트(종료시 수행되는 스크립트)도 안될거 같네요..
    단지 부팅시 추가적으로 수행되는 스크립트 정도에 대한 기능은 넣을수 있을것 같은데.
  • ?
    네. 본글은 일반 리눅스에서 사용하는 init프로세스이구요,
    안드로이드에서 적용하여 사용할만한 부팅레벨 스크립트는 E, S 으로 알고있습니다.
    릴리님이 상기 두개를 이전에 지원되게끔 수정해줬던걸로 기억합니다.
    안드로이드는 저도 접한지 얼마 되지 않아서, 리눅스표준으로 작성했습니다. 좋은 지적 감사합니다.

    아. 그리고 자양님정도의 실력이라면, 필요한 서비스데몬도 안드로이드커널에 때려넣을수 있을거라고 생각합니다.
  • ?
    좋은정보 감사합니다^^
댓글 쓰기 권한이 없습니다.
정렬 목록 검색 쓰기
등록된 글이 없습니다.
1 - 2