tmpfsが/dev/shmをマウントしている件
前から気になってた。tmpfsって何?
ノートLinuxでファイルシステムのディスク容量を見てみるとこうなってる。
# df -Th Filesystem Type サイズ 使用 残り 使用% マウント位置 /dev/hda2 ext3 19G 7.1G 11G 41% / tmpfs tmpfs 248M 0 248M 0% /lib/init/rw udev tmpfs 10M 64K 10M 1% /dev tmpfs tmpfs 248M 0 248M 0% /dev/shm /dev/hda1 ext3 938M 51M 840M 6% /boot /dev/hda3 ext3 17G 9.7G 6.1G 62% /home
Filesystemの中の/dev/hda達は、/etc/fstabに書いてるから納得だけど、
Typeがtmpfsなのがよくわからない。
仮想メモリベースのファイルシステムであるtmpfsを使用すれば、必要なサイズに応じてRAMディスクの容量が動的に変化するため、メモリを効率よく使用できる。
容量が動的に変化するRAMディスクを使うには
上の記事を見ると、動的に変化できるメモリ上のファイルシステムであることはわかる。
では、設定した覚えもない、/etc/fstabにも書いてないのに使われているのか。
tmpfs tmpfs 248M 0 248M 0% /lib/init/rw udev tmpfs 10M 64K 10M 1% /dev tmpfs tmpfs 248M 0 248M 0% /dev/shm
まず、udevのtmpfsはググってわかった。tmpfsは必須でシステムがマウントしている。
udev は実際に存在しているデバイスのためのファイルを置くための 動的なデバイスディレクトリを作成する. udev は通常 /dev/ ディレクトリに存在するデバイスノードファイルを 作成したり削除したり,ネットワークインターフェイスの名前を変更したりする.
udev は何をするのか
設定していない、tmpfs:/dev/shmがなぜあるのかわからず。
起動のタイミングを見ながら何が使ってるのか特定する。
どうやら、起動時に/etc/default/tmpfsの中に書いてあるサイズ分だけ、
tmpfs:/dev/shmでマウントしておくみたいです。(サイズは4096bytesの倍数)
SHM_SIZE=40960000
これがデフォルトで何目的なのかはやっぱり不明。
tmpfs:/lib/init/rw これについてもググってもわからず。
知ってる人いたら教えてください。
最後に使いかたを引用しておきます。
メモリを豊富に搭載している場合、/tmp などを RAM ベースファイルシステムにする事で速くなります。オススメは tmpfs で、カーネルがサポートしていれば特別な設定なしにマウントするだけで使えます。
RAM ベースファイルシステムを利用して速くする
# mount -t tmpfs -o size=32m tmpfs /tmp
起動する時にマウントさせるには /etc/fstab に
tmpfs /tmp tmpfs defaults,size=32m 0 0
マウントオプションの size= でサイズを指定しないと、実メモリの半分の容量が割り当てられてしまうので注意。
tmpfs 上に置かれているファイル分のメモリは、そのファイルが削除されない限り開放されません。そのため、実メモリとスワップの合計より多くの tmpfs をマウントして、実メモリとスワップの合計以上の容量を消費した場合、最悪システムがクラッシュします。
あと、本当に割り当てメモリを動的に空けてくれるのかの検証をid:naoyaさんが1年以上前にやっていました。
* tmpfs は OS がメモリが足りなくなったときにスワップして、OS 側にメモリを確保させる機能がある
ということは分かるのですが、tmpfs として確保した領域のうち空いてる箇所は果たして
* tmpfs として確保した領域のうち使用されてないものは OS がアプリケーションに割り当てる
* tmpfs として確保されたものはあくまでファイルシステムとして扱われ、OS がアプリケーションに割り当てることはないのどちらなのかがはっきりしません。
tmpfs は本当に容量が動的なのか
・・・