清水出芙蓉,天然去雕饰——李白《论诗》
内核版本:3.0.54
busybox:1.20.2
根文件系统制作很久了,但是当时做完的时候对其中的一些东西以及过程还不是很理解,就想等到理解了再来写博客,一拖就是一个多月,最近在做总结,因为马上就要做其他的事情了,所以想起来完成这篇博客。
jffs2文件系统呢,适用于norflash和nandflash,ubifs文件系统适用于nandflash,我们的s3c2440是nandflash,因此最好用的文件系统应当是ubifs,但是在制作ubifs文件系统时遇到了一系列的问题,所以ubifs一直没有成功,而jffs2成功了,所以在此后的开发都是用的jffs2文件系统,这篇文章呢主要就是谈一谈制作jffs2的过程以及如何将它烧进开发板中。
添加对内核的支持:
[tangyanjun@centos Linux-3.0.54]$export TERM=vt100
[tangyanjun@centos Linux-3.0.54]$make menuconfig
File systems ————>
Miscellaneous filesystems ————>
<*> Journalling Flash File System v2 (JFFS2) support
(0) JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
[*] JFFS2 write-buffering support
[ ] JFFS2 summary support (EXPERIMENTAL)
[ ] JFFS2 XATTR support (EXPERIMENTAL)
[tangyanjun@centos Linux-3.0.54]make
mkfs.jffs2与mkfs.ubifs工具的制作
这里我们先创建一个文件夹用来放这些工具,然后用一个脚本来生成我们的工具,至于脚本的注释,鉴于本人目前未深入学习,只能以后再研究。
[tangyanjun@centos opt]$mkdir mtd-utiles
[tangyanjun@centos opt]$cd mtd-utiles/
[tangyanjun@centos mtd-utiles]$vim build.sh
#!/bin/bash
#+--------------------------------------------------------------------------------------------
#|cription: This shell script used to download lzo,zlib,mtd-utils source code
#| and cross compile it for ARM Linux, all is static cross compile.
#| 修改为国内CDN,优化下载速度
#| Author: popy32 @sfantree.com
#| ChangeLog:1, Initialize 1.0.0 on 2017.03.16
#|
#+--------------------------------------------------------------------------------------------
PRJ_PATH=`pwd`
LZO="lzo-2.04"
ZLIB="zlib-1.2.5"
e2fsprogs_ver=1.42
mtd="mtd-utils-1.4.9"
echo "+---------------------------------------------+"
echo "| Modified by panlin <740502708@qq.com> "
echo "| 修改为国内CDN,优化下载速度 "
echo "| 如遇编译报错 尝试yum install glibc-static zlib-static -y "
echo "+---------------------------------------------+"
sleep 3
sudo yum install glibc-static zlib-static -y
function decompress_packet()
(
echo "+---------------------------------------------+"
echo "| Decompress $1 now"
echo "+---------------------------------------------+"
ftype=`file "$1"`
case "$ftype" in
"$1: Zip archive"*)
unzip "$1" ;;
"$1: gzip compressed"*)
if [ `expr "$1" : ".*.tar.*" ` ] ; then
tar -xzf $1
else
gzip -d "$1"
fi ;;
"$1: bzip2 compressed"*)
if [ `expr "$1" : ".*.tar.*" ` ] ; then
tar -xjf $1
else
bunzip2 "$1"
fi ;;
"$1: POSIX tar archive"*)
tar -xf "$1" ;;
*)
echo "$1 is unknow compress format";;
esac
)
# Download lzo source code packet
if [ ! -s $LZO.tar.gz ] ; then
wget https://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/lzo-2.04.tar.gz
fi
# Decompress lzo source code packet
if [ ! -d $LZO ] ; then
tar zxvf $LZO.tar.*
fi
# Cross compile lzo
cd $LZO
if [ ! -s src/.libs/liblzo*.a ] ; then
unset LDFLAGS
./configure --enable-static --disable-shared
make
fi
cd -
echo "+----------------------------------------+"
echo "| Cross compile $ZLIB now "
echo "| Crosstool: $CROSS"
echo "+----------------------------------------+"
# Download zlib source code packet
if [ ! -s $ZLIB.tar* ] ; then
wget https://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/zlib-1.2.5.tar.bz2
fi
# Decompress zlib source code packet
if [ ! -d $ZLIB ] ; then
tar xjf $ZLIB.tar.*
fi
#Cross compile zlib
cd $ZLIB
if [ ! -s libz.a ] ; then
unset LDFLAGS
./configure --static
make
fi
cd -
echo "+----------------------------------------+"
echo "| Cross compile e2fsprogsV$e2fsprogs_ver now "
echo "| Crosstool: $CROSS"
echo "+----------------------------------------+"
#e2fsprogs is for UBIFS, download e2fsprogs source code packet
if [ ! -s e2fsprogs-$e2fsprogs_ver.tar.gz ] ; then
wget https://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/e2fsprogs-1.42.tar.gz
fi
# Decompress e2fsprogs source code packet
if [ ! -d e2fsprogs-$e2fsprogs_ver ] ; then
tar zxvf e2fsprogs-$e2fsprogs_ver.tar.*
fi
cd e2fsprogs-$e2fsprogs_ver
if [ ! -s lib/libuuid.a ] ; then
./configure --enable-elf-shlibs
make
fi
cd -
echo "+----------------------------------------+"
echo "| Cross compile mtd-utils now "
echo "| Crosstool: $CROSS"
echo "+----------------------------------------+"
if [ ! -s ${mtd}.tar.bz2 ] ; then
wget https://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/mtd-utils-1.4.9.tar.bz2
fi
tar xjf ${mtd}.tar.bz2
# download mtd-utils source code
#if [ ! -d mtd-utils* ] ; then
#git clone git://git.infradead.org/mtd-utils.git
#fi
cd ${mtd}
#Add the CROSS tool in file common.mk
line=`sed -n '/CFLAGS ?= -O2 -g/=' common.mk `
if [ ! -z $line ] ; then
sed -i -e ${line}s"|.*|CFLAGS ?= -O2 -g --static|" common.mk
fi
unset LDFLAGS
unset CFLAGS
export CFLAGS="-DWITHOUT_XATTR -I$PRJ_PATH/$ZLIB -I$PRJ_PATH/$LZO/include -I$PRJ_PATH/e2fsprogs-$e2fsprogs_ver/lib"
export ZLIBLDFLAGS="-L$PRJ_PATH/$ZLIB"
export LZOLDFLAGS="-L $PRJ_PATH/$LZO/src/.libs/"
export LDFLAGS="-static -L $PRJ_PATH/e2fsprogs-$e2fsprogs_ver/lib $ZLIBLDFLAGS $LZOLDFLAGS"
make
echo "+---------------------------------------------+"
echo "| 修改为国内CDN,优化下载速度 "
echo "| 如遇编译报错 尝试yum install glibc-static zlib-static -y "
echo "+---------------------------------------------+"
[tangyanjun@centos mtd-utiles]$sh build.sh
这个脚本会下载我们需要的源码包以及生成制作jffs2的工具mkfs.jffs2(在mtd-utiles-1.4.9下),和制作ubifs的工具mkfs.ubifs(在mtd-utiles-1.4.9/mkfs.ubifs下)。
[tangyanjun@centos mtd-utiles-1.4.9]$sudo cp mkfs.jffs2 /usr/local/bin/
[tangyanjun@centos mtd-utiles-1.4.9]$mkfs
[tangyanjun@centos mtd-utiles-1.4.9]mkfs.jffs2 -V
制作映像文件
以前不是很理解这个映像文件,现在有个概念了,映像文件就相当于一张存放东西的光盘我们可以随时拿来用,当我们的文件系统出问题时,我们直接烧录映像文件不就行了,方便我们的修复。
[tangyanjun@centos mtd-utiles-1.4.9]$cd /opt
[tangyanjun@centos opt]$sudo mkfs.jffs2 -n -s 2048 -e 128KiB -d rootfs -o rootfs.jffs2 --pad=0x1400000
[tangyanjun@centos opt]$du -h rootfs.jffs2
20M rootfs.jffs2
生成我们的rootfs.jffs2文件就完成了我们的文件系统的制作。
烧录过程
烧录jffs2文件系统得根据我们的分区来,我给的分区是这样的:
bootloader:1M
kernel:15M
rootfs:40M
apps:100M
datas:100M
所以我们根据分区来设置我们在u-boot里面的参数:
1.[uboot@tangyanjun]#set bjffs2 'tftp 30008000 rootfs.jffs2;nand erase 1e00000 1400000;nand write.jffs2 30008000 1e00000 1400000'
这里给我们的文件系统设置为bjffs2变量名,可以随意,30008000是我们内存的基地址,我们先将jffs2文件放入内存,然后擦除我们的文件系统分区,再将我们的文件系统写入硬盘分区中。
2.[uboot@tangyanjun]#set bootargs_jffs2 'noinitrd root=/dev/mtdblock2 rootfstype=jffs2 init=/linuxrc console=ttyS0,115200'
这里就是设置根文件系统在第二个分区,这是我们自己分的,然后启动文件为linuxrc。
3.[uboot@tangyanjun]#set bootargs 'noinitrd root=/dev/mtdblock2 rootfstype=jffs2 init=/linuxrc console=ttyS0,115200'
第二步的bootargs_jffs2是我们自己设置的参数,目的是为了让我们好记,这一步的bootargs才是系统认识的参数,所以这里重新设置一次。
4.[uboot@tangyanjun]#set bootcmd_jffs2 'nand read 30008000 100000 400000;bootm 30008000'
这里就是设置启命令了,当我们boot时,系统从硬盘将根文件系统读到内存中,让其在内存中运行。
5.[uboot@tangyanjun]#set bootcmd 'run bootcmd_jffs2'
这一步就是执行上一步的命令。
6.最后就是save
。
OK,参数设置完毕:
[uboot@tangyanjun]#run bkr
[uboot@tangyanjun]#run bjffs2
[uboot@tangyanjun]#boot