お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2018-01-13 19:03:56

taku_s
メンバ
登録日: 2008-12-14

tmpfsの/dev/shmについて

Ubuntuでは最初から、 /dev/shmがマウントされていると思いますが、このファイルをユーザーが使っても問題ないのでしょうか?

shmの最大容量を制限することは出来るのでしょうか?

オフライン

 

#2 2018-01-14 10:32:23

taka.zoo.n
メンバ
登録日: 2013-05-30

Re: tmpfsの/dev/shmについて

> Ubuntuでは最初から、 /dev/shmがマウントされていると思いますが、このファイルをユーザーが使っても問題ないのでしょうか?

問題が起きる・起きないに関わらす、kernel の内部データobjectを直接操作するようなことは私ならしませんね。OS が提供するインターフェイスを使います。
man shm_open の NOTES や man shm_overview をご参照ください。

>shmの最大容量を制限することは出来るのでしょうか?

ポータブルな方法ではありませんが、linux では一つの共有メモリーセグメントのサイズの最大値は
/proc/sys/kernel/shmmax       (単位は byte)
共有メモリーセグメントのサイズの合計の最大は
/proc/sys/kernel/shmall           (単位はページ数)
です。読み取りは一般ユーザー権限でもできますが、変更(書き込み)は root 権限が必要です。
なお、この既定値は ubuntu 14.04 と 16.04 では異なります。ご参考まで。

オフライン

 

#3 2018-01-14 12:47:15

taku_s
メンバ
登録日: 2008-12-14

Re: tmpfsの/dev/shmについて

tak.zoo.nさま
ありがとうございました。
どうも質問内容がが変でした
webカメラで静止画を取って、メールに添付して送信したいのですが、送るまでの一時的な保存場所として
メモリーファイルを使おうと思い、調べてみると、shmがあるらしいと知りました。
実際にユーザー権限で保存できるようなのですが、このような使い方が良いのかどうかと思い質問いたしました。

Ubuntuでメモリファイルを使う場合はどのようにすれば良いでしょうか?

オフライン

 

#4 2018-01-14 16:54:59

si
メンバ
From: hokkaido kitami, jp
登録日: 2007-01-15

Re: tmpfsの/dev/shmについて

taku_s による投稿:

tak.zoo.nさま
ありがとうございました。
どうも質問内容がが変でした
webカメラで静止画を取って、メールに添付して送信したいのですが、送るまでの一時的な保存場所として
メモリーファイルを使おうと思い、調べてみると、shmがあるらしいと知りました。
実際にユーザー権限で保存できるようなのですが、このような使い方が良いのかどうかと思い質問いたしました。

Ubuntuでメモリファイルを使う場合はどのようにすれば良いでしょうか?

普通に /tmp を使ったら如何でしょうか?
df を見ればわかりますが、/tmp は、/dev/shmを使っていると思います。
(今、Ubuntuが周りに無いので確認できませんが)

オフライン

 

#5 2018-01-14 18:40:45

taka.zoo.n
メンバ
登録日: 2013-05-30

Re: tmpfsの/dev/shmについて

taku_s さま:

いろいろとやり方が有りますが、ubuntu での(システムと干渉しない、堅牢である、最善とまではいかなくても相応の速度が出るという点で)私のお勧めはユーザー用に tmpfs を作成することです。

まず、file system の mount point を一つ決めます。(以下では /var/tmpdir としますが適宜読み替えてください。なお、 /var  が /  と同一のパーティションであることを仮定していますがインストール時に設定を変えない限りこの仮定は満たされているはずです。)次に
  sudo mkdir /var/tmpdir
  sudo chmod a+rwx,+t /var/tmpdir
を実行します。また root 権限で /etc/fstab に次の行を追加します。

tmpfs  /var/tmpdir  tmpfs  defaults,nodev,nosuid,noexec,size=1024m  0  0

ここで size=1024m はファイルシステムのサイズ(この例では1024MB=1GB)です。想定しているファイルの総容量に合わせて余裕を含めた値を設定してください。実メモリーサイズより大きくても構いませんが実メモリーの約 1/5 を越えるなら別途 swap partition を設定してください。(なお、/etc/fstab の変更は間違えると最悪システムが立ち上がらなくなるので慎重に作業願います。)ここで確認のため
   sudo mount /var/tmpdir
   df -m /var/tmpdir
を実行します。

Filesystem     1M-blocks  Used Available Use% Mounted on
tmpfs               1024     0      1024   0% /var/tmpdir

のように表示されること、/var/tmpdir の下にユーザー権限でファイルを作成したり削除したりできることを確かめた上でシステムを reboot してください。
あとは reboot するたびに空の tmpfs が自動的に /var/tmpdir にマウントされます。
# Ubuntu 16.04.3 i686 で確認しました。

最初にも書きました他にも状況に応じていろいろな方法が考えられます。保存するファイル容量が大したことがない(数MB以下)なら安直に /var/run/自分のuid 直下に置いてしまうとか。(これなら何も設定しなくて良いわけですが、 systemd 以下は絶対に変更してはいけません。)

オフライン

 

#6 2018-01-14 19:11:47

taka.zoo.n
メンバ
登録日: 2013-05-30

Re: tmpfsの/dev/shmについて

si さま:

どういうわけか少なくとも ubuntu 14.04, 16.04 共に /tmp も /var/tmp も tmpfs ではありません。それどころか install 時の default では /tmp も /var も root file system の中にあります。(記憶が定かではありませんが 12.04 でもそうだったような....)

# kernel level では問題ないはずなので、ubuntu の boot sequence で何か独自の理由があるのでしょうか?私には全く分かりません。
# 試しに 14.04 のマシン一台で /tmp を tmpfs になるように設定してみましたが私の環境・使い方では過去3年で一度も不具合は経験していません。

オフライン

 

#7 2018-01-14 19:34:53

taku_s
メンバ
登録日: 2008-12-14

Re: tmpfsの/dev/shmについて

siさま
ご回答いただきありがとうございました。
tmpはメモリファイルだったんでね。
ls -lだとtmpは緑色に表示されました。これがメモリファイルを表しているんでしょうか
ただ、単純にdfではtmpは表示されず
df tmp してみると
ファイルシス   1K-ブロック     使用  使用可 使用% マウント位置
/dev/sda1         19620732 12640248 5960736   68% /
と表示されました、どうも確認ができません


taka.zoo.nさま
詳細な説明をいただき、ありがとうございました。
能動的にtmpfsを指定するこの方法は、一番安全なようですね。
試してみます。
ありがとう、ございました。

オフライン

 

#8 2018-01-20 15:16:47

taka.zoo.n
メンバ
登録日: 2013-05-30

Re: tmpfsの/dev/shmについて

僭越ながら私の方からコメントさせていただきます。

taku_s による投稿:

ls -lだとtmpは緑色に表示されました。これがメモリファイルを表しているんでしょうか

ls のソースを隅から隅まで読んだわけではないのですが、ざっと目を通した限りでは、ls の表示色がファイルシステムタイプに依存することはありません。
表示色はカスタマイズ可能ですが、14.04 の既定値(端末の設定も含む)では world writable(permission 表示の右から2文字目が w になっている)ディレクトリはスティッキービットが立っていれば背景緑文字色黒、立っていなければ背景緑文字色青となります。逆に背景緑ならば既定値では world writable ディレクトリと判断できますがカスタマイズに関わる要素が多いので実際問題としては ls -l で確認するということになるのだと思います。

taku_s による投稿:

df tmp してみると
ファイルシス   1K-ブロック     使用  使用可 使用% マウント位置
/dev/sda1         19620732 12640248 5960736   68% /

tmp は /tmp でしょうか?そうだとしてマウント位置がわかったので mount を引数なしで実行して3語目(on の次の語)がそのマウント位置(今の場合 /)に一致する行を探します。マウント位置の次の次の語がファイルシステムタイプ(tmpfs とか ext4 とか vfat とか....)です。(行の先頭はファイルシステムタイプではありません。)

オフライン

 

#9 2018-01-21 09:32:29

taku_s
メンバ
登録日: 2008-12-14

Re: tmpfsの/dev/shmについて

taka.zoo.nさま
ありがとうございました。

メモリファイルの場合、デバイス名とファイルタイプがtmpになって少しややっこしいですね。
デバイス名は/dev/shmではなく、tmpになるんですね

オフライン

 

#10 2018-01-21 15:12:10

taka.zoo.n
メンバ
登録日: 2013-05-30

Re: tmpfsの/dev/shmについて

tmpfs には対応するブロックデバイスは存在しません。/dev/shm は 14.04 では /run/shm へのシンボリックリンク、16.04 では単なるディレクトリです。

kernel 内部の tmpfs のドライバーにとっては tmpfs のデバイス名は意味がありません。(というか、単に捨てられます。)
空でない任意(といっても文字列長など mount システムコールの制限は受けます)の文字列が指定できます。試しに端末から
   mkdir /tmp/testdir
   sudo mount -t tmpfs  foobar /tmp/testdir
   df /tmp/testdir
とか実行してみてください。(実験し終わったら念の為 unmount するかリブートしておいたほうがよいでしょう。)

kernel にとっては無意味でもシステムの初期化スクリプトなどでデバイス名として特定の文字列が期待されている可能性を完全には否定できないので既存のデバイス名を変更したりはしないほうが良いです。しかし、自分で作成する tmpfs に対しては紛らわしくないお好みの文字列が使えます。
# そうは言っても空白や shell の特殊文字を含むようなもの、他のデバイスと紛らわしいものは避けて下さい。

オフライン

 

#11 2018-01-21 19:35:47

taku_s
メンバ
登録日: 2008-12-14

Re: tmpfsの/dev/shmについて

taka.zoo.nさま
納得関ました。
ありがとうございました。

オフライン

 

#12 2020-04-13 10:27:32

span
新しいメンバ
登録日: 2020-04-13

Re: tmpfsの/dev/shmについて

shmという名前がそもそもshared memoryの略で、自由に利用して構わないRAMディスクです。

ユーザーが独自に何らかのファイルを読み書きする場所として利用するのであれば、他のユーザーやプロセスと被らないよう実行プロセスやユーザ名などを元にハッシュ化した一意となる名前を決めてその名前でのディレクトリをまず/dev/shm下に置き、パーミッションを0700にした上で利用すると良いです。

shmの容量は、実メモリの半分を最大値とした可変です。

オフライン

 

Board footer

Powered by FluxBB