카테고리 없음 2010. 12. 2. 20:13

안녕하세요...

제가 옵큐를 쓴건... LU230039 버전이고 몇일있다가 41버전이 나왔습니다...

그전엔 커스텀 커널 올릴 fast_boot인가가 있다가 41버전 부터 없어졌다고 하는데... 그래도 커널 컴파일하고 커널을 변경 가능할 것같아서 글을 올립니다.

우선.. 제가 하고자 한 작업은 / 파티션의 default.prop와 init.rc를 수정해 보고 싶어서 입니다.

수정해 보신분은 알겠지만... 수정해도 재부팅하면 말짱 꽝입니다.

그래서 구글링을 했습니다.

아직 커널까지 빌드해보지 않아서 (정확히는 커널을 빌드할때 module로 컴파일해야 하는지... 또 어떤 것들을 써야 하는지... 기본 값 로드해도 tdmb 같은것 조차 선택되어 있지 않아서...) 커널 교체가 가능할지는 의문이지만 우선 / 파티션의 정보는 변경해 봤습니다.

우선 참고한 사이트는
http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Images
입니다.

저는 리눅스는 써봤지만... 그닥 뛰어난 실력이 있는것도 아니고...
임베디드가 전공이라지만... 다된 시스템에 큐토피아 컴파일해서 올린게 전부일 정도로... 뛰어난 실력이 아닙니다.
고수 분들이야 이미 알고 있을테지만... 안드로이드, 옵큐에 대해 알고 싶으신분을 위해 적어 놓습니다.



그럼 제가 작업한 작업 입니다.

기본적으로 설정 - 응용프로그램 - usb 디버깅은 설정해 둬야 합니다.

참고로 pc 에서 입력 값은 파란색, 출력값은 보라색으로 하겠습니다.
adb shell 은 #로 표시하고 (루팅이 된 상태에서 su 명령을 통해 root 권한을 획득한 상태입니다)
cmd console 은 >로 표시하고...
리눅스에서의 작업은 $로 표시하겠습니다.

1. boot 파티션 추출
adb shell 상태에서
# cat /proc/mtd
cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00a20000 00020000 "boot"
mtd1: 01fa0000 00020000 "cache"
mtd2: 00c20000 00020000 "recovery"
mtd3: 14200000 00020000 "system"
mtd4: 05e40000 00020000 "userdata"
#

위 결과 값을 보시면... 옵큐의 부팅 파티션은 /dev/mtd/mtd0 라는걸 쉽게 알수 있습니다.
# cat /dev/mtd/mtd0 > /sdcard/boot.img

자 그럼... boot 파티션을 추출했습니다.

이건 뭐하는 걸까요???
참고 사이트를 보면
<pre>+-----------------+
| boot header | 1 page
+-----------------+
| kernel | n pages
+-----------------+
| ramdisk | m pages
+-----------------+
| second stage | o pages
+-----------------+

n = (kernel_size + page_size - 1) / page_size
m = (ramdisk_size + page_size - 1) / page_size
o = (second_size + page_size - 1) / page_size

0. all entities are page_size aligned in flash
1. kernel and ramdisk are required (size != 0)
2. second is optional (second_size == 0 -> no second)
</pre><pre>이리 되어 있습니다.
즉 부팅에 필요한 boot header, 가장 핵심인 kernel, 그리고 / 파티션인 ramdisk가 있습니다.
즉 / 파티션은 ramdisk라... 죽어라 수정해도 재부팅하면 말짱 꽝입니다.


2. ramdisk 추출하기...
ramdisk를 추출하려면 위의 식 대로 계산을 해야 합니다.
하지만 역시나 능력자분들이 이미 쉽게 ramdisk만 추출하게 해 놨습니다.
앞서 추출한 boot.img를 이제 리눅스에서 작업해야 합니다. (cygwin을 통해 윈도우 환경에서도 작업이 가능하지만... 해보지 않았고... cygwin을 통한 작업은 제가 별로 안좋아합니다.)
boot.img를 리눅스로 옮깁니다. (저는 VMWare + 우분투 10.10 Server를 사용합니다.)
첨부된 split_bootimg.pl를 이용해서 ramdisk와 커널을 분립니다.
물론 perl이 설치되어 있어야 합니다.

$ ./split_bootimg.pl boot.img
Page size: 2048 (0x00000800)
Kernel size: 1388548 (0x00153004)
Ramdisk size: 141518 (0x000228ce)
Second size: 0 (0x00000000)
Board name:
Command line: no_console_suspend=1
Writing boot.img-kernel ... complete.
Writing boot.img-ramdisk.gz ... complete.

참쉽게 boot.img-kernel과 boot.img-ramdisk.gz로 분리해 줍니다ㅡ.ㅡ


3. ramdisk 수정
추출한 ramdisk를 다음 명령어로 압축해제 합니다.
$ mkdir ramdisk
$ cd ramdisk
$ gzip -dc ../boot.img-ramdisk.gz | cpio -i
$ cd ..
ramdisk 디렉토리 아래 / 파티션이 압축해제 됩니다.
이제 수정하면 됩니다.
저같은 경우 간단히 default.prop 의 set ro.secure=1 -> set ro.secure=0 로 수정해서 테스트했습니다.
(
set ro.secure=0는 adb shell 접속시 기본적으로 root 권한을 가집니다. 즉 adb를 통해 마운트도 할 수 있고 root가 할수있는 모든일을 su 하지 않고도 가능합니다.)


4. ramdisk 재압축
첨부된 mkbootfs를 통해 압축합니다. 명령어 자체는 ramdisk를 만들고 다시 압축해라 하는 것입니다.
$ ./mkbootfs ./ramdisk | gzip > ramdisk-new.gz
참쉽습니다.ㅡ.ㅡ


5. boot 이미지 만들기...
우선 참고 사이트는
$ ./mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img
이런 방법을 제시 했고... 전 옵큐에 맞게
$ ./mkbootimg --cmdline 'console=ttyMSM2 androidboot.hardware=qcom androidboot.carrier=LGT' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img
변경해서 해봤습니다.
둘다 안됩니다.


정리하기전...

출처 : http://cafe.naver.com/androiders.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=451700
posted by Sense.J
: