이지랑드로랑 - 10장. Root 파티션 영역을 ReadWrite 권한으로

 

일단, 경축!

안드로이드를 이지보드에서 포팅하기 위해서 시작된 강좌, 이지랑드로랑이 드디어 10번째 강의를 맞이하였습니다.

얼씨구나 좋구나~ 기쁜일이 아닐 수 없습니다.

조회수가 적으면 의욕도 안생기고 해서 뭐하나 해서 금방 접어버리게 되는데 여러분들이 많이 봐주시니 저도 이제 압박이 되어 강좌를 빼먹지 않고 진행할 수 있도록 더 신경쓰는 것 같아요.

앞으로도 많은 관심 부탁드립니다.

What! Permission of File system?!

오늘 할 강좌는 바로 안드로이드 파일시스템이 부팅이 된 후에 읽고 쓰기가 모두 가능하도록 하는 것이 되겠습니다.

이전 시간에 좀 힘겹게 컴파일 하고 하는 부분이 많아서 오늘은 정말 쉬운거 하나 하려구요.

하지만 필요없는 건 아니고 안드로이드에서 개발하기 위해서 상당히 유용한 작업 전력이 되겠습니다.

 

퍼미션이라는 말은 다들 들어보셔서 알겠지만 권한을 말하는 것이죠.

이떤 디렉토리에서는 파일이 써지고 지워지고 자유로운데 어떤데서는 만들어지지는 않고 볼수만 있단 말이죠.

또 어디서는 아에 파일을 볼수 조차 없는 그런 공간이 있습니다.

바로 퍼미션 설정이 되어 있기 때문인데요, 우리도 오늘 이 권한설정을 한번 해보도록 하겠습니다.

 

그런데 왜 갑자기 이런 강좌를?

말이 필요 없죠.

그냥 이지랑드로랑 처음부터 따라하신 분들, 안드로이드 부팅하신 상태에서 mkdir 한번 해보세요.

 

[그림10-1. 그 유명한 Permission Denied]

 

띠로리!! Cannot create directory 'test' : Read-only file system.

말인 즉슨, 제가 만들고자 하는 디렉토리가 읽기전용인 파일 시스템의 문제로 생성할 수가 없다는 충격적인 결과보고.

일전에 허접함으로 무장한 막장 쉘에 이어서 이건 또 한번 사람을 당황스럽게 하는군요.

 

네, 그렇습니다.

안드로이드는 시스템을 자체적으로 보호하기 위해서 파티션 영역중 system 영역은 Read-only 로 설정해 버립니다.

실질적으로 사용자가 사용할 수 있는 공간을 userdate 파티션으로 제한하게 되는 것인데요.

그러나 아직 우리는 안드로이드를 가지고 막 열심히 작업하는 상태이고 시판하는건 아니란 말이죠.

그렇다면 중요한건 보안이 아니라 우리의 작업환경 입니다! (절대 보안이 안중요하다는건 아닙니다! ^^)

그럼 지금부터 한번 저를 따라서 간단하고 빠르게 읽고 쓰기 가능한 파일 시스템을 만들어 보죠.

 

Step1. 램디스크로 부팅 후 app 디렉토리 내의 init.rc 수정

먼저 우리가 항상 해오던데로 램디스크로 부팅을 해보죠.

그리고 app 디렉토리 (/dev/mtdblock2 영역) 에 들어가 있는 안드로이드 파일 중에서 init.rc 를 수정합니다.

init.rc는 모든 프로세서의 조상(뭐, 이런 표현들을 많이 쓰더라구요)이라 칭송받는 init 프로세서용 스크립트 입니다.

안드로이드용 init 프로세서는 이런 .rc 파일을 읽어서 시스템을 셋팅하게 됩니다.

우리가 이지부트에서 보면 이런 커맨드라인이 있었죠?

 

[그림10-3. 이지부트 커널 커맨드 중]

 

자, 19번 라인에 있는 명령. 바로 init=/init /init.rc 라는 명령어 입니다.

바로 이 커널 커맨드를 커널이 읽어서 파일 시스템을 읽을 때 init 프로세서가 잘 실행될 수 있도록 해주는 거에요.

이런걸 쉽게 수정할 수 있도록 만들어 놓은 이지부트를 쓰다 다른 부트로더를 쓰면 '아~~~ 이래서 이지보드가 개발하기 편한 보드라고 소문이 자자했던거구나~~~' 할낍니다. ^^

 

자! 이제 init.rc 파일을 수정해 보도록 하죠.

내장된 vi 에디터를 사용하면 쉽게 수정할 수 있습니다.

# create mountpoints and mount tmpfs on sqlite_stmt_journals

   ... 생략 ...

    mount rootfs rootfs / ro remount                                            
                                                                                
   ... 생략 ...                  
                                                              
# mount mtd partitions                                        
    # Mount /system rw first to give the filesystem a chance to save a checkpoin
    mount yaffs2 mtd@system /system                                             
    mount yaffs2 mtd@system /system ro remount 

기존에 저렇게 mount 하도록 된 구문을 아래와 같이 바꿉니다.

# create mountpoints and mount tmpfs on sqlite_stmt_journals

   ... 생략 ...

    mount rootfs rootfs / rw remount                                            
                                                                                
   ... 생략 ...                  
                                                              
# mount mtd partitions                                        
    # Mount /system rw first to give the filesystem a chance to save a checkpoin
    #mount yaffs2 mtd@system /system                                             
    #mount yaffs2 mtd@system /system ro remount 

간단히 분석하면 이렇습니다.

rootfs 영역, 즉 / 영역을 rw, ReadWrite (기존엔 ReadOnly) 로 수정했습니다.

그리고 system 디렉토리를 마운트 하는 것은 취소하도록 합니다.

왜냐면 이미 / 아래 system 디렉토리가 있기 때문이죠.

다 편집하셨다면 저장하고 끝!!! (ESC키 누른다음 Shift+; 키 누르시고 wq 쓰신다음에 Enter 하시면 되는것, 똑같습니다. ^^)

 

Step2. ReadWrite 권한 잘되는지 테스트

자! 이제 다시 낸드로 부팅해서 안드로이드를 만나 보도록 하죠.

안드로이드가 부팅이 완료된 이후, Root 영역에 디렉토리를 하나 만들어 보도록 해요.

자... 잘 되겠죠?

 

[그림10-4. mkdir 로 디렉토리를 생성한 모습. 권한 바꾸기 성공!]

 

자! mkdir 로 디렉토리를 생성해 보니... 아까 나던 오류가 안나요! 야호!

ls 로 디렉토리 목록을 보니까... 와우! 맨 아래에 제가 생성한 디렉토리가 떡하니 자리잡고 있네요.

네! 이렇게 해서 오늘 목표인 RootFS 권한을 수정하는 작업을 마치게 되었습니다.

 

'무슨 귀찮은 작업이냐! 난 그냥 하련다!' 하시는 분들은 한번 그렇게 작업 몇시간 해 보셔야 아~~~ 이래서 에프에이리눅스에서 이런걸 알려줬던 거구나~~~' 할 낍니다. ^^

우리가 어플리케이션은 소비자에게 맞춰야 하지만 이런 개발환경은 철저히 개발자에 맞춰야 하는거 아닐까요? ^^

그런 의미로 9장과 10장을 준비해 봤습니다.

유익하셨으면 좋겠네요.

 

그럼 다음 강좌를 쓸때까지!!!

모두 행복하세요~~~