skypeを立ち上げると

kern.maxfiles limit exceeded by uid 1102, please see tuning(7).

こんなメッセージがでるので、lsofしてみたらchromeの方がいっぱいファイルディスクリプタを消費してた。

lsofの出力をみてると

syslogd    1392       root   10w    VBAD         (revoked)

のようなのがちらほら出てくる。たしかにrevoke(2)というシステムコールはあるが、プログラムのソースコードをみてもrevokeを呼んでいるようにはみえない。

でカーネルの方をみるとVBAD(これは無効なvnodeをあらわす)を代入しているところがみつかるが、どういうパスで実行されるかまでは読まず。

どうやら端末からプログラムを起動したあと、その端末を閉じるとVBADになるっぽいことがかわって、それでよしということにした。

シェルから sleep 100000 & を実行してみたところ:

% lsof -p 26797
COMMAND   PID USER   FD   TYPE        DEVICE SIZE/OFF  NODE NAME
sleep   26797 koie  cwd   VDIR 41,3942383680      576     3 /home/koie
sleep   26797 koie  rtd   VDIR         0,136     1024     2 /
sleep   26797 koie  txt   VREG         0,136     5160 49732 /bin/sleep
sleep   26797 koie  txt   VREG         0,136   248568 49933 /libexec/ld-elf.so.1
sleep   26797 koie  txt   VREG         0,136  1274032 16717 /lib/libc.so.7
sleep   26797 koie    0u  VCHR         0,191     0t79   191 /dev/ttyp3
sleep   26797 koie    1u  VCHR         0,191     0t79   191 /dev/ttyp3
sleep   26797 koie    2u  VCHR         0,191     0t79   191 /dev/ttyp3

sleepは生かしたままシェルを終了→端末を閉じたところ:

% lsof -p 26797
COMMAND   PID USER   FD   TYPE        DEVICE SIZE/OFF  NODE NAME
sleep   26797 koie  cwd   VDIR 41,3942383680      576     3 /home/koie
sleep   26797 koie  rtd   VDIR         0,136     1024     2 /
sleep   26797 koie  txt   VREG         0,136     5160 49732 /bin/sleep
sleep   26797 koie  txt   VREG         0,136   248568 49933 /libexec/ld-elf.so.1
sleep   26797 koie  txt   VREG         0,136  1274032 16717 /lib/libc.so.7
sleep   26797 koie    0u  VBAD                              (revoked)
sleep   26797 koie    1u  VBAD                              (revoked)
sleep   26797 koie    2u  VBAD                              (revoked)

強制umountでもVBADになるようだ。

てきとうにファイルをオープンした状態:

% lsof -p 27317
COMMAND   PID USER   FD   TYPE        DEVICE  SIZE/OFF  NODE NAME
cat     27317 koie  cwd   VDIR 206,638058647       511     3 /tmp
cat     27317 koie  rtd   VDIR         0,136      1024     2 /
cat     27317 koie  txt   VREG         0,136     11072 49932 /bin/cat
cat     27317 koie  txt   VREG         0,136    248568 49933 /libexec/ld-elf.so.1
cat     27317 koie  txt   VREG         0,136   1274032 16717 /lib/libc.so.7
cat     27317 koie    0u  VCHR         0,178 0t4803748   178 /dev/ttyp1
cat     27317 koie    1w  VREG 207,926285839         0 61670 /usr/src (tank/usr/src)
cat     27317 koie    2u  VCHR         0,178 0t4803748   178 /dev/ttyp1

umount -fで強制umountした状態:

% lsof -p 27317
COMMAND   PID USER   FD   TYPE        DEVICE  SIZE/OFF  NODE NAME
cat     27317 koie  cwd   VDIR 206,638058647       511     3 /tmp
cat     27317 koie  rtd   VDIR         0,136      1024     2 /
cat     27317 koie  txt   VREG         0,136     11072 49932 /bin/cat
cat     27317 koie  txt   VREG         0,136    248568 49933 /libexec/ld-elf.so.1
cat     27317 koie  txt   VREG         0,136   1274032 16717 /lib/libc.so.7
cat     27317 koie    0u  VCHR         0,178 0t4803748   178 /dev/ttyp1
cat     27317 koie    1w  VBAD                               (revoked)
cat     27317 koie    2u  VCHR         0,178 0t4803748   178 /dev/ttyp1

再マウントした状態(revokedがもとにもどったりはしない):

% lsof -p 27317
COMMAND   PID USER   FD   TYPE        DEVICE  SIZE/OFF  NODE NAME
cat     27317 koie  cwd   VDIR 206,638058647       511     3 /tmp
cat     27317 koie  rtd   VDIR         0,136      1024     2 /
pcat     27317 koie  txt   VREG         0,136     11072 49932 /bin/cat
cat     27317 koie  txt   VREG         0,136    248568 49933 /libexec/ld-elf.so.1
cat     27317 koie  txt   VREG         0,136   1274032 16717 /lib/libc.so.7
cat     27317 koie    0u  VCHR         0,178 0t4803748   178 /dev/ttyp1
cat     27317 koie    1w  VBAD                               (revoked)
cat     27317 koie    2u  VCHR         0,178 0t4803748   178 /dev/ttyp1

その状態でwriteするとエラーになる(EIOっぽい):

cat: stdout: Input/output error

2011/10/12 15:49:57
sof | sed '/cwd/d;/rtd/d;' | awk '{print $1}' | sort | uniq -c | sort -n

242 httpd

666 console-k

1890 skype

9822 chrome

2011/10/12 15:55:01
lsof | sed -n '/^chrome/{/txt/d;p;}' | awk '{print $5}' | sort | uniq -c | sort -n

38 IPv4

100 VCHR

106 VBAD

298 KQUEUE

555 PIPE...

2011/10/12 15:55:30
chromeはディレクトリをオープンしっぱなししすぎ。

2011/10/12 15:56:26
revoke(2)もつかっているようだ。<- VBAD

2011/10/12 16:03:22
chromiumをgrepしてみると、

find . -name "*.c" -print -o -name "*.cc" -print | xargs grep revoke | sed 's|//.*$||' | less

SSLの証明書のrevokeしかでてこない。

2011/10/12 16:09:50
lsof | grep VBAD | less してみるとrevokeされてるのがchrome以外にもけっこうある。だれがやってるんだろう。

2011/10/13 15:21:17
VBAD: revoke(2)してるんじゃなくて(たぶん)プロセスがopenしたままなのにTTYがcloseしてしまったせい。