馬上加入Android 台灣中文網,立即免費下載應用遊戲。
您需要 登錄 才可以下載或查看,沒有帳號?註冊
x
本帖最後由 monitorstudio 於 2014-4-14 23:18 編輯
還記得小弟很久以前的一篇文章雙系統開機-掛載自製檔案系統映像檔嗎?(誰記得= =......)
當時還只是一個討論串,並沒有真正的釋出教學告訴大家到底要要怎麼做到雙(多)系統開機
最近剛好又想到了這件事,所以就順便分享給網路上的所有版友們
當然,我們不能什麼都不懂就開始動手,對吧!(早就懂的請慢用)弄不好可是會......的。。。所以先來一點基本常識吧!小弟會把個人的思路和做法一併奉上的~~~
1.bootloader(hboot):
bootloader的中文名字是"開機載入程式",任何Unix-like(例如Android)設備都是由它來引導開機的,在我們的Android,它選擇要使用哪個內核來開機,要使用recovery內核呢?還是一般的內核呢?抑或是從電腦載入新的內核來開機(fastboot boot boot.img)
2.內核(kernel):
等到bootloader指定了一個內核之後,這個內核會被載入(解壓到根目錄上)
內核是幹嘛的???內核其實就是一個小小的迷你作業系統,沒有使用者介面(你看到的是開機第一屏或黑色的螢幕或開機動畫),它負責把整個Android系統建構起來,以下是精簡的內核的運行流程:
被bootloader解壓到根目錄 -> 執行/init -> /init解讀/init.rc
3.init:
init 照字面上的意思來看就是"最一開始的,最初的",它的確是整個Android系統裡,第一個被系統執行的程式,它是整個內核的中心,把Android系統建構起來的重責大任就落在它的肩上。因為程式修改不易,我們不可能每次都要重新撰寫&&編譯init,這樣是非常麻煩的,所以我們把指令都寫在一個檔案中,然後請init來讀它,並按照指令來跑,這樣每當我們想要修改開機程序的時候,就只要修改這個存放指令的檔案就可以了,這個檔案是/init.rc,它是我們這次討論的重點
所以我們就是要藉由修改/init.rc來更改開機的動作,達到載入不同系統的目的
做法:
init.rc在內核裡面,剛剛說過,由於在啟動時,內核是被"解壓"到根目錄的,所以直接修改根目錄裡被解壓出來的檔案是沒有用的,應該要去修改內核本身才對
取得自己裝置的內核,你可以使用小弟製作的應用程式boot kitchen它可以幫你從手機裡提取出來,也可以解壓,壓縮
假設大家都已經解壓好自己的內核了,現在要開始修改內核
以下是計劃:
把我的系統映像檔放在sd卡上,開機的時候掛載
首先要準備好你自己第二個系統的映像檔(不會的以後再詳述),把它放到sd卡上
然後修改init.rc
把
- mount yaffs2 mtd@system /system
複製代碼
刪除,這樣原本的系統就不會被掛載了
加上
- /sbin/busybox losetup /dev/block/loop0 系統映像檔路徑
- mount 檔案系統格式 /dev/block/loop0 /system
複製代碼
重新壓縮完內核之後,發現問題了,SD卡是在開完機之後才掛載的,所以init.rc在被執行的時候SD卡是不能用的
所以,我們要自己掛載它
把
- symlink /mnt/sdcard /sdcard
複製代碼
刪除,換成
然後
- mount vfat /dev/block/mmcblk1p1 /sdcard
複製代碼
重新編譯完後,又出現問題了......
losetup失敗,以致於自己的系統映像檔無法掛載
看了一下init的原始碼init.c,裡面有定義,掛載映像檔可以用
- mount 檔案系統格式 loop@系統映像檔路徑 掛載點
複製代碼
例如
- mount ext4 loop@/sdcard/ubuntu/ubuntu.img /ubuntu
複製代碼
重新編譯內核,刷入之後重新開機,就發現你已經在自己的系統裡面囉!!!
|
評分
-
查看全部評分

|