tmpfs

提供: ArchWiki
ナビゲーションに移動 検索に移動

tmpfs はメモリやスワップパーティションに存在する一時ファイルシステムです。ディレクトリを tmpfs としてマウントすることでファイルへのアクセスを高速化させたり、再起動時に自動的に中身が消去されるようにすることができます。

ヒント: systemd を使っている場合、systemd-tmpfiles を使って 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 の半分に設定されていますが、この値はカスタマイズすることができます。

ノート: 実際に使用されるメモリ/スワップは使用する量によって変わり、必要とされるまで tmpfs パーティションはメモリを消費しないので注意してください。

最大容量を明示的に設定するために、以下の例ではデフォルトの /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#設定 を見て下さい。

警告: この挙動を変更するとセキュリティに問題が起こります。無闇に無効化しないでください。

参照