一、基本概念
文件管理:数据管理算法
文件系统:管理文件算法的载体
文件系统的功能:管理分区上的数据(增删查改)
文件系统的分类:fat32/ntfs/ext3/ext4/yaffs/jffs/cramfs/.....
文件系统的表现形态:
window--------->森林
linux------------>树 ------->文件目录标准
文件系统与根文件系统:
根文件系统: 系统启动时加载的助文件系统
其他文件系统: 根系统启动后挂载的其他文件系统
二、需要用到的工具
busybox-1.20.2.tar,yaffs2-source,bash-4.0.tar
下载地址:http://pan.baidu.com/s/1ntmMh5Z
三、根文件系统镜像设计
1)建立标准的linux文件目录(必备)
/sbin ------->超级用户工具命令
/etc --------->系统配置文件
/bin ---------->通用工具命令
/dev ---------->设备文件目录
/lib ------------>库文件目录 --------------->静态库、动态库
命令:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 mkdir /home/gec/build_rootfs 2 3 cd /home/gec/build_rootfs 4 mkdir rootfs -----> 创建根文件系统主目录 -----> / 5 6 cd rootfs 7 mkdir {sbin,bin,dev,lib,etc}
2)配置busybox
1.解压,并进入目录
# tar jxvf busybox-1.20.2.tar.bz2 # cd busybox-1.20.2
2.修改Makefile中的体系结构ARCH和交叉编译器前缀CROSS_COMPILE
# vim Makefile
修改: CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi- ARCH = arm
3.通过menuconfig配置busybox
BusyBox的配置程序和linux内核菜单项配置方式简直一模一样。熟悉用make menuconfig方式配置linux内核的朋友很容易上手。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# make menuconfig 选上以下几项: Busybox Settings ---> General Configuration ---> [*] Don't use /usr Build Options ---> [*] Build BusyBox as a static binary (no shared libs) 这个选项是一定要选上,这样才能把BusyBox编译成静态链接的可执行文件,运行时才独立于其他函数库,否则需要其他库文件才能运行BusyBox。 Busybox Library Tuning ---> [*] vi-style line editing commands 选上VI风格的行编辑器命令。 [*] Fancy shell prompts Installation Options ("make install" behavior) ---> (/home/gec/build_rootfs/rootfs) BusyBox installation prefix //安装目标路径 Linux Module Utilities ---> [ ] Simplified modutils [*] insmod [*] rmmod [*] lsmod [*] modprobe [*] depmod 取消选中Simplified modutils,使用完整的模块工具命令:insmod、rmmod……
确保支持mdev(mdev是udev设备文件系统的精简版),确保以下几项被选中:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Linux System Utilities ---> [*] mdev [*] Support /etc/mdev.conf [*] Support subdirs/symlinks [*] Support regular expressions substitutions when renaming dev [*] Support command execution at device addition/removal [*] Support loading of firmwares
其它选项都是一些linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了,配置好后退出并保存。
4.编译BusyBox,并安装。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
编译: # make -j2 // j2表示创建两个线程进行编译 安装: # make install
在busybox-1.20.2目录下可以找到_install子目录,这就是刚才的安装目录。
下面的操作在rootfs目录进行
3)拷贝交叉编译器里的动态链接库到lib目录
只需要拷贝交叉编译器里的动态链接库及其软链接到lib目录就好了,静态链接库不用拷贝:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib -rdf
注意:使用cp工具拷贝链接一定要使用d选项,表示拷贝的文件带链接属性。
4)对lib目录下的动态链接库进行裁剪
动态链接库包括了符号信息,可以去掉不必要的符号信息,使用动态链接库变得更小巧:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# arm-none-linux-gnueabi-strip lib/*so*
5)修改脚本文件
1.etc/inittab文件是启动流程文件。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#vi etc/inittab 内容: ::sysinit:/etc/init.d/rcS ::askfirst:/bin/sh //::respawn:/bin/bash ::once:/etc/local.rc ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r ::restart:/sbin/init
2./etc/init.d/rcS脚本。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#vi etc/init.d/rcS 内容: #!/bin/sh export PATH=/sbin:/bin:/usr/sbin:/usr/bin //设置变量PATH mount -a //mount -a会读取etc/fstab完成文件系统挂载 echo /sbin/mdev > /proc/sys/kernel/hotplug //当内核有热插拨事件时调用/sbin/mdev mdev -s //启动mdev #ifconfig eth0 192.168.0.80 //配置以太网接口0的IP地址
3.etc/fstab文件。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0
/proc目录挂载了procfs文件系统,/sys目录挂载了sysfs文件系统,var和tmp及dev目录挂载的是tmpfs临时文件系统。
创建mdev.conf文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
touch /rootfs/etc/mdev.conf
附:修改好的etc目录:
http://pan.baidu.com/s/1pJ4sX2j
6)设置动态库的加载路径
修改 etc/init.d/rcS ,添加:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
export LD_LIBRARY_PATH=/mylib:$LD_LIBRARY_PATH
7)添加bash
1.配置,编译,生成。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
配置bash: #./configure --host=arm-linux 编译: #make 生成: #make install 得到bash -----> 放到开发板文件系统的/bin目录下,检查该程序所需的动态库是否具备
2.修改inittab脚本
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/bin/bash
::askfirst:/bin/bash
3.修改其他脚本的声明
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/bin/sh --> #!/bin/bash
4.添加etc/profile ----> 启动bash时系统默认的执行脚本
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# Ash profile # No core files by default ulimit -S -c 0 > /dev/null 2>&1 USER="`id -un`" LOGNAME=$USER PS1='[\u@\h \W]# ' PATH=$PATH HOSTNAME=`/bin/hostname` export USER LOGNAME PS1 PATH export LD_LIBRARY_PATH=lib:/usr/lib:$LD_LIBRARY_PATH
四、构建根文件系统镜像
1.获取mkyaffs2image工具的源码包
下载地址:
http://fatplus.googlecode.com/files/yaffs2-source.tar
2. 编译mkyaffs2image工具
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# tar xvf yaffs2-source.tar # cd yaffs2/utils # make # cp mkyaffs2image /usr/local/bin/
3.制作根文件系统镜像
进入/root目录
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# mkyaffs2image rootfs rootfs.img
五、根文件系统镜像rootfs.img下载与烧写
下面的操作在开发板复位后的u-boot下载阶段进行:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
SMDKV210 # nand erase 0xe00000 0xF200000 SMDKV210 # tftp 0x40000000 rootfs.img SMDKV210 # nand write.yaffs 0x40000000 0xe00000 0x6aa340 (要把最后一个数字改为实际u-boot下载传输的字节数) SMDKV210 # set bootargs root=/dev/mtdblock4 rootfstype=yaffs2 rw console=ttySAC0,115200