如何將ramdisk.img 編譯進核心和修改init.rc
阿新 • • 發佈:2019-01-29
一 將ramdisk.img編譯進核心
android系統可以不用ramdisk.img 檔案就可以啟動檔案系統,原因是在android核心編譯的時候使用配置選項已經將檔案系統編譯進核心。方法是在編譯配置選項中開啟File Systems->"The Extended 4 (ext4) filesystem", 如圖:
我經過親身實驗,如果關掉ext4,開啟ext3檔案系統,那麼在系統的時候不可以登入,無法進入rootfs,而且提示錯誤資訊,如:
init: Unable to open persistent property directory /data/property errno: 2
init: cannot find '/system/bin/servicemanager', disabling 'servicemanager'
init: cannot find '/system/bin/vold', disabling 'vold'
init: cannot find '/system/bin/netd', disabling 'netd'
init: cannot find '/system/bin/debuggerd', disabling 'debuggerd'
isa bounce pool size: 16 pages
init: cannot find '/system/bin/rild', disabling 'ril-daemon'
init: cannot find '/system/bin/surfaceflinger', disabling 'surfaceflinger'
scsi 0:0:0:0: Direct-Access Generic Flash Disk 5.00 PQ: 0 ANSI: 2
init: cannot find '/system/bin/app_process', disabling 'zygote'
init: cannot find '/system/bin/drmserver', disabling 'drm'
而插入優盤等操作核心皆可以識別到,說明核心正常工作,但是無法登入檔案系統。因而通過rootfs 找其他掛載的系統也會失敗。
二 修改init.rc
如果android採用將ramdisk.img 編譯進核心,那麼修改init.rc就只能通過重新編譯android核心的方式了。
方法:將android kernel top目錄下/arch/arm/boot/ramdisk.img 檔案拷貝到某目錄下如tmpdir
1.解壓ramdisk.img
進入tmpdir,將ramdisk.img修改為ramdisk.img.gz
#mv ramdisk.img ramdisk.img.gz
#gunzip ramdisk.img.gz
#mkdir ramdisk //建立ramdisk目錄
#cd ramdisk //進入ramdisk目錄
#cpio -i -F ../ramdisk.img //將ramdisk.img 解壓到當前目錄
這樣可以修改init.rc 檔案,修改後儲存
2.打包ramdisk.img
#cpio -i -t -F ../ramdisk.img > list
#cpio -o -H newc -O ../new.img < list
#gzip new.img //生成new.img.gz
#mv new.img.gz ramdisk.img //改名為ramdisk.img
然後重新編譯android kernel, 生成的boot.img二進位制檔案拷貝到原sdcard根目錄下,更新boot.img後,再次啟動系統,檢視init.rc即是已經修改過的了。
另外需要注意:也可以用命令find . -print |cpio -o > ../new.img 或者 cpio -i -t -F ../ramdisk.img |cpio -o > ../new.img打包,但是使用這樣打包之後更新的boot.img 系統啟動之後掛掉了。
在用第一種方法打包時檔案大小有636個blocks,但是用第二種方法打包的檔案是633個blocks,還不知道這兩種方式本質的區別。
android系統可以不用ramdisk.img 檔案就可以啟動檔案系統,原因是在android核心編譯的時候使用配置選項已經將檔案系統編譯進核心。方法是在編譯配置選項中開啟File Systems->"The Extended 4 (ext4) filesystem", 如圖:
我經過親身實驗,如果關掉ext4,開啟ext3檔案系統,那麼在系統的時候不可以登入,無法進入rootfs,而且提示錯誤資訊,如:
init: Unable to open persistent property directory /data/property errno: 2
init: cannot find '/system/bin/servicemanager', disabling 'servicemanager'
init: cannot find '/system/bin/vold', disabling 'vold'
init: cannot find '/system/bin/netd', disabling 'netd'
init: cannot find '/system/bin/debuggerd', disabling 'debuggerd'
isa bounce pool size: 16 pages
init: cannot find '/system/bin/rild', disabling 'ril-daemon'
init: cannot find '/system/bin/surfaceflinger', disabling 'surfaceflinger'
scsi 0:0:0:0: Direct-Access Generic Flash Disk 5.00 PQ: 0 ANSI: 2
init: cannot find '/system/bin/app_process', disabling 'zygote'
init: cannot find '/system/bin/drmserver', disabling 'drm'
而插入優盤等操作核心皆可以識別到,說明核心正常工作,但是無法登入檔案系統。因而通過rootfs 找其他掛載的系統也會失敗。
二 修改init.rc
如果android採用將ramdisk.img 編譯進核心,那麼修改init.rc就只能通過重新編譯android核心的方式了。
方法:將android kernel top目錄下/arch/arm/boot/ramdisk.img 檔案拷貝到某目錄下如tmpdir
1.解壓ramdisk.img
進入tmpdir,將ramdisk.img修改為ramdisk.img.gz
#mv ramdisk.img ramdisk.img.gz
#gunzip ramdisk.img.gz
#mkdir ramdisk //建立ramdisk目錄
#cd ramdisk //進入ramdisk目錄
#cpio -i -F ../ramdisk.img //將ramdisk.img 解壓到當前目錄
這樣可以修改init.rc 檔案,修改後儲存
2.打包ramdisk.img
#cpio -i -t -F ../ramdisk.img > list
#cpio -o -H newc -O ../new.img < list
#gzip new.img //生成new.img.gz
#mv new.img.gz ramdisk.img //改名為ramdisk.img
然後重新編譯android kernel, 生成的boot.img二進位制檔案拷貝到原sdcard根目錄下,更新boot.img後,再次啟動系統,檢視init.rc即是已經修改過的了。
另外需要注意:也可以用命令find . -print |cpio -o > ../new.img 或者 cpio -i -t -F ../ramdisk.img |cpio -o > ../new.img打包,但是使用這樣打包之後更新的boot.img 系統啟動之後掛掉了。
在用第一種方法打包時檔案大小有636個blocks,但是用第二種方法打包的檔案是633個blocks,還不知道這兩種方式本質的區別。