【FreeBSD】/tmpをRAMに割り当てたい(tmpfs)

確認環境

PC Thinkpad X1 Carbon 2nd Gen
OS FreeBSD 12.1-RELEASE-p5

課題

こちらの記事/tmpディレクトリ配下のファイルを自動で削除する方法を調べた。

しかし、そもそも/tmpをRAMに割り当ててしまえば、シャットダウン時に勝手にファイルは消える。
ついでに高速化にもストレージの延命にもつながって、お得ではなかろうか。

ということで、やってみよう。

対策

RAMに割り当てるには、デバイスにtmpfsを指定すればいいっぽい。

ざっくりやることは下になる。

  1. 現在の/tmpのマウント設定確認 (df -h)
  2. tmpfsの有効化 (/boot/loader.conf or options TMPFS)
  3. tmpfsを/tmpにマウント (/etc/fstab)
  4. ZFSのマウント設定 (zfs set mountpoint=/tmp.old /zroot/tmp)

1. 現在の/tmpのマウント設定確認

下のコマンドで現在の/tmpのマウント設定を確認してみよう。
例では、/zroot/tmp/tmpにマウントされていることが分かる。

% df -h /tmp
Filesystem            Size    Used   Avail Capacity  Mounted on
zroot/tmp             188G    144K    188G     0%    /tmp

2. tmpfsの有効化

GENERICカーネルならtmpfsは有効になっているはず。

念のため、下のようにtmpfsをロードして有効になっているか確認しよう。
「既に読み込んでいるよ」という旨のメッセージが出れば問題ない。

$ sudo kldload tmpfs
kldload: can't load tmpfs: module already loaded or in kernel

何もメッセージが出なかった場合は、/boot/loader.confに以下の追記が必要。

tmpfs_load="YES"

もしくは、カーネルビルド時にoptions TMPFSを設定してビルドする。

3. tmpfsを/tmpにマウント

お試し

以下のコマンドで、一時的にtmpfs/tmpにマウントできる。
/tmpを使うソフトは挙動がおかしくなるので注意。

$ mount -t tmpfs tmpfs /tmp
$ df -h /tmp
Filesystem    Size    Used   Avail Capacity  Mounted on
tmpfs         8.8G    4.0K    8.8G     0%    /tmp

僕のシステムでは自動だとサイズは8.8Gになった。
PCのメモリサイズは8Gのはずなのだけれども。。

永続化

/etc/fstabに以下の行を追加しよう。
sizeの値は各自環境に合わせて変更してね。

tmpfs            /tmp    tmpfs   rw,mode=1777,size=4.0G  0   0

僕はメモリサイズの半分で十分だと思ったので4.0Gにした。これでもかなり大きい。
ただ、tmpfsは動的にメモリを確保・解放するっぽい。
フルで使うことはないと思うので、PCのメモリサイズを指定しておけばいいのかも。

PC再起動後、下のようにtmpfsがマウントされていれば問題ない。

$ df -h /tmp
Filesystem    Size    Used   Avail Capacity  Mounted on
tmpfs         4.0G    4.0K    4.0G     0%    /tmp

ZFSを使っていると、下のように元々のデバイス(下の例ではzroot/tmp)が/tmpにマウントされているかもしれない。

$ df -h /tmp
Filesystem            Size    Used   Avail Capacity  Mounted on
zroot/tmp             188G    144K    188G     0%    /tmp

きっと下のように/tmpが2箇所でマウントされていて、元々のデバイスが後からマウントされているはず。
その場合、次節のZFSの設定も必要。

$ df -h
zroot/ROOT/default    202G     14G    188G     7%    /
devfs                 1.0K    1.0K      0B   100%    /dev
tmpfs                 4.0G    4.0K    4.0G     0%    /tmp
zroot                 188G     88K    188G     0%    /zroot
zroot/var/log         188G    1.2M    188G     0%    /var/log
zroot/usr/home        197G    8.7G    188G     4%    /usr/home
zroot/tmp             188G    144K    188G     0%    /tmp
zroot/var/crash       188G     88K    188G     0%    /var/crash
zroot/var/audit       188G     88K    188G     0%    /var/audit
zroot/var/tmp         188G     88K    188G     0%    /var/tmp
zroot/var/mail        188G    112K    188G     0%    /var/mail
zroot/usr/src         189G    711M    188G     0%    /usr/src
zroot/usr/ports       190G    1.3G    188G     1%    /usr/ports

4. ZFSのマウント設定

下のコマンドで、元々のデバイスを別のディレクトリに割り当てよう。
ディレクトリ(/tmp.old)とデバイス名(zroot/tmp)は各自の環境に合わせて変更してね。

$ sudo umount -f /tmp
$ sudo zfs set mountpoint=/tmp.old zroot/tmp
$ zfs list zroot/tmp
NAME        USED  AVAIL  REFER  MOUNTPOINT
zroot/tmp   144K   188G   144K  /tmp.org

/tmpを一度アンマウントしているのは、zfs setでビジーエラーが出たときの力技。

無事に設定が終わったら、再起動後にtmpfs/tmpに自動でマウントされていることを確認しよう。

$ df -h /tmp
Filesystem    Size    Used   Avail Capacity  Mounted on
tmpfs         4.0G    4.0K    4.0G     0%    /tmp

さいごに

Windowsと違ってRAM化がウルトラ楽ですな。

もし/tmp以外にもRAMに割り当てたいパスがある場合、同じような感じで設定すればOK。
シャットダウン時に消えて問題ないものは、どんどんRAM化して良いかと。

今回の設定前後でパフォーマンスを測っていないので、どれくらい高速化できているかは分からない。
HDDだったらもっと体感で分かるんだろうけど。

ただ、/tmpを頻繁に使うツールは自作のシェルスクリプトを含めてたくさんある。
きっとストレージには優しくなったと思う。



以上。

参考