The distribution is an Ubuntu server running the 2.6.35-30 Linux kernel.
I would like to have a directory that sits completely in memory. Is this possible without root privileges?
Linux provides a tmpfs device which any user can use,
/dev/shm. It is not mounted to a specific directory by default, but you can still use it as one.
Simply create a directory in
/dev/shm and then symlink it to wherever you want. You can give the created directory any permissions you choose, so that other users can't access it.
This is a RAM backed device, so what's there is in memory by default. You can create any directories you need inside
Naturally, files placed here will not survive a reboot, and if your machine starts swapping,
/dev/shm won't help you.
The Solaris parallel to
/tmp which is a "swap" type partition, and also memory based. As with
/dev/shm, arbitrary users may create files in
/tmp on Solaris.
OpenBSD has the capability to use a memory based mount as well, but does not have one available by default. The mount_mfs command is availabe to the super user.
I'm not sure about other *BSDs.
Your system may have one already available; recent Linux systems based on Glibc always have a tmpfs mounted on
If your system doesn't have one or it's too small, then a filesystem not mounted by root pretty much means FUSE. On Ubuntu, you need to be in the
fuse group to use FUSE. Looking through available FUSE filesystems, I see only Ramfuse, which unfortunately is abandoned upstream.
Using /dev/shm is insecure in systems with active swap. Chances are very high your computer has it enabled.
There is a better, secure alternative —
ramfs. You may want to use
ramfs if you plan to use RAM-backed space to temporary store sensitive data, such as private keys, Bitcoin or Ethereum wallets and such.
ramfs is better than
tmpfs when security is concerned, since
ramfs data never gets swapped (saved to a physical storage drive), while
tmpfs may get swapped. Third parties then can inspect the swap space and extract sensitive data.
You can prepare
ramfs mount so any non-privileged user can mount/unmount it on-demand.
To do this, you will need root privilege, once. Ask the administrator of your system to set this up for you, if you lack root privileges.
At first, you need to add a line to the
/etc/fstab. The line in fstab may look like this:
none /mnt/ramfs ramfs noauto,user,size=1024M,mode=0770 0 0
/mnt/ramfsis a mount point, where the ramfs filesystem will be mounted. Directory should exist.
noautooption prevents this to be mounted automatically (e.g. at system's boot up)
usermakes this mountable by regular users
sizesets this "ramdisk's" size
modeis very important, with the octal code
0770only root and user, who mounted this filesystem, will be able to read and write to it, not the others (you may use different code of your choice as well, but be very sure about it)
When this is done, any user will be able to mount this on demand.
Once some user mounts this, new 1024 MB
ramfs filesystem is created and mounted at
/mnt/ramfs/. It will be owned by
root:user. Once he/she unmounts it, or system gets rebooted, the filesystem vanish with all its data. Which is cool.
Also, this filesystem can be mounted by several users independently, but not at the same time, i.e. to be ready for mounting by a next user, previous user should unmount this filesystem.
P.S. If you are trying to
rsync files to the root of the newly mounted/created ramfs as a non-root user, you may face a
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.1] error. This is completely fine and expected, because your user doesn't own the root of the ram filesystem. Solution is simple, just create some directory there,
/mnt/ramfs/copied/ for example, and rsync to it.
In general, no, filesystems can only be mounted by root. If you allow a user to place filesystems arbitrarily, that's essentially giving them root. (Easy way: mount one over /etc, put your own passwd and shadow there, su with the new root password you just created, unmount)
If you want a tmpfs at a particular location, you could add it to
/etc/fstab, with the flags of
noauto,user and then a user would be able to mount it (but its not particularly clear why you wouldn't just auto-mount it)
If users need arbitrary tmpfs's, then you have a couple options:
sudoto allow users to run it. Make sure that you do not allow the user to pick arbitrary paths.