Linux内存文件系统

本文介绍了Linux内存文件系统,包括RamDisk的使用(查看、创建、格式化和挂载),ramfs的特性与使用,以及tmpfs的工作原理、特点和应用场景。tmpfs作为内存文件系统,可以使用物理内存或交换分区,其大小根据需求动态调整,并在重启后数据不保留。在Linux中,/dev/shm是一个tmpfs实例,用于提供快速访问的临时存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RamDisk

RamDisk的使用

RamDisk有三种实现方式:
第一种就是传统意义上的,可以格式化,然后加载。 这在Linux内核2.0/2.2就已经支持,其不足之处是大小固定,之后不能改变。为了能够使用Ramdisk,我们在编译内核时须将block device中的Ramdisk支持选上,它下面还有两个选项,一个是设定Ramdisk的大小,默认是4096k;另一个是initrd的支持。
如果对Ramdisk的支持已经编译进内核,我们就可以使用它了。

查看可用的RamDisk

# ll /dev/ram* 
lrwxrwxrwx  1 root root     4 Feb 20 00:49 /dev/ram -> ram1
brw-rw----  1 root disk 1,  0 Apr 27 11:44 /dev/ram0
brw-rw----  1 root disk 1,  1 Feb 20 00:49 /dev/ram1

创建一个目录

# mkdir /mnt/testRamDisk

对/dev/ram0 创建文件系统

# mke2fs /dev/ram0 

挂载/dev/ram0

# mount /dev/ram0 /mnt/testRamDisk      /dev/ram0
# df -h 
Filesystem            Size  Used Avail Use% Mounted on
/dev/ram0              16M  140K   15M   1% /mnt/testRamDisk

然后就可以象对普通硬盘一样对它进行操作了。
另两种则是内核2.4才支持的,通过Ramfs或者Tmpfs来实现:
它们不需经过格式化,用起来灵活,其大小随所需要的空间而增加或减少。

ramfs

Ramfs顾名思义是内存文件系统,它它处于虚拟文件系统(VFS)层,而不像ramdisk那样基于虚拟在内存中的其他文件系统(ex2fs)。 因而,它无需格式化,可以创建多个,只要内存足够,在创建时可以指定其最大能使用的内存大小。

Ramfs的使用

如果你的Linux已经将Ramfs编译进内核,你就可以很容易地使用Ramfs了。创建一个目录,加载Ramfs到该目录即可:

# mkdir  /testRam
# mount -t ramfs none /testRam 
# df -aH #可以看到已经挂载了testRam
Filesystem             Size   Used  Avail Use% Mounted on
none                      0      0      0   -  /testRam

缺省情况下,Ramfs被限制最多可使用内存大小的一半。可以通过maxsize(以kbyte为单位)选项来改变。
# mount -t ramfs none /testRAM -o maxsize=2000 (创建了一个限定最大使用内存为2M的ramdisk)

tmpfs

tmpfs是一种基于内存的文件系统。

tmpfs和VM

tmpfs可以使用物理内存,也可以使用交换分区。在Linux内核中,虚拟内存资源由物理内存(RAM)和交换分区(Swap)组成,这些资源是由内核中的虚拟内存子系统来负责分配和管理。
传统的ramdisk是个块设备,要用mkfs来格式化它,才能真正地使用它;而tmpfs是一个文件系统,并不是块设备,只是安装它,就可以使用了。
tmpfs向虚拟内存子系统请求页来存储文件,它同Linux的其它请求页的部分一样,不知道分配给自己的页是在内存中还是在交换分区中。同Ramfs一样,其大小也不是固定的,而是随着所需要的空间而动态的增减。

tmpfs的特点

1.tmpfs 主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的。
2.动态文件系统的大小。
/mnt/tmpfs最初会只有很小的空间,但随着文件的复制和创建,tmpfs文件系统驱动程序会分配更多的 VM,并按照需求动态地增加文件系统的空间。而且,当 /mnt/tmpfs 中的文件被删除时,tmpfs 文件系统驱动程序会动态地减小文件系统并释放 VM 资源,这样做可以将 VM 返回到循环当中以供系统中其它部分按需要使用。因为 VM 是宝贵的资源,所以您一定不希望任何东西浪费超出它实际所需的 VM,tmpfs 的好处之一就在于这些都是自动处理的。
例如:在linux下,/dev /shm/默认最大为内存的一半大小,使用df -h命令可以看到。但它并不会真正的占用这块内存,如果/dev/shm/下没有任何文件,它占用的内存实际上就是0字节;如果它最大为1G,里头放有 100M文件,那剩余的900M仍然可为其它应用程序所使用,但它所占用的100M内存,是绝不会被系统回收重新划分的。
3.tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载,绑定的操作。

tmpfs的使用

关于/dev/shm

使用tmpfs,首先你编译内核时得选择”虚拟内存文件系统支持(Virtual memory filesystem support)。
默认的Linux发行版中的内核配置都会开启tmpfs,映射到了/dev/下的shm目录。可以通过df 命令查看:

$ df -aT
Filesystem    Type   1K-blocks      Used Available Use% Mounted on
tmpfs                   17G    11M    17G   1% /dev/shm

/dev/shm/是linux下一个非常有用的目录,因为这个目录不在硬盘上,而是在内存里。因此在linux下,就不需要大费周折去建ramdisk,直接使用/dev/shm/就可达到很好的优化效果。该目录的文件系统是tmpfs的,因此这个目录下的文件访问非常快。
/dev/shm默认为一半内存大小。在某些场合可能不够用,并且默认的inode数量很低一般都要调高些,这时可以用mount命令来管理它。
#mount -o size=1500M -o nr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shm
如果需要永久修改/dev/shm的值,需要修改/etc/fstab
tmpfs /dev/shm tmpfs defaults,size=1.5G 0 0
mount -o remount /dev/shm
/dev/shm应用
首先在/dev/shm建个tmp文件夹,然后与实际/tmp绑定

# mkdir /dev/shm/tmp
# chmod 1777 /dev/shm/tmp
# mount –bind /dev/shm/tmp /tmp(–bind )

在使用mount –bind olderdir newerdir命令来挂载一个目录到另一个目录后,newerdir的权限和所有者等所有信息会发生变化。挂载后的目录继承了被挂载目录的所有属性,除了名称。

创建tmpfs

tmpfs并不是存在于一个底层块设备上面。因为tmpfs是直接建立在VM之上的,用一个简单的mount命令就可以创建tmpfs文件系统了。

# mount tmpfs /mnt/tmpfs -t tmpfs
# df -h
Filesystem            Size  Used Avail Use% Mounted on
tmpfs                  24G     0   24G   0% /mnt/tmpfs

为了防止tmpfs使用过多的内存资源而造成系统的性能下降或死机,可以在加载时指定tmpfs文件系统大小的最大限制。
# mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m

注意

ramfs只会在物理内存中被创建,而tmpfs可能在物理内存中创建,也可能在交换分区中被创建。对于想利用内存的高速IO来提高效能的应用,最好是使用ramfs。对于只是想存放临时缓存的应用,最好是用tmpfs,以提前内存的利用率。
但是,对于高负载的服务器,使用内存文件系统实际上得不偿失,在系统内存很快用光的情况下,操作系统将进行磁盘交换,导致系统性能严重下降,这比起直接使用磁盘文件系统更为糟糕。事实上,在高负载的服务器环境下,允许系统使用更多的内存来缓冲磁盘数据,更有效的发挥系统的磁盘缓冲能力,在实际使用中更为有效。

参考资料

1.[http://blog.youkuaiyun.com/gdutliuyun827/article/details/17280069]
2.[http://cryolite.iteye.com/blog/358500]
3.[http://www.vanemery.com/Linux/Ramdisk/ramdisk.html]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值