JS

2014년 11월 14일 금요일

Nexus 7 (2013), Android 5.0 Lollipop OTA

넥서스 7 (2013)용 안드로이드 5.0 롤리팝 OTA가 시작되었다. 팩토리 이미지는 어제인가 그제인가 나왔는데 OTA file 주소는 조금 더 늦게 알려진 듯 하다.

OTA 파일을 직접 다운로드 받아서 적용하려면 아래와 같이 하면 된다.

OTA 파일 다운

KTU84P → LRX21P
http://android.clients.google.com/packages/data/ota/google_razor/5a0f7a47588c268c239e58cf568823c6637c5af1.signed-razor-LRX21P-from-KTU84P.5a0f7a47.zip

(출처: http://forum.xda-developers.com/showthread.php?t=2380113)

adb sideload를 이용하여 패치 적용

a. 기기 전원을 끄고,
b. 전원 버튼과 볼륨+ 버튼을 동시에 눌러서 recovery 모드로 들어 간 뒤,
c. 누워 있는 안드로이드가 보이면 전원 버튼을 계속 누르고 있는 상태에서, 볼륨+ 버튼을 눌렀다가 떼고, 전원 버튼에서 손을 떼면,
d. 메뉴가 보일 것이다.
e. 메뉴에서 Apply update from ADB를 선택하고,
f. 컴퓨터에서 adb sideload <filename> 명령으로 업데이트 파일을 전달하면 된다.

참고:

2014년 6월 28일 토요일

윈도우 재설치 없이 MBR 디스크를 GPT 디스크로 변환하는 방법

경고: 모든 내용을 이해한 경우에만 따라할 것을 권장합니다. 최악의 경우 모든 데이터가 유실될 수 있으며, 필자는 그에 대해 어떠한 책임도 지지 않습니다. 데이터의 유실의 원인이 아래 설명에 포함된 오류에 의한 경우에도 마찬가지입니다.


윈도우를 MBR 타입의 디스크에 설치한 상태에서, 윈도우를 재설치하지 않고 파티션 테이블 타입을 GPT로 바꾸는 방법을 설명한다. 이 글은 윈도우 포럼의 글 등을 참고하여 작성하였다.

요구사항: 최근 버전의 64비트 윈도우, UEFI를 지원하는 메인보드, 기타 등등.

단계 1

윈도우 자체에서는 디스크를 초기화하지 않고 파티션 테이블 타입을 변경할 수 없다. 따라서 제3의 프로그램을 이용해야 한다. 여기서는 SystemRescueCd로 부팅하여 gparted와 gdisk를 이용하였다. 물론 다른 프로그램을 써도 된다.

단계 1.1

SystemRescueCd로 부팅하고 gparted를 실행한다.

MBR 타입의 디스크에 윈도우 8.1을 설치하면 Recovery 파티션의 크기가 350MB로 설정된다. GPT 타입의 디스크에 직접 설치해 본적은 없는데, 이 경우에는 300MB라고 하는 것 같다. 그러므로 Recovery 파티션의 크기를 300MB로 줄여준다. 상황에 따라 없애 버려도 된다.

나중에 EFI 파티션과 MSR 파티션을 만들어야 하는데 각각 100MB와 128MB를 차지한다. 이 2개의 파티션은 gparted에서 만드는 것이 아니라 윈도우에서 만들 것이므로 228MB의 공간이 남도록 파티션 크기 조절을 해야 한다. 최종적으로 다음 순서대로 파티션이 생성되면 "권장" 설치 방법과 동일해진다.

* Windows Recovery Environment (Windows RE) - 300MB
* Extensible Firmware Interface System Partition (ESP) - 100MB
* Microsoft Reserved Partition (MSR) - 128MB
* Windows

위 모양대로 파티션을 만드려면 기존의 윈도우가 설치된 파티션을 우측으로 이동해야 하는데, 이렇게 하면 시간이 오래 걸린다. 하드디스크의 경우 시간이 정말 오래 걸릴 수 있고, SSD의 경우 수명에도 문제가 될 수도 있다. 윈도우가 실제로 차지하는 공간이 작은 경우에도 gparted는 파티션 전체를 이동시키는 것 같고, 따라서 파티션 용량에 비례해서 시간이 오래 걸릴 것이다.
a. 윈도우 파티션의 데이터를 백업한 후, 파티션을 삭제하고 다시 만들고, 데이터를 복원하는 방법이 오히려 나을 것 같다.
b. 아니면 피티션 구조를 "권장" 방법이랑 다르게 할 수도 있을 것 같다. ESP나 MSR가 윈도우 파티션보다 뒤로 가게 만들어주는 것이다. 이렇게 구성할 경우 생기는 부작용에 대해서는 아는 바가 없다.
그리고 나중에 설명하겠지만 파티션의 가장 끝에 빈 공간을 약간 늘려 주어야 한다. 예를 들면 다음과 같은 형태로 만들어주면 된다.

* Windows RE - 300MB (350MB에서 축소됨.)
* 빈 공간 228MB 마련
* 우측으로 이동한 윈도우 파티션 (크기가 약간 작아지면서 우측으로 이동됨.)
* 약간의 빈 공간

사실 빈 공간 228MB가 윈도우보다 반드시 앞에 있어야 하는 것은 아니며, MSR은 안 만들어도 당장은 동작하므로 빈 공간을 100MB만 만들어 두어도 상관 없으며, 여의치 않으면 Windows RE는 지워버려도 당장은 상관 없다.

원하는대로 파티션 테이블을 조작한 후 gparted를 종료한다.

단계 1.2

이제 gdisk를 이용한다. 참고로 gdisk는 fdisk의 GPT 버전 비슷한 것이다. 아마 디스크의 파티션 테이블이 MBR 타입이라는 경고가 뜰 것이다. 여기서 w 명령을 이용하여 파티션 테이블을 기록하면 디스크가 GPT 타입으로 변경된다. N 블럭이 겹친다는 경고가 뜰 수도 있는데, GPT의 경우 파티션 테이블의 복사본을 디스크의 끝에 저장하기 때문이다. 이 때문에 전 단계에서 디스크 끝에 약간의 빈 공간을 남겨두라고 한 것이다.

단계 1.3

다시 gparted를 실행하고, 너무 넉넉하게 만든 약간의 빈 공간을 다시 채운다.

단계 1.4

Recovery 파티션의 권장 용량이 350MB에서 300MB로 줄었다는 것은 뭔가 필요 없는 것이 생겼다는 것이다. Recovery 파티션을 mount해서 살펴보면 Boot, bootmgr, BOOTNXT, BOOTSECT.BAK처럼 부팅 관련된 파일들이 있다. 우리는 EFI를 쓸 것이므로 이것들은 더 이상 필요가 없고, 삭제해도 될 것 같은데 확실하지는 않다. Recovery 파티션은 다시 umount해준다. 이제 단계 1은 끝났다. 재부팅을 한다.

단계 2


단계 2.1

윈도우 설치 디스크로 부팅한다. SHIFT+F10을 이용하여 명령 프롬프트로 들어간다.
여기서 diskpart 명령을 이용한다. "list disk"로 디스크를 확인하고 "select disk N"으로 디스크를 선택한다. (필요하면 help 명령으로 도움을 받으면 된다.)

단계 2.2

(이 단계가 왜 필요한지 모르겠다. 어쩌면 필요 없을 수도 있다.)
첫번째 파티션, 즉 recovery 파티션을 선택하고, GUID를 바꿔준다.
select partition 1
set id=DE94BBA4-06D1-4D40-A16A-BFD50179D6AC
assign letter-R
letter는 마음대로 해도 되는데, 필자는 recovery부터 순서대로 R, S, T를 쓰기로 했다.

단계 2.3

빈공간 228MB에 두 개의 파티션을 생성해야 한다.
create partition efi size=100
format quick fs=fat32
assign letter=S
create partition msr size=128
MSR은 format을 안 해도 되는 건지 모르겠는데, 일단 넘어간다.

단계 2.4

윈도우가 설치된 파티션을 선택하고 드라이브 문자를 C로 만들어준다.
select partition 4
assign letter=C
diskpart는 이제 종료한다.

단계 2.5

다음 명령으로 boot 매니저를 설치한다.
bcdboot C:\Windows /s S: /f UEFI

이제 다시 재부팅

단계 2.6

부팅할 때 F2 키를 누르고 UEFI 설정에 들어가서, UEFI를 활성화한다. 이것으로 모든 작업이 끝났다. 제대로 되었다면 윈도우로 부팅이 가능하다.

참고자료

1. http://windowsforum.kr/review/4750525
2. http://windowsforum.kr/review/4767059
3. https://gitorious.org/tianocore_uefi_duet_builds/pages/Windows_x64_BIOS_to_UEFI
4. http://technet.microsoft.com/en-us/library/hh824874.aspx
5. http://technet.microsoft.com/en-us/library/cc754498.aspx


2014년 6월 27일 금요일

GPT

컴퓨터를 너무 오랜만에 바꿨더니, 그 사이에 바뀐 기술들에 익숙하지 않다.
GPT라든가 UEFI라든가...

# GPT 장점

위키 등을 참조.


# GPT 복구 방법

GPT는 디스크의 끝에 파티션 테이블의 백업을 저장하므로, 디스크 앞의 테이블만 망가진 경우에는 복구가 가능하다.

# 윈도우를 MBR 디스크에 설치 시 생성되는 파티션

* Windows Recovery Environment (Windows RE) - 350MB
* Windows

Windows RE는 없어도 된다. 공식적으로는 만드는 것을 추천하긴 한다.


# 윈도우를 GPT 디스크에 설치시 생성되는 파티션

* Windows Recovery Environment (Windows RE) - 300MB
* Extensible Firmware Interface System Partition (ESP) - 100MB
* Microsoft Reserved Partition (MSR) - 128MB
* Windows

Windows RE는 없어도 되고, MSR은 용도가 불분명한데, 현재로서는 없어도 되긴 된다.
공식적으로는 둘 다 만드는 것을 추천한다.

ESP는 부팅을 위해 필요하므로 반드시 만들어야 한다.
디스크가 2개 이상일 때 각각 필요한지 여부는 모르겠다.


# MBR to GPT

윈도우가 기본으로 제공하는 도구를 사용하면 모든 데이터가 삭제될 수도 있다.


# GPT to MBR


# GPT 사용 시 윈도우, 리눅스 멀티 부팅

MBR을 쓸 때 보다 더 어려워 진 것 같다.
http://unix.stackexchange.com/questions/49165/can-grub2-share-the-efi-system-partition-with-windows

# 참고 문서

1. 디스크 파티션 이해,http://technet.microsoft.com/ko-kr/library/dd799232(v=ws.10).aspx
영문: Understanding Disk Partitions, http://technet.microsoft.com/en-us/library/dd799232(v=ws.10).aspx

윈도우 설치시 생성되는 파티션 설명이 있음. 윈도우 7 또는 윈도우 서버 2008 R2 기준으로 설명함.

2. Using GPT Drives, http://msdn.microsoft.com/en-us/library/windows/hardware/dn653580(v=vs.85).aspx

3. Windows and GPT FAQ, http://msdn.microsoft.com/en-us/library/windows/hardware/dn640535(v=vs.85).aspx#gpt_faq_what_is

2013년 11월 14일 목요일

넥서스 7 (2013)에 kitkat 올리는 방법 (OTA)

롤리팝의 경우:
http://sigpoll.blogspot.kr/2014/11/nexus-7-2013-android-50-lollipop-ota.html


1. 우선 android sdk와 usb driver를 설치해야 된다. http://sigpoll.blogspot.kr/2013/09/adb.html을 참고하면 된다.

2. OTA 파일을 다운받아야 한다. 다음 주소에서 다운로드 받으면 된다.

http://android.clients.google.com/packages/ota/google_razor/3a3951e8243c82bc01a620ab858f4454c8ebd65c.signed-razor-KRT16O-from-JSS15R.3a3951e8.zip

링크 주소의 출처는 http://forum.xda-developers.com/showthread.php?t=2380113&page=7이다.

3. 그리고 adb sideload를 이용해서 업데이트를 하는데 그 방법은 http://forum.xda-developers.com/showthread.php?p=44882205#post44882205에 적혀있다. (영어)

대충 설명하면,
a. 전원을 끄고,
b. 전원 버튼과 볼륨+ 버튼을 동시에 눌러서 recovery 모드로 들어 간 뒤,
c. 누워 있는 안드로이드가 보이면 전원 버튼을 계속 누르고 있는 상태에서, 볼륨+ 버튼을 눌렀다가 떼고, 전원 버튼에서 손을 떼면,
d. 메뉴가 보일 것이다.
e. 메뉴에서 Apply update from ADB를 선택하고,
f. 컴퓨터에서 adb sideload <filename> 명령으로 업데이트 파일을 전달하면 된다.
g. 이제 업데이트가 완료될 때까지 구경하면서(?) 대기한다.

2013년 9월 28일 토요일

기기 관리자 문제 해결

문제가 발생하는 원인:
* OTA를 빨리 받기 위한 방법 중에 Google Services Framework의 데이터를 지우는 방법이 있다. 그런데 이 방법을 적용하면 몇 가지 문제가 발생하기도 한다.

안드로이드 기기 관리자에 내 기기가 안 보이는 경우

참고: https://support.google.com/accounts/answer/3265955?hl=ko

1. Google 설정에서 원격 기기 초기화 허용을 비활성화한다.
2. 설정 > 애플리케이션에서 Google Play 서비스의 데이터를 지운다.
3. Google 설정에서 원격 기기 초기화 허용을 활성화한다.
4. 기기를 리부팅하고 기다린다.

구글 플레이 스토어에서 내 기기가 안 보이는 경우 (앱 원격 설치 불가능)

참고: https://support.google.com/googleplay/answer/1141080?hl=en

1. 설정 > 애플리케이션에서 Google Play 스토어의 데이터를 지운다.
2. 플레이 스토어를 다시 실행하면 약관 동의를 묻는 창이 다시 나올 것이다. 여기에 동의하고 기다린다.

2013년 9월 27일 금요일

넥서스 7 (2013) OTA 실패

넥서스 7 (2013)을 루팅 등을 하지 않고 순정 상태로 사용 중이었다. 그런데 시스템 업데이트 과정에서 오류가 발생하였다. 처음에는 일시적인 오류라고 착각을 했는데, 같은 오류가 두세번 반복되고 난 후, 내 넥서스 7에 문제가 있다는 것을 알게 되었다. 오류가 발생한 화면에서 volume up key + power key를 누르면 recovery mode가 나오면서 어디서 오류가 발생했는지도 볼 수 있다. 에러 메시지는 다음과 같았다.

Finding update package...
Opening update package...
Verifying update package...
Installing update...
Verifying current system...
assert failed: apply_patch_check("/system/framework/framework-res.apk", "d6ff2a1767bec4e906ee8498fc852d74c16e328d", "b92dd7bde4e18298ee24053ba36436f4f03fcb79")
E:Error in /cache/58a0583c950458ab96dc1fc29b020c6782493c3b.signed-razor-JSS15R-from-JSS15Q.58a0583c.zip
(Status 7)
Installation aborted.

정상적인 방법으로 OTA를 시도한 경우에도 실패했고, adb sideload를 이용한 방법도 실패했다. 공장 초기화를 한 후 다시 시스템 업데이트를 시도한 경우에도 실패했다. 모든 경우에 위와 같은 assert failed 메시지가 나타났다.

* 루팅을 시도하지도 않았고, 커스톰 롬을 설치하지도 않았다.

* 설정의 메뉴에서 공장 초기화를 해도 문제는 해결되지 않았다.

* 리커버리 모드에서 공장 초기화를 해도 문제는 해결되지 않았다.

* 위 메시지에서 assert failed에 해당하는 부분은 OTA update 파일에서 META-INF/com/google/android/update-script의 line #196에 해당하는 내용이다.

* 루팅은 하지 않았고, 시스템 파티션에 read-only로 접근 가능하다. adb pull /system/framework/framework-res.apk로 JSS15Q 상태의 기기에서 framework-res.apk를 추출한 후 sha1sum을 해보니 결과는 b92dd7bd... 이였다.

* Factory image의 압축을 해제한 후 apk의 파일을 추출할 수 있다 (참고1, 참고2). 요약하면 sgs2toext4.jar을 이용하여 .img 파일을 .ext4.img 파일로 바꿀 수 있고, 그 파일은 DiskInternals Linux Reader에서 읽을 수 있다. 이렇게 해서 framework-res.apk를 추출했고, 그 파일의 sha1sum은 b92dd7bd... 이였다.

* 그리고 d6ff2a17...은 업데이트 적용 후의 sha1sum인 것 같다.

* OTA 파일에서 patch/system/framework/framework-res.apk.p가 바이너리 패치 파일인 것 같다.

* apply_patch_check가 정확히 무슨 일을 하는지 모르겠다. 내 시스템에서 framework-res.apk의 sha1sum은 분명히 문제가 없다. 그리고 OTA 파일도 아마 문제가 없을 것이다. 정상적인 방법(sideload 말고)을 이용했을 때도 같은 에러가 발생했으며, 에러 메시지에서 보이는 파일명(zip 파일)은 sideload를 위해 다운 받은 zip 파일의 파일명과 일치하기 때문이다.

안드로이드 adb를 설치하고 사용하는 방법

1. SDK 설치

여기를 클릭하여 Android SDK에 접속하여, 필요한 프로그램을 다운받아 설치해야 한다. 참고로 ADT bundle이라고 되어 있는 것은 이런 저런 프로그램이 통합되어 있어서 용량이 크다. 앱을 개발할 생각이 없다면 SDK tools only라고 되어 있는 것을 다운받아서 설치해도 된다. 본인에게 맞는 방법으로 설치하자. 참고로 JDK도 설치해야 된다. System requirements에 자세히 적혀 있다.


SDK 설치가 완료되면 Android SDK Manager를 실행하고 Tools/Android SDK Platform-tools를 설치한다. 앱을 개발할 계획이 없다면 Android 4.3 (API 18) 등은 설치하지 않아도 된다.



2. USB 드라이버 설치

단순히 파일 복사만 하는 경우에는 드라이버를 설치하지 않아도 되지만, USB 디버깅을 하려면 추가 드라이버를 설치해야 한다. 이 드라이버는 제품에 따라 다운 받는 위치가 다르다. 이 글에서는 윈도우에서 넥서스 7 (2013)을 사용하는 경우를 기준으로 설명하겠다. 그 이외의 상황이라면 윈도우를 쓰는 경우에는 win-usb.html 또는 oem-usb.html을 참고하고, 다른 운영체제를 쓰는 경우에는 device.html을 참고하자.

Android SDK Manager를 실행하고 Extras/Google USB Driver를 설치한다. 앱을 개발할 계획이 없다면 Android 4.3 (API 18) 등은 설치하지 않아도 된다.

그 다음에 윈도우의 장치 관리자를 열고 기타 장치에서 느낌표가 떠 있는 Nexus 7을 선택하여 드라이버 업데이트를 한다. 수동으로 설치하는 옵션을 선택하자. 그 다음 드라이버를 검색할 위치를 지정해야 한다. 이 위치를 C:\Program Files\Android\android-sdk\extras\google\usb_driver으로 지정한다. (정확한 위치는 android-sdk를 설치한 위치에 따라 알맞게 수정.)

설치가 제대로 되었는지 확인하려면 cmd 창에서 adb devices 명령을 내려보고 기기가 나타나는지 보면 된다. adb가 기본적으로 PATH에 없으므로 PATH를 수정하든가 C:\Program Files\Android\android-sdk\platform-tools에서 cmd를 열어야 한다.

3. Recovery 모드에서 adb 사용

USB 코드가 달라서 드라이버를 또 설치해야 한다. 방법은 위와 비슷한데, 드라이버를 검색하는 옵션 대신 드라이버 목록에서 직접 선택하는 옵션을 사용해야 한다. 그렇게 하지 않으면 설치가 안 된다. (수동 설치 -> 직접 선택 -> (모든 장치) -> 디스크 있음 -> Andorid ADB Interface 선택)