tmpfs
tmpfs はメモリやスワップパーティションに存在する一時ファイルシステムです。ディレクトリを tmpfs としてマウントすることでファイルへのアクセスを高速化させたり、再起動時に自動的に中身が消去されるようにすることができます。
使用方法
tmpfs(5) が使われる主なディレクトリは /tmp, /var/lock, /var/run です。tmpfs を /var/tmp で使ってはいけません。このフォルダは、再起動しても消えない一時ファイルを置くところだからです。
glibc 2.2 以上では tmpfs は POSIX shared memory の /dev/shm
にマウントされることになっています。/dev/shm
への tmpfs のマウントは systemd によって自動的に行われるため、fstab における手動設定は必要なくなりました。
Arch は tmpfs の /run
ディレクトリを使っており、/var/run
と /var/lock
は互換性維持のため単なるシンボリックリンクとして存在しています。また、systemd のデフォルト設定で /tmp
で使用されるため、特別な設定が必要ないかぎり fstab にエントリを記述する必要はありません。
一般的に、tmpfs フォルダを使う意味があるのは、読み書き操作を頻繁に実行するような I/O の処理が重い作業やプログラムです。アプリケーションによっては、部分的な (または全ての) データを共有メモリにオフロードすることで体感することができるほどの変化が現れることもあります。例えば、Firefox のプロファイルを RAM に再配置するとパフォーマンスが著しく上昇します。
サンプル
デフォルトでは、tmpfs パーティションの最大容量は合計 RAM の半分に設定されていますが、この値はカスタマイズすることができます。
最大容量を明示的に設定するために、以下の例ではデフォルトの /tmp
マウントを上書きして、size
マウントオプションを使っています:
/etc/fstab
tmpfs /tmp tmpfs rw,nodev,nosuid,size=2G 0 0
以下はユーザーに tmpfs マウントを追加する、より高度な例です。ウェブサイトや mysql の一時ファイル、~/.vim/
などで有用です。設定する前にマウントオプションをよく確かめて下さい。悪用を防止するためにできる限りセキュリティを高めるべきです。容量を制限したり、uid と gid のモードを指定すると良いでしょう。詳しくは、#参照セクションのリンクを見て下さい。
/etc/fstab
tmpfs /www/cache tmpfs rw,size=1G,nr_inodes=5k,noexec,nodev,nosuid,uid=user,gid=group,mode=1700 0 0
詳細は tmpfs(5) man ページおよび セキュリティ#ファイルシステム に載っています。
変更を適用するには再起動してください。mount -a
と実行するだけで変更が即座に適用できるかに思われるかもしれませんが、これではディレクトリ内に存在する既存のファイルにアクセスできなくなってしまいます (特にロックファイルを使用するプログラムを実行している場合は危険です)。ただし、ディレクトリの中身が全て空なのであれば、再起動する代わりに mount -a
を実行しても問題ありません (もしくは個別にマウントを実行してもよい)。
変更の適用後、findmnt
を使って /proc/mounts
を見ることで効果が現れているかどうか確認することができます:
$ findmnt /tmp
TARGET SOURCE FSTYPE OPTIONS /tmp tmpfs tmpfs rw,nosuid,nodev,relatime
また、tmpfs は再起動せずとも一時的にサイズを変更することが可能です。いますぐ巨大なコンパイルを行う必要があるときなどに有用です。その場合、以下を実行します:
# mount -o remount,size=4G,noatime /tmp
自動マウントの無効化
systemd 下では、/etc/fstab
にエントリを記述してなくても /tmp
は自動的に tmpfs としてマウントされます。自動マウントを無効にするには、tmp.mount
systemd ユニットをマスクしてください。
ファイルは tmpfs ではなく、ブロックデバイスに保存されるようになります。/tmp
の中身は再起動しても消去されないようになるので、問題が起こる可能性があります。前の挙動に戻して再起動で /tmp
フォルダが自動的に消去されるようにするには、以下の tmpfiles.d(5) を使ってください:
/etc/tmpfiles.d/tmp.conf
# see tmpfiles.d(5) # always enable /tmp folder cleaning D! /tmp 1777 root root 0 # remove files in /var/tmp older than 10 days D /var/tmp 1777 root root 10d # namespace mountpoints (PrivateTmp=yes) are excluded from removal x /tmp/systemd-private-* x /var/tmp/systemd-private-* X /tmp/systemd-private-*/tmp X /var/tmp/systemd-private-*/tmp
トラブルシューティング
root で tmpfs のシンボリックリンクを開けない
/tmp
は tmpfs を使っているので、カレントディレクトリを /tmp
に変更してから、ファイルを作成して、同じ /tmp
ディレクトリの中にファイルのシンボリックリンクを作成してみて下さい。シンボリックリンクを使って作成したファイルを開こうとすると、パーミッションエラーが表示されるはずです。/tmp
には スティッキービット が設定されているためにこうなります。
この挙動は /proc/sys/fs/protected_symlinks
や sysctl で変更できます: sysctl -w fs.protected_symlinks=0
。設定を永続化させる方法は Sysctl#設定 を見て下さい。