tmpfs を活用する(Ubuntu 上)
前準備
Ubuntu のシステム更新
作業前に、システムを最新の状態にします。 Ubuntu で OS のシステム更新を行うときは, 次のコマンドを実行します。
# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを包括的に更新 (依存関係も考慮)
sudo apt full-upgrade
# 変更をシステム全体に確実に反映させるために再起動
sudo shutdown -r now
mergerfs のインストール
mergerfs は、複数のディレクトリを束ねて単一のディレクトリとしてマウントするユニオンファイルシステムです。ここでは、メモリ上の tmpfs とディスク上のディレクトリを統合するために使用します。 Ubuntu での mergerfs のインストールは,別ページで説明しています。
tmpfs と mergerfs の設定手順
ここでは、tmpfs を作成し、mergerfs を使ってディスク上のディレクトリと統合して /tmp としてマウントする手順を説明します。tmpfs のみを /tmp にすると、指定したサイズを超える一時ファイルを作成したときに容量不足で失敗しますが、ディスク上のディレクトリと統合することで、この失敗を避けられます。
tmpfs の設定
実メモリを特定のディレクトリにマウントします。 そのディレクトリに配置したファイルは、ディスクではなくメモリ上に格納されます。 tmpfs 上のデータはシステムの再起動により消去されます。
設定内容例:
- サイズ: 4000M
- マウント先: /tmpfs
1. マウント先ディレクトリの作成
次のコマンドを実行し、マウントポイントとなるディレクトリを作成します。
sudo mkdir /tmpfs
2. /etc/fstab への追記
システムの起動時に自動的に tmpfs をマウントするため、/etc/fstab に以下の行を追加します。エディタ(例: sudo nano /etc/fstab)でファイルを開き、末尾に追記します。
tmpfs /tmpfs tmpfs noatime,nosuid,nodev,mode=1777,size=4000M 0 0
各フィールドとオプションの意味:
tmpfs(1番目): マウント元。tmpfs は実体となるデバイスを持たないため、種類名をそのまま記述します。/tmpfs: マウントポイント。tmpfs(3番目): ファイルシステムの種類。noatime: ファイルアクセス時刻(atime)の更新を抑制します。nosuid: set-user-ID ビットを無効にします。一時ファイル領域では有効にする必要がありません。nodev: デバイスファイルの解釈を無効にします。mode=1777: マウント後のディレクトリのアクセス権を指定します。1777 は、全ユーザーが書き込める一方で、他ユーザーが作成したファイルは削除できないスティッキービット付きの設定であり、一時ファイル領域で使われます。size=4000M: tmpfs が使用できる最大サイズ(この例では 4000MB)。size=50%のように実メモリに対する割合でも指定できます。0 0: dump コマンドの対象外、起動時の fsck チェック対象外を示します。
なお、tmpfs では allow_other は使用できません。これは FUSE ファイルシステム(mergerfs など)のオプションです。
設定を反映させるには、以下のコマンドを実行します。
sudo systemctl daemon-reload
sudo mount /tmpfs
3. tmpfs 設定の確認
/tmpfs が指定したサイズで正しくマウントされていることを確認します。-h オプションを使用すると、容量が読みやすい単位(例: G、M)で表示されます。
df -h /tmpfs
mergerfs の設定
設定内容例:
- /tmpfs(メモリ上)と /var/tmp/tmp(ディスク上)を統合し、/tmp としてマウントする
- ファイル作成時は、先に記述した /tmpfs を使用する
- /tmpfs の空き容量が不足した場合に /var/tmp/tmp を使用する
1. フォールバック用ディレクトリの作成と権限設定
tmpfs の容量が不足した場合に使用する、ディスク上のディレクトリを作成します。-p オプションは、親ディレクトリ /var/tmp が存在しない場合でもエラーなく作成するために指定します。
sudo mkdir -p /var/tmp/tmp
作成したディレクトリに、一時ファイル領域として使うためのアクセス権を設定します。1777 は、全ユーザーが書き込める一方で、他ユーザーが作成したファイルは削除できないスティッキービット付きの設定です。
sudo chmod 1777 /var/tmp/tmp
2. /etc/fstab への追記
mergerfs を使って /tmpfs と /var/tmp/tmp を統合し、/tmp としてマウントするため、/etc/fstab に以下の行を追加します。
/tmpfs:/var/tmp/tmp /tmp fuse.mergerfs allow_other,category.create=ff,minfreespace=100M,moveonenospc=true 0 0
各フィールドとオプションの意味:
/tmpfs:/var/tmp/tmp: 統合するディレクトリ(mergerfs ではブランチと呼ぶ)を:で区切って指定します。/tmp: マウントポイント。fuse.mergerfs: ファイルシステムの種類。allow_other: mergerfs を起動したユーザー以外もアクセスできるようにします。/tmpは全ユーザーが利用するため必要です。category.create=ff: ファイル作成先を選ぶポリシーを first found(記述順で最初に見つかったブランチ)にします。mergerfs の既定のポリシーは空き容量に基づいて作成先を選ぶため、先頭の /tmpfs を優先させるにはこの指定が必要です。minfreespace=100M: 空き容量が指定値(この例では 100MB)未満のブランチを、ファイル作成先の候補から除外します。この指定により、/tmpfsの残りが 100MB を切ると/var/tmp/tmpが使われます。moveonenospc=true: ファイル書き込み中に容量不足になった場合、空き容量のある別のブランチへファイルを移動して書き込みを再試行します。0 0: dump/fsck 対象外。
古い解説では use_ino や nonempty というオプションが記載されていることがありますが、現在の mergerfs ではこれらは廃止されており、指定しても動作に影響しません。
【重要】 この設定を有効にする前に、既存の /tmp ディレクトリ内に必要なファイルがないことを確認します。設定を反映させるには、システムを再起動します。
sudo shutdown -r now
3. mergerfs 設定の確認
/tmp が mergerfs によってマウントされ、統合したブランチの合計容量に近いサイズとして認識されていることを確認します。
df -h /tmp
ファイルが tmpfs 側に作成されているかは、/tmp にファイルを作成した後、/tmpfs を直接参照して確認します。
touch /tmp/testfile
ls -l /tmpfs
まとめと注意点
この記事では、Ubuntu 環境で tmpfs と mergerfs を活用し、一時ファイル用ディレクトリ /tmp を高速化する手順を解説しました。
利用上の注意点:
- データの揮発性: tmpfs 上のデータはメモリ上にのみ存在するため、システムの再起動やシャットダウンで消去されます。保存が必要なデータには使用しません。
- メモリ消費: tmpfs は実メモリを消費します。確保するサイズは、搭載メモリ量と他のアプリケーションの使用状況を考慮して決定します。メモリが不足すると、システムの性能低下につながります。
- systemd による既定の /tmp: systemd 256 以降を採用する Ubuntu では、
/tmpは既定で tmpfs としてマウントされます(サイズは実メモリの 50%)。/etc/fstabに/tmpの行を記述すると、そちらの設定が使われます。既定の状態はdf -h /tmpとfindmnt /tmpで確認できます。