Linux常用文件系统概述-RAM篇

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.  
  22. Writing inode tables: done 
  23. Writing superblocks and filesystem accounting information: done
  24.  
  25. This filesystem will be automatically checked every 36 mounts or
  26. 180 days, whichever comes first. Use tune2fs -or -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.  
  3. # Housekeeping...clean before img
  4. rm -/tmp/ramdisk.img
  5.  
  6. # Ramdisk Constants
  7. # 80M = 80 * 1024 * 1024
  8. RDSIZE=8192
  9. BLKSIZE=1024
  10.  
  11. # Create an empty ramdisk image
  12. dd if=/dev/zero of=/tmp/ramdisk.img bs=$BLKSIZE count=$RDSIZE
  13.  
  14. # Make it an ext2 mountable file system
  15. /sbin/mke2fs --m 0 -b $BLKSIZE /tmp/ramdisk.img $RDSIZE
  16.  
  17. # Mount it so that we can populate
  18. mkdir -p /mnt/ramdisk
  19. mount /tmp/ramdisk.img /mnt/ramdisk -t ext2 -loop
  20.  
  21. # Populate the filesystem (subdirectories)
  22. cp -ar ./rootfs/* /mnt/ramdisk/
  23.  
  24. mkdir -p /mnt/ramdisk/sys
  25. mkdir -p /mnt/ramdisk/proc
  26. mkdir -p /mnt/ramdisk/var
  27. mkdir -p /mnt/ramdisk/tmp
  28. mkdir -p /mnt/ramdisk/mnt
  29. mkdir -p /mnt/ramdisk/dev
  30.  
  31. # Finish up...
  32. umount /mnt/ramdisk
  33. cp /tmp/ramdisk.img ./
  34. rm -fr /mnt/ramdisk

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

 

  1. #mount ramdisk.img /mnt/ -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 -/var/tmp
  9. #mkdri -/var/log
  10. #ln -/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系统开发技术详解》杨水清等

Tachyon是一个分布式内存文件系统,可以在集群里以访问内存的速度来访问存在tachyon里的文件。把Tachyon是架构在最底层的分布式文件存储和上层的各种计算框架之间的一种中间件。主要职责是将那些不需要落地到DFS里的文件,落地到分布式内存文件系统中,来达到共享内存,从而提高效率。同时可以减少内存冗余,GC时间等。        特性:类 Java 的文件 API兼容性:实现 Hadoop 文件系统接口可插入式的底层文件系统内建 Raw 原生表的支持基于 Web 的 UI 提供命令行接口Tachyon 架构:与 HDFS 的比较:        Hadoop足够快吗?美国加州大学伯克利分校的AMPLab基于Hadoop的核心组件开发出一个更快的版本Tachyon。AMPLab从底层重建了Hadoop平台,“没有最快,只有更快”。        AMPLab在大数据领域最知名的产品是Spark,它是一个内存中并行处理的框架,Spark的创造者声称:使用Shark运行并行处理Job速度要比MapReduce快100倍。又因为Spark是在内存运行,所以Shark可与Druid或者SAP's HANA系统一较高下。Spark也为ClearStory下一代分析和可视化服务提供处理引擎。如果你喜欢用Hive作为Hadoop的数据仓库,那么你一定会喜欢Shark,因为它代表了“Hive on Spark”。       AMPLab的最新目标就是Hadoop分布式文件系统(HDFS),不过HDFS在可用性和速度方面一直受人诟病,所以AMPLab创建了Tachyon( 在High Scalability上非常夺目,引起了Derrick Harris的注意)。       当然,AMPLab并不是第一个对HDFS提出质疑的组织,同时也有很多商业版本可供选择,像Quantcast就自己开发了开源文件系统,声称其在运行大规模文件系统时速度更快、更高效。诚然,AMPLab所做的工作就是打破现有商业软件的瓶颈限制。如果碰巧破坏了现状,那么就顺其自然吧!不过,对于用户来说,AMPLab只是为那些寻找合适工具的人员提供了一种新的选择,AMPLab的合作伙伴和赞助商包括谷歌,Facebook,微软和亚马逊网络服务,它们当然非常乐意看到这些新技术,如果很有必要的话。       AMPLab的其他项目包括PIQL,类似于一种基于键/值存储的SQL查询语言;MLBase,基于分布式系统的机器学习系统;Akaros,一个多核和大型SMP系统的操作系统;Sparrow,一个低延迟计算集群调度系统。Tachyon可运行在如下任意平台上: 标签:分布式  文件系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值