把内存当硬盘用: tmpfs & ramfs & ramdisk

把内存当硬盘用: tmpfs & ramfs & ramdisk

一.tmpfs
某天我学了个“奇巧淫技”:在/etc/fstab 里加上一句none  /tmp  tmpfs   defaults 0 0,重起之后/tmp就在内存里了,因为/tmp放的是临时文件,这样每次关机就清空,又减少硬盘读写,而且读写又快,多好。

tmpfs是相当强大,它的空间能动态调整(但是大小不能超过上限),往里面塞文件它就变大,删文件就会变小。
看我往里面塞个1G的文件:
dd if=/dev/zero of=/tmp/bigfile count=1000000 bs=1024

内存里有1352M的cache(原来是300多M的)。
可以试下复制/dev/urandom而不是/dev/zero,再开个top,就能看cache慢慢增加了,可以看出tmpfs在cache里。
当内存不够用的时侯,就动用交换分区(swap)了,这可是影响性能的。

还有个方法是用mount挂载。
先建个文件夹吧,我在我家建了个.tmp_ram
mkdir ~/.tmp_ram
然后就是mount了
sudo mount -t tmpfs -o size=256M tmpfs ~/.tmp_ram
size指定的是能用的内存的上限。
这样,向~/.tmp_ram里写的文件其实都在内存而不是硬盘。

突然想到一个很好的用处,那就是把chrome的cache放内存了。
sudo mount -t tmpfs -o size=384M tmpfs ~/.cache/google-chrome
去掉sudo然后加到/etc/rc.local,那样每次开机就自动挂载。(要改成绝对路径,谢谢红联的相思爱文指出)
(其实这样没次都清空cache也有点影响上网的体验的,不过我还是喜欢保护硬盘,节省空间...)

二.ramfs
ramfs能实现类似的功能:
sudo mount -t ramfs -o size=256m ramfs ~/.tmp_ram
如果你往里面塞超过mount时设置的上限的文件,它不会提示空间不足,相反它突破你设的上限,动态增大了。而且ramfs不会用swap。

三. ramdisk
有没发现在/dev里面有ram0、ram1等等ramN设备文件,这就是ramdisk。
ramdisk和ramfs的差别之一是ramdisk的大小是固定的(通常只有10几M的大小,编译内核时设定的),可以在系统启动的时候用命令行参数调整。
要用ramdisk要先在/dev/ramN里建文件系统:(我这里用ext2)
sudo mke2fs -m 0 /dev/ram0
然后是挂载:
sudo mount /dev/ram0 ~/.tmp_ram

四.参考
linux kernel的文档:
tmpfs : http://lxr.linux.no/linux+v2.6.37.3/Documentation/filesystems/tmpfs.txt
ramfs : http://lxr.linux.no/linux+v2.6.37.3/Documentation/filesystems/ramfs-rootfs-initramfs.txt
ramdisk: http://lxr.linux.no/linux+v2.6.37.3/Documentation/blockdev/ramdisk.txt

WU.题外八卦:神奇的dd & mount & loopback device
dd 可以用来复制文件,把一个分区复制到另一个分区或者文件,把一个文件的一部分复制到其他地方等等。
dd if=/dev/cdrom  of=~/mycd bs=2048 conv=sync
这样就把整张cd拷成一个通常说的iso,只是我用的文件名没加.iso。
有iso那怎样打开?用mount就可以了。

mount是用来挂载文件系统的,这文件系统不一定就是硬盘分区的那几个,cd的文件系统就是iso 9660。
sudo mount ~/mycd /media/cdrom
这样打开/media/cdrom就是打开了这个iso。(/media/cdrom只是例子,挂载到其他地方也可以)
简直就是虚拟光驱。

dd if=/dev/zero of=~/myfs count=10000
mkfs. ext3 ~/myfs
sudo mount -o loop ~/myfs  /media/cdrom
首先用dd从/dev/zero复制了5.1M到~/myfs这个文件,也就是说myfs这个文件是5.1M大小,内容全是0。
然后用mkfs.ext2在这个文件上建了个ext2文件系统,挂载到/media/cdrom。
这样读写/media/cdrom其实是读写myfs这个文件。
然后你又可以在里面再建文件系统,再挂载到其他地方,很好玩。
而且如果你想验证一下这文件系统的结构是不是和书上说的一样(开头几个字节放什么、怎样放数据之类的),直接用编辑器打开myfs这个文件就可以了,而且linux支持很多文件系统。(看源码更好?)
loopback device就是一个虚拟的设备,能让一个文件通过块设备(硬盘就是块设备的一种)的方式读写。
loopback还跟网络有关,扯远了。

猜你喜欢

转载自iintothewind.iteye.com/blog/1834991