去年这个时候买了个e9卡片式电脑(主板资料), 主要是解决raspberry pi的性能太弱的问题,同 时看中了支持sata硬盘。我主要是用它来做服务器使用的。自带的ubuntu 12.04也基本满足 要求。
后来,我承载的服务越来越多,就想通过docker来简单部署了,但docker需要的内核至少是 3.10+的。这个板子的内核是3.0.35的,差好多。试着拉了一下代码。发现内核的arm版本在 这期间进行了大改动。增加了dts的方式。对于dts,我完全不了解。也不明白,据说是设计 板子用的。总之,学习需要很长的时间,对于我这种非设计的程序员而言,就像美术于我一 样。于是,我买了个pipo的x7,x86 64位架构,安装了个ubuntu的系统。就作为我的主服务 器了。而且,自动构建也是在这个里面通过docker来部署的。
这个e9卡片电脑就变成了我的心结了。时不时的找找资料,泡泡论坛,看是否有相关的进展。 后来,在论坛上看到有人说自己移植了3.10内核(帖子位置 )了。于是,就想在此基础上进行进一 步的开发。
代码我基本上就是从帖子中的地址(代码位置 )拖下来的。先测试编译。帖子中的问题也碰到过。 主要是卡在start kernel之后就没有了,这个问题很纠结。第一次碰到的时候也是这种状况, 完全不明白头绪。不过这次开发就相对有经验了。我在其他地方看到了相关的信息资 料(unbriking u-boot启动)当然,我主要是使用linux开发的,因此,使用 imx_usb_loader工具(imx_usb_loader) 即可。
简单而言,将板子设置为download模式,然后,在download的时候,通过usb_loader工具将 u-boot上传到板子中,并运行,这个要比默认用mfg的那个工具方便很多。要知道,使用那 个工具需要反复的跳线,长时间的烧。而且,必须所有的一起烧,苦不堪言啊。
总之,通过usb_loader工具,我可以单独测试u-boot了,但u-boot我也不太会用,不过,这 个就好用些了,想办法设置为网络启动,然后运行下,看到有请求网络上的内核,可以加载 相关文件,然后启动加载远程的rootfs了。这简直就是个无盘工作站啊。
默认的启动的是mmc,然后是netboot,我记得是这样子的。但我的mmc不想格式话,觉得还 是emmc比较方便,分析代码中的u-boot的设置的环境信息,以及老的相关信息脚本。手动设 置运行。想了一个方案:
将自己定制的内核的zImage和dtb文件放到emmc的root分区的boot目录中,然后启动的时候, 加载这个文件,如果要升级内核的话,可以直接更新这些文件即可,也可以弄多份。
原因在于,mfg的那个工具,必须要有uImage文件,而我们编译出来的是zImage,虽然也可生 成uImage,但dtb文件总要有个地方存放。而我又不想弄的太复杂,于是还是简单些好。这 个就造成了在烧的时候使用一个从来不会用到的文件。
先上最终的结果: rootfs:(下载)这个文件在烧的时候修改下名称,我用的是 http://cdimage.ubuntu.com/cdimage/ubuntu-core/releases/14.04.1/release 中的ubuntu14.04.2 的,非常小,只有 不到60MB,所有定制完成也才66MB,当然,里面也什么都不包含(甚至不包含 openssh-server),不过启动了之后能启动网络就一切OK了。这个里面已经包含了内核和相 关的模块,至少可以启动docker。我主要是用来玩docker的。
u-boot.bin: 下载 这个是定制的编译的。我对启动的变量进行了修改,以便可以启动emmc中的系 统以及更好的显示到液晶屏幕上,默认分辨率:1280×800 对于uImage文件,你可以使用老的,反正我们启动的时候也不会使用到这个部分。 其他的操作可以按照e9官方的教程进行烧制,正常情况下,启动完应该就是3.10.17的 ubuntu 14.04.2系统了。
以下是枯燥的技术部分:
内核编译使用的config为imx_v6_v7_defconfig
docker需要overlayfs的支持。3.10并未有这一特性,幸好,有人已经做好补丁 (overfs patch)了。 下载对应的内核版本。不过,这个补丁使用的模块名称是overlayfs,现在已经被修改成 overlayer了。于是,打完补丁需要修改fs/overlayfs/Makefile文件中的overlayfs.o为 overfs.o,以及overlayfs-objs为overlay-objs,还有super.c中注册模块的名称部分的 file_system_type ovl_fs_type中的变量.name的名称为overlay,MODULE_ALIAS_FS中的 “overlayfs”为overlay。基本上要修改的就是这些了。 编译的.config文件中添加CONFIG_OVERLAYFS_FS=m
docker还需要iptables的nf_nat的支持,反正我在menuconfig阶段将所有的netfilter全都 修改为m了。
然后就是枯燥的:
make CROSS_COMPILE=${CC} ARCH=arm make CROSS_COMPILE=${CC} ARCH=arm modules_install INSTALL_MOD_PATH=../modules
我将modules放置在上一层,为了在rootfs制作阶段复制到rootfs中的libs目录下使用。
基本上内核就这样了。在u-boot阶段。主要修改了下面几行代码:
"script=boot_old.scr\0" \ "displayArgs=video=mxcfb0:dev=lcd,CLAA-WVGA,1280x720M@60,if=RGB24,bpp=32 video=mxcfb1:off video=mxcfb2:off fbmem=48M\0" \ "image=/boot/zImage\0" \ "fdt_file=/boot/" CONFIG_DEFAULT_FDT_FILE "\0" \ "fdt_addr=0x18000000\0" \ "boot_fdt=try\0" \ "ip_dyn=no\0" \ "fs_type=ext2\0" \ "console=" CONFIG_CONSOLE_DEV "\0" \ "fdt_high=0xffffffff\0" \ "initrd_high=0xffffffff\0" \ "mmcdev=" __stringify(CONFIG_SYS_MMC_ENV_DEV) "\0" \ "mmcpart=1\0" \
里面很多都是原来的,主要添加了displayArgs,修改mmcpart为1,修改fdt_file, image文 件的路径,script为一个不存在的。在新版本中这个是个脚本,而我刚开始测试用的是老的 12.04的rootfs,悲剧在于这个文件存在。新的rootfs中并不存在这个文件,不管如何,这 个在u-boot启动的时候可以修改并保存的。
哗啦啦,我们又开始编译了。
make mx6q-tqe9_config make ARCH=arm CROSS_COMPILE=${CC} cat < disk_header.bin > out_u-boot.bin cat < u-boot.imx >> out_u-boot.bin
这个里面的disk_heder.bin是我dump老的里面的,就是老的文件的开头的1024个字节。不然 烧了没办法启动。我之前弄的u-boot一直无法启动的原因就在这块。。。。
其实,u-boot可以玩很多的,我在测试的时候,就设置为网络启动,然后一直download模式, 测试从u-boot到kernel到rootfs,所有的都测试搞定之后再重新完整弄一遍。然后打包结束