这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 利用busybox和mkfs.jffs2制作根文件系统

共2条 1/1 1 跳转至

利用busybox和mkfs.jffs2制作根文件系统

高工
2018-07-03 08:08:39     打赏

PC机系统:Ubuntu 12.04 LTS

目标板:海思3518C

Flash类型:SPI Flash16M

BusyboxBusyBox-1.16.1.tgz

嵌入式交叉编译工具链:arm-hisiv100nptl-linux-gcc

目标板根文件系统格式:JFFS2在闪存上使用非常广泛的读/写文件系统

根文件系统制作工具:mkfs.jffs2

 

一、mkfs.jffs2工具使用说明:

mkfs.jffs2: Usage: mkfs.jffs2 [OPTIONS]

例:

mkfs.jffs2 -r rootfs -o rootfs_64k.jffs2 -e 0x20000 --pad=0x1000000 -s 0x800 -n

Options:

-p--pad[=SIZE]  16表示所要案的大小,也就是root.jffs2size。                                        很重要的是,为了不浪flash空間这个值最好符合flash driver规划的区域大小。                                         如果不足则使用0xff来填充补满。 

-r, -d, --root=DIR         指定要做成image的源資料夾.(默认:当前文件夹)

-s, --pagesize=SIZE      节点页大小(默认: 4KiB)

-e, --eraseblock=SIZE    设定擦除块的大小为(默认: 64KiB)

-c, --cleanmarker=SIZE   Size of cleanmarker (default 12)

-m, --compr-mode=MODE     选择压缩模式 (default: priortiry)

-x, --disable-compressor=COMPRESSOR_NAME 禁用压缩

-X, --enable-compressor=COMPRESSOR_NAME 启用指定的压缩工具

-y, --compressor-priority=PRIORITY:COMPRESSOR_NAME

                                      设置所指定的压缩工具的优先级

-L, --list-compressors           列出所有可用的压缩工具

-t, --test-compression   Call decompress and compare with the original (for test)

-n, --no-cleanmarkers          指明不添加清除标记(nand flash 有自己的校检块,存放相关的信息。)

    注:如果挂载后会出现类似:CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0 的警告,则加上-n 就会消失。

-o, --output=FILE            指定image案的文件名(default: stdout)

-l, --little-endian                   指定使用小端格式

-b, --big-endian                   指定使用大端格式

-D, --devtable=FILE               使用指定的文件作为一种设备tablefile-f, --faketime                 Change all file times to '0' for regression testing

-q, --squash  Squash permissions and owners making all files be owned by root

-U, --squash-uids           将所有文件的拥有者设为root用户

-P, --squash-perms                   Squash permissions on all files

    --with-xattr             stuff all xattr entries into image

    --with-selinux         stuff only SELinux Labels into jffs2 image

    --with-posix-acl     stuff only POSIX ACL entries into jffs2 image

-h, --help                                  显示这些文字

-v, --verbose                               Verbose operation

-V, --version                               显示版本

-i, --incremental=FILE      Parse FILE and generate appendage output for it


二、利用BusyBox-1.16.1版本来制作根文件系统

1、获取BusyBox源码:

从海思提供的SDK包中得到BusyBox源码包。

tar -xvf busybox-1.16.1.tgz

cd busybox-1.16.1 

2、配置和编译BusyBox

make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- menuconfig

//以图形界面进行选择配置

注意:

 Busybox Settings ---> Build Options 中注意下面两个选项:

[*]Build BusyBox as a static binary (no shared libs)

(arm-hisiv100nptl-linux-) Cross Compiler prefix

其中:

前者项用于是否把 busybox 编译成静态链接的可执行文件。如果选择该选项,编译出来的 busybox 就是静态链接的,运行时不依赖于动态库,但体积较大;清除该选项将得到动态链接的 busybox,体积较小,但需要动态库的支持。

后者选项是用于选择 SDK 推荐的交叉编译器。

 

配置好后保存并退出。

这个步骤中,可以对busybox进行裁剪,根据实际需要裁剪掉某些命令或者库,可以减小镜像文件的大小。 

3、 编译和安装 busybox

make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux-  //编译。

make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- install //安装。

编译并安装成功后,在 busybox 目录下的_install 目录下生成以下目录及文件:

drwxr-xr-x  2 root root 4096  4月 16 15:21 bin/

lrwxrwxrwx  1 root root   11  4月 16 15:21 linuxrc -> bin/busybox*

drwxr-xr-x  2 root root 4096  4月 16 15:21 sbin/

drwxr-xr-x  4 root root 4096  4月 15 23:56 usr/

4、制作根文件系统:

制作根文件系统的具体操作步骤如下:

4.1、创建rootfs目录:

mkdir rootfs

cd rootfs/

4.2、从BusyBox中获取相应文件夹rootfs

cp -rfa ../busybox/busybox-1.16.1/_install/* .

4.3、创建文件系统中常用的目录:

mkdir etc dev lib tmp var mnt home proc tmpfs

4.4、获取系统依赖库:

注意此步骤获取的是SDK开发包中对应的交叉编译工具链目录下的lib目录下的so库。如果用错了系统依赖的库,会导致只有BusyBox编译出来的命令可以正常运行,而你自己的用户态程序运行时报错:Input/Output error

4.5、获取其它工具:

一般SDK中会包含有除busybox以外的公用应用工具如udev、用户层调用的驱动接口工具等,如海思的himountbtools等。这些工具可以在SDK包中找到相应对应源码,根据说明文档进行交叉编译之后得到可执行的bin文件,拷贝到rootfs/bin/目录下即可。

4.6添加系统运行所需要的模块驱动

SDK开发包中找到应用示例目录,如samples,其中包含有系统各个常用模块的驱动,把这些文件拷贝到rootfs/lib/modules/目录下即可。

4.7、获取用户程序运行所依赖的库:

SDK开发包中找到应用示例目录,如samples,其中包含有用户态程序运行时所依赖的动态库文件,把这些文件拷贝到rootfs/usr/lib/目录下即可。

4.8生成根文件系统镜像:

cd ../

mkfs.jffs2 -d ./rootfs -l -e 0x10000 -o rootfs_64k.jffs2

到此,就生成了一个初级的rootfs.jffs2根文件系统镜像文件了。


补充说明:

嵌入式常用文件系统如:SquashFSJFFS2NFSYAFFS2

各自特点:

SquahFSJFFS2具有良好的空间特性,很适合作嵌入式文件系统。

SquahFS为只读文件系统。

JFFS2为可读可写的文件系统。

NFS文件系统适合于开发初期的调试阶段。

YAFFS2文件系统只适用于NAND Flash

 

4.9、烧录根文件系统rootfs.jffs2SPI Flash中:

sf probe 0 //对 SPI Flash 进行初始化设置

sf erase 0x400000 0xc00000 //首先擦除 FLASH 的文件系统分区,从0x400000地址开始,擦除大小为0xc00000(12M)

mw.b 0x82000000 0xff 0xc00000

tftp 0x82000000 rootfs_64k.jffs2 //将 rootfs_64k.jffs2 文件下载到内存0x82000000

sf write 0x82000000 0x400000 0xc00000 //把文件系统从内存写入SPI FLASH0x400000地址起始处,大小为0xc00000(12M) 

reset //重启

如果各步骤制作的镜像没有问题,至此重启后,设备即会进入到自己制作的文件系统中。

以上生成的根文件系统是一个裸的文件系统,没有做相应功能的部署。

如果要对文件系统部署,可以根据实际需求来灵活修改/etc/init.d/rcS/etc/init.d/目录下的脚本文件,在此暂不作讨论。




管理员
2018-07-03 08:26:33     打赏
2楼

谢谢楼主分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]