基本上,有了kernel之後,我們只差Android檔案系統就能開機了。
Android SDK中有現成的檔案系統,不過我們之後需要做部份修改,
所以還是從source code開始編譯。
首先要取得整個Android平台的source code,這次用的是Repo:
Using Repo and Git
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo
$ mkdir working-directory-name
$ cd working-directory-name
$ repo init -u git://android.git.kernel.org/platform/manifest.git
$ repo sync
等待下載完成。
這裡假設'working-directory-name'為'$(andsrc)',
在這裡我們先直接編譯,不作任何修改:
$ cd $(andsrc)
$ make
編譯時間約為2.5小時(Intel Core 2 Solo U3500@1.4GHz),大約需要8GB的硬碟空間。
編譯完的file system會在$(andsrc)/out/target/product/generic下。
Android file system主要由三個部份構成:
1. ramdisk.img,包含檔案系統"/"下的所有檔案,除了/system和/data之外。
2. system.img,包含/system下的所有檔案。
3. data.img,包含/data下的所有檔案。
一般情況下,只要把整個file system包裝成JFFS2,再以SAM-BA燒入NAND即可。
但在Android下,/data資料夾的檔案系統必須支援memory-mapped操作,
而JFFS2不支援memory-mapped;Android所用的YAFFS2又無法以SAM-BA燒入。
這個問題有幾種可能的解法:
1. NFS (Network file system)
2. Ext3 on SD card
3. 在U-boot下,以TFTP將整個file system下載到NAND上
(NFS和Ext3皆支援memory-mapped operation)
其中方法1. 2. 已測試可行,在此我們以2. 為例。
要把整個檔案系統放在SD卡上,其實就是把檔案放對位置。
在Linux下,將SD卡插到讀卡機上,格式化分區為Ext3(fdisk and mkfs)。
假設其位置為/media/disk,則/media/disk資料夾相當於Android上的"/"位置。
我們不需要把.img檔解壓縮,因為
$(andsrc)/out/target/product/generic下的root、data和system資料夾,
分別是ramdisk.img、userdata.img和system.img解壓縮的檔案。
只要複製到對應的位置即可 (需要root權限):
$ sudo cp -r $(andsrc)/out/target/product/generic/root/* /media/disk/
$ sudo cp -r $(andsrc)/out/target/product/generic/data/ /media/disk/
$ sudo cp -r $(andsrc)/out/target/product/generic/system/ /media/disk/
接著我們要修改init.rc (/media/disk/init.rc)。
init.rc定義了init執行時所做的事,其中有mount /data和/system的動作,
但我們已經手動將這些資料夾放好,所以必須將這些指令刪除。
刪除init.rc中所有mount開頭的指令,只留下"mount tmpfs tmpfs /sqlite_stmt_journals size=4m"。
到此我們已經完成kernel和file system。下次試著把它們組合起來,試著開機看看。
(待續...)
留言列表