本帖最后由 牛头 于 2016-9-29 15:09 编辑
很多朋友希望在拿到Firelfy发布的Ubuntu镜像后,会想自己加驱动或自己编译的内核等等,但做的过程中难免出现各种各样的问题。网上各种教程都不那么切题,讲解都不是那么细致,让人感到迷茫,又或许是无助。Firefly团队努力地在帮助开发者打破此困局,整理策划了系列教程,让开发者可以通过Firefly开源平台可以快速上手开发,并快速打造出成熟产品。 “创新 开源 分享 定制”是我们的口号,我们一直在努力。
上次在打包固件时,用了官方固件的parameter,会导致无法进入系统,有跟着教程做实验的朋友,可能都载在这坑了。之前应急的处理方法是对parameter文件做了修改,虽然无伤大雅,却急死了处女座的朋友。今天我们继续来坑填,抚慰下处女座朋友那颗爱完美的心灵吧。 问题出现在根文件系统挂载方面,挂载的节点不存在,问题可以定位在ramdisk镜像上。推测是官方固件的initrd里处理分区这一块做了更细致的优化。问题已经定位,那方向就很明确了:一是自己修改initrd,直至成功;二是用Firefly官方initrd。Initrd也不熟悉,肯定有更多的坑在路上。从Firefly官方github获取的initrd有问题,问题貌似进入了死循环。我想静静。
之前做boot镜像时,已经知道boot分区是带initrd镜像,且官方的boot.img已经解包得来。好了,看来出路就在这里:如何从官方的boot.img里解包得到initrd镜像。
首先从Android SDK里找找看有没有对boot.img解包的工具,可惜只有打包的工具,但有分打包的源代码。既然有打包的源代码,那解包就迎刃而解了,自己做一个解包工具?哈,可惜时间有限,我赶紧上网找了一个解包工具,点击下载。
下载后,解压放到~/UbuntuDev/目录,给里面的unpackbootimg增加可执行属性。 cd ~/UbuntuDev/make-mkboot-tools ./unpackbootimg -i linux-boot.img 上面的linux-boot.img是从官方固件解包而来的boot分区镜像。 解包成功后,多了不少的文件: 从名字看linux-boot.img-ramdisk.gz应该就是我们要的文件,虽然和之前我们用的initrd.img命名不一样。但从对打包、解包过程的理解来看,两者就是互为逆向操作,不会对文件本身去做改变。所以这里就直接把linux-boot.img-ramdisk.gz当成是initrd.img来用,仅仅是文件名不一样。另外,从解包的结果看,这个boot镜像虽是按android的boot结构去打包,但也没有按标准去填充cmdline参数。
回到kernel目录进行打包: cd ../firefly-3.14-kernel-master ./mkbootimg --kernel arch/arm/boot/zImage --ramdisk ../make-mkboot-tools/linux-boot.img-ramdisk.gz --second resource.img -o boot.img 没有报错,那就烧录吧! 之前都是用windows下的AndroidTool来烧录,老是要重启切换系统,今天就直接在ubuntu下烧录了。具体怎么用烧录工具在这就不多讲,注意把从官方固件解包而来的parameter文件拷贝到要烧录的boot.img相同的目录来,这样工具才知道要把镜像烧录到什么分区什么位置。 烧录完boot分区后,记得把从Firefly官方Ubuntu固件解包的parameter也烧录到开发板,因为我们这次是要验证用官方的parameter能不能正常进入系统。烧录完后机器不会自动重启,记得要手动按重启键,不然等到天黑也不会进入系统。
这一次开发板乖乖进入了桌面,让我们来确认一下kernel版本及cmdline参数。 cat /proc/version cat /proc/cmdline
再来看看这个信息,分区的对应关系,确实是和之前推断的一样:
OK,大功告成。可以放心去修改kernel了。
|