fs之创建文件系统
总览
本文使用 linux-2.6.22.6 内核, 使用jz2440开发板.
要构建一个最小的linux根文件系统
dev/console
, linux内核的标准IO接口dev/null
, 相当于一个NULL文件- init进程, 即
bin/busybox
etc/inittab
配置文件, (可以省略, busybox会调用其默认值)- 配置文件里指定的应用程序或脚本, 如
/etc/init.d/rcS
bin/sh
- C语言库
lib/
在 fs之Busybox的编译与使用 一文中,
已经将busybox安装到指定目录 ~/jz2440/fs_first/
,
接下来, 基于此目录, 继续完善嵌入式linux的最小文件系统
创建 dev/console
dev/null
文件
dev/console
用于标准输入输出dev/null
空设备, 用于丢弃不需要的输出流, 或提供空输入.
# pwd = ~/jz2440/fs_first/ |
创建 etc/inittab
文件
etc/inittab
供busybox初始化时调用的配置文件
# pwd = ~/jz2440/fs_first/ |
安装C库
务必使用 gcc-3.4.5-glibc-2.3.6
这个版本的C库
在 嵌入式linux环境搭建3-Ubuntu16.04 中,
已经将这个库安装到了 /usr/local/
目录下.
$ cd /usr/local/gcc-3.4.5-glibc-2.3.6/arm-linux/lib |
制作并烧录yaffs2映像文件
直接说结论, 一般文件系统都会放到 nand flash 里,
所以会使用 mkyaffs2image 工具将目录文件生成为 yaffs2 格式文件系统,
最后烧录进 nand flash 的 root 分区即可.
linux下的大多数工具都需要下载源码再自己编译, 譬如这里的 mkyaffs2image.
对于这类软件的安装, 我一般归到环境搭建里面去.
可以参考 嵌嵌入式linux环境搭建3-Ubuntu16.04
flash和文件系统比较
- jffs2: Journalling Flash FileSystem V2
- 主要用于NOR FLASH, 基于MTD驱动层.
- 缺点是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢
- jffs不适合用于NAND闪存
- yaffs: Yet Another Flash File System
- 针对NAND FLASH而设计的一种日志型文件系统. 直接提供了API对FLASH进行操作.
- 与jffs2相比, 减少了数据压缩等功能, 所以速度更快, 挂载时间更短, 内存占用较小.
- yaffs 仅支持小页(512 Bytes), yaffs2 可支持大页(2KB)的NAND闪存. yaffs2也优化了性能.
- 大多数情况, 嵌入式系统推荐使用 yaffs2
- Cramfs: Compressed ROM File System
- 一种只读的压缩文件系统。它也基于MTD驱动程序.
- 按页单独压缩, 可以随机页访问. 高压缩比, 可节省Flash空间.
- 速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性.
- NOR FLASH vs NAND FLASH
NOR FLASH | NAND FLASH |
---|---|
接口时序同SRAM,易使用 | 地址/数据线复用,数据位较窄 |
读取速度较快 | 读取速度较慢 |
擦除速度慢,以64-128KB的块为单位 | 擦除速度快,以8-32KB的块为单位 |
写入速度慢 | 写入速度快 |
随机存取速度较快,支持XIP(eXecute In Place,芯片内执行),适用于代码存储。在嵌入式系统中,常用于存放引导程序、根文件系统等。 | 顺序读取速度较快,随机存取速度慢,适用于数据存储(如大容量的多媒体应用)。在嵌入式系统中,常用于存放用户文件系统等。 |
单片容量较小,1-32MB | 单片容量较大,8-128MB,提高了单元密度 |
最大擦写次数10万次 | 最大擦写次数100万次 |
制作yaffs2映像文件
$ cd ~/jz2440/ |
烧录yaffs2映像文件
# 开发板 uboot |
进一步完善linux根文件系统
上面只是完成了linux文件系统的基础功能.
要实现更高级的功能, 我们需要更为复杂全面的文件系统.
创建 proc
文件
proc目录即process的简写, 可以让ps指令查看linux的进程.
知道 /proc
的基本作用和使用方法以后, 我们需要把这些功能整合到文件系统里面.
为了循序渐进的说明, 下面展示了三种方法, 常用的就是第三种.
开发板人工实现
# 开发板终端 |
~~集成到文件系统, 直接 mount ~~
# Linux主机, Ubuntu终端 |
集成到文件系统, 使用 mount -a
一般的, linux需要mount多个文件, 因此使用更为通用的 mount -a
指令,
然后去读取 /etc/fstab
文件内的配置项.
# Linux主机, Ubuntu终端 |
此时. 可以使用 mkyaffs2image 生成镜像文件并烧录, 测试一下.
fstab文件的简单说明
- dev, 要挂接的设备
- 譬如:
/dev/hd2
/dev/mtdblock1
- 对于 proc, 直接忽略此字段. 可以是任意值
- 对于NFS文件系统, 此字段为
<host>:<dir>
- 譬如:
- mount-point, 挂载点, 即一个目录文件
- type, 文件系统类型
- 如 jffs, yaffs, ext2, nfs
- 也可以是auto, 对DVD, usb等设备会非常有用
- proc, tmpfs 等是特殊的文件类型, 都有特定功能.
- options, 挂接参数.
- 一般用 defaults 就行
- 参考fstab (简体中文)
- dump和fsck, 文件系统的备份和检查
- 嵌入式系统一般都禁用, 设置为0
使用 mdev 自动生成文件
udev是Linux的设备管理器。它主要的功能是管理/dev目录底下的设备节点
busybox提供了udev的简化版本mdev, 其作用是在系统启动或动态加载驱动时, 自动生成节点文件.
在busybox源码里, 可以找到 busybox-1.7.0\docs\mdev.txt
. 关键步骤如下:
mount -t sysfs sysfs /sys
echo /bin/mdev > /proc/sys/kernel/hotplug
mdev -s
mount -t tmpfs mdev /dev
mkdir /dev/pts
mount -t devpts devpts /dev/pts
由于我们使用的是 mount -a
, 因此具体步骤稍有修改
# Linux主机, Ubuntu终端 |
完成烧录后, 使用 ls /dev
, 就会看到自动生成了非常多的设备文件.
至此, 一个最小linux文件系统制作完成了.
制作 jffs2 映像文件
jffs2 是一个压缩的文件系统, 所以体积几乎比yaffs2小一半.
多用于 NOR FLASH
生成 jffs2 工具
# mtd-utils-05.07.23.tar.bz2 可生成jffs2工具 |
制作 jffs2 映像文件
$ cd ~/jz2440/ |
至此, jffs2 格式的映像文件制作完成.
烧录 jffs2 映像文件
# 开发板 uboot |
参考资料
- 嵌入式系统文件系统比较 jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs (转)
- Cramfs、JFFS2、YAFFS2的全面对比
- fstab (简体中文)
原创于 DRA&PHO