一. 建立目录
[root@qljt1 /]# mkdir /jffs2 /jffs2/rootfs /jffs2/rootfs_build
[root@qljt1 /]# cd /jffs2/rootfs
[root@qljt1 rootfs]# mkdir {bin,dev,etc,usr,lib,sbin,proc,sys,tmp}
[root@qljt1 rootfs]# mkdir usr/{bin,sbin,lib}
二. 拷贝动态链接库
[root@qljt1 rootfs]#cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib
[root@qljt1 lib]# cp -arfv * /jffs2/rootfs/lib/
三. 编译busybox
把busybox-1.15.2.tar.ba2 放到 /jffs2/rootfs_build目录下,转到该目录
[root@qljt1 rootfs_build]# tar -xjvf busybox-1.15.2.tar.bz2
[root@qljt1 rootfs_build]# cd busybox-1.15.2
[root@qljt1 busybox-1.15.2]# vi Makefile
修改下面两行
ARCH ?= arm
CROSS_COMPILE ?=/usr/local/arm/4.3.2/bin/arm-linux- (这个视你的交叉编译工具所在路径而定)
[root@qljt1 busybox-1.15.2]# make menuconfig
Busybox Settings --->
Build Options --->
| +-------------------------------------------------------------------------+ |
| | [*] Build BusyBox as a static binary (no shared libs) |
| | [ ] Force NOMMU build | |
| | [*] Build with Large File Support (for accessing files > 2 GB) | |
| | () Cross Compiler prefix | |
| | () Additional CFLAGS
Installation Options --->
| | [*] Don't use /usr |
| | (./_install) BusyBox installation prefix (进入这一项)
填入 /jffs2/rootfs
这样编译好的busybox,安装以后就会自动保存到 /jffs2/rootfs目录下,不用复制了。
保存退出
[root@qljt1 busybox-1.15.2]# make ;make install
四. 编译bash
把bash-3.2.tar.gz 放到 /jffs2/rootfs_build目录下,转到该目录
[root@qljt1 rootfs_build]# tar -xzvf bash-3.2.tar.gz
[root@qljt1 rootfs_build]# cd bash-3.2
[root@qljt1 bash-3.2]# ./configure --host=arm-linux
[root@qljt1 bash-3.2]#make
[root@qljt1 bash-3.2]# arm-linux-strip bash
[root@qljt1 bash-3.2]# cp bash /jffs2/rootfs/bin/
五. 建立配置文件
1. etc/inittab 文件
[root@qljt1 bash-3.2]# cd /jffs2/rootfs
[root@qljt1 rootfs]# vi etc/inittab
添加如下内容
#first: run the system script file
::sysinit:/etc/init.d/rcS
#second:run the local script file
::once:/etc/rc.local
#third run the bash shell prosecc
::respawn:/bin/bash
#restart init process
::restart:/sbin/init
#umount all file system
::shutdown:/bin/umount -a –r
保存退出
[root@qljt1 rootfs]# chmod 777 etc/inittab
上面的这个inittab文件决定的启动流程是:
(1) 执行“/etc/init.d/rcS”脚本;
(2) 执行“/etc/rc.local”脚本;
(3) 执行“/bin/bash”交互程序,进入交换界面;
2. etc/init.d/rcS文件
[root@qljt1 rootfs]# mkdir etc/init.d
[root@qljt1 rootfs]# vi etc/init.d/rcS
内容:
#!/bin/sh
#mount fs
/bin/mount -t ramfs ramfs /tmp
/bin/mount -t proc proc /proc
/bin/mount -t sysfs sysfs /sys
保存退出
[root@qljt1 rootfs]# chmod 777 etc/init.d/rcS
3. etc/rc.local 文件
内容如下(由于还没有移植网卡驱动,所以暂时全部都注释掉了):
#!/bin/sh
# set ip
#/sbin/ifconfig lo 127.0.0.1 up
#/sbin/ifconfig eth0 172.22.60.223 netmask 255.255.0.0 up
#/sbin/route add default gw 172.22.60.1 eth0
保存退出
[root@qljt1 rootfs]# chmod 777 etc/rc.local
4. .bashrc文件
[root@qljt1 rootfs]# vi .bashrc
#!/bin/bash
# set env
export PATH=/bin:/sbin:/usr/bin
export LD_LIBRARY_PATH=/lib:/usr/lib
保存退出
5. 添加一个hello world用户程序
[root@qljt1 rootfs]# cd /jffs2/rootfs_build/
[root@qljt1 rootfs_build]# vi hello.c
#include <stdio.h>
int main(void)
{
printf("hello world!/n");
return 0;
}
保存退出
[root@qljt1 rootfs_build]# arm-linux-gcc -o hello hello.c
[root@qljt1 rootfs_build]# cp hello /jffs2/rootfs/usr/bin/
六. 制作JFFS2根文件系统映像
制作JFFS2根文件系统需要用到MTD工具,其下载地址是:
ftp://ftp.infradead.org/pub/mtd-utils/mtd-utils-1.0.0.tar.gz
编译后会生成mkfs.jffs2 ,把mkfs.jffs2复制到 /sbin目录下。然后:
[root@qljt1 rootfs]# cd /jffs2
[root@qljt1 jffs2]# mkfs.jffs2 -r rootfs -o rootfs.jffs2 -p -l -n -e 0x4000
[root@qljt1 jffs2]# ls
rootfs rootfs_build rootfs.jffs2
rootfs.jffs2就是可用的jffs2根文件系统镜像。
-r 指定内含根文件系统的目录
-o 指定文件系统映象的输出文件名称
?-p 表示在映像的结尾用0x0补全到block
-l 存储格式为小端格式
-n 每个擦除的block中不添加clreanmarker
-e 擦除block的大小
Uboot下设置传递给内核的命令行参数:
setenv bootargs root=/dev/mtdblock2 init=/sbin/init console=ttySAC0,115200 rootfstype=jffs2
七. 下载运行
VFS: Mounted root (jffs2 filesystem) on device 31:2.
Freeing init memory: 120K
Warning: unable to open an initial console. 到这里停止,不能进控制台,修改如下:
[root@qljt1 jffs2]# cd /jffs2/rootfs/dev/
[root@qljt1 dev]# mknod -m 660 console c 5 1
[root@qljt1 dev]# mknod -m 660 null c 3 0
[root@qljt1 dev]# cd /jffs2
重新生成 rootfs.jffs2 下载运行。
VFS: Mounted root (jffs2 filesystem) on device 31:2.
Freeing init memory: 120K到这里停止,不能进控制台,估计是bash暂时没有启动,修改如下:
[root@qljt1 jffs2]# cd /jffs2/rootfs/etc/init.d/
[root@qljt1 init.d]# vi rcS
加上如下内容:
/bin/sh
保存退出,重新生成 rootfs.jffs2 下载运行。
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
VFS: Mounted root (jffs2 filesystem) on device 31:2.
Freeing init memory: 120K
/bin/sh: can't access tty; job control turned off
#
虽然还有小小错误,以后慢慢再改,但总算能够出控制台了。
但是hello和bash程序都不能运行,原因是他们链接的时候用了动态库。