Linux : /dev/shmと/tmpの違いと役割

Linux
この記事は約6分で読めます。

本記事では /dev/shm/tmp の使い方や役割について調べてわかったことをご紹介。ディストリビューションによって扱われ方がそれぞれ微妙に違いがあるらしいが本稿執筆にあたってはArch Linuxをつかっている。

まずは /dev/shm /tmp 両方に使われている tmpfs ファイルシステムについて解説。

tmpfs とは

tmpfsは「temporary file storage」の略で多くのUNIXライクなシステムにおいて利用できる仮想的な一時ファイルシステムだ。主にメインメモリにキャッシュなどを一時保存するのに用いられる。キャッシュファイルをHDDやSSDなどの補助記憶装置に保存せずに利用する場合に使われることが多い。

tmpfsramfs の派生で容量の制限とスワップ領域への書き込みできる能力を追加されたものである。スワップ領域を使いたくない場合はramfs でマウントするという選択肢があるがバッキングストア(予備領域)なしで物理メモリを一杯になるまで書き込み続けるという割と危険なファイルシステムなので root のみがアクセスできるように制限すべき。

繰り返しになるが tmpfs は厳密にはRAMディスクではなくファイルシステムである。デバイス扱いのRAMディスクは予めフォーマットや確保する領域を予約しなければならないが、tmpfsはファイルシステムなのでフォーマットする必要がなく利用した分だけ領域を占領する。書き込みデータが確保されているメモリ容量を超えてしまったときはスワップ領域に書き込まれる。

マウントされているデバイスとファイルシステムを調べる

システムファイルおよびマウントされているデバイスなどを調べたい場合は df コマンドを使う。-h オプションを付与することで単位を読みやすく表示させることができる。

# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
dev               16G     0   16G    0% /dev
run               16G  1.5M   16G    1% /run
/dev/nvme0n1p2   468G   88G  356G   20% /
tmpfs             16G  408M   16G    3% /dev/shm
tmpfs             16G   28M   16G    1% /tmp
/dev/nvme0n1p1  1022M   96M  927M   10% /boot
tmpfs            3.2G  100K  3.2G    1% /run/user/1000

/dev/shm/tmp/run/user/1000 と本システムでは3つの領域が tmpfs ファイルシステムでマウントされていることがわかる。

/tmp

/tmp はFHS(Filesystem Hierarchy Standard、ファイルシステム・ヒエラルキー・スタンダード、ファイルシステム階層標準)で一時ファイルの保管場所として定められたディレクトリ。 tmpfs ファイルシステムでフォーマットされていることがほとんど。 システムを再起動すると消去されるためログファイルなどは tmpfs ではない /var/tmp に格納されるのが一般的。

また常時稼働させている状態でもいつの間にか削除されていることがある。これはsystemdcronのスケジューラによって一定時間以上アクセスがなかったファイルを削除するスクリプトが実行されるからだ。 ディストリビューションによって違いがあるが10日程度で削除される。

以下は筆者のシステムの /tmp ディレクトリ内のファイル。

/var/tmp

/var/tmptmpfs ファイルシステムでフォーマットされておらず再起動しても削除されることはないためログファイルなどが保管されるている。 /tmp と同様cronスケジューラやsystemdによって削除するタイマーが設けられており、30日間と長めに設定されていることが多い。

/dev/shm

/dev/shm はPOSIXライブラリなどがPOSIX APIを提供するための共有メモリ領域である。アプリケーション間の効率的なデータを受け渡しを担っている。POSIX共有メモリは shm_open 経由で作られたセグメントを利用し /dev/shm 下で運用される。

こちらも tmpfs ファイルシステムを利用していることが多い。 /dev/shmsystemdによって管理されているので /etc/fstab には表示されない。このため混乱を覚えることがあるかもしれない。

比較的サイズの小さな常に書き換えられているようなファイルのバッファーなどを目的としているディレクトリ。 nosuidnoexec マウントオプションでマウントされていることがほとんどなので実行ファイルの使用も不可。

ユーザが任意のファイルを突っ込んだり一時ファイルを保管することを意図したディレクトリではないようだ。しかし明確に使ってはいけないという理由がないためRAMディスク代わりに使う人はいる。海外のフォーラムではこの使用方法に否定的なコメントが目立つ。

私の環境では何もいじっていない状態で以下のようなファイルが生成されていた。

PulseAudioとSteamの共有オブジェクトがあるのがわかるがそれ以外は読みとることができなかった。

まとめ

私の調べた感じだと /dev/shm/tmp 両方好きに使ってもあまり支障がないように思える。両方とも tmpfs ファイルシステムが使われているため性質上の違いはないだろう。

しかし /tmp ディレクトリのほうが雑多なデータを格納することを前提に作られたものだということがわかった。 /dev/shm を使いたい明確な理由がなければとりあえず /tmp を使ったほうが良さそうだ。

/tmp ディレクトリ内のファイルを定期的に削除させなくする設定というのが結構出回っているが、迂闊に設定しないのが吉だと考える。システムを圧迫する原因になりうる。それよりも削除したくないデータをアプリケーション側で出力先を変更したり定期的なバックアップスクリプトを走らせたほうが良い。

参考サイト

Photo by Charlie Belvin Designs on StockSnap

コメント

タイトルとURLをコピーしました