终于完成了文件系统的制作了,在这之前移植过u-boot,不成功,移植过内核,还是不成功,都没有信心调试下去了,而且网上有关OK6410的资料还挺少的,不像2440、2410移植手册满天飞,对于我这个菜鸟级别的人来说难度着实比较大啊。但这里有关文件系统制作还是比较类似的,在几经磨难之后终于还是成功挂载上文件系统了。庆祝一下!
以下是我的制作步骤,希望能给大家一点参考,有不对之处希望大虾指出来,谢谢!
开发平台:ubuntu linux2.6.36.2(飞凌源码) arm-linux-gcc-4.3.3busybox-1.7.0 OK6410
1. 建立根文件系统目录
# Mkdirrootfs_zfx
在该目录下建立以下目录
Cd rootfs_zfx
# Mkdir bin etcdev home lib mnt opt proc root sbin sys tmp usr var
2. 下载busybox
从http://www.busybox.net/downloads/下载busybox-1.7.0.tar.bz2。
# tar jxvfbusybox-1.7.0.tar.bz2
3. 修改Makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
4. 配置busybox
# Makemenuconfig
选择要配置的选项,这里选上
Busybox settings--->
Busybox library tuning --->
[*]tab completion //支持tab补齐功能
[*]vi-style line editing commands
[*]fancy shell prompts
Busybox Setting --->
Build Options --->
[*] Build Busybox as a static binary (no shared libs) //(1)
Installation Options --->
[*] Don’t use /usr //(2)
(./_install) Busybox installation prefix 进入这个选项,输入busybox的安装路径,这里是 ../rootfs_zfx
Shells--->
Chooseyour default shell (msh) ---> //(3)
Ipsvd utilities---> //(4)
[ ]tcpsvd
[ ]udpsvd
Networking utilities--->
[ ]iptunnel
(1) 这里采用静态编译,这样就可以不依赖编译器的库文件。如果不选上表示动态编译,在编译安装完成后还需要将库文件给拷贝到文件系统中,由于这样可能会多拷贝一些不需要的库导致文件系统变大,这里采用静态编译,不过一般会出现一些命令编译不过去的情况,这里将他们取消不编译。后面会提到。
(2) 这个选项也一定要选,否则make install后,busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令.
(3) 由于ash功能不够强大,不能支持tab补齐,历史纪录等等的高级功能,所以使用busybox里面的msh代替ash.
(4) 取消这几项,不然编译不过,因为是静态编译的原因
5. 编译
因为busybox主要应用于对空间要求非常严格的嵌入式系统,所以它推荐使用uclibc而不鼓励使用glibc,如果你没有安装uclibc,而且在 build Options也选择了Build BusyBox as a staticbinary(no shared libs),那肯定无法编译通过的,当然如果你之前build Options选择的是动态编译的话就不会有这样的问题出现了。假设你是第一种情况,我们可以这样解决:把applets/applets.c开头的几行 warning注释掉。
# make
将会遇到下面问题:
applets/applets.c:20:2:error: #warning Static linking against glibc produces buggy executables
applets/applets.c:21:2: error: #warning (glibc does not cope well with ld--gc-sections).
applets/applets.c:22:2: error: #warning Seesources.redhat.com/bugzilla/show_bug.cgi?id=3400
applets/applets.c:23:2: error: #warning Note that glibc is unsuitable forstatic linking anyway.
applets/applets.c:24:2: error: #warning If you still want to do it, remove-Wl,--gc-sections
applets/applets.c:25:2: error: #warning from top-level Makefile and remove thiswarning.
make[1]: *** [applets/applets.o] Error 1
这个警告的定义在applets/applets.c中。将这段警告注释掉就可以了。这段警告的意思是告诉你最好用uclibc编译,而不是用glibc因为glibc比较大,busybox在寸土寸金的嵌入式系统中运用比较多,所以会有这样的要求。
# vi /busybox-1.7.0/applets/applets.c
注释掉20 -- 28行内容即可
6. 安装
#make install //安装到设置的默认路径
或者:
#makeCONFIG_PREFIX=../rootfs_zfx install //安装到指定路径
7. 构建/etc目录
拷贝Busybox-1.7.0/examples/bootfloopy/etc/* 到rootfs_zfx/etc下
# cp -rf../../busybox-1.7.0/examples/bootfloopy/etc/* ./
包括文件:fstab init.d inittab profile
修改inittab文件如下:
#/etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount-a -r
修改init.d/rcS文件如下:(如果本文件是自己建立的,需要改变属性:chmod +x rcS)
如需开机启动什么,也可以在这个文件里面加
#! /bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
echo"hello,linux,zfx"
/bin/mount -a
echo "mountok"
修改fstab文件如下:
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
8. 构建/dev目录
有两种方法,一:静态创建设备文件;二:使用mdev创建。这里我使用的是第一种方法,比较简单。
#cd /dev
#sudo mknodconsole c 5 1
#sudo mknod nullc 1 3
9. 制作文件系统映像文件
要实现不同类型的文件系统,如cramfs、yaffs2等,只是在这里有区别,只要使用不同的制作工具来制作就行。
我开始打算使用yaffs2来制作,做出来发现启动时停在:
Kernel panic -not syncing: No init found. Try passinginit= option to kernel.
原因是:采用默认的mkyaffs2image来制作是不行的,必须修改mkyaffs2image.c才行。(据说linux3.0.1代码中已经有了修改好了的代码,有兴趣的朋友可以试试)这里飞凌想出了一个巧妙的方法,linux2.6.36手册中有说明,先用cramfs文件系统启动,然后用sd卡或u盘拷贝制作的文件系统文件夹,之后解压到/mnt/disk目录下,修改启动参数,就可以了。
实现方式我猜测是在启动时将/mnt/disk挂载到了mtd/mtdblock3中,然后我们将文件系统拷贝到这里,相当于以yaffs2形式写进了mtdblock3中,这样就实现了写入。
这里我就用cramfs来试验吧,这样会简单一点。
# ./mkcramfs rootfs_zfxrootfs_zfx.cramfs
然后下载到600000处,即可挂载,不过很奇怪的是用ls命令查看时,总是多出现一段乱七八糟的值。如下:
init started: BusyBox v1.7.0 (2011-11-3014:22:36 CST)
starting pid 47, tty '': '/etc/init.d/rcS'
hello,linux,zfx
mount ok
Please press Enter to activate thisconsole.
starting pid 51, tty '': '/bin/sh'
Processing /etc/profile... Done
:/> ls
[1;34mbin[0m [1;34metc[0m [1;34mlib[0m [1;34mmnt[0m [1;34mproc[0m [1;34msbin[0m [1;34mtmp[0m [1;34mvar[0m
[1;34mdev[0m [1;34mhome[0m [1;36mlinuxrc[0m [1;34mopt[0m [1;34mroot[0m [1;34msys[0m [1;34musr[0m
参考文献:
http://hi.baidu.com/zengzhaonong/blog/item/b0895436d24c33dea2cc2b03.html
http://wj86843248.blog.163.com/blog/static/6864301220110454653111/