確認環境
| PC | Thinkpad X1 Carbon 2nd Gen |
| OS | FreeBSD 12.1-RELEASE-p5 |
課題
こちらの記事で/tmpディレクトリ配下のファイルを自動で削除する方法を調べた。
しかし、そもそも/tmpをRAMに割り当ててしまえば、シャットダウン時に勝手にファイルは消える。
ついでに高速化にもストレージの延命にもつながって、お得ではなかろうか。
ということで、やってみよう。
対策
RAMに割り当てるには、デバイスにtmpfsを指定すればいいっぽい。
ざっくりやることは下になる。
- 現在の/tmpのマウント設定確認 (
df -h) - tmpfsの有効化 (
/boot/loader.conforoptions TMPFS) - tmpfsを/tmpにマウント (
/etc/fstab) - 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を頻繁に使うツールは自作のシェルスクリプトを含めてたくさんある。
きっとストレージには優しくなったと思う。
以上。