Tmpfs and ramfs Raw

How it works
------------

Linux uses **pages** and **dentries** to cache files and directories
(respectively) temporarily in memory to speed things up. When the
[virtual memory subsystem](http://www.redhat.com/magazine/001nov04/features/vm/) 
needs this memory for something else, the caches & dentries are flushed to a
**backing store**. In the interest of brevity, this store is a block
device, like your hard disk.

When you use either `tmpfs` or `ramfs`, *there is no backing store*.
Trippy.

### Differences between `tmpfs` or `ramfs`

Only two major things, really.

1.  **`tmpfs` can use swap** while `ramfs` cannot
2.  **`tmpfs` cannot grow dynamically** while `ramfs` can

Using `tmpfs` or `ramfs`
------------------------

### `tmpfs`

A simple tmpfs mount. This will default to half the size of system
memory:

    mount -t tmpfs tmpfs /tmp

Mount tmpfs, but limit it to 200MB, owned by user `joe` and group
`fisherman`:

    mount -t tmpfs tmpfs /mnt/volatile -o size=200M,uid=12,gid=107

The `man` page also says that you can tweak with block and inode counts
for your mount (`nr_blocks` and `nr_inodes`).

### `ramfs`

A simpler gentleman; no mount options whatsoever:

    mount -t ramfs ramfs /mnt/volatile

Can you free memory after using it?
-----------------------------------

>  With ramfs, there is no backing store.  Files written into ramfs allocate  
>  dentries and page cache as usual, but there's nowhere to write them to.  
>  This means the pages are never marked clean, so they can't be freed by the  
>  VM when it's looking to recycle memory.

I'm *guessing* that this is the case with tmpfs as well. You'll probably
need to reboot the system. However, and to test this, I put two
184,320,000-byte files into `/dev/shm` and played around with them. Here
are some numbers:

    # Before   
    MemTotal:      1026888 kB  
    MemFree:        376068 kB  
    SwapTotal:     2064376 kB  
    SwapFree:      1891908 kB  
      
    # After copying 2x180MB into 502MB tmpfs mount  
    MemTotal:      1026888 kB  
    MemFree:         33672 kB  
    SwapTotal:     2064376 kB  
    SwapFree:      1891908 kB  
      
    # After removing one 180MB file  
    MemTotal:      1026888 kB  
    MemFree:        213364 kB  
    SwapTotal:     2064376 kB  
    SwapFree:      1891908 kB

Observe that swap hasn't changed. I also couldn't get perfect arithmetic
accounting for the free memory, but it seemed close enough. Bottom-line
is that I don't know what to think of this (yet).

`/dev/shm`: A ready `tmpfs` solution
------------------------------------

Look at the output of `df -ah` on most Linux boxes. You'll see the
highlighted:

    Filesystem            Size  Used Avail Use% Mounted on  
    /dev/mapper/VolGroup00-LogVol00  
                           73G  2.8G   66G   5% /  
    proc                     0     0     0   -  /proc  
    sysfs                    0     0     0   -  /sys  
    devpts                   0     0     0   -  /dev/pts  
    /dev/sda1              99M   25M   70M  26% /boot  
    tmpfs                 502M     0  502M   0% /dev/shm
    none                     0     0     0   -  /proc/sys/fs/binfmt_misc  
    sunrpc                   0     0     0   -  /var/lib/nfs/rpc_pipefs  
    /root/tmpfs           191M  176M   15M  93% /root/tmpfs

`/dev/shm` (shm = shared memory) is automatically mounted to occupy half
your physical memory *at most* by default. If you're not happy with
this, go ahead and change it:

    mount -o remount,size=1G /dev/shm

Other Points
------------

*   Don't ever think that merely *mounting* `tmpfs`, `ramfs`, or
    `/dev/shm` will actually reserve (or 'cordon off') memory.
*   In low-memory situations, swap is used as a backing store. This
    means that you're not going to see a huge performance boost with
    `tmpfs`. And I think you'd appreciate a live (albeit sluggish)
    system rather than one that's crashed due to a reckless use of
    `ramfs`. Swings and roundabouts.