[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 | 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

/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 ファイルシステムを利用していることが多い。

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

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

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

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

まとめ

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

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

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

Photo by Charlie Belvin Designs on StockSnap

コメント

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