嵌入式的文件系统

转自

板子的硬件信息: Flash    :8M Byte NOR Flash
                        
SDRAM:32M Byte

板子上电之后,在minicom中运行df, mount. 显示如下:

~ # df -k
Filesystem           1k-blocks      Used     Available    Use%    Mounted on
/dev/rd/0                     7931      5573          1949      74%           /
tmpfs                        14368         0           14368        0%           /dev/shm
/dev/mtdblock/4            768       768              0       100%           /jffs2

~ # mount
/dev/rd/0 on / type ext2 (rw)
none on /dev type devfs (rw)
none on /proc type proc (rw)
tmpfs on /dev/shm type tmpfs (rw)
/dev/mtdblock/4 on /jffs2 type jffs2 (rw)
/dev/mtdblock/5 on /cramfs type cramfs (rw)


rootfs

显然, 挂载到根目录的就是根文件系统了. Linux内核启动完成后, 会逐个挂载文件系统映象文件并做解包的工作. 根文件系统最先被挂载. 有了根文件系统并提供了shell之后. 就可以通过mount来挂载其它FS了.

板子使用ramdisk来做根文件系统, 文件格式为ext2. 回忆一下"
开发板实务3 "中关于ramdisk的部分: 我先在宿主机上将ramdisk.image挂在到主机上的某个目录. 此刻用df命令查看文件系统信息. 和板子中的df的显示比较一下: ramdisk中都有7931个1k的块. 但已使用的1-k block数目是不同的. 这是怎么回事?

如果要向板子的文件系统中添加内容, 不推荐用开发板实务3中介绍的方法, 即不要修改既有的ramdisk, 而是重新创建一个ramdisk. 这样做是为了让映像获得更大的压缩比.

有一点让我不解: /dev/rd/0 这个设备名是何方神圣? rd = RamDisk么? 我查看了2.4内核中的devices.txt文档, 没发现它的信息.

实际上, 内核源码树的Documentation/devices.txt描述的是静态设备的major, minor编号和设备名. 而板子中使用的是devfs文件系统. 它对设备节点的命名和静态设备是不同的.

Linux devfs FAQ中有这样的内容:

RAMDISCS
The RAMDISCS are placed in their own directory, and are named thus:

/dev/rd/{0,1,2,...}

果然, /dev/rd/0就是ramdisk的设备名. 它被挂载到根目录.


tmpfs

1, tmpfs介绍
tmpfs是一个以虚拟内存为基础的文件系统. 这句话有两层含义:

(1) 它以虚拟内存为基础, 所以它不同于ramdisk, ramdisk只能位于ram中, 而tmpfs可能位于交换分区中(Linux 内核的虚拟内存资源同时来源于RAM 和交换分区).
(2) 它是个文件系统, 而不是块设备. 同样和ramdisk比较: ramdisk是个块设备, 需要一个mkfs 之类的命令将个做成某个格式的文件系统才能使用. 而tmpfs是一个文件系统不是块设备. mount它即可使用.

另外, tmpfs的大小不是固定的, 可以被swap. 这都是它区别于ramdisk的优点.

2, 为什么要使用tmpfs
tmpfs被用来作为shm(POSIX共享内存, Posix shared memory): glibc 2.2之后的版本要求tmpfs被挂载到/dev/shm作为shm.  除此之外, 还有许多需要tmpfs的地方.

3, 系统如何支持tmpfs
只需在配置内核时启动对tmpfs的支持: 选中File systems -> Virtural memory file system support(former shm fs).

4, 加载tmpfs
作为文件系统, tmpfs就需要被mount, 它是如何被mount的呢?

先在自己的PC机上试试: 运行df, 看看文件系统信息. 注意挂在到/dev/shm的文件系统.

使用mount命令: 
# mount -t tmpfs -o size=32m tmpfs /dev/shm

它将tmpfs挂载到/dev/shm. 注意, 之前已经有devshm被挂载到/dev/shm上了.  还是照样可以继续挂在tmpfs到/dev/shm上.
实际上, 在相同的挂载点上可以挂载任意数目的文件系统. 就象一个堆栈: 卸载当前的文件系统后, 上一个最近挂载的文件系统就会重新出现.

-o size=<n>m 用以 限定tmpfs可用ram的大小. 如果不使用它, 则tmpfs使用默认的ram大小. 默认是物理内存大小的一半(不包括swap分区).

在开发板的/etc/fstab中有这样的内容:
tmpfs           /dev/shm        tmpfs   defaults        0  0
它等价于:
# mount tmpfs /dev/shm -t tmpfs

这下就豁然开朗了: 板子将tmpfs挂在到/dev/shm. tmpfs使用默认的ram大小: SDRAM的一半(32 / 2 = 16). 也就对应了df命令的输出:
tmpfs                        14368         0           14368        0%           /dev/shm


jffs2, cramfs

"On 26th June 2001, [email protected] released the blkmtd driver to the world. This driver allows you to use any block device as an MTD storage device. The big advantage with doing this is that you can run the JFFS2 filesystem on a block device, and get compression and journalling where you couldn't normally do so."
                                                                               ---- The Intimate Project
 
使用blkmtd驱动, 你能将任意的块设备当作MTD设备使用. 当内核加载blkmtd驱动后, 如果使用的是devfs(开发板正是这样), 那么会在/dev/mtdblock/目录中生成mtd块设备节点.

可以将jffs2, cramfs文件系统挂载到mtd块设备上. 比如:
# mount -t jffs2 /dev/mtdblock/4 /mnt/test

在板子的 /etc/init.d/rcS中有下列挂载命令:
mount -t jffs2 /dev/mtdblock/4 /jffs2
mount -t cramfs /dev/mtdblock/5 /cramfs

/etc/init.d/rcS中的命令显而易见: 将jffs2文件系统(设备节点为/dev/mtdblock/4)挂载到/jffs2目录,  将cramfs文件系统(设备节点为/dev/mtdblock/5)挂载到/cramfs目录.


/dev, /proc

在板子的/etc/fstab文件中, 有下列内容.

none            /proc           proc    defaults        0 0
none            /dev/pts        devpts  mode=0622       0 0
tmpfs           /dev/shm        tmpfs   defaults        0 0

同时, 在/etc/init.d/rcS中有mount -a命令:
/bin/mount -a

mount -a:    Mount all filesystems (of the given types) mentioned in fstab.


参考资料

1, IBM dW上有个文件系统的 专题系列 , 其中有一篇介绍了 tmpfs . 作者是Gentoo的创始人. 该专题中还详述了2.4内核中的devfs技术.

2, 内核源代码中的
Documentation/filesystems/tmpfs.txt文件介绍了tmpfs. 如果你手头没有源代码, 也可以查看 在线版本 .

3,
Linux devfs FAQ

4,
The Intimate Project


你可能感兴趣的:(文件系统)