Hi3516A开发--根文件系统

下面的指令  注意检查 - ,应该为英文的,而不是中文的。

例如: mkfs.jffs2 –d ./rootbox -l –e 0x20000 -o jffs2-root.img

应为 -d,而非 –d ,不再一一改了,请注意!!

一、根文件系统简介

Linux 的目录结构的最顶层是一个被称为“ /”的根目录。系统加载 Linux 内核之后,就会挂载一个设备到根目录上。存在于这个设备中的文件系统被称为根文件系统。所有的系统命令、系统配置以及其他文件系统的挂载点都位于这个根文件系统中。根文件系统通常存放于内存和 Flash 中,或是基于网络的文件系统。根文件系统中存放了嵌入式系统使用的所有应用程序、库以及其他需要用到的服务。 下图列出了根文件系统的顶层目录。

Hi3516A开发--根文件系统_第1张图片

通用的 Linux 系统的根文件系统中会包括根文件系统顶层目录结构图中所有的目录,不过在嵌入式系统中,需要精简根文件系统。部分可以被忽略的目录如表 4-1 所示。表4-1 嵌入式系统中可忽略的目录说明

Hi3516A开发--根文件系统_第2张图片

在SDK软件包内带有rootfs_uclibc根文件系统


在SDK软件包imge_ulibc目录下有各种类型根文件镜像


二、利用busybox制作根文件系统

利用 busybox 制作根文件系统需要先获取 busybox 源代码,然后配置、编译和安装busybox,操作成功后开始制作根文件系统。

1、获取 busybox 源代码
成功安装 SDK 后, busybox 完整源代码就存放在 /osdrv/opensource/busybox/目录中。要获取 busybox 源代码也可以从网站 http://www.busybox.net 下载。

2、配置 busybox

A、进入 busybox 所在目录,进行配置操作需要输入如下命令:

cd osdrv/opensource/busybox/busybox-1.20.2

cp config_v300_soft .config



B、执行 make menuconfig
busybox 的配置界面和内核配置相似,其功能选项容易理解,可以根据自己的需求选择配置。在 Busybox Settings ---> Build Options 中注意下面两个选项:
[*]Build BusyBox as a static binary (no shared libs)
[*] Build with Large File Support (for accessing files > 2 GB)
(arm-hisiv300-linux-) Cross Compiler prefix
() Path to sysroot
(-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4) Additional CFLAGS
(-mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4) Additional
LDFLAGS
() Additional LDLIBS
其中:
 第一个选项选择是否把 busybox 编译成静态链接的可执行文件。如果选择该选项,编译出来的 busybox 就是静态链接的,运行时不依赖于动态库,但体积较大;清除该选项将得到动态链接的 busybox,体积较小,但需要动态库的支持。
第二个选项是用于选择 SDK 推荐的交叉编译器,配置好后保存并退出。欲了解 busybox 各选项含义请参考 busybox 配置帮助。

Hi3516A开发--根文件系统_第3张图片Hi3516A开发--根文件系统_第4张图片


C、进入Makefile 修改

vi Makefile

164 CROSS_COMPILE ?= arm-hisiv300-linux-
190 ARCH ?= arm 

3、编译和安装 busybox

编译和安装 busybox 的具体操作如下:
hisilicon$ make
hisilicon$ make install
编译并安装成功后,在 busybox 目录下的_install 目录下生成以下目录及文件:
drwxr-xr-x 2 lnan lnan 4096 2014-05-23 14:37 bin
lrwxrwxrwx 1 lnan lnan 11 2014-05-23 14:37 linuxrc -> bin/busybox
drwxr-xr-x 2 lnan lnan 4096 2014-05-23 14:37 sbin
drwxr-xr-x 4 lnan lnan 4096 2014-05-23 14:37 usr


4、制作根文件系统
用户如有需要可在 busybox 的基础上制作根文件系统,制作根文件系统的具体操作步骤如下:
步骤 1. 

mkdir rootbox
cd rootbox
cp ../busybox-1.20.2/_install/. ./ -frd
mkdir etc dev lib tmp var mnt home proc

步骤 2. 

配置 etc、 lib、 dev 目录的必需文件。

A、etc 目录可参考系统/etc 下的文件。其中最主要的文件包括 inittab、 fstab、 init.d/rcS文件等,这些文件最好从 busybox 的 examples 目录下拷贝过来,根据需要自行修改。

B、dev 目录下的设备文件,可以直接从系统中拷贝过来或者使用 mknod 命令生成需要的设备文件。拷贝文件时请使用 cp –R file,例如:

在dev目录下创建两个设备文件  
sudo mknod dev/console c 5 1
sudo mknod dev/null c 1 3
sudo chmod 666 dev/console
sudo chmod 666 dev/null

C、 lib 目录是存放应用程序所需要的库文件,请根据应用程序需要拷贝相应的库文件。

完成以上两个步骤,一个完整的根文件系统就生成了。
说明:
SDK 软件包中已经包括配置好的完整的根文件系统,如果无特别需求,可直接使用。要添加自己开发的应用程序,只需将应用程序和相应的库文件拷贝到根文件系统的对应目录即可。

三、文件系统简介
嵌入式系统中常用文件系统包括有 cramfs、 JFFS2、 NFS、 initrd、 yaffs2 以及squashfs。它们的特点如下:
cramfs 和 JFFS2 具有好的空间特性,很适合嵌入式产品应用。
cramfs 与 squashfs 为只读文件系统。
squashfs 压缩率最高。
JFFS2 为可读写文件系统。
NFS 文件系统适用于开发初期的调试阶段。
yaffs2 文件系统只用于 NAND Flash。
initrd 采用 cramfs 文件系统,为只读。

在/osdrv/tools/pc目录下有各种文件系统镜像生成工具。通过make编译可生成。
cramfs_tool  jffs2_tool  lzma_tool  mkimage_tool  mkyaffs2image  nand_production  

squashfs4.2  ubifs_config  uboot_tools  zlib

注意:下面制作镜像时需要将镜像工具放在/usr/bin目录下,并给以权限,否则会出现“找不到命令”。

1、cramfs

cramfs 是针对 Linux 内核 2.4 之后的版本所设计的一种新型文件系统,使用简单,加载容易,速度快。
cramfs 的优缺点如下:
优点:
将文件数据以压缩形式存储,在需要运行时进行解压缩,能节省 Flash 存储空间。
缺点:
由于它存储的文件是压缩的格式,所以文件系统不能直接在 Flash 上运行。同时,文件系统运行时需要解压数据并拷贝至内存中,在一定程度上降低读取效率。另外 cramfs 文件系统是只读的。如果想要在单板运行的 Linux 中提供 cramfs 的能力,必须要在编译内核时把 cramfs 的选项加入。在 make menuconfig 后,进入“ File>systems”,选择“ miscellaneous filesystems”,最后选中其中的“ Compressed ROM file system support”( SDK 里提供的内核默认已经选择了该文件系统的支持)。
mkfs.cramfs 是用来制作 cramfs 文件系统映象的工具。通过这个工具处理已经制作好的根文件系统,就可以生成 cramfs 文件系统的映象(这类似于我们把光盘制作成 ISO 文件映像)。具体操作如下所示:

hisilicon$mkfs.cramfs ./rootbox ./cramfs-root.img
其中, rootbox 是之前已经制作好的根文件系统, cramfs-root.img 是生成的 cramfs 文件系统映像文件。

2、JFFS2

JFFS2 是 RedHat 的 David Woodhouse 在 JFFS 基础上改进的文件系统,是用于微型嵌入式设备的原始闪存芯片的实际文件系统。 JFFS2 文件系统是日志结构化的可读写的文件系统。
JFFS2 的优缺点如下:
优点:
使用了压缩的文件格式。最重要的特性是可读写操作。
缺点:
JFFS2 文件系统挂载时需要扫描整个 JFFS2 文件系统,因此当 JFFS2 文件系统分区增大时,挂载时间也会相应的变长。使用 JFFS2 格式可能带来少量的 Flash 空间的浪费。这主要是由于日志文件的过度开销和用于回收系统的无用存储单元,浪费的空间大小大致是若干个数据段。 JFFS2 的另一缺点是当文件系统已满或接近满时, JFFS2 运行速度会迅速降低。这是因为垃圾收集的问题。
加载 JFFS2 文件系统时的步骤如下:
步骤 1. 扫描整个芯片,对日志节点进行校验,并且将日志节点全部装入内存缓存。
步骤 2. 对所有日志节点进行整理,抽取有效的节点并整理出文件目录信息。
步骤 3. 找出文件系统中无效节点并且将它们删除。
步骤 4. 最后整理内存中的信息,将加载到缓存中的无效节点释放。

由此可以看出虽然这样能有效地提高系统的可靠性,但是在一定程度上降低了系统的速度。尤其对于较大的闪存芯片,加载过程会更慢。为了使内核支持 JFFS2 文件系统,必须在编译内核时把 JFFS2 的选项加入(我们发布的内核默认已经加入了支持)。在 make menuconfig 后,进入“ File>systems”,选择“ miscellaneous filesystems”,最后选中其中的“ Journalling Flash File System v2 (JFFS2) support”选项( SDK 里面提供的内核默认已经选择了该文件系统的支持)。

JFFS2 的制作方法为:
hisilicon$mkfs.jffs2 –d ./rootbox -l –e 0x20000 -o jffs2-root.img
其中, mkfs.jffs2 工具可以从互联网中下载,也可以在 SDK 包中找到。 rootbox 为之前已经制作好的根文件系统。参数说明如表 4-2 所示。

spi flash使用jffs2格式的镜像,制作jffs2镜像时,需要用到spi flash的块大小。这些信息会在uboot启动时会打印出来。建议使用时先直接运行mkfs.jffs2工具,根据打印信息填写相关参数。下面以块大小为256KB为例:
osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc -l -e 0x40000 -o osdrv/pub/rootfs_uclibc_256k.jffs2
或者
osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_glibc -l -e 0x40000 -o osdrv/pub/rootfs_glibc_256k.jffs2

参数           

      说明                                        

d

指定根文件系统

i

Little-endian小端模式

e

Flash的块大小

o

输出映像文件


问题1:在编译mkfs.jffs2 时出现如下错误:

compr_zlib.c:39:18: fatal error: zlib.h: 没有那个文件或目录

解决方法: sudo apt-get install zlib1g-dev:

3、yaffs2
yaffs2 是专门为 NAND Flash 设计的嵌入式文件系统。它是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外掉电对文件系统一致性和完整性的影响。
yaffs2 的优缺点如下:
优点:
专门针对 NAND Flash,软件结构得到优化,速度快。使用硬件的 spare area 区域存储文件组织信息,启动时只需扫描组织信息,启动比较快。采用多策略垃圾回收算法,能够提高垃圾回收的效率和公平性,达到损耗平衡的目的。
缺点:
没有采用压缩的文件格式。当包含的内容相同时, yaffs2 镜像文件要比 jffs2 镜像文件大。yaffs2 文件系统在 SDK 中作为一个模块提供。只需在 yaffs2 代码中的 Makefile 中加入所依赖的内核代码路径,进行编译,即可生成 yaffs2 文件系统模块。

yaffs2 镜像文件的制作和 cramfs 相同,即通过工具制作,只需简单的几个参数,具体如下:
hisilicon$ mkyaffs2image ./rootbox yaffs2-root.img pagesize ecctype

其中, rootbox 是之前已经制作好的根文件系统, yaffs2-root.img 是生成的 yaffs2 文件系统镜像文件, pagesize 是单板上焊接 NAND Flash 器件的页大小, ecctype 是单板上焊接 NAND Flash 器件的 ecc 类型。

nand flash使用yaffs2格式的镜像,制作yaffs2镜像时,需要用到nand flash的pagesize和ecc。这些信息会在uboot启动时会打印出来。建议使用时先直接运行mkyaffs2image工具,根据打印信息填写相关参数。下面以2KB pagesize、4bit ecc为例:
osdrv/pub/bin/pc/mkyaffs2image610 osdrv/pub/rootfs_uclibc osdrv/pub/rootfs_uclibc_2k_4bit.yaffs2 1 2
或者
osdrv/pub/bin/pc/mkyaffs2image610 osdrv/pub/rootfs_glibc osdrv/pub/rootfs_glibc_2k_4bit.yaffs2 1 2

Hi3516A开发--根文件系统_第5张图片

4、initrd
initrd 相当于存储介质,它支持的文件系统格式有 ext2、 cramfs 等,因此内核除了支持initrd 之外,还要支持 cramfs 文件系统。内核需要做如下配置, initrd 才可以正常工作:
进入“ Device Drivers->Block devices”,选择支持“ RAM disk support” 和“ InitialRAM disk (initrd) support”。
进入“ File>systems”,选择“ miscellaneous filesystems”,最后选中其中的“ Compressed ROM file system support”。

当前 SDK 中默认选中以上两项。

制作initrd的步骤如下:
步骤 1. 制作 cramfs 镜像文件,具体制作方法请参见“ 4.3.1 cramfs”。
步骤 2. 以步骤 1 制作的镜像文件作为输入,制作 initrd 文件,制作命令为“ mkimage -A arm -T ramdisk -C none -a 0 -e 0 -n cramfs-initrd -d ./cramfs-image cramfs-initrd”。

5、Squashfs
squashfs 文件系统是一套基于 Linux 内核使用的压缩只读文件系统,压缩率高。
squashfs 具有如下特点: 
数据(data),节点(inode)和目录(directories)都被压缩
保存了全部的 32 位 UID/GIDS 和文件的创建时间
最大支持 4G 文件系统
检测并删除重复文件

使用 squashfs 文件系统步骤:
步骤 1. 制作支持 squashfs 的内核镜像。进入 linux-3.4.y 目录下,执行以下命令:
cp arch/arm/configs/hi3516a_mini_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-hisiXXX-linux- menuconfig (保存退出即可)
make ARCH=arm CROSS_COMPILE=arm-hisiXXX-linux- uImage

步骤 2. 制作 squashfs 文件系统镜像。在发布包 SDK/package/osdrv/tools/pc 目录下的
mksquashfs 为制作 squashfs 文件系统工具。使用方法如下:
./mksquashfs rootfs ./ rootfs.squashfs.img -b 64K -comp xz
其中, rootfs 是之前已经制作好的根文件系统, rootfs.squashfs.img 是生成的 squashfs 文件系统映像文件。 -b 64K 指定 squashfs 文件系统的块大小为 64K(决定于实际 spi flash块大小)。 -comp 指定文件系统压缩方式为 xz。请根据实际情况修改参数。

参看:基于 SquashFS 构建 Linux 可读写文件系统

你可能感兴趣的:(Hi3516A开发,Hi3516A开发)