http://blog.chinaunix.net/uid-25272011-id-3250053.html

前面提到的文件系统都是基于Flash存储器的,而本文介绍的这些文件系统都是利用RAM来作为他们的存储空间。它们共同的优点都是读写的速度非常快(因为是在内存中读写),而缺点也很明显,就是当系统复位之后会丢失所有数据。

二、基于RAM的文件系统

1、Ramdisk文件系统

Ramdisk是将一部分固定大小的内存当做分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。

A、特点

a. 将一些经常访问但不会修改的文件通过ramdisk放入内存,可明显提高系统的性能;

b. 和CRAMFS、JFFS2相比,压缩率不高,占用资源多;

c. 存取速度快;

d. 只读文件系统,掉电数据丢失。

B、创建方法

a. 内核起来之后创建和挂载方式

  1. 查看系统可用的ramdisk
  2. #ls -al /dev/ram*
  3. 内核将ramdisk作为一个设备文件来管理,未格式化之前还不占用内存空间
  4. #mke2fs /dev/ram0
  5. 这个命令就格式化了一个ramdisk,出现以下提示:
  6. mke2fs 1.41.12 (17-May-2010)
  7. Filesystem label=
  8. OS type: Linux
  9. Block size=1024 (log=0)
  10. Fragment size=1024 (log=0)
  11. Stride=0 blocks, Stripe width=0 blocks
  12. 16384 inodes, 65536 blocks
  13. 3276 blocks (5.00%) reserved for the super user
  14. First data block=1
  15. Maximum filesystem blocks=67108864
  16. 8 block groups
  17. 8192 blocks per group, 8192 fragments per group
  18. 2048 inodes per group
  19. Superblock backups stored on blocks:
  20. 8193, 24577, 40961, 57345
  21. Writing inode tables: done
  22. Writing superblocks and filesystem accounting information: done
  23. This filesystem will be automatically checked every 36 mounts or
  24. 180 days, whichever comes first. Use tune2fs -c or -i to override.
  1. 加载ramdisk
  1. #mkdir /mnt/ramdisk
  1. #mount /dev/ram0 /mnt/ramdisk
  1. 可以查看创建的ramdisk的大小
  1. root@jgf:~/qihuan# df -k /dev/ram0              
      Filesystem           1K-blocks      Used Available Use% Mounted on
      /dev/ram0                63461      1289     58896   3% /mnt/ramdisk
  1. 卸载
  1. #umount /mnt/ramdisk

b. 如何创建ramdisk镜像文件

提供一个脚本用于将准备好的rootfs文件夹创建为ramdisk.img,可在ubuntu上运行,原来还是利用ubuntu的mke2fs命令格式化一块ram,在mount到/mnt下面,再将rootfs拷贝到其中,在拷贝出来便成为了ramdisk.img镜像文件。

make_ramdisk.sh

  1. #!/bin/bash
  2. # Housekeeping...clean before img
  3. rm -f /tmp/ramdisk.img
  4. # Ramdisk Constants
  5. # 80M = 80 * 1024 * 1024
  6. RDSIZE=8192
  7. BLKSIZE=1024
  8. # Create an empty ramdisk image
  9. dd if=/dev/zero of=/tmp/ramdisk.img bs=$BLKSIZE count=$RDSIZE
  10. # Make it an ext2 mountable file system
  11. /sbin/mke2fs -F -m 0 -b $BLKSIZE /tmp/ramdisk.img $RDSIZE
  12. # Mount it so that we can populate
  13. mkdir -p /mnt/ramdisk
  14. mount /tmp/ramdisk.img /mnt/ramdisk -t ext2 -o loop
  15. # Populate the filesystem (subdirectories)
  16. cp -ar ./rootfs/* /mnt/ramdisk/
  17. mkdir -p /mnt/ramdisk/sys
  18. mkdir -p /mnt/ramdisk/proc
  19. mkdir -p /mnt/ramdisk/var
  20. mkdir -p /mnt/ramdisk/tmp
  21. mkdir -p /mnt/ramdisk/mnt
  22. mkdir -p /mnt/ramdisk/dev
  23. # Finish up...
  24. umount /mnt/ramdisk
  25. cp /tmp/ramdisk.img ./
  26. rm -fr /mnt/ramdisk

这时便生成了ramdisk.img,可以在你的ubuntu上挂载试验一下

  1. #mount ramdisk.img /mnt/ -o loop
  2. #ls /mnt
  3. bin etc init lost+found modules proc sys usr dev home lib mnt sbin tmp var

如果实现将其烧写到nand的某个分区中,然后uboot启动的时候,需要一些参数配置,并且需要在读取内核之后紧接着将其也读到内存的相应位置,再启动linux:

  1. define CONFIG_BOOTARGS "root=/dev/ram0 rw console=ttyS0,115200 mem=64mb initrd=0x41000000,0x800000 init=/linuxrc"
  2. define CONFIG_BOOTCOMMAND "mtdparts default; nand read 0x41000000 0xe00000 0x800000; nand read 0x40008000 0x400000 0x300000; bootm 0x40008000;"

当然,在嵌入式中,对于ramdisk的支持需要一些配置,列出:

  1. 1、General setup --->
  2. [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
  3. 2、File systems --->
  4. <*> Second extended fs support
  5. 3、Device Drivers --->
  6. [*] Block devices --->
  7. --- Block devices
  8. <*> Loopback device support
  9. <*> Cryptoloop Support
  10. <*> RAM block device support
  11. (16) Default number of RAM disks
  12. (8192) Default RAM disk size (kbytes)
  13. 说明:1、这里配置的是支持initramfs(只是下面要介绍到的一个重要的文件系统)和ramdisk的支持
  1. 2、ramdisk是基于EXT2的,所以需要支持EXT2,当然,也有EXT3类型的ramdisk
  1. 3、这里可以指定ramdisk的最大空间

2、RamFS和TmpFS文件系统

这两个文件系统(以下简称RamFS)是Linus Torvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,创建时可以指定其最大能使用的内存大小,并且可以读写。

嵌入式Linux中许多的后台守护进程会生成很多的日志消息,还有内核日志记录机制,如syslogd、dmesg和klogd等,会在/var/ 和 /tmp/目录下生成许多的消息。如果这些消息都保存在Flash中,势必极大的消耗Flash的使用寿命,这里最好的方法是使用RamFS。

与传统的ramdisk相比,不同之处在于其不可以格式化,文件系统大小可以动态变化。

 A、挂载方式

  1. #mkdir /mnt/ramfs
  2. #mount -t ramfs none /mnt/ramfs
  3. 注意ramfs没有对应的/dev/设备节点
  4. 默认,ramfs被限制为可以内存大小的一半,也可以通过maxsize(kB单位)
  5. #mount -t ramfs none /mnt/ramfs -o maxsize=2000
  6. 另外,在/etc/rc.d等文件里面会看到这样的内容
  7. #mount -t tmpfs tmpfs /var -o size=512k
  8. #mkdir -p /var/tmp
  9. #mkdri -p /var/log
  10. #ln -s /var/tmp /tmp
  11. 这段命令这/var上创建了ramfs并将其大小限制为512k,同时tmp和log目录成为ramfs的一部分以便在RAM中存储日志消息。
  12. 也可将ramfs的一个项添加到/etc/fstab中,语法为
  13. tmpfs /var tmpfs size=32m 0 0
  14. 这将在/var上挂装一个新的ramfs的文件系统

 3、initramfs文件系统

这个文件系统也是基于ramfs的,不过最大的区别就是,在内核中配置了选项之后,可以将其和内核镜像打包在一起,并支持例如gzip等的压缩,可以进一步的简化uboot的配置和镜像的大小。

内核配置

  1. General setup --->
  2. [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
  3. (../ramdisk/rootfs) Initramfs source file(s)
  4. (0) User ID to map to 0 (user root)
  5. (0) Group ID to map to 0 (group root)
  6. [*] Support initial ramdisks compressed using gzip

对于initramfs,就可以不用在去配置file system下面的那些个文件系统选项,也可以去掉块设备里面列出的关于ramdisk的相关选项。

这里是可以指定你的rootfs的目录的,内核会将其与img镜像编在一起,生成的initramfs根文件系统镜像在Linux源码树的usr目录下。名字叫initramfs_data.cpio.gz,它是gz格式的压缩文件。我的一个6.6M的rootfs和2.5的img,合并之后只有大概5M左右,比较理想。这对于Flash大小敏感的项目来说,是一个很理想的选择。

在作为前期内核调试的时候,这个方法应该是十分实用的,可以不要在去单独编译根文件系统。

具体可以参照http://www.arm9home.net/simple/index.php?t5645.html

相应的在uboot中的配置可以修改为

  1. bootargs=root=/dev/ram0 rw console=ttyS0,115200 mem=64mb
  2. bootcmd=mtdparts default; nand read 0x40008000 0x100000 0x800000; bootm 0x40008000;

这里也就是只要读一个uImage就行了,已经包含了rootfs镜像了。

相关参考:

《ARM嵌入式Linux系统开发技术详解》杨水清等

Linux常用文件系统概述-RAM篇相关推荐

  1. Linux学习——Linux常用文件和目录管理命令(超详细)

    Linux常用文件和目录管理命令 JunLeon--go big or go home 前言: Linux系统文件和目录管理是必须学会的命令,在Linux系统目录中/tmp目录是用来存放临时文件的目录 ...

  2. kali linux 模板文件夹,详解kali linux 常用文件与指令路径

    kali linux 常用文件与指令路径 重启网络 /etc/init.d/networking restart 语言设置文件 /etc/default/locale apt 安装deb保存目录 /v ...

  3. linux有那几种文件类型,Linux常用文件类型有哪些?六大类!

    在学习Linux的过程中,大家会遇到各种各样的问题,比如说:Linux常用文件类型有哪些?我想很多人都不是很了解吧,接下来我们一起来看看吧. Linux的文件没有扩展名,所以Linux下的文件名称和它 ...

  4. Linux常用文件压缩/解压命令格式大全(tar、gzip、bzip2、zip、compress、cpio、compress、dd)建议收藏

    Linux常用文件压缩/解压命令格式大全 1. tar 2. gzip 3. bzip2 4. zip 5. compress 6. cpio 7.dd 1. tar 打包备份后的文件包缀:.tar ...

  5. linux常用命令--开发调试篇

    前言 Linux常用命令中有一些命令可以在开发或调试过程中起到很好的帮助作用,有些可以帮助了解或优化我们的程序,有些可以帮我们定位疑难问题.本文将简单介绍一下这些命令. 转自:https://www. ...

  6. linux常用命令--系统状态篇

    前言 Linux常用命令中,有些命令可以用于查看系统的状态,通过了解系统当前的状态,能够帮助我们更好地维护系统或定位问题.本文就简单介绍一下这些命令. 查看系统运行时间--uptime 有时候我们想知 ...

  7. Linux常用指令学习(篇一):文件处理指令

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.查看Linux版本信息 二.文件处理命令 (一)命令格式与目录处理命令 1.命令格式 2.显示目录文件:ls 3. ...

  8. Linux常用指令学习(篇三):文件搜索命令

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.文件搜索命令:find 1. 根据文件名搜索 -name 2. 指定文件大小搜索 -size 3. 根据所有者搜索 ...

  9. Linux常用指令学习(篇二):权限管理指令

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.改变文件或目录权限:chmod 1. 改变文件权限方法(一) 2. 改变文件权限方法(二)(常用此方法) 3. 改 ...

最新文章

  1. 成功解决TypeError: Object of type 'ndarray' is not JSON serializable
  2. 充分利用移动支付系统的10种方法
  3. 透彻理解RPN: 从候选区域搜索到候选区域提取网络
  4. 我的博客园第一个博客.
  5. webservice 的datetime不能为null_用.net发布一个简单的webservice
  6. [推荐]Windows2003 Server 设置大全(一)
  7. UML学习(一)类图和对象图
  8. 【刨根问底】32位/64位系统、地址总线以及最大内存寻址
  9. Cisco 路由器破解密码
  10. 自己做网站需要考虑的问题
  11. 南通大学计算机专业校区,南通大学计算机科学与技术专业
  12. 网站流量分析的整体思路(大数据)
  13. 安卓开发用什么语言?Jetpack-MVVM-高频提问和解答,Android校招面试指南
  14. 计算机课程教学调查问卷,《初中生信息技术课程学习现状调查问卷》分析报告...
  15. 简单说说我是怎么找回U盘删除的文件
  16. apa引用要在文中吗_APA写作规范究竟有多细节?
  17. python学习第十二天
  18. 安徽省二级计算机试题中VB题库,2010安徽省全国计算机等级考试二级VB最新考试试题库(完整版)...
  19. 请编写CBank类,完成单利和单复利差额的计算
  20. 美团外卖商家版多开工具

热门文章

  1. 路由器端口ipv4通,ipv6不通是什么原因?
  2. mysql修改连接数_修改MYSQL最大连接数的3种方法
  3. 05 | 计算机指令:让我们试试用纸带编程
  4. BIOS加电自检的过程是怎样的
  5. 谷歌广告账号注册很难?请收下这篇谷歌账号注册指南
  6. 2023年商家该如何激活私域社群活跃度,提升转化率复购率?
  7. linux看线程占用率,查看linux线程的CPU占用率
  8. 航班指派问题(matlab)
  9. Clouder—构建企业级数据分析平台-墨羽@袋鼠云
  10. Redis实战案例及问题分析之好友关注功能(关注、共同好友、消息推送)