现在的位置: 首页 > 综合 > 正文

tmpfs和sysfs

2013年05月06日 ⁄ 综合 ⁄ 共 3303字 ⁄ 字号 评论关闭

tmpfs是一种基于内存的文件系统,它和虚拟磁盘ramdisk比较类似像,但不完全相同,和ramdisk一样,tmpfs可以使用RAM,但它也可以使用swap分区来存储。而且传统的ramdisk是个块设备,要用mkfs来格式化它,才能真正地使用它;而tmpfs是一个文件系统,并不是块设备,只是安装它,就可以使用了。tmpfs是最好的基于RAM的文件系统。

tmpfs 和VM(虚拟内存)

Linux内核的虚拟内存资源同时来源于您的RAM和交换分区内核中的VM子系统将这些资源分配到系统中的其它部分,并负责在后台管理这些资源,通常是透明地将RAM页移动到交换分区或从交换分区到RAM页。
tmpfs文件系统需要VM子系统的页面来存储文件。tmpfs自己并不知道这些页面是在交换分区还是在RAM中;做这种决定是VM子系统的工作。tmpfs文件系统所知道的就是它正在使用某种形式的虚拟内存
不同于大多数“标准的”文件系统,如ext3、ReiserFS和其它一些系统,tmpfs并不是存在于一个底层块设备上面。因为tmpfs是直接建立在VM之上的,您用一个简单的mount命令就可以创建tmpfs文件系统了。
# mount tmpfs /mnt/tmpfs -t tmpfs

tmpfs 的优势

动态文件系统大小
/mnt/tmpfs最初会只有很小的空间,但随着文件的复制和创建,tmpfs文件系统驱动程序会分配更多的 VM,并按照需求动态地增加文件系统的空间。而且,当 /mnt/tmpfs 中的文件被删除时,tmpfs 文件系统驱动程序会动态地减小文件系统并释放 VM 资源,这样做可以将 VM 返回到循环当中以供系统中其它部分按需要使用。因为 VM 是宝贵的资源,所以您一定不希望任何东西浪费超出它实际所需的 VM,tmpfs 的好处之一就在于这些都是自动处理的。
速度快
tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的。即使用了一些交换分区,性能仍然是卓越的,当更多空闲的 VM 资源可以使用时,这部分 tmpfs 文件系统会被移动到
RAM 中去。让 VM 子系统自动地移动部分 tmpfs 文件系统到交换分区实际上对性能上是好的,因为这样做可以让 VM 子系统为需要 RAM 的进程释放空间。这一点连同它动态调整大小的能力,比选择使用传统的 RAM 磁盘可以让操作系统有好得多的整体性能和灵活性。

3使用
tmpfs

默认情况下,tmpfs会mount到/dev/shm目录。使用tmpfs,就是说你可以使用这个目录,这个目录就是tmpfs,如你写临时文件到此目录,这些文件实际上是在VM中。
要使用tmpfs,您要在内核配置时,启用“Virtual memory file system support”。
为防止tmpfs使用了全部VM,有时候要限制其大小。要创建一个最大为32 MB的tmpfs文件系统,键入:
# mount tmpfs /dev/shm -t tmpfs -o size=32m
添加到 /etc/fstab,应该是这样:
tmpfs /dev/shm tmpfs size=32m 0 0
sysfs:

sysfs 文件系统

linux2.6内核引入sysfs文件系统,sysfs可以看成与proc,devfs和devpty同类别的文件系统,该文件系统是虚拟的文件系统,可以更方便对系统设备进行管理。它可以产生一个包含所有系统硬件层次视图,与提供进程和状态信息的proc文件系统十分类似。
sysfs把连接在系统上的设备和总线组织成为一个分级的文件,它们可以由用户空间存取,向用户空间导出内核的数据结构以及它们的属性。sysfs的一个目的就是展示设备驱动模型中各组件的层次关系,其顶级目录包括block,bus,drivers,class,power和firmware等.

它把实际连接到系统上的设备和总线组织成一个分级的文件,用户空间的程序同样可以利用这些信息以实现和内核的交互,该文件系统是当前系统上实际设备树的一个直观反应,它是通过kobject子系统来建立这个信息的,当一个kobject被创建的时候,对应的文件和目录也就被创建了,位于 /sys下的相关目录下,既然每个设备在sysfs中都有唯一对应的目录,那么也就可以被用户空间读写了。

你可能根本没有去关心过sysfs文件系统的挂载过程,它是这样被挂载的。
mount -t sysfs sysfs /sys
sysfs是一个特殊文件系统,并没有一个实际存放文件的介质。sysfs的信息来源是kobject层次结构,读一个sysfs文件,就是动态的从kobject结构提取信息,生成文件。重启后里面的信息当然就没了

sysfs文件系统与kobject结构紧密关联,每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。Kobject 是Linux 2.6引入的新的设备管理机制,在内核中由struct kobject表示。通过这个数据结构使所有设备在底层都具有统一的接口,kobject提供基本的对象管理,是构成Linux2.6设备模型的核心结构,Kobject是组成设备模型的基本结构。类似于C++中的基类,它嵌入于更大的对象的对象中,用来描述设备模型的组件。如bus,devices, drivers 等。都是通过kobject连接起来了,形成了一个树状结构。这个树状结构就与/sys向对应。
sysfs就是利用VFS的接口去读写kobject的层次结构,建立起来的文件系统。 kobject的层次结构的注册与注销XX_register()形成的。文件系统是个很模糊广泛的概念, linux把所有的资源都看成是文件,让用户通过一个统一的文件系统操作界面,也就是同一组系统调用,对属于不同文件系统的文件进行操作。这样,就可以对用户程序隐藏各种不同文件系统的实现细节,为用户程序提供了一个统一的,抽象的,虚拟的文件系统界面,这就是所谓"VFS(Virtual Filesystem Switch)"。这个抽象出来的接口就是一组函数操作。
我们要实现一种文件系统就是要实现VFS所定义的一系列接口,file_operations, dentry_operations, inode_operations等,供上层调用。file_operations是描述对每个具体文件的操作方法(如:读,写),dentry_operations结构体指明了VFS所有目录的操作方法, 而inode_operations提供所有结点的操作方法。
举个例子,我们写C程序,open(“hello.c”, O_RDONLY),它通过系统调用的流程是这样的
open() ->       /*用户空间*/
-> 系统调用->    /*通过系统调用,程序进程内核状态*/
sys_open() -> filp_open()-> dentry_open() -> file_operations->open()           /*内核空间*/
不同的文件系统,调用不同的file_operations->open(),在sysfs下就是sysfs_open_file()。
我们使用不同的文件系统,就是将它们各自的文件信息都抽象到dentry和inode中去。这样对于高层来说,我们就可以不关心底层的实现,我们使用的都是一系列标准的函数调用。这就是VFS的精髓,实际上就是面向对象。
注意sysfs是典型的特殊文件。它存储的信息都是由系统动态的生成的,它动态的包含了整个机器的硬件资源情况。从sysfs读写就相当于向 kobject层次结构提取数据。
每当我们新增一个kobject结构的时候,同时会在/sys下创建一个目录。
kobject_add() -> create_dir() -> sysfs_create_dir()
来自百度百科:http://baike.baidu.com/link?url=FWOkyUTRM9MuPi014w2NNupQFUI0nIcH5otcbfQZEkWMqgwDg03RLLn_fKiPCo96g8ZABP9eVZDpWZO-rLU8F_

抱歉!评论已关闭.