まえがき
本記事では /dev/shm
と /tmp
の使い方や役割について調べてわかったことをご紹介。ディストリビューションによって扱われ方がそれぞれ微妙に違いがあるらしいが本稿執筆にあたっては Arch Linux をつかっている。
まずは /dev/shm
/tmp
両方に使われている tmpfs
ファイルシステムについて解説。
tmpfs とは
tmpfs
は「temporary file storage」の略で多くの UNIX ライクなシステムにおいて利用できる仮想的な一時ファイルシステムだ。主にメインメモリにキャッシュなどを一時保存するのに用いられる。キャッシュファイルを HDD や SSD などの補助記憶装置に保存せずに利用する場合に使われることが多い。
tmpfs
は ramfs
の派生で容量の制限とスワップ領域への書き込みできる能力を追加されたものである。スワップ領域を使いたくない場合は ramfs
でマウントするという選択肢があるがバッキングストア(予備領域)なしで物理メモリを一杯になるまで書き込み続けるという割と危険なファイルシステムなので root のみがアクセスできるように制限すべき。
繰り返しになるが tmpfs
は厳密には RAM ディスクではなくファイルシステムである。デバイス扱いの RAM ディスクは予めフォーマットや確保する領域を予約しなければならないが、tmpfs
はファイルシステムなのでフォーマットする必要がなく利用した分だけ領域を占領する。書き込みデータが確保されているメモリ容量を超えてしまったときはスワップ領域に書き込まれる。
マウントされているデバイスとファイルシステムを調べる
システムファイルおよびマウントされているデバイスなどを調べたい場合は df
コマンドを使う。-h
オプションを付与することで単位を読みやすく表示させることができる。
# df -h | grep tmpfs
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 16G 431M 16G 3% /dev/shm
tmpfs 6.3G 9.6M 6.3G 1% /run
tmpfs 16G 121M 16G 1% /tmp
tmpfs 3.2G 144K 3.2G 1% /run/user/1000
/dev/shm
、/run
、/tmp
、/run/user/1000
と本システムでは4つの領域が tmpfs
ファイルシステムでマウントされていることがわかる。
近年、これらのマウントポイントは systemd によってすべて管理されているので /etc/fstab
には記述されていない。なので混乱を覚えることがあるかもしれない。
以下のコマンドで /tmp のマウントサービスの状態を確認することができる。
# systemctl status tmp.mount
![](https://slacknotebook.com/wp-content/uploads/2023/11/systemctl-status-tmp.mount-min.png)
/tmp
/tmp
は FHS(Filesystem Hierarchy Standard、ファイルシステム・ヒエラルキー・スタンダード、ファイルシステム階層標準)で一時ファイルの保管場所として定められたディレクトリ。 tmpfs
ファイルシステムでフォーマットされていることがほとんど。 システムを再起動すると消去されるためログファイルなどは tmpfs
ではない /var/tmp
に格納されるのが一般的。
また常時稼働させている状態でもいつの間にか中身が削除されていることがある。これはsystemd
やcron
のスケジューラによって一定時間以上アクセスがなかったファイルを削除するスクリプトが実行されるからだ。 ディストリビューションによって違いがあるが10日程度で削除される。
以下は筆者のシステムの /tmp
ディレクトリ内のファイル。
![](https://slacknotebook.com/wp-content/uploads/2021/07/ls_-alh_tmp-min.png)
/var/tmp
/var/tmp
は tmpfs
ファイルシステムでフォーマットされておらず再起動しても削除されることはないためログファイルなどが保管される。
/tmp
と同様 cron
スケジューラや systemd
によって削除するタイマーが設けられており、30日間と長めに設定されていることが多い。
/dev/shm
/dev/shm
は POSIX ライブラリなどが POSIX API を提供するための共有メモリ領域である。アプリケーション間の効率的なデータを受け渡しを担っている。 POSIX 共有メモリは shm_open
経由で作られたセグメントを利用し /dev/shm
下で運用される。
こちらも tmpfs
ファイルシステムを利用していることが多い。
比較的サイズの小さな常に書き換えられているようなファイルのバッファーなどを目的としているディレクトリ。 nosuid
と noexec
マウントオプションでマウントされていることがほとんどなので実行ファイルの使用も不可。
ユーザが任意のファイルを突っ込んだり一時ファイルを保管することを意図したディレクトリではないようだ。しかし明確に使ってはいけないという理由がないため RAM ディスク代わりに使う人はいる。海外のフォーラムではこの使用方法に否定的なコメントが目立つ。
私の環境では何もいじっていない状態で以下のようなファイルが生成されていた。
![](https://slacknotebook.com/wp-content/uploads/2021/07/ls_-alh-dev-shm-min.png)
PulseAudio と Steam の共有オブジェクトがあるのがわかるがそれ以外は読みとることができなかった。
まとめ
私の調べた感じだと /dev/shm
と /tmp
両方好きに使ってもあまり支障がないように思える。両方とも tmpfs
ファイルシステムが使われているため性質上の違いはないだろう。
しかし /tmp
ディレクトリのほうが雑多なデータを格納することを前提に作られたものだということがわかった。 /dev/shm
を使いたい明確な理由がなければとりあえず /tmp
を使ったほうが良さそうだ。
/tmp
ディレクトリ内のファイルを定期的に削除させなくする設定というのが結構出回っているが、迂闊に設定しないのが吉だと考える。システムを圧迫する原因になりうる。それよりも削除したくないデータをアプリケーション側で出力先を変更したり定期的なバックアップスクリプトを走らせたほうが良い。
![](https://slacknotebook.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
- 参考サイト
コメント