根据busybox源码可知,最小的根文件系统要具备如下条件:
第一.init(来源于busybox,主要是一些命令,如cp,ls等,等编译busybox时,就得到)
第二./dev/console 和/dev/null(open()打开设备)
第三./etc/inittab
第四.配置指定的程序
第五.C库(r如:标准输入,输出,错误等)
--根据韦东山老师电子书参考--
【环境】
1:Ubuntu 10.10
2:u-boot-2010.03
3:linux-2.6.35
4:busybox-1.17.3
5:优龙FS2410
6:交叉编译器:arm-none-linux-gnueabi-gcc version 4.3.2
第一步:busybox的编译
1)解压缩busybox
tar xjvf busybox-1.17.3.tar.bz2
解压后,可以在当前busybox目录下,看INSTALL或README,教你如何编译
make menuconfig # This creates a file called ".config"
make # This creates the "busybox" executable
make install # or make CONFIG_PREFIX=/path/from/root install
第一步是:make menucofig
第二步是:make
第三步是:make intall (可以根据自己指定的目录去安装)
第一步:配置源码
@Ubuntu:~/busybox-1.17.3$make menuconfig
BusyboxSettings --->
BuildOptions --->
[*] BuildBusyBox as a static binary (no shared libs)
[ ] Force NOMMU build (NEW)
[ ] Build with Large File Support (foraccessing files > 2 GB)
(/home/tony/toolchain/bin/arm-none-linux-gnueabi-)Cross Compiler prefix
() Additional CFLAGS (NEW)
第二步:编译
第三步:安装
busybox默认安装路径为源码目录下的_install
但是最好不要用默认目录,不然很容易破坏我们得东西,组号再创建一个目录
@Ubuntu:~/busybox-1.17.3$ mkdir -p /home/gx/first_fs install (根据INSTALL文件就可以知道,这样做是问了防止安装后回破坏原有文件)
附加:进入生成得目录
@Ubuntu:~/busybox-1.17.3$ make CONFIG_PREFIX=/home/lsb/gx/first_fs install
@Ubuntu:~/busybox-1.17.3$ cd /home/lsb/gx/first_fs
@Ubuntu:~/home/lsb/gx/first_fs $ ls
bin linuxrc sbin usr
@Ubuntu:~/home/lsb/gx/first_fs $ ls bin/ls -l
上面busybox编译完成
---------------------------------------------------------------------------------------------------------------------------------------
第二步:创建设备节点(打开标准输入,输出,错误等)
1.@Ubuntu:~/home/lsb/gx/first_fs $ ls /dev/console /dev/null -l
crw------- 1 root root 5, 1 2011-11-11 19:50 /dev/console
crw-rw-rw- 1 root root 1, 3 2011-11-11 19:49 /dev/null
2.@Ubuntu:~/home/lsb/gx/first_fs $mkdir dev
3.@Ubuntu:~/home/lsb/gx/first_fs $cd dev/
4. sudo mknod console c 5 1
5.sudo mknod null c 1 3
6.@Ubuntu:~/home/lsb/gx/first_fs /dev$ls -l
total 0
crw-r--r-- 1 root root 5, 1 2011-11-11 20:01 console
crw-r--r-- 1 root root 1, 3 2011-11-11 20:03 null
---------------------------------------------------------------------------------------------------------------------------------------
第三步:构造inittab
进是因为当我们不构造的时候,busybox就会使用默认项
::ctrlaltdel:/sbin/reboot
::shutdown:umount -a -r
::restart:init
::askfirst:-/bin/sh
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
tty4::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS
而我们不需要多项,所以我们就构造inittab项
@Ubuntu:~/home/lsb/gx/first_fs $sudo mkdir etc
@Ubuntu:~/home/lsb/gx/first_fs $vim etc/inittab
添加的内容是:
console::askfirst:-/bin/sh
(解析:console表示为终端,就会执行/bin/sh程序,是用来回显信息用的,而标准得输出,输入和错误就会定位到console终端去)
---------------------------------------------------------------------------------------------------------------------------------------
第四,暂时不管
第五,C库
@Ubuntu:~/home/lsb/gx/first_fs $ sudo mkdir lib
@Ubuntu:~/home/lsb/gx/first_fs $cp /home/lsb/toolchain/arm-none-linux-gnueabi/lib/*so* ./lib/ -a
(-d是保持原有得连接文件,不然得到的文件很大)
附加:在管理员模式对库瘦身
@Ubuntu:~/home/lsb/gx/first_fs $ $sudo su
root@Ubuntu:~/home/lsb/gx/first_fs install #source /home/tony/.bashrc //如果在etc/profile中不用
root@Ubuntu:~/home/lsb/gx/first_fs install #arm-none-linux-gnueabi-strip./lib/*
root@Ubuntu:~/home/lsb/gx/first_fs install #exit
上面步骤完成一个最小的根文件系统
2.yaffs2文件系统制作
---------------------------------------------------------------------------------------------------------------------------------------
- 文件系统做成了,要烧写到板子上去,所以,就得做成映像文件-
1.先下载yaffs工具
2.解压yaffs2(s1是小页的nand faslh用的,只有512个字节。。而yaffs2是对大页nand faslh用的2048个字节)
@Ubuntu:~/home/lsb/gx/first_fs $ fmkyaffsimage_2 filesystem filesystem.yaffs2
把它考到板子上去
---------------------------------------------------------------------------------------------------------------------------------------
2.1.完善yaffs2文件系统(一)
方法一:实现PS命令
1.再板子上执行PS 命令,无法实现
直接mkdir proc是不行的,还要的挂载一个虚拟的根文件系统,而内核提供proc文件系统用来收集正在执行的文件
2.若我们想在板子上执行 PS命令的话,就得用
在板子上# mount -t proc none /proc (手动挂载的)
#cd proc
#cd 1
# ls -l fd (以查看,标准输出,输入和错误)
3.可以实现自动挂载,那就得去更改配置文件
@Ubuntu:~/home/lsb/gx/first_fs $ vim etc/inittab
增加内容:
console::askfirst:-/bin/sh
console::sysinit:/etc/init.d/rcS
4.再对这个配置文件增加点内容(脚本):
@Ubuntu:~/home/lsb/gx/first_fs $ sudo mkdir init.d
@Ubuntu:~/home/lsb/gx/first_fs $ vim etc/init.d/rcS
填写:mount -t proc none /proc
上面就实现增加:自动
@Ubuntu:~/home/lsb/gx/first_fs $ chmod +x rcS (修改它的属性)
方法二:实现PS命令
# mount -a (执行 mount -a 命令时,就会去读/etc/fstab,根据这个配置文件的内容去挂载根文件系统)
我们再到
@Ubuntu:~/home/lsb/gx/first_fs $ vim etc/init.d/rcS
#mount -t proc none /proc(注册掉)
/bin/ mount -a(而mount -a 依赖于etc/fstab文件)
@Ubuntu:~/home/lsb/gx/first_fs $ vim etc/fstab
fastab格式:
#device mount-point type options dump fsch order
proc /proc proc defaults 0 0
@Ubuntu:~/home/lsb/gx/first_fs $ sudo mkdir proc
cp到板子去:
@Ubuntu:~/home/lsb/gx/first_fs $ fmkyaffsimage_2 filesystem filesystem.yaffs2
在板子上:#cat /proc/mounts 参看正在挂载的文件
2.2.完善yaffs2文件系统(二)
自动创建设备节点文件
由于我们的设备有很多,而我们不一一手动去挂载设备节点,所以我们就用udev机制=mdev机制
udev机制是=自动创建/dev/设备节点(在busybox里面是mdev是udev的简化版本)
板子上:#ls /dev
console null
@Ubuntu:~/home/lsb/gx/first_fs $ vim etc/init.d/rcS
/bin/ mount -a
mkdir /dev/pts
mount -t devpts devts /devpts
mount -t sysfs sysfs /sys
echo /bin/mdev > /proc/sys/kernel/hotplug
mdev -s
在板子上: # ls /dev 就会产生很多设备文件,是由mdev自动给我们创建的
@Ubuntu:~/home/lsb/gx/first_fs $ vim etc/fstab
fastab格式:
#device mount-point type options dump fsch order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
@Ubuntu:~/home/lsb/gx/first_fs $ sudo mkdir tmp mnt var sys root
cp到板子去:
@Ubuntu:~/home/lsb/gx/first_fs $ fmkyaffsimage_2 filesystem filesystem.yaffs2
---------------------------------------------------------------------------------------------------------------------------------------
3.jffs2文件系统制作
(一般放于NOR FLASH)
1)zlib工具的编译
解压:tar xjvf zlib-1.2.3.tar.bz2
@Ubuntu:~/home/lsb/gx/$ cd zlib-1.2.3
@Ubuntu:~/home/lsb/gx/zlib-1.2.3$ ./config --shared --prefix=/usr (shared表示为动态库,而prefix则表示为安装路径)
@Ubuntu:~/home/lsb/gx/zlib-1.2.3/$ make
@Ubuntu:~/home/lsb/gx/zlib-1.2.3/$ sudo make install
为什么要安装这个?是因为制作jffs2文件系统时,需要MTD设备工具包,编译它生成mkjs.jffs工具,用它来将一个目录制作成jffs文件系统镜像文件
又因为,这个MTD工具包,需要zlib压缩包,所以得先安装它
2)mtd工具包的编译
tar xjvf mtd-snapshot-20050519.tar.bz2
@Ubuntu:~/home/lsb/gx/$ cd Util
@Ubuntu:~/home/lsb/gx/Util$ make
@Ubuntu:~/home/lsb/gx/Util$sudo make install
3) 文件系统镜像制作
@Ubuntu:~/home/lsb/gx/$ sudo mkfs.jffs2 -n -s 2048 -e 128KiB -d first_fs -o first_fs .jffs2
1.-n 表示不要在每个擦除块上都加上清除标志
2.-s 2048 指明一页得大小为2048字节
3.-e 128 KiB 指明擦除块大小为128Kb
4.-d 表明根文件系统目录
5.-o 表示输出文件
tony@Ubuntu:/opt$sudo mkfs.jffs2 -r filesystem -o filesystem.jffs2
tony@Ubuntu:/opt$cp filesystem.jffs2 /tftpboot/
4)将jffs2文件系统烧写到nand
tftp 30008000 filesystem.jffs2
nand erase 500000 800000
nand write 30008000 400000 实际大小
setenv bootargs root=/dev/mtdblock2 init=/linuxrcrootfstype=jffs2 rw console=ttySAC0,115200
当你重启板子是,板子默认为yaffs2,所以在传参时,加上文件系统类型
5.挂载方式NFS
1.从 falsh启动根文件系统,再用命令去挂载NFS
2.直接从NFS启动
nfs格式:
ootargs console=ttySAC0,115200 init=/init
root=/dev/nfs nfsroot=192.168.7.102:/opt/fs100
ip=192.168.7.162:192.168.7.102:192.168.7.1:255.255.255.0:farsight_02:eth0(第一个网卡):off(不需要自动挂载)