tmpfs を活用する(Ubuntu 上)
ユースケース: 実メモリに余裕がある状況で、`/tmp` のような一時的な作業領域(システム再起動時にファイルが消えても問題ない領域)を高速化したい場合。tmpfsはデータをディスクではなくメモリ上に直接配置するため、ディスクI/Oが発生せず、ファイルアクセスが非常に高速になります。
前準備
Ubuntu のシステム更新
作業前に、システムを最新の状態にしておくことを推奨します。これにより、セキュリティパッチが適用され、システムの安定性が向上します。 Ubuntu で OS のシステム更新を行うときは, 次のコマンドを実行します。
sudo apt -y update
sudo apt -yV upgrade
sudo /sbin/shutdown -r now
mergerfs のインストール
mergerfsは、複数のディレクトリやファイルシステムを透過的に束ね、単一のディレクトリとしてマウントするためのツールです。今回はtmpfsとディスク上のディレクトリを統合するために使用します。 Ubuntu での mergerfs のインストールは,別ページで説明しています。
tmpfs と mergerfs の設定手順
ここでは、tmpfsを作成し、mergerfsを使って既存の `/tmp` ディレクトリと統合する具体的な設定手順を説明します。
tmpfs の設定
実メモリを特定のディレクトリにマウントします。 その結果,そのディレクトリに配置したファイルは,ディスクではなくメモリ上に直接格納されるようになります。 ただし、tmpfs上のデータはシステムの再起動により消去されるため注意が必要です。
設定内容例:
- サイズ: 4000 m
- マウント先: /tmpfs
1. マウント先ディレクトリの作成と権限設定
次のコマンドを実行し、マウントポイントとなるディレクトリを作成します。
sudo mkdir /tmpfs
作成したディレクトリに適切な権限を設定します。一時ファイル用ディレクトリとして、全ユーザーが書き込める一方、他ユーザーが作成したファイルを削除できないようにスティッキービット (`1777`) を設定するのが一般的です。
sudo chmod 1777 /tmpfs
【注意】 chmod 777
は、全てのユーザーに読み書き実行の全権限を与えてしまい、セキュリティリスクを高めるため、通常は避けるべき設定です。用途に応じて適切な権限を設定してください。
2. /etc/fstab への追記
システムの起動時に自動的にtmpfsをマウントするため、`/etc/fstab` に以下の行を追加します。エディタ(例: `sudo nano /etc/fstab`)でファイルを開き、末尾に追記してください。
tmpfs /tmpfs tmpfs defaults,allow_other,noatime,size=4000m 0 0
オプションの主な意味:
tmpfs
: ファイルシステムの種類。/tmpfs
: マウントポイント。tmpfs
: マウントするファイルシステムのタイプ。defaults
: 標準的なマウントオプション群 (`rw`, `suid`, `dev`, `exec`, `auto`, `nouser`, `async`) を適用します。allow_other
: root以外のユーザーもこのファイルシステムへのアクセスを許可します。FUSEファイルシステム(mergerfsなど)で一般ユーザーからのアクセスを許可する場合に必要ですが、セキュリティポリシーを考慮して設定してください。noatime
: ファイルアクセス時刻(atime)の更新を抑制し、パフォーマンスを向上させます。size=4000m
: tmpfsが使用できるメモリの最大サイズを指定します(この例では4000MB)。物理メモリとスワップの合計を超えるサイズは指定できません。0 0
: dumpコマンドの対象外、起動時のfsckチェック対象外を示します。
設定を反映させるには、以下のコマンドでマウントを実行するか、システムを再起動します。
sudo mount /tmpfs
3. tmpfs 設定の確認
`/tmpfs` が指定したサイズで正しくマウントされていることを確認します。`-h` オプションを使用すると、容量が人間にとって読みやすい形式(例: GB、MB)で表示されます。
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
作成したディレクトリに適切な権限を設定します。`/tmp` と同様の用途で使うことを想定し、ここでもスティッキービット (`1777`) を設定します。
sudo chmod 1777 /var/tmp/tmp
【注意】 ここでも chmod 777
はセキュリティリスクがあるため、推奨されません。
2. /etc/fstab への追記
mergerfsを使って `/tmpfs` と `/var/tmp/tmp` を統合し、`/tmp` としてマウントするため、`/etc/fstab` に以下の行を追加します。
/tmpfs:/var/tmp/tmp /tmp fuse.mergerfs defaults,allow_other,use_ino,nonempty,minfreespace=100M,moveonenospc=true 0 0
オプションの主な意味:
/tmpfs:/var/tmp/tmp
: 統合するソースディレクトリを `:` で区切って指定します。先に記述された `/tmpfs` が優先されます。/tmp
: マウントポイント。fuse.mergerfs
: ファイルシステムの種類。defaults
: 標準的なマウントオプション群。allow_other
: root以外のユーザーもアクセスできるようにします。`/tmp` は通常全ユーザーが利用するため、このオプションが必要です。use_ino
: mergerfsがinode番号を生成するようにします。互換性のために推奨されます。nonempty
: マウントポイント (`/tmp`) が空でなくてもマウントを許可します。既存の `/tmp` ディレクトリにマウントする場合に必要です。minfreespace=100M
: 書き込み先の空き容量が指定値(この例では100MB)未満になった場合、その書き込み先を選択肢から除外します。moveonenospc=true
: ファイル書き込み中に空き容量が不足した場合、他の空き容量があるソースディレクトリへファイルを移動しようと試みます。0 0
: dump/fsck対象外。
【重要】 この設定を有効にする前に、既存の `/tmp` ディレクトリ内に必要なファイルがないことを確認してください。必要であればバックアップを取得してください。設定を反映させるには、システムを再起動するか、以下のコマンドを実行します(既存の `/tmp` を利用しているサービスがあれば、一時的に停止することが望ましい場合があります)。
sudo mount /tmp
3. mergerfs 設定の確認
`/tmp` が mergerfs によって正しく管理され、統合されたソースディレクトリの合計容量に近いサイズとして認識されていることを確認します。
df -h /tmp
まとめと注意点
この記事では、Ubuntu環境でtmpfsとmergerfsを活用し、一時ファイル用ディレクトリ `/tmp` を高速化する手順を解説しました。
利用上の重要な注意点:
- データの揮発性: tmpfs上のデータはメモリ上にのみ存在するため、システムの再起動やシャットダウンで完全に消去されます。永続的な保存が必要なデータには絶対に使用しないでください。
- メモリ消費: tmpfsは実メモリを直接消費します。確保するサイズは、システムの搭載メモリ量や他のアプリケーションの使用状況を十分に考慮して慎重に決定してください。メモリが不足すると、システムのパフォーマンス低下や不安定化につながる可能性があります。
これらの特性を理解した上で、一時ファイルの高速な読み書きが求められる場面でtmpfsの活用を検討してください。