「Tmpfs」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(校正(でき・出来))
 
(4人の利用者による、間の11版が非表示)
1行目: 1行目:
 
{{Lowercase title}}
 
{{Lowercase title}}
 
[[Category:ファイルシステム]]
 
[[Category:ファイルシステム]]
[[en:tmpfs]]
+
[[en:Tmpfs]]
  +
[[es:Tmpfs]]
  +
[[ru:Tmpfs]]
 
[[Wikipedia:Tmpfs|tmpfs]] はメモリやスワップパーティションに存在する一時ファイルシステムです。ディレクトリを tmpfs としてマウントすることでファイルへのアクセスを高速化させたり、再起動時に自動的に中身が消去されるようにすることができます。
 
[[Wikipedia:Tmpfs|tmpfs]] はメモリやスワップパーティションに存在する一時ファイルシステムです。ディレクトリを tmpfs としてマウントすることでファイルへのアクセスを高速化させたり、再起動時に自動的に中身が消去されるようにすることができます。
   
{{Note|[[systemd]] を使っている場合、[[Systemd#一時ファイル|tmpfiles.d]] を使って tmpfs ディレクトリの一時ファイルを起動時に再作成することができます。}}
+
{{Tip|[[systemd]] を使っている場合、[[Systemd#systemd-tmpfiles - 一時ファイル|systemd-tmpfiles]] を使って tmpfs ディレクトリの一時ファイルを起動時に再作成することができます。}}
   
 
== 使用方法 ==
 
== 使用方法 ==
   
tmpfs が使われる主なディレクトリは [http://www.pathname.com/fhs/2.2/fhs-3.15.html /tmp], [http://www.pathname.com/fhs/2.2/fhs-5.9.html /var/lock], [http://www.pathname.com/fhs/2.2/fhs-5.13.html /var/run] です。tmpfs を [http://www.pathname.com/fhs/2.2/fhs-5.15.html /var/tmp] で使ってはいけません。このフォルダは、再起動しても消えない一時ファイルを置くところだからです。
+
{{man|5|tmpfs}} が使われる主なディレクトリは [https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s18.html /tmp], [https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch05s09.html /var/lock], [https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch05s13.html /var/run] です。tmpfs を [https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch05s15.html /var/tmp] で使ってはいけません。このフォルダは、再起動しても消えない一時ファイルを置くところだからです。
   
{{Pkg|glibc}} 2.2 以上では tmpfs は [[wikipedia:ja:共有メモリ#UNIXでのサポート|POSIX shared memory]] の {{ic|/dev/shm}} にマウントされることになっています。{{ic|/dev/shm}} への tmpfs のマウントは [[systemd]] によって自動的に行われるため、[[fstab]] における手動設定は必要なくなりました。
+
{{Pkg|glibc}} 2.2 以上では tmpfs は [[wikipedia:ja:共有メモリ#UNIXでのサポート|POSIX shared memory]] の {{ic|/dev/shm}} にマウントされることになっています。{{ic|/dev/shm}} への tmpfs のマウントは [[systemd]] によって自動的に行われるため、[[fstab]] における手動設定は必要なくなりました。
   
 
Arch は tmpfs の {{ic|/run}} ディレクトリを使っており、{{ic|/var/run}} と {{ic|/var/lock}} は互換性維持のため単なるシンボリックリンクとして存在しています。また、systemd のデフォルト設定で {{ic|/tmp}} で使用されるため、特別な設定が必要ないかぎり [[fstab]] にエントリを記述する必要はありません。
 
Arch は tmpfs の {{ic|/run}} ディレクトリを使っており、{{ic|/var/run}} と {{ic|/var/lock}} は互換性維持のため単なるシンボリックリンクとして存在しています。また、systemd のデフォルト設定で {{ic|/tmp}} で使用されるため、特別な設定が必要ないかぎり [[fstab]] にエントリを記述する必要はありません。
18行目: 20行目:
 
== サンプル ==
 
== サンプル ==
   
デフォルトでは、tmpfs パーティションの最大容量は合計 RAM の半分に設定されていますが、この値はカスタマイズすることができます。実際に使用されるメモリ/スワップは使用する量によって変わり、必要とされるまで tmpfs パーティションはメモリを消費しないので注意してください
+
デフォルトでは、tmpfs パーティションの最大容量は合計 RAM の半分に設定されていますが、この値はカスタマイズすることができます。
  +
  +
{{Note|実際に使用されるメモリ/スワップは使用する量によって変わり、必要とされるまで tmpfs パーティションはメモリを消費しないので注意してください。}}
   
 
最大容量を明示的に設定するために、以下の例ではデフォルトの {{ic|/tmp}} マウントを上書きして、{{ic|size}} マウントオプションを使っています:
 
最大容量を明示的に設定するために、以下の例ではデフォルトの {{ic|/tmp}} マウントを上書きして、{{ic|size}} マウントオプションを使っています:
   
 
{{hc|/etc/fstab|2=
 
{{hc|/etc/fstab|2=
tmpfs /tmp tmpfs nodev,nosuid,size=2G 0 0}}
+
tmpfs /tmp tmpfs rw,nodev,nosuid,size=2G 0 0}}
   
  +
以下はユーザーに tmpfs マウントを追加する、より高度な例です。ウェブサイトや mysql の一時ファイル、{{ic|~/.vim/}} などで有用です。設定する前にマウントオプションをよく確かめて下さい。悪用を防止するためにできる限りセキュリティを高めるべきです。容量を制限したり、uid と gid のモードを指定すると良いでしょう。詳しくは、[[#参照]]セクションのリンクを見て下さい。
Here is a more advanced example showing how to add tmpfs mounts for users. This is useful for websites, mysql tmp files, {{ic|~/.vim/}}, and more. It's important to try and get the ideal mount options for what you are trying to accomplish. The goal is to have as secure settings as possible to prevent abuse. Limiting the size, and specifying uid and gid + mode is very secure. For more information on this subject, follow the links listed in the [[#See also]] section.
 
   
 
{{hc|/etc/fstab|2=
 
{{hc|/etc/fstab|2=
tmpfs /www/cache tmpfs rw,size=1G,nr_inodes=5k,noexec,nodev,nosuid,uid=648,gid=648,mode=1700 0 0}}
+
tmpfs /www/cache tmpfs rw,size=1G,nr_inodes=5k,noexec,nodev,nosuid,uid=''user'',gid=''group'',mode=1700 0 0}}
   
  +
詳細は {{man|5|tmpfs}} man ページおよび [[セキュリティ#ファイルシステム]] に載っています。
See the {{ic|mount}} command man page for more information. One useful mount option in the man page is the {{ic|default}} option. At least understand that.
 
   
  +
変更を適用するには再起動してください。{{ic|mount -a}} と実行するだけで変更が即座に適用できるかに思われるかもしれませんが、これではディレクトリ内に存在する既存のファイルにアクセスできなくなってしまいます (特にロックファイルを使用するプログラムを実行している場合は危険です)。ただし、ディレクトリの中身が全て空なのであれば、再起動する代わりに {{ic|mount -a}} を実行しても問題ありません (もしくは個別にマウントを実行してもよい)。
Reboot for the changes to take effect. Note that although it may be tempting to simply run {{ic|mount -a}} to make the changes effective immediately, this will make any files currently residing in these directories inaccessible (this is especially problematic for running programs with lockfiles, for example). However, if all of them are empty, it should be safe to run {{ic|mount -a}} instead of rebooting (or mount them individually).
 
   
 
変更の適用後、{{ic|findmnt}} を使って {{ic|/proc/mounts}} を見ることで効果が現れているかどうか確認することができます:
 
変更の適用後、{{ic|findmnt}} を使って {{ic|/proc/mounts}} を見ることで効果が現れているかどうか確認することができます:
   
{{hc|$ findmnt --target /tmp|
+
{{hc|$ findmnt /tmp|
 
TARGET SOURCE FSTYPE OPTIONS
 
TARGET SOURCE FSTYPE OPTIONS
 
/tmp tmpfs tmpfs rw,nosuid,nodev,relatime}}
 
/tmp tmpfs tmpfs rw,nosuid,nodev,relatime}}
46行目: 50行目:
 
== 自動マウントの無効化 ==
 
== 自動マウントの無効化 ==
   
[[systemd]] 下では、{{ic|/etc/fstab}} にエントリを記述してなくても {{ic|/tmp}} は自動的に tmpfs としてマウントされます。
+
[[systemd]] 下では、{{ic|/etc/fstab}} にエントリを記述してなくても {{ic|/tmp}} は自動的に tmpfs としてマウントされます。自動マウントを無効にするには、{{ic|tmp.mount}} systemd ユニットを[[マスク]]してください
 
自動マウントを無効にするには、次を実行:
 
 
# systemctl mask tmp.mount
 
   
ファイルは tmpfs ではなく、ブロックデバイスに保存されるようになります。{{ic|/tmp}} の中身は再起動しても消去されないようになるので、問題が起こる可能性があります。前の挙動に戻して再起動で {{ic|/tmp}} フォルダが自動的に消去されるようにするには、以下の {{ic|tmpfiles.d(5)}} を使ってください:
+
ファイルは tmpfs ではなく、ブロックデバイスに保存されるようになります。{{ic|/tmp}} の中身は再起動しても消去されないようになるので、問題が起こる可能性があります。前の挙動に戻して再起動で {{ic|/tmp}} フォルダが自動的に消去されるようにするには、以下の {{man|5|tmpfiles.d}} を使ってください:
   
 
{{hc|/etc/tmpfiles.d/tmp.conf|2=
 
{{hc|/etc/tmpfiles.d/tmp.conf|2=
72行目: 72行目:
 
=== root で tmpfs のシンボリックリンクを開けない ===
 
=== root で tmpfs のシンボリックリンクを開けない ===
   
  +
{{ic|/tmp}} は tmpfs を使っているので、カレントディレクトリを {{ic|/tmp}} に変更してから、ファイルを作成して、同じ {{ic|/tmp}} ディレクトリの中にファイルのシンボリックリンクを作成してみて下さい。シンボリックリンクを使って作成したファイルを開こうとすると、パーミッションエラーが表示されるはずです。{{ic|/tmp}} には [https://wiki.ubuntu.com/Security/Features#Symlink_restrictions スティッキービット] が設定されているためにこうなります。
Considering {{ic|/tmp}} is using tmpfs, change the current directory to {{ic|/tmp}}, then create a file and create a symlink to that file in the same {{ic|/tmp}} directory. If you try to open the file you created via the symlink, you will get a permission denied error. This is expected as {{ic|/tmp}} [https://wiki.ubuntu.com/Security/Features#Symlink_restrictions has the sticky bit set].
 
   
 
この挙動は {{ic|/proc/sys/fs/protected_symlinks}} や sysctl で変更できます: {{ic|1=sysctl -w fs.protected_symlinks=0}}。設定を永続化させる方法は [[Sysctl#設定]] を見て下さい。
 
この挙動は {{ic|/proc/sys/fs/protected_symlinks}} や sysctl で変更できます: {{ic|1=sysctl -w fs.protected_symlinks=0}}。設定を永続化させる方法は [[Sysctl#設定]] を見て下さい。
   
  +
{{Warning|この挙動を変更するとセキュリティに問題が起こります。無闇に無効化しないでください。}}
{{Warning|Changing this behaviour can lead to security issues! Disable it only if you know what you are doing.}}
 
   
 
== 参照 ==
 
== 参照 ==
   
* [https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt Linux カーネルドキュメント]
+
* [https://www.kernel.org/doc/html/latest/filesystems/tmpfs.html Linux カーネルドキュメント]

2024年7月10日 (水) 20:13時点における最新版

tmpfs はメモリやスワップパーティションに存在する一時ファイルシステムです。ディレクトリを tmpfs としてマウントすることでファイルへのアクセスを高速化させたり、再起動時に自動的に中身が消去されるようにすることができます。

ヒント: systemd を使っている場合、systemd-tmpfiles を使って tmpfs ディレクトリの一時ファイルを起動時に再作成することができます。

使用方法

tmpfs(5) が使われる主なディレクトリは /tmp, /var/lock, /var/run です。tmpfs を /var/tmp で使ってはいけません。このフォルダは、再起動しても消えない一時ファイルを置くところだからです。

glibc 2.2 以上では tmpfs は POSIX shared memory/dev/shm にマウントされることになっています。/dev/shm への tmpfs のマウントは systemd によって自動的に行われるため、fstab における手動設定は必要なくなりました。

Arch は tmpfs の /run ディレクトリを使っており、/var/run/var/lock は互換性維持のため単なるシンボリックリンクとして存在しています。また、systemd のデフォルト設定で /tmp で使用されるため、特別な設定が必要ないかぎり fstab にエントリを記述する必要はありません。

一般的に、tmpfs フォルダを使う意味があるのは、読み書き操作を頻繁に実行するような I/O の処理が重い作業やプログラムです。アプリケーションによっては、部分的な (または全ての) データを共有メモリにオフロードすることで体感することができるほどの変化が現れることもあります。例えば、Firefox のプロファイルを RAM に再配置するとパフォーマンスが著しく上昇します。

サンプル

デフォルトでは、tmpfs パーティションの最大容量は合計 RAM の半分に設定されていますが、この値はカスタマイズすることができます。

ノート: 実際に使用されるメモリ/スワップは使用する量によって変わり、必要とされるまで tmpfs パーティションはメモリを消費しないので注意してください。

最大容量を明示的に設定するために、以下の例ではデフォルトの /tmp マウントを上書きして、size マウントオプションを使っています:

/etc/fstab
tmpfs   /tmp         tmpfs   rw,nodev,nosuid,size=2G          0  0

以下はユーザーに tmpfs マウントを追加する、より高度な例です。ウェブサイトや mysql の一時ファイル、~/.vim/ などで有用です。設定する前にマウントオプションをよく確かめて下さい。悪用を防止するためにできる限りセキュリティを高めるべきです。容量を制限したり、uid と gid のモードを指定すると良いでしょう。詳しくは、#参照セクションのリンクを見て下さい。

/etc/fstab
tmpfs   /www/cache    tmpfs  rw,size=1G,nr_inodes=5k,noexec,nodev,nosuid,uid=user,gid=group,mode=1700 0 0

詳細は tmpfs(5) man ページおよび セキュリティ#ファイルシステム に載っています。

変更を適用するには再起動してください。mount -a と実行するだけで変更が即座に適用できるかに思われるかもしれませんが、これではディレクトリ内に存在する既存のファイルにアクセスできなくなってしまいます (特にロックファイルを使用するプログラムを実行している場合は危険です)。ただし、ディレクトリの中身が全て空なのであれば、再起動する代わりに mount -a を実行しても問題ありません (もしくは個別にマウントを実行してもよい)。

変更の適用後、findmnt を使って /proc/mounts を見ることで効果が現れているかどうか確認することができます:

$ findmnt /tmp
TARGET SOURCE FSTYPE OPTIONS
/tmp   tmpfs  tmpfs  rw,nosuid,nodev,relatime

また、tmpfs は再起動せずとも一時的にサイズを変更することが可能です。いますぐ巨大なコンパイルを行う必要があるときなどに有用です。その場合、以下を実行します:

# mount -o remount,size=4G,noatime /tmp

自動マウントの無効化

systemd 下では、/etc/fstab にエントリを記述してなくても /tmp は自動的に tmpfs としてマウントされます。自動マウントを無効にするには、tmp.mount systemd ユニットをマスクしてください。

ファイルは tmpfs ではなく、ブロックデバイスに保存されるようになります。/tmp の中身は再起動しても消去されないようになるので、問題が起こる可能性があります。前の挙動に戻して再起動で /tmp フォルダが自動的に消去されるようにするには、以下の tmpfiles.d(5) を使ってください:

/etc/tmpfiles.d/tmp.conf
# see tmpfiles.d(5)
# always enable /tmp folder cleaning
D! /tmp 1777 root root 0

# remove files in /var/tmp older than 10 days
D /var/tmp 1777 root root 10d

# namespace mountpoints (PrivateTmp=yes) are excluded from removal
x /tmp/systemd-private-*
x /var/tmp/systemd-private-*
X /tmp/systemd-private-*/tmp
X /var/tmp/systemd-private-*/tmp

トラブルシューティング

root で tmpfs のシンボリックリンクを開けない

/tmp は tmpfs を使っているので、カレントディレクトリを /tmp に変更してから、ファイルを作成して、同じ /tmp ディレクトリの中にファイルのシンボリックリンクを作成してみて下さい。シンボリックリンクを使って作成したファイルを開こうとすると、パーミッションエラーが表示されるはずです。/tmp には スティッキービット が設定されているためにこうなります。

この挙動は /proc/sys/fs/protected_symlinks や sysctl で変更できます: sysctl -w fs.protected_symlinks=0。設定を永続化させる方法は Sysctl#設定 を見て下さい。

警告: この挙動を変更するとセキュリティに問題が起こります。無闇に無効化しないでください。

参照