2013년 10월 31일 목요일

Install Ubuntu 13.04 + linux 3.11 and dual-boot with OSX on Macbook Air, 2013

Macbook Air(MBA) is one of greatest machine for hackers. I bought MBA 2010 when 11" model released and used to hack with it.

One day, I attended linux forum and requested torvalds's signature on my MBA. He refused to have a signature on MBA, but I persuaded him with my promise to install linux on my MBA. After the event, I got torvalds's signature on my MBA and installed Ubuntu 12.04 on it. And, it was really great. MBA's mobility and linux. It's really cool hacking environment.

Recently, because MBA 2010 was too old, I bought MBA 2013 11" model and installed Ubuntu 13.04. Because Ubuntu 13.04 didn't support MBA well, I also build and installed linux 3.11 official version with some patch on it. Now, I'm enjoying my hacking life.

Because the installation was not so easy, I want to record / share my experience here.
Because the time I installed Ubuntu was about 2 months ago, some parts may not be up to date. Just hope it can be a little help to somebody :)


0. Install Environment
My MBA is 11" model published from 2013(6,1). I also upgraded it's cpu, RAM, SSD.

1. Download Ubuntu Image and Burn Install CD
Ubuntu distribute installation CD image for Mac in seperate way. Go to the link below and download 13.04 for mac image(ubuntu-13.04-desktop-amd64+mac.iso) and burn CD using it.
http://releases.ubuntu.com/raring/

I think live USB will be Ok, too. But, in my case, because my USB broken, I did with CD using USB CD driver.

2. SSD Partition
Make partition on SSD for Ubuntu installation. Open disk utility from Mac OSX(If hard to find, use spotlight).
Select SSD, enter to Partition tab, reduce partition size for Macintosh HD partition as you want to.
If my explanation is too concise, see the link below:
http://osxdaily.com/2009/11/20/resize-partitions-in-mac-os-x-with-disk-utility/

3. Boot to Ubuntu Install Image
Connect Live CD or Live USB you made from step 1, restart MBA. Before MBA powered on, press Option(alt) key. You should press it as soon as you pressed power button to turn on MBA. Then, booting partition selection screen like below photo will be displayed.

The USB displayed as Windows. Looks like OSX think it's just Windows if user trying to boot from other media such as CD or USB. It's annoying but, just select it. Then, MBA boot to Ubuntu in Live CD or Live USB.

4. rEFIt Install
Pressing option key every time can be annoying. The program rEFIt can help it. rEFIt is boot option selection / managing program. You can download from the link below:
http://refit.sourceforge.net/#download
Just execute downloaded rEFIt and execute install file. Then rEFIt be installed. Now, when you restart MBA, it doesn't boot to OSX automatically, rather ask you which partition you want to boot.

Actually, the developer of rEFIt doesn't support it any more. He is now developing same purpose program with new name rEFInd. It'd rather to use it. I just used rEFIt because I didn't know rEFInd at that time.


5. Ubuntu Install
Ubuntu installation is very easy. Just install Ubuntu as usually you did on other computer. It will ask you whether want to remove OSX and install Ubuntu on entire SSD. If you want dual-booting with Ubuntu and OSX, you should not remove OSX. Just install Ubuntu beside of OSX.

After Ubuntu installation completed, you can see screen below after reboot.

After select tux(the cute penguin) from this screen, grub bootloader comes. Select Ubuntu from grub bootloader. Now, it should boot to Ubuntu... But, not... It doesn't boot and screen stuck. We will solve this problem in next step.

6. Add nosmp on linux parameter
You can adjust linux boot parameter from grub by pressing key 'e'. You can boot successfully by adding nosmp on parameter.

There would be exist the line start with next content in second line from end of screen.
linux        /boot/vmlinuz-3.8.0 root=UUID=

Just enter ' nosmp'(without quotation mark, with one whitespace) on last of the line and press f10 key. Now, it will boot to Ubuntu.

7. Add nosmp permanently
Now we succeed to boot to Ubuntu. But, type nosmp every time boot to Ubuntu from grub may be very annoying and uncomfortable. You can add nosmp to boot parameter permanently.
Open /etc/default/grub file and find the line start with GRUB_CMDLINE_LINUX_DEFAULT=".Type nosmp inside quotation mark. It may need super user permission to edit the file.
After that, save and close file, and update grub config using the command below:
$ sudo update-grub

8. Let WiFi Work
Now, we can boot, but problem still exist. First, WiFi. It's because Ubuntu 13.04 have no device driver for MBA's WiFi. Download deb file from the link below:
http://launchpadlibrarian.net/138967184/dkms_2.2.0.3-1.1ubuntu3_all.deb
Install the deb file using the command below and reboot. Now, WiFi will work.
$ sudo dpkg -i path/to/downloaded/deb_file

9. Change To EFI Mode for Whole Cores
nosmp parameter from step above means we will use only one core in MBA. It was just a work-around for boot because MBA doesn't support bios way booting properly. It's shameful to use only one core in Multi-core era. You can use whole cores if you boot linux with EFI mode.See next link and change Ubuntu to EFI mode:
https://help.ubuntu.com/community/UEFI#Converting_Ubuntu_into_EFI_mode

The link's content says, in concisely, just install a program named boot-repair using next command,
sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update
sudo apt-get install -y boot-repair && (boot-repair &)

And change Ubuntu to EFI mode using the program.

After changed to EFI mode, remove nosmp from /etc/default/grub file, and sudo update-grub to make it effect.

Now, restart MBA. You should able to see lots of boot options like below photo.
Boot to Ubuntu in EFI mode.

Now, you can use whole cores in MBA.

Also, you may see lots of error message while booting. If it's too annoying, Open /etc/default/grub again and insert libata.force=noncq as we did with nosmp. Also, never forget to sudo update-grub.

10. Install linux 3.11
Problem still exist. fn key doesn't works, track pad works as just a mouse, not track pad(can't scroll using two fingers), speaker doesn't works. But, first, let's go to kernel 3.11 version.

Download 3.11.0 linux source code from kernel.org or git repository and build / install the kernel using Ubuntu 13.04's config file as usually do.
Kernel build / installation may be out of focus of this article. See other articles about kernel build / install from Ubuntu(e.g., http://dry-kiss.blogspot.kr/2014/01/how-to-build-install-linux-kernel-on.html).

11. Apply patches for Keyboard / Track pad / Speaker
Keyboard / Track pad / Speaker still not works although you installed 3.11.0 kernel. But, there exist patches for those problems. Latest kernel maybe already merged those patches. But, because this is just my experience sharing, I will say about that.

Download links below and save each of them as file. The link is just a text file. You can just open the link in browser and copy-and-taste the contents, save as a text file.
http://www.miek.nl/downloads/2013/macbookair-3.11.patch
https://bugzilla.kernel.org/attachment.cgi?id=107811

Go back to the kernel source you built and use command below to apply each patches:
$ patch -p1 < path/to/downloaded/patch

Now, build and install the patch applied kernel source again, boot to the kernel.
Now, Keyboard, Trackpad, Speaker problems all solved and works properly.

Wish your Happy Hacking! :D



Remaining Problem
Still one problem exist. Monitor brightness adjust button works well after MBA boot to linux. But, once it goes to sleep and comes back, monitor brightness become only brightest state or darkest state.

Referenced Web Pages



2013년 10월 20일 일요일

GRAVITY




[주의] 스포일러라면 스포일러라 할 내용이 있습니다.













정리해 보자면 상처를 받고 자신의 근원(지구, 고향, 가족, 직장)을 떠나 일탈하던 여인이 일탈한 곳으로부터도 버림을 받고 헤매다가 결국은 친구의 희생과 자신의 근원에 대한 재인식으로 상처를 치유받고 돌아오게 되는 이야기.

라이언은 딸을 잃는 아픔을 겪고 지구에서도 직장을 제외하면 정처없이 드라이브를 하며 방황했고, 우주로 일탈해 고요함이 가장 좋다고 이야기했다. 하지만 우주에서도 위성 파편이라는 형태로 버림을 받고 삶을 포기하려고도 하지만 맷의 희생으로 목숨을 건지고 지구에 대한 그리움과 다시 설 동기를 얻게 되어 지구로 돌아오게 된다.

이를 통해 인간을 매개로 해 생명체와 그 근원과의 관계를 중심으로 생명체의 삶의 형태를 잘 그려낸, 다큐멘터리에 가까운 영화라고 생각한다.

연어의 고향 회귀, 가출 청소년의 귀가 등의 다큐멘터리에 대입해보면 대략 비슷하다.

뻔하다면 뻔하고 숭고하다면 숭고한 주제를 수많은 볼거리와 상징성 등을 통해 흥행적으로도 예술적으로도 손색이 없게 표현해낸 수작.

2013년 9월 7일 토요일

2013년 맥북에어에 우분투 13.04 + 리눅스 3.11 커널 설치(OSX과 듀얼 부팅)

얼마 전, 별생각 없이 kernel.org 들어가보니 리눅스 3.11 official version이 릴리즈 되었더군요.

그렇잖아도 지난 6월 사온 2013년 맥북에어에 리눅스를 깔아야지 깔아야지 하면서 깔지 않고 있었는데, 3.11도 나왔겠다 싶어 우분투 13.04를 설치하고 그 위에 리눅스 3.11을 컴파일해 설치했습니다.

설치 과정 자체는 매끄럽지만 이후 문제가 몇가지 있고 이걸 하나하나 해결하는게 조금 귀찮기에, 설치과정부터 문제들을 해결한 과정을 기록 / 공유해 볼까 합니다.


0. 설치 환경
제 맥북에어는 2013년형 11" 모델(6,1)이며, cpu와 RAM, SSD 용량을 모두 업그레이드했습니다.

1. ubuntu 설치 이미지 받아 cd 굽기
우분투는 맥용 이미지를 따로 배포하고 있습니다. 다음의 링크를 가서 13.04 for mac 이미지(ubuntu-13.04-desktop-amd64+mac.iso)를 받아 cd를 굽습니다.
http://releases.ubuntu.com/raring/
라이브 usb로 만들어도 될 것 같은데, 제 경우는 usb가 망가졌는지 제대로 진행이 되지 않아 라이브 CD를 굽고 USB CD 드라이브를 연결해서 설치를 진행했습니다.

2. SSD 파티션
우분투를 설치하기 위한 파티션을 남겨줘야 합니다. 맥OSX으로 부팅된 상태에서 disk utility를 열고(찾기 어려우면 spotlight를 활용합시다) SSD를 선택하고 Partition 탭으로 들어가 Macintosh HD 파티션을 원하는 만큼만 남기고 파티션 크기를 줄여줍니다.
어렵다면 다음 링크를 참고합니다. 움짤로 영어 몰라도 알 수 있게 설명해 줍니다.
http://osxdaily.com/2009/11/20/resize-partitions-in-mac-os-x-with-disk-utility/

3. 설치 이미지로 부팅
앞서 만든 라이브 CD 또는 라이브 USB를 꽂고, 맥북을 껐다 켜면서 Option(alt)키를 눌러 줍니다. 파워 버튼을 누르자마자 눌러줘야 합니다. 잘 안되면 파워 버튼 누르자마자부터 계속해서 Option 키를 강타해 줍니다. 그러면 사진과 같이, 어떤 파티션 또는 USB 또는 CD에서 부팅할지 선택할 수 있습니다.

Mac OSX은 다른 매체에서 부팅하려 하면 무조건 Windows로 생각하는 모양인데, 좀 아니꼽지만 선택해 주면 라이브 CD에서 우분투가 부팅됩니다.

사실 좀 이따 설명할 rEFIt를 설치하면 option 키 누를 필요 없는데, 제가 깜빡하고 그렇게 진행했으니 그냥 제가 한 순서대로 설명합니다.

4. 우분투 설치
설치는 기존에 하던대로 진행합니다.
다만, 중간에 Mac OSX을 발견했는데, 그거 지우고 설치할지 그거 놔두고 옆에다 설치할지 물어봅니다만, 듀얼부팅 할 생각이시라면 당연히 놔두고 옆에다 설치해 달라고 하셔야 합니다.

5. rEFIt 설치
설치가 완료되고 재부팅을 하면 OSX으로 부팅됩니다. 우분투로 부팅하려면 3번 과정에서처럼 다시 파워를 켜자마자 option 키를 눌러 부팅할 파티션을 선택해 줘야 합니다.
아무래도 귀찮으므로, rEFIt를 설치합니다. rEFIt는 부트 옵션 선택/관리 프로그램으로, 다음 링크에서 받을 수 있습니다.
http://refit.sourceforge.net/#download
다운로드된 rEFIt를 실행하고 설치 파일을 실행하면 rEFIt가 설치됩니다. 이제 껐다 켜면 기존처럼 무작정 OSX으로 부팅하지 않고, 어느 파티션으로 부팅할지 물어봅니다.

여기서 리눅스를 선택하면 grub 부트로더가 뜨고, 여기서 우분투를 선택하면 우분투로 부팅... 되어야겠지만 세상 일이 그렇게 쉽지 않고, 부팅 안되고 화면이 멈춥니다.

참고로, rEFIt는 더이상 개발자가 지원하지 않고 있고, rEFInd라는 프로그램으로 개발되고 있는데, 그걸 쓰는게 나을 것 같습니다. 전 쓰던 게 기억나서 그냥 rEFIt를 썼습니다.

6. linux parameter에 nosmp를 추가
grub 화면에서 e 키를 누르면 부트 패러미터를 조정할 수 있습니다.
여기서 패러미터에 nosmp를 추가해 주면 부팅할 수 있습니다.

밑에서 두번째 줄 정도에 다음과 같은 내용으로 시작하는 줄이 있을 텐데,
linux        /boot/vmlinuz-3.8.0 root=UUID=

줄의 마지막에 한칸 띄고 nosmp만 추가하면 됩니다.
그리고, f10 키를 누르면 이제 우분투로 부팅 됩니다.

7. nosmp를 영구 추가
이제 우분투로 부팅이 되었지만, 앞으로도 우분투로 부팅할 때마다 grub에서 nosmp를 입력해야 합니다. 번거로우니까, grub이 항상 nosmp를 추가해 부팅하도록 설정합니다.
/etc/default/grub 파일을 열면 GRUB_CMDLINE_LINUX_DEFAULT=" 으로 시작하는 줄이 있는데, 여기에 따옴표 안에 nosmp를 넣어줍니다. 이 파일은 관리자 권한으로만 수정되므로, 이에 유의합니다.
수정이 끝났으면 다음 명령으로 grub 설정을 업데이트 해줍니다.
$ sudo update-grub

8. 네트워크 되도록 수정
이제 부팅은 껐다 켜도 잘 되지만, 일단 네트워크가 안됩니다. 우분투 13.04에 맥북에어의 무선네트워크 장치 드라이버가 없기 때문입니다. 다음의 링크에서 deb를 받습니다.
http://launchpadlibrarian.net/138967184/dkms_2.2.0.3-1.1ubuntu3_all.deb
받은 deb 파일을 다음 명령으로 설치하고, 리부팅 하면 네트워크가 됩니다.
$ sudo dpkg -i 다운로드/받은/deb의/경로

9. EFI 모드로 수정
앞서 nosmp를 패러미터에 추가한 것은 맥북에어의 코어들 중 하나만 쓰겠다는 의미로, 맥북에어가 bios 방식의 부팅을 제대로 지원하지 않아 임시 처방으로 그렇게 한 것입니다.
멀티 코어 시대에 코어 4개짜리 컴퓨터에서 코어 하나만 쓰는 것은 아까운 일입니다. 리눅스를 EFI 모드로 부팅시키면 코어를 모두 쓸 수 있습니다.
다음 링크를 참고해 우분투를 EFI 모드로 변경해 줍니다.
https://help.ubuntu.com/community/UEFI#Converting_Ubuntu_into_EFI_mode

해당 링크의 내용을 간략히 설명하면, 다음 명령으로 boot-repair 라는 프로그램을 설치하고,
sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update
sudo apt-get install -y boot-repair && (boot-repair &)
이 프로그램을 실행해서 우분투를 EFI 모드로 변경하는 방식입니다.

이제 부팅하면 다음 그림과 같이 여러 부팅 옵션을 볼 수 있습니다.
EFI 모드로 우분투를 부팅합시다.

이제 네개의 코어를 모두 쓸 수 있습니다.
그리고, 부팅 시 에러메세지 같은게 보여서 조금 성가실 수 있는데, 그렇다면 다시 /etc/default/grub을 열고 이번엔 libata.force=noncq 라는 내용을 아까 nosmp 넣었듯이 넣어줍니다.
수정한 후에는 sudo update-grub을 잊지 않도록 합니다.

10. 3.11 커널 설치
아직 fn키가 제대로 인식되지 않고 트랙패드도 두손가락 스크롤링이 안되는등 문제가 있지만, 여기서 곧바로 3.11 커널로 넘어가 봅시다.

3.11 커널 소스를 받고 이미 깔려 있는 우분투 13.04의 config 파일을 이용해 config 파일을 만들고 빌드, 설치해 줍니다.
커널 컴파일 방법에 대해서는 다른 글(http://dry-kiss.blogspot.kr/2014/01/debian-deb.html)을 참고해 봅시다.

11. 키보드 / 트랙패드, 내장스피커 문제 패치 적용
3.11 커널을 올려도 키보드 / 트랙패드 문제는 여전하고, 내장스피커가 동작하지 않습니다. 헤드셋을 연결하거나 해야만 음악 등을 들을 수 있습니다. 이에 대한 패치를 적용해야 합니다.
다음 링크들을 다운받아 적당한 이름으로 저장합니다. 그냥 텍스트 파일입니다. 그냥 링크를 열고 내용을 긁어서 적당한 텍스트 파일로 저장해도 됩니다.
http://www.miek.nl/downloads/2013/macbookair-3.11.patch
https://bugzilla.kernel.org/attachment.cgi?id=107811

아까 컴파일한 커널 소스 경로로 이동해서 다음 명령으로 각각의 패치를 적용합니다.
$ patch -p1 < 다운받은/패치의/경로

이제 커널 소스에 패치가 적용되었으니, 다시 컴파일, 설치하고 재설치된 커널로 부팅합니다.
이제 키보드, 트랙패드, 내장 스피커 모두 정상 동작합니다.

사진이 좀 흔들렸지만, 2013년 11" 맥북에어 모델에 3.11 커널이 돌아감을 인증샷 한번 찍어봤습니다 :)


남은 문제들
하지만 아직 문제가 하나 더 남아있는데요. 처음 부팅했을 때에는 모니터 밝기 조정 버튼이 잘 동작하지만, 한번 sleep에 빠졌다가 돌아오면 모니터 밝기가 가장 밝거나 가장 어둡거나 두가지로만 동작합니다.
사실 이정도면 사소한 문제 수준이라 전 큰 불편 없이 쓰고 있습니다만, 혹시 맥북에어에 리눅스 설치를 생각중인 분들은 고민해 보시기 바랍니다.


참고 웹페이지


2013년 8월 18일 일요일

monkeyrunner에서 MOVE 타입 이용해 복잡한 입력 재현하기


monkeyrunner를 이용하면 아주 간단하게 안드로이드 기기를 제어할 수 있습니다.
하지만 MOVE 이벤트를 지원하지 않고, 단순히 한 지점에서 다른 지점으로의 drag만을 지원하고 있었기에, monkeyrunner를 이용해 사람의 입력을 똑같이 재현할 수 없는 문제점이 있었습니다.

해서, MOVE 이벤트를 지원하도록 monkeyrunner를 약간 수정, AOSP에 컨트리뷰션했고, 곧바로 merge 되었습니다.
(https://android-review.googlesource.com/#/c/50991/)

그리고 한참 잊고 있었는데, 얼마 전에 어떤 외국인이 최신 버전 monkeyrunner에서 해당 기능이 제대로 들어갔는지, 어떻게 쓰면 되는지 스택오버플로에 질문을 올리고 제게도 메일을 보냈더군요.
(http://stackoverflow.com/questions/18161416/android-monkey-runner-touch-with-move)

확인해보니 당연하게도 해당 기능이 최신 버전 monkeyrunner에는 들어간 채로 배포되고 있습니다.
해서 간단한 예제를 작성, 공유했는데, 여기서도 공유해 봅니다.


단순히 touch 함수에 DOWN, UP 처럼 MOVE로 타입만 주시면 됩니다. 간단하죠? ;)

2013년 8월 9일 금요일

색채가 없는 다자키 쓰쿠루와 그가 순례를 떠난 해

간만의 하루키 작품, 한권이라는 비교적 적은 분량에 이틀만에 읽어버렸네요.

기존 작품들이 너무 잔혹했던 것도 같지만 그에 비해 육체적으로도 정신적으로도 덜 자극적인 편이라 약간 아쉬우면서도 가볍게 읽기에 좋습니다.

하지만 열린 결말임에도 관련 추측을 위한 떡밥이 너무 제한되어 있어 조금은 너무 짧고 정리가 덜된 것 아닌가 하는 느낌도 들었습니다.

그렇다 해도 역시 하루키 특유의 맛은 분명하게 내고 있기에 가벼운 마음으로 짧게 읽기엔 좋은 책 같네요.

2013년 7월 4일 목요일

android linux module 설치 시 vermagic 문제 해결

android에 kernel module 올리기(http://dry-kiss.blogspot.kr/search?updated-max=2013-07-04T11:23:00%2B09:00&max-results=1) 에 이어 작성한 글인데 올리지 않고 있다가 이제서야 포스팅.

android용 linux module 설치 시, module의 vermagic 이 맞지 않아 설치가 안되는 경우가 있다.

예를 들면 다음과 같은 메세지가 커널 메세지에 나오고, insmod에 실패한다.

version magic '2.6.29-12345 mod_unload ARMv7' should be '2.6.29-13579 mod_unload ARMv7'

이 경우, 커널 소스의 Makefile 의 최상단에 있는 EXTRAVERSION을 수정함으로써 vermagic의 리눅스 버전 다음 문자열을 바꿀 수 있다.

하지만, 이렇게 변경한 내용을 commit 하지 않으면 다음과 같이 기존 버전넘버와 -dirty 라는 이상한 문자가 붙게 되어 여전히 insmod 에 실패한다.
2.6.29abcd-ge3d684d-dirty mod_unload ARMv7

이는 scripts/setlocalversion 파일에서 git commit 되지 않은 변경사항이 있으면 자동으로 넣어주는 내용이다.

따라서, 해당 파일에서 version magic을 수정하는 부분을 주석 처리하거나, EXTRAVERSION을 변경한 내용을 커밋해 주면 된다.



http://forum.xda-developers.com/showthread.php?t=1236576
http://www.tldp.org/LDP/lkmpg/2.6/html/x380.html

vim에서 spell check

tex 으로 글을 쓰게 되면 spelling check가 조금 귀찮은데,
vim으로 글을 쓴다면 vim에서 쉽게 spelling check를 할 수 있다.

명령모드에서
:set spell spelllang=<language of this text. i.e., en_us>
해주면 스펠링이 잘못된 단어가 빨갛게 빛난다.

커서를 해당 단어에 위치하고
z=
를 입력하면 수정할 단어 목록을 보여주고 쉽게 수정할 단어를 선택할 수 있다.

해제할 땐
:nospell


참고 사이트:

2013년 3월 11일 월요일

android emulator에 kernel module 올리기


안드로이드는 커널로 리눅스를 사용하므로, 리눅스에서와 같이 커널 모듈을 만들어 올림으로써 커널 레벨로의 접근이 가능하다.

안드로이드 에뮬레이터에 커널 모듈을 만들어 올리는 간단한 방법을 기록해 둔다.

안드로이드용 에뮬레이터를 위한 가상 하드웨어의 이름은 goldfish다. 따라서, 이 글에서는 앞으로 안드로이드용 에뮬레이터의 커널을 goldfish 커널이라 부른다.

0. 환경
사용된 기기 / 소프트웨어 버전은 다음과 같다.
ubuntu 12.04 desktop 64bit
git 1.7.9.5

사용된 에뮬레이터의 안드로이드 버전:
4.2.1_r14.2.2 사이 언젠가 sync 해둔 AOSP master branch.

1. goldfish 커널 빌드 & 사용
goldfish 커널은 기본적으로 모듈을 지원하지 않는다.
따라서 커널 소스코드를 받아 모듈을 지원하도록 설정을 수정, 빌드해 올리고 여기에 모듈을 올린다.

1.1. 안드로이드 에뮬레이터 커널 소스 받기
$ git clone https://android.googlesource.com/kernel/goldfish
$ git checkout android-goldfish-2.6.29
(checkout 하는 브랜치는 적당히. $ git branch -r 명령으로 사용 가능한 브랜치를 볼 수 있다)

1.2. prebuilt 소스 받기
크로스 컴파일을 위해 prebuilt 를 받아야 한다.
$ git clone https://android.googlesource.com/platform/prebuilt

1.3. kernel build configuration 설정
리눅스 커널은 빌드 설정을 다양하게 할 수 있으며, 이 정보는 소스코드 디렉토리의 .config 파일에 저장된다. 하지만, 앞서 받아온 소스파일에는 .config가 없다.
아래의 명령으로 goldfish를 위한 기본 설정을 만든다.
$ make goldfish_defconfig

이제 .config 파일이 만들어졌을 것이다.
또는, 다음의 명령으로 이미 돌고 있는 에뮬레이터의 설정을 가져올 수도 있다.

$ adb pull /proc/config.gz
$ gunzip config.gz
$ mv config .config

1.4. MODULE을 지원하는 방식으로 빌드되도록 설정
.config 파일을 열고 다음의 내용을 추가한다.
CONFIG_MODULES=y
CONFIG_MODULES_FORCE_LOAD=y
CONFIG_MODULES_UNLOAD=y
CONFIG_MODULES_FORCE_UNLOAD=y

CONFIG_MODULE_UNLOAD를 설정하지 않으면 모듈을 적재 후 내릴 수가 없다. 유의하자.

1.5. 안드로이드 에뮬레이터 커널 빌드
이건 그냥 s.android.com을 따라하면 되는데... 요약하자면,
$ ARCH=arm CROSS_COMPILE=<path to prebuilt we downloaded above>/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- make -j2
ARCH, CROSS_COMPILE은 따로 export ARCH=arm 과 같은 식으로 하고 마지막에 make만 하는 것도 당연히 가능...
CROSS_COMPILE 에 주는 prebuilt 위치는 앞서 1.2에서 받은 prebuilt임.

빌드가 끝나면 zImage로 커널 이미지가 나옴.

1.6. 에뮬레이터에서 새로 빌드한 커널을 사용
다음의 커맨드로 에뮬레이터가 사용할 커널을 지정 가능.
$ emulator -kernel <path of kernel image>
-show-kernel 과 -verbose 옵션을 추가로 주면 여러모로 편리하다.

2. 안드로이드용 커널 모듈 빌드
이제 안드로이드용 커널 모듈을 만들어보자.
2.1. 커널 모듈 소스코드
다음과 같이 android_module.c 파일을 생성


구체적인 linux kernel module 의 동작 원리는 이 글의 주제가 아니므로 스킵...
위 소스코드는 커널에 적재될 때 "Hello android kernel..." 메세지를, 커널에서 삭제될 때 "Goodbye android kernel..." 라는 메세지를 커널 로그 상에 뱉을 것이다.
실제 동작 코드는 각자의 목적에 맞게 바꾸면 되겠다.


2.2. 커널 모듈 빌드를 위한 Makefile 작성
다음과 같은 내용으로 Makefile을 생성.
4, 7라인의 -C 옵션의 값은 커널 소스가 있는 경로를 나타내야 한다.


2.3. 커널 모듈 빌드
다음과 같이 ARCH, CROSS_COMPILE 환경 변수 설정 후 make 하면 간단하게 끝.
커널 컴파일 할 때와 거의 같다.
$ ARCH=arm CROSS_COMPILE=<path to prebuilt we downloaded above>/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- make

같은 경로에 android_module.ko가 만들어질 것이다.

3. 커널 모듈 로드
$ adb push android_module.ko /data/
$ adb shell
(이제 android의 shell 위임)
# insmod /data/android_module.ko

dmesg 등의 커맨드로 커널 로그를 확인해 보면 Hello android kernel... 메세지가 보일 것이다.

4. 커널 모듈 언로드
$ adb shell
# rmmod android_module
역시 dmesg 등의 커맨드로 커널 로그를 확인해 보면 Goodbye android kernel... 메세지가 보일 것이다.


* 이 과정대로만 따라할 경우 vermagic에 의해 module load에서 문제를 겪는 경우가 생길 수 있다.
이 경우는 다음 글을 참고하면 된다.
http://dry-kiss.blogspot.kr/2013/07/android-linux-module-vermagic.html


참고 자료:
http://linuxclues.blogspot.kr/2010/05/build-compile-linux-kernel-android.html
http://stackoverflow.com/questions/6282669/how-do-you-create-a-loadable-kernel-module-for-android
http://s.android.com/